From 94d26a19d0dce113fd7338c5e9588840d1d5d00b Mon Sep 17 00:00:00 2001 From: Marcel van der Veldt Date: Sat, 24 Aug 2024 22:12:40 +0200 Subject: [PATCH] Add feature to transfer a queue (#1606) --- music_assistant/client/player_queues.py | 15 +++++++++ music_assistant/constants.py | 2 +- .../server/controllers/player_queues.py | 31 +++++++++++++++++++ 3 files changed, 47 insertions(+), 1 deletion(-) diff --git a/music_assistant/client/player_queues.py b/music_assistant/client/player_queues.py index 2a2d4d94..a52bf692 100644 --- a/music_assistant/client/player_queues.py +++ b/music_assistant/client/player_queues.py @@ -214,6 +214,21 @@ class PlayerQueues: start_item=start_item, ) + async def transfer_queue( + self, + source_queue_id: str, + target_queue_id: str, + auto_play: bool | None = None, + ) -> None: + """Transfer queue to another queue.""" + await self.client.send_command( + "player_queues/transfer", + source_queue_id=source_queue_id, + target_queue_id=target_queue_id, + auto_play=auto_play, + require_schema=25, + ) + # Other endpoints/commands async def _get_player_queues(self) -> list[PlayerQueue]: diff --git a/music_assistant/constants.py b/music_assistant/constants.py index 9c2708d1..3d1ced95 100644 --- a/music_assistant/constants.py +++ b/music_assistant/constants.py @@ -3,7 +3,7 @@ import pathlib from typing import Final -API_SCHEMA_VERSION: Final[int] = 24 +API_SCHEMA_VERSION: Final[int] = 25 MIN_SCHEMA_VERSION: Final[int] = 24 diff --git a/music_assistant/server/controllers/player_queues.py b/music_assistant/server/controllers/player_queues.py index ff66ac51..63c4e155 100644 --- a/music_assistant/server/controllers/player_queues.py +++ b/music_assistant/server/controllers/player_queues.py @@ -765,6 +765,37 @@ class PlayerQueuesController(CoreController): task_id=f"play_media_{queue_id}", ) + @api_command("player_queues/transfer") + async def transfer_queue( + self, + source_queue_id: str, + target_queue_id: str, + auto_play: bool | None = None, + ) -> None: + """Transfer queue to another queue.""" + if not (source_queue := self.get(source_queue_id)): + raise PlayerUnavailableError("Queue {source_queue_id} is not available") + if not (target_queue := self.get(target_queue_id)): + raise PlayerUnavailableError("Queue {target_queue_id} is not available") + if auto_play is None: + auto_play = source_queue.state == PlayerState.PLAYING + source_items = self._queue_items[source_queue_id] + target_queue.repeat_mode = source_queue.repeat_mode + target_queue.shuffle_enabled = source_queue.shuffle_enabled + target_queue.radio_source = source_queue.radio_source + target_queue.resume_pos = source_queue.elapsed_time + target_queue.current_index = source_queue.current_index + if source_queue.current_item: + target_queue.current_item = source_queue.current_item + target_queue.current_item.queue_id = target_queue_id + self.clear(source_queue_id) + self.load(target_queue_id, source_items, keep_remaining=False, keep_played=False) + for item in source_items: + item.queue_id = target_queue_id + self.update_items(target_queue_id, source_items) + if auto_play: + await self.resume(target_queue_id) + # Interaction with player async def on_player_register(self, player: Player) -> None: -- 2.34.1