some cleanup of delayed callbacks
authorMarcel van der Veldt <m.vanderveldt@outlook.com>
Wed, 23 Oct 2024 22:49:46 +0000 (00:49 +0200)
committerMarcel van der Veldt <m.vanderveldt@outlook.com>
Wed, 23 Oct 2024 22:49:46 +0000 (00:49 +0200)
music_assistant/server/controllers/player_queues.py
music_assistant/server/controllers/players.py
music_assistant/server/providers/hass/__init__.py
music_assistant/server/providers/plex/__init__.py
music_assistant/server/providers/snapcast/__init__.py
music_assistant/server/providers/sonos/provider.py

index 07edd95f71cfa6595956f6771d80340813a39f6f..eb8fb902b64499530476147de53d49cea0963bc6 100644 (file)
@@ -1041,7 +1041,7 @@ class PlayerQueuesController(CoreController):
                 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."""
index f796b991f41717743d875c12e6d167d58d14d4b7..dc2e3600bc8f8c88fef52dbeee3677bc006a7e30 100644 (file)
@@ -838,6 +838,16 @@ class PlayerController(CoreController):
         )
         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 @@ class PlayerController(CoreController):
             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
index 5b1cd6482acec9d1d193a760d873bb2b16cf0b67..a365b5a5652c5043537e5747fa3bdc2cbecdab4e 100644 (file)
@@ -203,4 +203,4 @@ class HomeAssistant(PluginProvider):
             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)
index b9945352f401ce8dc574b73d7fa4c66a67f79311..748b65bfca680ab6d0d9fb7bac97a63e6ea98a18 100644 (file)
@@ -358,8 +358,7 @@ class PlexProvider(MusicProvider):
             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
                         ),
index c2916893c6124f4a1d4dd0eb78323529278d2781..28a4e9a3045ef349ddc18c2c21816a76c02b0b29 100644 (file)
@@ -727,4 +727,4 @@ class SnapCastProvider(PlayerProvider):
             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)
index 690f4ff1cbc241f6534224bd8ecf81cbc356b2f9..6cf4c0fe8b3f5b1477f3c344f465983c99366f89 100644 (file)
@@ -112,7 +112,7 @@ class SonosPlayerProvider(PlayerProvider):
         # 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 @@ class SonosPlayerProvider(PlayerProvider):
                 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_"):