Chore: tweak enqueue next a tiny bit
authorMarcel van der Veldt <m.vanderveldt@outlook.com>
Wed, 2 Apr 2025 23:22:49 +0000 (01:22 +0200)
committerMarcel van der Veldt <m.vanderveldt@outlook.com>
Wed, 2 Apr 2025 23:28:52 +0000 (01:28 +0200)
music_assistant/controllers/player_queues.py
music_assistant/providers/chromecast/__init__.py
music_assistant/providers/dlna/__init__.py
music_assistant/providers/sonos_s1/__init__.py

index 6d9b6236505435be486e3c221c106d0610deaecd..112b0a796bf56437da76615630e48560c5c97ba8 100644 (file)
@@ -1100,6 +1100,9 @@ class PlayerQueuesController(CoreController):
         queue.index_in_buffer = self.index_by_id(queue_id, item_id)
         self.logger.debug("PlayerQueue %s loaded item %s in buffer", queue.display_name, item_id)
         self.signal_update(queue_id)
+        # enqueue the item on the player as soon as one is loaded
+        if next_item := self.get_next_item(queue_id, item_id):
+            self._enqueue_next_item(queue_id, next_item)
         # preload next streamdetails
         self._preload_next_item(queue_id, item_id)
 
@@ -1469,12 +1472,13 @@ class PlayerQueuesController(CoreController):
                 player_id=queue_id,
                 media=await self.player_media_from_queue_item(next_item, False),
             )
-            queue.next_item_id_enqueued = next_item.queue_item_id
-            self.logger.debug(
-                "Enqueued next track %s on queue %s",
-                next_item.name,
-                self._queues[queue_id].display_name,
-            )
+            if queue.next_item_id_enqueued != next_item.queue_item_id:
+                queue.next_item_id_enqueued = next_item.queue_item_id
+                self.logger.debug(
+                    "Enqueued next track %s on queue %s",
+                    next_item.name,
+                    self._queues[queue_id].display_name,
+                )
 
         task_id = f"enqueue_next_item_{queue_id}"
         self.mass.create_task(
@@ -1492,9 +1496,14 @@ class PlayerQueuesController(CoreController):
 
         async def _preload_streamdetails() -> None:
             try:
-                await self.preload_next_queue_item(queue_id, item_id_in_buffer)
+                next_item = await self.preload_next_queue_item(queue_id, item_id_in_buffer)
             except QueueEmpty:
                 return
+            # always send enqueue next (even though we may have already sent that)
+            # because it could have been changed and also because some players
+            # sometimes miss the enqueue_next call when its sent too short after
+            # the play_media call, so consider this a safety net.
+            self._enqueue_next_item(queue_id, next_item)
 
         if not (current_item := self.get_item(queue_id, item_id_in_buffer)):
             # this should not happen, but guard anyways
@@ -1765,10 +1774,6 @@ class PlayerQueuesController(CoreController):
             if queue.next_item and queue.next_item.streamdetails:
                 queue.next_item.streamdetails.dsp = dsp
 
-        if queue.next_item and queue.next_item_id_enqueued != queue.next_item.queue_item_id:
-            # the next item has changed, so we need to enqueue the new one
-            self._enqueue_next_item(queue_id, queue.next_item)
-            queue.next_item_id_enqueued = queue.next_item.queue_item_id
         # handle sending a playback progress report
         # we do this every 30 seconds or when the state changes
         if (
index 66325fece8113af91b6d7e94629aa8c32c26a14f..1156f5edbd3718a7e693a91b41f937e7ad6d9d7e 100644 (file)
@@ -318,11 +318,6 @@ class ChromecastProvider(PlayerProvider):
         media_controller = castplayer.cc.media_controller
         queuedata["mediaSessionId"] = media_controller.status.media_session_id
         await asyncio.to_thread(media_controller.send_message, data=queuedata, inc_session_id=True)
-        self.logger.debug(
-            "Enqued next track (%s) to player %s",
-            media.title or media.uri,
-            castplayer.player.display_name,
-        )
 
     async def poll_player(self, player_id: str) -> None:
         """Poll player for state updates."""
index c004c19e57c4b6493a8c538ca3e3435f95cd975d..c8ed06d1073554ec251b8d195c5e14c89a470490 100644 (file)
@@ -325,12 +325,6 @@ class DLNAPlayerProvider(PlayerProvider):
                 "Enable 'flow mode' for this player.",
                 dlna_player.player.display_name,
             )
-        else:
-            self.logger.debug(
-                "Enqued next track (%s) to player %s",
-                title,
-                dlna_player.player.display_name,
-            )
 
     @catch_request_errors
     async def cmd_pause(self, player_id: str) -> None:
index 462d1d10eaa66a9c2a431d0f1fffe80ccef8567e..72c4090d49e4b1e6f96df22922f4111dbbf4de1e 100644 (file)
@@ -326,12 +326,6 @@ class SonosPlayerProvider(PlayerProvider):
             self.logger.warning(
                 "Unable to enqueue next track on player: %s: %s", sonos_player.zone_name, err
             )
-        else:
-            self.logger.debug(
-                "Enqued next track (%s) to player %s",
-                media.title or media.uri,
-                sonos_player.soco.player_name,
-            )
 
     async def poll_player(self, player_id: str) -> None:
         """Poll player for state updates."""