fix chromecast discovery
authorMarcel van der Veldt <m.vanderveldt@outlook.com>
Sun, 27 Sep 2020 18:51:47 +0000 (20:51 +0200)
committerMarcel van der Veldt <m.vanderveldt@outlook.com>
Sun, 27 Sep 2020 18:51:47 +0000 (20:51 +0200)
music_assistant/models/playerprovider.py
music_assistant/player_manager.py
music_assistant/providers/chromecast/__init__.py
music_assistant/providers/chromecast/player.py
music_assistant/providers/squeezebox/socket_client.py

index d2bd77229acad24611baa80b066b4a209752ac39..7ed6c1f98e9d23ccb04aabfd19d0dc93a925bf37 100755 (executable)
@@ -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 [
index 2b2f8172f2176b573354aae1d5881decb2cdb603..66f7ee0c0a9f7818550f4e5b32b6ab57ccb186a1 100755 (executable)
@@ -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):
index 5dc865399b37268f653f1024498c7f5a211009e9..ffc33dcd0fac2429a4e7369015456601fe1c4e3f 100644 (file)
@@ -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):
index 520431d720b99246118c6909913e1c1ccbb19df9..01d783babd92e1475d80c3761363a09365b5203b 100644 (file)
@@ -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 ==========
 
index dd9b9e6aeef0d5984dcf1e762f9cf391200afd43..aa8dfd8a70d144d90d3c11a82e03c27db2e797a9 100644 (file)
@@ -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