more attempts of CC reconnecting
authorMarcel van der Veldt <m.vanderveldt@outlook.com>
Wed, 28 Aug 2019 07:03:02 +0000 (09:03 +0200)
committerMarcel van der Veldt <m.vanderveldt@outlook.com>
Wed, 28 Aug 2019 07:03:02 +0000 (09:03 +0200)
music_assistant/modules/player.py
music_assistant/modules/playerproviders/chromecast.py

index 0276c9ea4e92fb8b59ad5d849b32690387f9e556..88955074cad1842111877db3d51ae844a83f5acd 100755 (executable)
@@ -45,14 +45,14 @@ class Player():
         prov = self.providers[prov_id]
         LOGGER.info('received command %s for player %s' %(cmd, player.name))
         # handle some common workarounds
-        if cmd in ['pause', 'play'] and cmd_args == 'toggle':
+        if (cmd in ['pause', 'play'] and cmd_args == 'toggle') or cmd == 'playpause':
             cmd = 'pause' if player.state == PlayerState.Playing else 'play'
         if cmd == 'power' and (cmd_args == 'toggle' or not cmd_args):
             cmd_args = 'off' if player.powered else 'on'
         if cmd == 'volume' and cmd_args == 'up':
-            cmd_args = player.volume_level + 2
+            cmd_args = player.volume_level + 1
         elif cmd == 'volume' and cmd_args == 'down':
-            cmd_args = player.volume_level - 2
+            cmd_args = player.volume_level - 1
         elif cmd == 'volume' and '+' in str(cmd_args):
             cmd_args = player.volume_level + try_parse_int(cmd_args.replace('+',''))
         elif cmd == 'volume' and '-' in str(cmd_args):
@@ -166,7 +166,6 @@ class Player():
     async def update_player(self, player_details):
         ''' update (or add) player '''
         player_details = deepcopy(player_details)
-        LOGGER.debug('Incoming msg from %s' % player_details.name)
         player_id = player_details.player_id
         player_changed = False
         if not player_id in self._players:
@@ -203,18 +202,21 @@ class Player():
         if player.cur_item and player_details.cur_item and player.cur_item.name != player_details.cur_item.name:
             # track changed
             player_changed = True
-            LOGGER.info("%s -- STOP PLAYING %s -- SECONDS PLAYED: %s" %(player.name, player.cur_item.name, player.cur_item_time))
-            LOGGER.info("%s -- START PLAYING %s" %(player.name, player_details.cur_item.name))
+            if not player.group_parent:
+                LOGGER.info("%s -- STOP PLAYING %s -- SECONDS PLAYED: %s" %(player.name, player.cur_item.name, player.cur_item_time))
+                LOGGER.info("%s -- START PLAYING %s" %(player.name, player_details.cur_item.name))
             player.cur_item = player_details.cur_item
         elif not player.cur_item and player_details.cur_item:
             # player started playing
             player_changed = True
-            LOGGER.info("%s -- START PLAYING %s" %(player.name, player_details.cur_item.name))
+            if not player.group_parent:
+                LOGGER.info("%s -- START PLAYING %s" %(player.name, player_details.cur_item.name))
             player.cur_item = player_details.cur_item
         elif player.cur_item and not player_details.cur_item:
             # player queue cleared
             player_changed = True
-            LOGGER.info("%s -- STOP PLAYING %s -- SECONDS PLAYED: %s" %(player.name, player.cur_item.name, player.cur_item_time))
+            if not player.group_parent:
+                LOGGER.info("%s -- STOP PLAYING %s -- SECONDS PLAYED: %s" %(player.name, player.cur_item.name, player.cur_item_time))
             player.cur_item = player_details.cur_item
         # compare values to detect changes
         for key, cur_value in player.__dict__.items():
index bdb11f43a1ba12bbfdd4701e4053258e25f6cad7..80eca0739ced8ceee8e6ea10c365dbd9473ed5c6 100644 (file)
@@ -66,6 +66,8 @@ class ChromecastProvider(PlayerProvider):
 
     async def player_command(self, player_id, cmd:str, cmd_args=None):
         ''' issue command on player (play, pause, next, previous, stop, power, volume, mute) '''
+        if not player_id in self._players or not player_id in self._chromecasts:
+            return
         try:
             if cmd == 'play':
                 self._players[player_id].powered = True
@@ -407,13 +409,15 @@ class ChromecastProvider(PlayerProvider):
         # remove any disconnected players...
         removed_players = []
         for player_id, cast in self._chromecasts.items():
-            if not cast.socket_client.is_connected:
+            if not cast.socket_client or not cast.socket_client.is_connected:
                 LOGGER.info("%s is disconnected" % cast.name)
                 removed_players.append(player_id)
         for player_id in removed_players:
-            self._chromecasts[player_id].socket_client.stop.set()
-            await asyncio.sleep(1)
-            self._chromecasts.pop(player_id, None)
+            try:
+                self._chromecasts[player_id].disconnect()
+            except Exception:
+                pass
+            del self._chromecasts[player_id]
             await self.mass.player.remove_player(player_id)
         # search for available chromecasts
         from pychromecast.discovery import start_discovery, stop_discovery