Fix queue state when active but idle
authorMarcel van der Veldt <m.vanderveldt@outlook.com>
Wed, 17 Dec 2025 00:37:07 +0000 (01:37 +0100)
committerMarcel van der Veldt <m.vanderveldt@outlook.com>
Wed, 17 Dec 2025 00:37:07 +0000 (01:37 +0100)
music_assistant/controllers/player_queues.py

index f766c807c6271b523d30e641882c2da22577a270..67b407b7f71575ee9abcad9350a7640c341608b3 100644 (file)
@@ -1096,7 +1096,7 @@ class PlayerQueuesController(CoreController):
             # do nothing while the announcement is in progress
             return
         # determine if this queue is currently active for this player
-        queue.active = player.active_source == queue.queue_id
+        queue.active = player.active_source in (queue.queue_id, None)
         if not queue.active and queue_id not in self._prev_states:
             queue.state = PlaybackState.IDLE
             # return early if the queue is not active and we have no previous state
@@ -2070,6 +2070,15 @@ class PlayerQueuesController(CoreController):
             queue.elapsed_time = elapsed_time
             queue.elapsed_time_last_updated = time.time()
 
+        elif not queue.current_item and queue.current_index is not None:
+            current_index = queue.current_index
+            queue.current_item = current_item = self.get_item(queue_id, current_index)
+            queue.next_item = (
+                self.get_next_item(queue_id, current_index)
+                if current_item and current_index is not None
+                else None
+            )
+
         # This is enough to detect any changes in the DSPDetails
         # (so child count changed, or any output format changed)
         output_formats = []
@@ -2121,6 +2130,12 @@ class PlayerQueuesController(CoreController):
         with suppress(KeyError):
             changed_keys.remove("next_item_id")
 
+        # store the new state
+        if queue.active:
+            self._prev_states[queue_id] = new_state
+        else:
+            self._prev_states.pop(queue_id, None)
+
         # return early if nothing changed
         if len(changed_keys) == 0:
             return
@@ -2147,12 +2162,6 @@ class PlayerQueuesController(CoreController):
             # also signal update to the player itself so it can update its current_media
             self.mass.players.trigger_player_update(queue_id)
 
-        # store the new state
-        if queue.active:
-            self._prev_states[queue_id] = new_state
-        else:
-            self._prev_states.pop(queue_id, None)
-
         if "output_formats" in changed_keys:
             # refresh DSP details since they may have changed
             dsp = get_stream_dsp_details(self.mass, queue_id)