fix playlist playback
authorMarcel van der Veldt <m.vanderveldt@outlook.com>
Tue, 7 May 2024 20:33:48 +0000 (22:33 +0200)
committerMarcel van der Veldt <m.vanderveldt@outlook.com>
Tue, 7 May 2024 20:33:48 +0000 (22:33 +0200)
music_assistant/server/controllers/player_queues.py

index 8258ac39b3e944aef4f15ba6713278dfd260124a..d646b539fcfffd04ff35e50469302af46a6a3094 100644 (file)
@@ -33,6 +33,8 @@ from music_assistant.common.models.media_items import (
     AlbumTrack,
     MediaItemType,
     PagedItems,
+    Playlist,
+    PlaylistTrack,
     media_from_dict,
 )
 from music_assistant.common.models.player import PlayerMedia
@@ -338,15 +340,10 @@ class PlayerQueuesController(CoreController):
                         self.clear(queue_id)
 
                 # collect tracks to play
-                ctrl = self.mass.music.get_controller(media_item.media_type)
                 if radio_mode:
                     radio_source.append(media_item)
                 elif media_item.media_type == MediaType.PLAYLIST:
-                    async for playlist_track in ctrl.tracks(
-                        media_item.item_id, media_item.provider
-                    ):
-                        tracks.append(playlist_track)
-                        await asyncio.sleep(0)  # yield to eventloop
+                    tracks += await self.get_playlist_tracks(media_item)
                     await self.mass.music.mark_item_played(
                         media_item.media_type, media_item.item_id, media_item.provider
                     )
@@ -1219,6 +1216,24 @@ class PlayerQueuesController(CoreController):
             in_library_only=album_items_conf == "library_tracks",
         )
 
+    async def get_playlist_tracks(self, playlist: Playlist) -> list[PlaylistTrack]:
+        """Return all tracks for given playlist."""
+        result: list[PlaylistTrack] = []
+        offset = 0
+        limit = 50
+        while True:
+            paged_items = await self.mass.music.playlists.tracks(
+                item_id=playlist.item_id,
+                provider_instance_id_or_domain=playlist.provider,
+                offset=offset,
+                limit=limit,
+            )
+            result += paged_items.items
+            if paged_items.count < limit:
+                break
+            offset += paged_items.count
+        return result
+
     def __get_queue_stream_index(self, queue: PlayerQueue, player: Player) -> tuple[int, int]:
         """Calculate current queue index and current track elapsed time."""
         # player is playing a constant stream so we need to do this the hard way