Jellyfin: Add pagination for get_library_albums and get_library_artists
authorJohn Carr <john.carr@unrouted.co.uk>
Tue, 18 Jun 2024 09:26:08 +0000 (10:26 +0100)
committerJohn Carr <john.carr@unrouted.co.uk>
Tue, 18 Jun 2024 12:59:57 +0000 (13:59 +0100)
music_assistant/server/providers/jellyfin/__init__.py
music_assistant/server/providers/jellyfin/manifest.json
requirements_all.txt

index 1407855cd2140755fa010990fe7ff1a2190fd12a..64cc0ba604928ccbfb0a4baec67a31ec98ac2114 100644 (file)
@@ -530,22 +530,61 @@ class JellyfinProvider(MusicProvider):
         """Retrieve all library artists from Jellyfin Music."""
         jellyfin_libraries = await self._get_music_libraries()
         for jellyfin_library in jellyfin_libraries:
+            offset = 0
+            limit = 100
+
             response = await self._client.artists(
-                jellyfin_library[ITEM_KEY_ID], enable_user_data=True, fields=ARTIST_FIELDS
+                jellyfin_library[ITEM_KEY_ID],
+                start_index=offset,
+                limit=limit,
+                enable_user_data=True,
+                fields=ARTIST_FIELDS,
             )
-            artists_obj = response["Items"]
-            for artist in artists_obj:
+            for artist in response["Items"]:
                 yield self._parse_artist(artist)
 
+            while offset < response["TotalRecordCount"]:
+                response = await self._client.artists(
+                    jellyfin_library[ITEM_KEY_ID],
+                    start_index=offset,
+                    limit=limit,
+                    enable_user_data=True,
+                    fields=ARTIST_FIELDS,
+                )
+                for artist in response["Items"]:
+                    yield self._parse_artist(artist)
+
+                offset += limit
+
     async def get_library_albums(self) -> AsyncGenerator[Album, None]:
         """Retrieve all library albums from Jellyfin Music."""
         jellyfin_libraries = await self._get_music_libraries()
         for jellyfin_library in jellyfin_libraries:
-            albums = await self._client.albums(
-                jellyfin_library[ITEM_KEY_ID], fields=ALBUM_FIELDS, enable_user_data=True
+            offset = 0
+            limit = 100
+
+            response = await self._client.albums(
+                jellyfin_library[ITEM_KEY_ID],
+                start_index=offset,
+                limit=limit,
+                enable_user_data=True,
+                fields=ALBUM_FIELDS,
             )
-            for album in albums["Items"]:
-                yield self._parse_album(album)
+            for artist in response["Items"]:
+                yield self._parse_album(artist)
+
+            while offset < response["TotalRecordCount"]:
+                response = await self._client.albums(
+                    jellyfin_library[ITEM_KEY_ID],
+                    start_index=offset,
+                    limit=limit,
+                    enable_user_data=True,
+                    fields=ALBUM_FIELDS,
+                )
+                for artist in response["Items"]:
+                    yield self._parse_album(artist)
+
+                offset += limit
 
     async def get_library_tracks(self) -> AsyncGenerator[Track, None]:
         """Retrieve library tracks from Jellyfin Music."""
index 451259ac130341cd04fac124d3753223ca02efff..fb8650668889de3a15be8b000d8b86375685fd61 100644 (file)
@@ -4,7 +4,7 @@
   "name": "Jellyfin Media Server Library",
   "description": "Support for the Jellyfin streaming provider in Music Assistant.",
   "codeowners": ["@lokiberra", "@Jc2k"],
-  "requirements": ["aiojellyfin==0.2.0"],
+  "requirements": ["aiojellyfin==0.3.0"],
   "documentation": "https://music-assistant.io/music-providers/jellyfin/",
   "multi_instance": true
 }
index 65237d0d2f662469f651ff86a5c069ead530c975..781454ef8aa4ba73073134e35507bfa7f6201338 100644 (file)
@@ -4,7 +4,7 @@ Brotli>=1.0.9
 aiodns>=3.0.0
 aiofiles==23.2.1
 aiohttp==3.9.5
-aiojellyfin==0.2.0
+aiojellyfin==0.3.0
 aiorun==2024.5.1
 aioslimproto==3.0.1
 aiosqlite==0.20.0