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)
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(
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
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 (
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."""