From 1bc8f75404c2caff4a44f5f17e36c706459015b4 Mon Sep 17 00:00:00 2001 From: Marcel van der Veldt Date: Fri, 17 Jan 2025 23:48:26 +0100 Subject: [PATCH] Fix Sonos has wrong grouping info at startup --- music_assistant/mass.py | 10 +++++----- music_assistant/providers/sonos/player.py | 4 ++-- music_assistant/providers/sonos/provider.py | 4 ++++ 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/music_assistant/mass.py b/music_assistant/mass.py index d0295d62..b4e83ea8 100644 --- a/music_assistant/mass.py +++ b/music_assistant/mass.py @@ -421,15 +421,15 @@ class MusicAssistant: "Non-Async operation detected: This method may only be called from the eventloop." ) - def _create_task() -> None: + def _create_task(_target: Coroutine[Any, Any, _R]) -> None: self._tracked_timers.pop(task_id) - if TYPE_CHECKING: - target = cast(Coroutine[Any, Any, _R], target) # noqa: F823 - self.create_task(target, *args, task_id=task_id, abort_existing=True, **kwargs) + self.create_task(_target, *args, task_id=task_id, abort_existing=True, **kwargs) if asyncio.iscoroutinefunction(target) or asyncio.iscoroutine(target): # coroutine function - handle = self.loop.call_later(delay, _create_task) + if TYPE_CHECKING: + target = cast(Coroutine[Any, Any, _R], target) + handle = self.loop.call_later(delay, _create_task, target) else: # regular callable if TYPE_CHECKING: diff --git a/music_assistant/providers/sonos/player.py b/music_assistant/providers/sonos/player.py index ee516d59..56178162 100644 --- a/music_assistant/providers/sonos/player.py +++ b/music_assistant/providers/sonos/player.py @@ -141,7 +141,7 @@ class SonosPlayer: # register callback for state changed self._on_cleanup_callbacks.append( self.client.subscribe( - self._on_player_event, + self.on_player_event, ( SonosEventType.GROUP_UPDATED, SonosEventType.PLAYER_UPDATED, @@ -426,7 +426,7 @@ class SonosPlayer: await self.client.disconnect() self.logger.debug("Disconnected from player API") - def _on_player_event(self, event: SonosEvent) -> None: + def on_player_event(self, event: SonosEvent | None) -> None: """Handle incoming event from player.""" self.update_attributes() self.mass.players.update(self.player_id) diff --git a/music_assistant/providers/sonos/provider.py b/music_assistant/providers/sonos/provider.py index e446c1d8..f9892fe5 100644 --- a/music_assistant/providers/sonos/provider.py +++ b/music_assistant/providers/sonos/provider.py @@ -350,6 +350,10 @@ class SonosPlayerProvider(PlayerProvider): self, player_id, discovery_info=discovery_info, ip_address=address ) await sonos_player.setup() + # trigger update on all existing players to update the group status + for _player in self.sonos_players.values(): + if _player.player_id != player_id: + _player.on_player_event(None) async def _handle_sonos_queue_itemwindow(self, request: web.Request) -> web.Response: """ -- 2.34.1