diff --git a/music_assistant/server/controllers/player_queues.py b/music_assistant/server/controllers/player_queues.py index 07edd95f7..eb8fb902b 100644 --- a/music_assistant/server/controllers/player_queues.py +++ b/music_assistant/server/controllers/player_queues.py @@ -1041,7 +1041,7 @@ def on_player_update( and (queue.items - queue.current_index) < 5 ): task_id = f"fill_radio_tracks_{queue_id}" - self.mass.call_later(5, self._fill_radio_tracks(queue_id), task_id=task_id) + self.mass.call_later(5, self._fill_radio_tracks, queue_id, task_id=task_id) def on_player_remove(self, player_id: str) -> None: """Call when a player is removed from the registry.""" diff --git a/music_assistant/server/controllers/players.py b/music_assistant/server/controllers/players.py index f796b991f..dc2e3600b 100644 --- a/music_assistant/server/controllers/players.py +++ b/music_assistant/server/controllers/players.py @@ -838,6 +838,16 @@ def update( ) self._prev_states[player_id] = new_state + if "available" in changed_values and not player.available: + # ensure a player that became available is no longer synced + if player.synced_to: + self.mass.create_task(self.cmd_unsync(player_id)) + if player.group_childs: + for group_child_id in player.group_childs: + self.mass.create_task(self.cmd_power(group_child_id)) + if player.active_group: + self.mass.create_task(self.cmd_power(player.active_group, False)) + if not player.enabled and not force_update: # ignore updates for disabled players return @@ -1049,7 +1059,7 @@ async def on_player_config_change(self, config: PlayerConfig, changed_keys: set[ player.available = False # if the player was playing, restart playback elif not player_disabled and player.state == PlayerState.PLAYING: - self.mass.call_later(1, self.mass.player_queues.resume(player.active_source)) + self.mass.call_later(1, self.mass.player_queues.resume, player.active_source) # check for group memberships that need to be updated if player_disabled and player.active_group and player_provider: # try to remove from the group diff --git a/music_assistant/server/providers/hass/__init__.py b/music_assistant/server/providers/hass/__init__.py index 5b1cd6482..a365b5a56 100644 --- a/music_assistant/server/providers/hass/__init__.py +++ b/music_assistant/server/providers/hass/__init__.py @@ -203,4 +203,4 @@ async def _hass_listener(self) -> None: self.logger.warning("Connection to HA lost due to error: %s", err) self.logger.info("Connection to HA lost. Connection will be automatically retried later.") # schedule a reload of the provider - self.mass.call_later(5, self.mass.load_provider(self.instance_id, allow_retry=True)) + self.mass.call_later(5, self.mass.load_provider, self.instance_id, allow_retry=True) diff --git a/music_assistant/server/providers/plex/__init__.py b/music_assistant/server/providers/plex/__init__.py index b9945352f..748b65bfc 100644 --- a/music_assistant/server/providers/plex/__init__.py +++ b/music_assistant/server/providers/plex/__init__.py @@ -358,8 +358,7 @@ def connect() -> PlexServer: except plexapi.exceptions.BadRequest as err: if "Invalid token" in str(err): # token invalid, invalidate the config - self.mass.call_later( - 0, + self.mass.create_task( self.mass.config.remove_provider_config_value( self.instance_id, CONF_AUTH_TOKEN ), diff --git a/music_assistant/server/providers/snapcast/__init__.py b/music_assistant/server/providers/snapcast/__init__.py index c2916893c..28a4e9a30 100644 --- a/music_assistant/server/providers/snapcast/__init__.py +++ b/music_assistant/server/providers/snapcast/__init__.py @@ -727,4 +727,4 @@ def _handle_disconnect(self, exc: Exception) -> None: str(exc), ) # schedule a reload of the provider - self.mass.call_later(5, self.mass.load_provider(self.instance_id, allow_retry=True)) + self.mass.call_later(5, self.mass.load_provider, self.instance_id, allow_retry=True) diff --git a/music_assistant/server/providers/sonos/provider.py b/music_assistant/server/providers/sonos/provider.py index 690f4ff1c..6cf4c0fe8 100644 --- a/music_assistant/server/providers/sonos/provider.py +++ b/music_assistant/server/providers/sonos/provider.py @@ -112,7 +112,7 @@ async def on_mdns_service_state_change( # handle new player setup in a delayed task because mdns announcements # can arrive in (duplicated) bursts task_id = f"setup_sonos_{player_id}" - self.mass.call_later(5, self._setup_player(player_id, name, info), task_id=task_id) + self.mass.call_later(5, self._setup_player, player_id, name, info, task_id=task_id) async def get_player_config_entries( self, @@ -237,7 +237,7 @@ async def play_media( await self.mass.players.cmd_unsync_many(group_childs) await self.mass.players.play_media(airplay.player_id, media) if group_childs: - self.mass.call_later(5, self.cmd_sync_many(player_id, group_childs)) + self.mass.call_later(5, self.cmd_sync_many, player_id, group_childs) return if media.queue_id and media.queue_id.startswith("ugp_"):