Chore: unwrap uri's in add to playlist
authorMarcel van der Veldt <m.vanderveldt@outlook.com>
Tue, 25 Feb 2025 18:26:38 +0000 (19:26 +0100)
committerMarcel van der Veldt <m.vanderveldt@outlook.com>
Tue, 25 Feb 2025 18:26:38 +0000 (19:26 +0100)
music_assistant/controllers/media/playlists.py

index fe2b0dc4751c3878df558773b8b269d5ded89ab1..c0fa264022fe7dbb8e7fe511a224ffe4fdbcf3a5 100644 (file)
@@ -116,10 +116,41 @@ class PlaylistController(MediaControllerBase[Playlist]):
             cur_playlist_track_uris.add(item.item_id)
             cur_playlist_track_uris.add(item.uri)
 
+        # unwrap all uri's to track uri's
+        unwrapped_uris: list[str] = []
+        for uri in uris:
+            # URI could be a playlist or album uri, unwrap it
+            if not ("://" in uri and len(uri.split("/")) >= 4):
+                # NOT a music assistant-style uri (provider://media_type/item_id)
+                self.logger.warning(
+                    "Not adding %s to playlist %s - not a valid uri", uri, playlist.name
+                )
+                continue
+            # music assistant-style uri
+            # provider://media_type/item_id
+            provider_instance_id_or_domain, rest = uri.split("://", 1)
+            media_type_str, item_id = rest.split("/", 1)
+            media_type = MediaType(media_type_str)
+            if media_type == MediaType.ALBUM:
+                for track in await self.mass.music.albums.tracks(
+                    item_id, provider_instance_id_or_domain
+                ):
+                    unwrapped_uris.append(track.uri)
+            elif media_type == MediaType.PLAYLIST:
+                for track in await self.tracks(item_id, provider_instance_id_or_domain):
+                    unwrapped_uris.append(track.uri)
+            elif media_type == MediaType.TRACK:
+                unwrapped_uris.append(uri)
+            else:
+                self.logger.warning(
+                    "Not adding %s to playlist %s - not a track", uri, playlist.name
+                )
+                continue
+
         # work out the track id's that need to be added
         # filter out duplicates and items that not exist on the provider.
         ids_to_add: set[str] = set()
-        for uri in uris:
+        for uri in unwrapped_uris:
             # skip if item already in the playlist
             if uri in cur_playlist_track_uris:
                 self.logger.info(
@@ -141,14 +172,6 @@ class PlaylistController(MediaControllerBase[Playlist]):
                 )
                 continue
 
-            # skip non-track items
-            # TODO: revisit this once we support audiobooks and podcasts ?
-            if media_type != MediaType.TRACK:
-                self.logger.warning(
-                    "Not adding %s to playlist %s - not a track", uri, playlist.name
-                )
-                continue
-
             # special: the builtin provider can handle uri's from all providers (with uri as id)
             if provider_instance_id_or_domain != "library" and playlist_prov.domain == "builtin":
                 # note: we try not to add library uri's to the builtin playlists