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 [
"""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):
def __init__(self, *args, **kwargs):
"""Initialize."""
self.mz_mgr = MultizoneManager()
- self._players = {}
self._listener = None
self._browser = None
super().__init__(*args, **kwargs)
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."""
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):
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 ==========
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:
"""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)
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