From 2d9ce89dbd5291a694d49c8a9c6e7c3d294f16c4 Mon Sep 17 00:00:00 2001 From: Marcel van der Veldt Date: Wed, 28 Aug 2019 09:03:02 +0200 Subject: [PATCH] more attempts of CC reconnecting --- music_assistant/modules/player.py | 18 ++++++++++-------- .../modules/playerproviders/chromecast.py | 12 ++++++++---- 2 files changed, 18 insertions(+), 12 deletions(-) diff --git a/music_assistant/modules/player.py b/music_assistant/modules/player.py index 0276c9ea..88955074 100755 --- a/music_assistant/modules/player.py +++ b/music_assistant/modules/player.py @@ -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(): diff --git a/music_assistant/modules/playerproviders/chromecast.py b/music_assistant/modules/playerproviders/chromecast.py index bdb11f43..80eca073 100644 --- a/music_assistant/modules/playerproviders/chromecast.py +++ b/music_assistant/modules/playerproviders/chromecast.py @@ -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 -- 2.34.1