From b9e58c6d628bd4248f9aa83d0be1c79f67243d67 Mon Sep 17 00:00:00 2001 From: Marcel van der Veldt Date: Sun, 27 Sep 2020 20:51:47 +0200 Subject: [PATCH] fix chromecast discovery --- music_assistant/models/playerprovider.py | 2 +- music_assistant/player_manager.py | 2 ++ music_assistant/providers/chromecast/__init__.py | 13 +++++-------- music_assistant/providers/chromecast/player.py | 2 +- .../providers/squeezebox/socket_client.py | 13 ++++--------- 5 files changed, 13 insertions(+), 19 deletions(-) diff --git a/music_assistant/models/playerprovider.py b/music_assistant/models/playerprovider.py index d2bd7722..7ed6c1f9 100755 --- a/music_assistant/models/playerprovider.py +++ b/music_assistant/models/playerprovider.py @@ -17,7 +17,7 @@ class PlayerProvider(Provider): return ProviderType.PLAYER_PROVIDER @property - def players(self, calculated_state=False) -> Players: + def players(self) -> Players: """Return all players belonging to this provider.""" # pylint: disable=no-member return [ diff --git a/music_assistant/player_manager.py b/music_assistant/player_manager.py index 2b2f8172..66f7ee0c 100755 --- a/music_assistant/player_manager.py +++ b/music_assistant/player_manager.py @@ -65,6 +65,8 @@ class PlayerManager: """Handle stop/shutdown.""" for player_queue in list(self._player_queues.values()): await player_queue.async_close() + for player_state in self.players: + await player_state.player.async_on_remove() @run_periodic(1) async def poll_task(self): diff --git a/music_assistant/providers/chromecast/__init__.py b/music_assistant/providers/chromecast/__init__.py index 5dc86539..ffc33dcd 100644 --- a/music_assistant/providers/chromecast/__init__.py +++ b/music_assistant/providers/chromecast/__init__.py @@ -29,7 +29,6 @@ class ChromecastProvider(PlayerProvider): def __init__(self, *args, **kwargs): """Initialize.""" self.mz_mgr = MultizoneManager() - self._players = {} self._listener = None self._browser = None super().__init__(*args, **kwargs) @@ -70,10 +69,7 @@ class ChromecastProvider(PlayerProvider): if not self._browser: return # stop discovery - pychromecast.stop_discovery(self._browser) - # stop cast socket clients - for player in self._players.values(): - player.disconnect() + self.mass.add_job(pychromecast.stop_discovery, self._browser) def __chromecast_add_update_callback(self, cast_uuid, cast_service_name): """Handle zeroconf discovery of a new or updated chromecast.""" @@ -90,15 +86,16 @@ class ChromecastProvider(PlayerProvider): port=service[5], ) player_id = cast_info.uuid - if player_id in self._players: + player_state = self.mass.player_manager.get_player(player_id) + if player_state: # player already added, the player will take care of reconnects itself. + self.mass.add_job(player_state.player.set_cast_info, cast_info) return LOGGER.debug( "Chromecast discovered: %s (%s)", cast_info.friendly_name, player_id ) player = ChromecastPlayer(self.mass, cast_info) - self._players[player_id] = player - self.mass.add_job(self._players[player_id].set_cast_info, cast_info) + self.mass.add_job(player.set_cast_info, cast_info) self.mass.add_job(self.mass.player_manager.async_add_player(player)) def __chromecast_remove_callback(self, cast_uuid, cast_service_name, cast_service): diff --git a/music_assistant/providers/chromecast/player.py b/music_assistant/providers/chromecast/player.py index 520431d7..01d783ba 100644 --- a/music_assistant/providers/chromecast/player.py +++ b/music_assistant/providers/chromecast/player.py @@ -247,7 +247,7 @@ class ChromecastPlayer(Player): async def async_on_remove(self) -> None: """Call when player is removed from the player manager.""" - self.disconnect() + self.mass.add_job(self.disconnect) # ========== Callbacks ========== diff --git a/music_assistant/providers/squeezebox/socket_client.py b/music_assistant/providers/squeezebox/socket_client.py index dd9b9e6a..aa8dfd8a 100644 --- a/music_assistant/providers/squeezebox/socket_client.py +++ b/music_assistant/providers/squeezebox/socket_client.py @@ -66,16 +66,11 @@ class SqueezeSocketClient(Player): asyncio.create_task(self.__async_send_heartbeat()), ] - async def async_close(self): - """Cleanup when the socket client needs to close.""" + async def async_on_remove(self) -> None: + """Call when player is removed from the player manager.""" for task in self._tasks: if not task.cancelled(): task.cancel() - await self.mass.player_manager.async_remove_player(self.player_id) - - async def async_on_remove(self) -> None: - """Call when player is removed from the player manager.""" - await self.async_close() @property def player_id(self) -> str: @@ -348,7 +343,7 @@ class SqueezeSocketClient(Player): """Send command to Squeeze player.""" if self._reader.at_eof() or self._writer.is_closing(): LOGGER.debug("Socket is disconnected.") - return await self.async_close() + await self.mass.player_manager.async_remove_player(self.player_id) packet = struct.pack("!H", len(data) + 4) + command + data try: self._writer.write(packet) @@ -379,7 +374,7 @@ class SqueezeSocketClient(Player): handler(packet) # EOF reached: socket is disconnected LOGGER.info("Socket disconnected: %s", self._writer.get_extra_info("peername")) - await self.async_close() + await self.mass.player_manager.async_remove_player(self.player_id) @callback @staticmethod -- 2.34.1