a few tweaks to builtin playlists
authorMarcel van der Veldt <m.vanderveldt@outlook.com>
Wed, 21 Aug 2024 08:18:01 +0000 (10:18 +0200)
committerMarcel van der Veldt <m.vanderveldt@outlook.com>
Wed, 21 Aug 2024 08:18:01 +0000 (10:18 +0200)
music_assistant/server/providers/builtin/__init__.py

index 31dfc25eb8664c6c61927a8c5870ad80bb013dbe..1b6dca44272a74b317914d779b51c7cf28402441 100644 (file)
@@ -549,28 +549,38 @@ class BuiltinProvider(MusicProvider):
         return result
 
     async def _get_builtin_playlist_random_album(self) -> list[Track]:
-        result: list[Track] = []
-        for random_album in await self.mass.music.albums.library_items(limit=1, order_by="random"):
-            tracks = await self.mass.music.albums.tracks(
-                random_album.item_id, random_album.provider
-            )
-            for idx, track in enumerate(tracks, 1):
-                track.position = idx
-                result.append(track)
-        return result
+        for in_library_only in (True, False):
+            for min_tracks_required in (10, 5, 1):
+                for random_album in await self.mass.music.albums.library_items(
+                    limit=25, order_by="random"
+                ):
+                    tracks = await self.mass.music.albums.tracks(
+                        random_album.item_id, random_album.provider, in_library_only=in_library_only
+                    )
+                    if len(tracks) < min_tracks_required:
+                        continue
+                    for idx, track in enumerate(tracks, 1):
+                        track.position = idx
+                    return tracks
+        return []
 
     async def _get_builtin_playlist_random_artist(self) -> list[Track]:
-        result: list[Track] = []
-        for random_artist in await self.mass.music.artists.library_items(
-            limit=1, order_by="random"
-        ):
-            tracks = await self.mass.music.artists.tracks(
-                random_artist.item_id, random_artist.provider
-            )
-            for idx, track in enumerate(tracks, 1):
-                track.position = idx
-                result.append(track)
-        return result
+        for in_library_only in (True, False):
+            for min_tracks_required in (25, 10, 5, 1):
+                for random_artist in await self.mass.music.artists.library_items(
+                    limit=25, order_by="random"
+                ):
+                    tracks = await self.mass.music.artists.tracks(
+                        random_artist.item_id,
+                        random_artist.provider,
+                        in_library_only=in_library_only,
+                    )
+                    if len(tracks) < min_tracks_required:
+                        continue
+                    for idx, track in enumerate(tracks, 1):
+                        track.position = idx
+                    return tracks
+        return []
 
     async def _get_builtin_playlist_recently_played(self) -> list[Track]:
         result: list[Track] = []