From: Marcel van der Veldt Date: Wed, 2 Apr 2025 23:22:49 +0000 (+0200) Subject: Chore: tweak enqueue next a tiny bit X-Git-Url: https://git.kitaultman.com/?a=commitdiff_plain;h=4f4c4135baa185df3848114aca7b429446595710;p=music-assistant-server.git Chore: tweak enqueue next a tiny bit --- diff --git a/music_assistant/controllers/player_queues.py b/music_assistant/controllers/player_queues.py index 6d9b6236..112b0a79 100644 --- a/music_assistant/controllers/player_queues.py +++ b/music_assistant/controllers/player_queues.py @@ -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 ( diff --git a/music_assistant/providers/chromecast/__init__.py b/music_assistant/providers/chromecast/__init__.py index 66325fec..1156f5ed 100644 --- a/music_assistant/providers/chromecast/__init__.py +++ b/music_assistant/providers/chromecast/__init__.py @@ -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.""" diff --git a/music_assistant/providers/dlna/__init__.py b/music_assistant/providers/dlna/__init__.py index c004c19e..c8ed06d1 100644 --- a/music_assistant/providers/dlna/__init__.py +++ b/music_assistant/providers/dlna/__init__.py @@ -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: diff --git a/music_assistant/providers/sonos_s1/__init__.py b/music_assistant/providers/sonos_s1/__init__.py index 462d1d10..72c4090d 100644 --- a/music_assistant/providers/sonos_s1/__init__.py +++ b/music_assistant/providers/sonos_s1/__init__.py @@ -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."""