Make Jellyfin provider compatible with Emby (#1325)
authorkingy444 <toddlesking4@hotmail.com>
Sun, 9 Jun 2024 21:59:57 +0000 (07:59 +1000)
committerGitHub <noreply@github.com>
Sun, 9 Jun 2024 21:59:57 +0000 (23:59 +0200)
music_assistant/server/providers/jellyfin/__init__.py
music_assistant/server/providers/jellyfin/const.py
music_assistant/server/providers/jellyfin/icon.svg

index 500ba369566af87b4bc1be280d050d383537dad3..e67f58eca530e74ac04ce30c718893e16f643652 100644 (file)
@@ -60,6 +60,8 @@ from .const import (
     CLIENT_VERSION,\r
     ITEM_KEY_ALBUM,\r
     ITEM_KEY_ALBUM_ARTIST,\r
+    ITEM_KEY_ALBUM_ARTISTS,\r
+    ITEM_KEY_ALBUM_ID,\r
     ITEM_KEY_ARTIST_ITEMS,\r
     ITEM_KEY_CAN_DOWNLOAD,\r
     ITEM_KEY_COLLECTION_TYPE,\r
@@ -327,18 +329,17 @@ class JellyfinProvider(MusicProvider):
             album.artists.append(\r
                 self._get_item_mapping(\r
                     MediaType.ARTIST,\r
-                    current_jellyfin_album[ITEM_KEY_PARENT_ID],\r
+                    current_jellyfin_album[ITEM_KEY_ALBUM_ARTISTS][0].get(ITEM_KEY_ID),\r
                     current_jellyfin_album[ITEM_KEY_ALBUM_ARTIST],\r
                 )\r
             )\r
         elif len(current_jellyfin_album.get(ITEM_KEY_ARTIST_ITEMS, [])) >= 1:\r
-            num_artists = len(current_jellyfin_album[ITEM_KEY_ARTIST_ITEMS])\r
-            for i in range(num_artists):\r
+            for artist_item in current_jellyfin_album[ITEM_KEY_ARTIST_ITEMS]:\r
                 album.artists.append(\r
                     self._get_item_mapping(\r
                         MediaType.ARTIST,\r
-                        current_jellyfin_album[ITEM_KEY_ARTIST_ITEMS][i][ITEM_KEY_ID],\r
-                        current_jellyfin_album[ITEM_KEY_ARTIST_ITEMS][i][ITEM_KEY_NAME],\r
+                        artist_item[ITEM_KEY_ID],\r
+                        artist_item[ITEM_KEY_NAME],\r
                     )\r
                 )\r
         return album\r
@@ -431,32 +432,25 @@ class JellyfinProvider(MusicProvider):
                     remotely_accessible=False,\r
                 )\r
             ]\r
-        if len(current_jellyfin_track[ITEM_KEY_ARTIST_ITEMS]) >= 1:\r
-            track.artists.append(\r
-                self._get_item_mapping(\r
-                    MediaType.ARTIST,\r
-                    current_jellyfin_track[ITEM_KEY_ARTIST_ITEMS][0][ITEM_KEY_ID],\r
-                    current_jellyfin_track[ITEM_KEY_ARTIST_ITEMS][0][ITEM_KEY_NAME],\r
-                )\r
-            )\r
-            num_artists = len(current_jellyfin_track[ITEM_KEY_ARTIST_ITEMS])\r
-            for i in range(num_artists):\r
+\r
+        if current_jellyfin_track[ITEM_KEY_ARTIST_ITEMS]:\r
+            for artist_item in current_jellyfin_track[ITEM_KEY_ARTIST_ITEMS]:\r
                 track.artists.append(\r
                     self._get_item_mapping(\r
                         MediaType.ARTIST,\r
-                        current_jellyfin_track[ITEM_KEY_ARTIST_ITEMS][i][ITEM_KEY_ID],\r
-                        current_jellyfin_track[ITEM_KEY_ARTIST_ITEMS][i][ITEM_KEY_NAME],\r
+                        artist_item[ITEM_KEY_ID],\r
+                        artist_item[ITEM_KEY_NAME],\r
                     )\r
                 )\r
-        elif ITEM_KEY_PARENT_ID in current_jellyfin_track:\r
+        elif ITEM_KEY_ALBUM_ID in current_jellyfin_track:\r
             parent_album = API.get_item(\r
-                self._jellyfin_server.jellyfin, current_jellyfin_track[ITEM_KEY_PARENT_ID]\r
+                self._jellyfin_server.jellyfin, current_jellyfin_track[ITEM_KEY_ALBUM_ID]\r
             )\r
-            if ITEM_KEY_PARENT_ID in parent_album and ITEM_KEY_ALBUM_ARTIST in parent_album:\r
+            if ITEM_KEY_ALBUM_ID in parent_album and ITEM_KEY_ALBUM_ARTIST in parent_album:\r
                 track.artists.append(\r
                     self._get_item_mapping(\r
                         MediaType.ARTIST,\r
-                        parent_album[ITEM_KEY_PARENT_ID],\r
+                        parent_album[ITEM_KEY_ALBUM_ID],\r
                         parent_album[ITEM_KEY_ALBUM_ARTIST],\r
                     )\r
                 )\r
@@ -464,18 +458,15 @@ class JellyfinProvider(MusicProvider):
                 track.artists.append(await self._parse_artist(name=VARIOUS_ARTISTS_NAME))\r
         else:\r
             track.artists.append(await self._parse_artist(name=VARIOUS_ARTISTS_NAME))\r
-        if (\r
-            ITEM_KEY_PARENT_ID in current_jellyfin_track\r
-            and ITEM_KEY_ALBUM in current_jellyfin_track\r
-        ):\r
+        if ITEM_KEY_ALBUM_ID in current_jellyfin_track and ITEM_KEY_ALBUM in current_jellyfin_track:\r
             track.album = self._get_item_mapping(\r
                 MediaType.ALBUM,\r
-                current_jellyfin_track[ITEM_KEY_PARENT_ID],\r
+                current_jellyfin_track[ITEM_KEY_ALBUM_ID],\r
                 current_jellyfin_track[ITEM_KEY_ALBUM],\r
             )\r
-        elif ITEM_KEY_PARENT_ID in current_jellyfin_track:\r
+        elif ITEM_KEY_ALBUM_ID in current_jellyfin_track:\r
             parent_album = API.get_item(\r
-                self._jellyfin_server.jellyfin, current_jellyfin_track[ITEM_KEY_PARENT_ID]\r
+                self._jellyfin_server.jellyfin, current_jellyfin_track[ITEM_KEY_ALBUM_ID]\r
             )\r
             track.album = self._get_item_mapping(\r
                 MediaType.ALBUM,\r
@@ -581,9 +572,15 @@ class JellyfinProvider(MusicProvider):
         """Retrieve all library artists from Jellyfin Music."""\r
         jellyfin_libraries = await self._get_music_libraries(self._jellyfin_server)\r
         for jellyfin_library in jellyfin_libraries:\r
-            artists_obj = await self._get_children(\r
-                self._jellyfin_server, jellyfin_library[ITEM_KEY_ID], ITEM_TYPE_ARTIST\r
+            response = API._get(\r
+                self._jellyfin_server.jellyfin,\r
+                "Artists",\r
+                {\r
+                    ITEM_KEY_PARENT_ID: jellyfin_library[ITEM_KEY_ID],\r
+                    "ArtistType": "Artist,AlbumArtist",\r
+                },\r
             )\r
+            artists_obj = response["Items"]\r
             for artist in artists_obj:\r
                 yield await self._parse_artist(artist)\r
 \r
@@ -628,7 +625,10 @@ class JellyfinProvider(MusicProvider):
                 self._jellyfin_server, playlist_library[ITEM_KEY_ID], "Playlist"\r
             )\r
             for playlist in playlists_obj:\r
-                if playlist["MediaType"] == "Audio":\r
+                if "MediaType" in playlist:  # Only jellyfin has this property\r
+                    if playlist["MediaType"] == "Audio":\r
+                        yield await self._parse_playlist(playlist)\r
+                else:  # emby playlists are only audio type\r
                     yield await self._parse_playlist(playlist)\r
 \r
     async def get_album(self, prov_album_id) -> Album:\r
@@ -769,7 +769,7 @@ class JellyfinProvider(MusicProvider):
             ITEM_KEY_PARENT_ID: parent_id,\r
         }\r
         if item_type in ITEM_TYPE_ARTIST:\r
-            params["IncludeItemTypes"] = [ITEM_TYPE_MUSICARTISTS, ITEM_TYPE_ARTIST]\r
+            params["IncludeItemTypes"] = f"{ITEM_TYPE_MUSICARTISTS},{ITEM_TYPE_ARTIST}"\r
         else:\r
             params["IncludeItemTypes"] = item_type\r
         if item_type in ITEM_TYPE_AUDIO:\r
index b2197e72fd51cfe337b795e57d48d6536f38f142..2d6f16d1a1b0cd807bdaf82443612cab2cae9f53 100644 (file)
@@ -32,7 +32,9 @@ ITEM_KEY_MUSICBRAINZ_ARTIST: Final = "MusicBrainzArtist"
 ITEM_KEY_MUSICBRAINZ_TRACK: Final = "MusicBrainzTrack"\r
 ITEM_KEY_SORT_NAME: Final = "SortName"\r
 ITEM_KEY_ALBUM_ARTIST: Final = "AlbumArtist"\r
+ITEM_KEY_ALBUM_ARTISTS: Final = "AlbumArtists"\r
 ITEM_KEY_ALBUM: Final = "Album"\r
+ITEM_KEY_ALBUM_ID: Final = "AlbumId"\r
 ITEM_KEY_PARENT_ID: Final = "ParentId"\r
 ITEM_KEY_ARTIST_ITEMS: Final = "ArtistItems"\r
 ITEM_KEY_CAN_DOWNLOAD: Final = "CanDownload"\r
index eff3209a6f9d5d5ea9d3dbb7fee17c873dfafaab..87a6dd39d645350bfdfc4c8795389b0e95aa04ab 100644 (file)
@@ -15,8 +15,6 @@
             <stop offset="1" stop-color="#00a4dc"/>
         </linearGradient>
     </defs>
-    <title>icon-solid-black</title>
-    <rect id="solid-background" width="512" height="512" fill="#000b25"/>
     <g id="icon-solid">
         <path id="inner-shape" d="M256,201.62c-20.44,0-86.23,119.29-76.2,139.43s142.48,19.92,152.4,0S276.47,201.63,256,201.62Z" fill="url(#linear-gradient)"/>
         <path id="outer-shape" d="M256,23.3C194.44,23.3-3.82,382.73,26.41,443.43s429.34,60,459.24,0S317.62,23.3,256,23.3ZM406.51,390.76c-19.59,39.33-281.08,39.77-300.89,0S215.71,115.48,256.06,115.48,426.1,351.42,406.51,390.76Z" fill="url(#linear-gradient)"/>