From ac42188601a174097f72611a1c0b672e8b716f76 Mon Sep 17 00:00:00 2001 From: Chris Date: Thu, 12 Feb 2026 14:24:47 -0600 Subject: [PATCH] Add save_as_playlist command to player queue controller (#3149) --- music_assistant/controllers/player_queues.py | 24 ++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/music_assistant/controllers/player_queues.py b/music_assistant/controllers/player_queues.py index d4063bdf..d30f26c8 100644 --- a/music_assistant/controllers/player_queues.py +++ b/music_assistant/controllers/player_queues.py @@ -65,6 +65,7 @@ from music_assistant_models.queue_item import QueueItem from music_assistant.constants import ( ATTR_ANNOUNCEMENT_IN_PROGRESS, MASS_LOGO_ONLINE, + PLAYLIST_MEDIA_TYPES, VERBOSE_LOG_LEVEL, PlaylistPlayableItem, ) @@ -680,6 +681,29 @@ class PlayerQueuesController(CoreController): queue.index_in_buffer = None self.update_items(queue_id, []) + @api_command("player_queues/save_as_playlist") + async def save_as_playlist(self, queue_id: str, name: str) -> Playlist: + """Save the current queue items as a new playlist. + + :param queue_id: The queue_id of the queue to save. + :param name: The name for the new playlist. + """ + if not self.get(queue_id): + raise PlayerUnavailableError(f"Queue {queue_id} is not available") + queue_items = self._queue_items.get(queue_id, []) + if not queue_items: + raise QueueEmpty("Cannot save an empty queue as a playlist.") + # collect URIs from queue items that are playlist-compatible + uris: list[str] = [] + for item in queue_items: + if item.uri and item.media_type in PLAYLIST_MEDIA_TYPES: + uris.append(item.uri) + if not uris: + raise InvalidDataError("No valid items in queue to save as playlist.") + playlist = await self.mass.music.playlists.create_playlist(name) + await self.mass.music.playlists.add_playlist_tracks(playlist.item_id, uris) + return playlist + @api_command("player_queues/stop") async def stop(self, queue_id: str) -> None: """ -- 2.34.1