Some fixes to the Subsonic provider (#1027)
authorEric Munson <eric@munsonfam.org>
Wed, 24 Jan 2024 17:48:57 +0000 (12:48 -0500)
committerGitHub <noreply@github.com>
Wed, 24 Jan 2024 17:48:57 +0000 (18:48 +0100)
music_assistant/server/providers/opensubsonic/manifest.json
music_assistant/server/providers/opensubsonic/sonic_provider.py
requirements_all.txt

index cdc9904dcfbe0c0f36fae7048d40994c38562558..0fe2a1df515327606c7a43d556f1e6330433b8a7 100644 (file)
@@ -4,7 +4,7 @@
   "name": "Open Subsonic Media Server Library",
   "description": "Support for Open Subsonic based streaming providers in Music Assistant.",
   "codeowners": ["@khers"],
-  "requirements": ["py-opensonic>=5.0.1"],
+  "requirements": ["py-opensonic>=5.0.2"],
   "documentation": "https://github.com/orgs/music-assistant/discussions/1806",
   "multi_instance": true
 }
index bd3c14bfe38c335a82110df9d049526ae7a20629..f5a374236390aeaba67c7e867d84f0a8a8fe811d 100644 (file)
@@ -238,9 +238,10 @@ class OpenSonicProvider(MusicProvider):
                 type=ImageType.THUMB, path=sonic_album.cover_id, provider=self.instance_id
             ),
         ]
-        album.artists.append(
-            self._get_item_mapping(MediaType.ARTIST, sonic_album.artist_id, sonic_album.artist)
-        )
+        if sonic_album.artist_id is not None and sonic_album.artist is not None:
+            album.artists.append(
+                self._get_item_mapping(MediaType.ARTIST, sonic_album.artist_id, sonic_album.artist)
+            )
 
         if sonic_info:
             if sonic_info.small_url:
@@ -259,11 +260,16 @@ class OpenSonicProvider(MusicProvider):
             track_class = PlaylistTrack
         else:
             track_class = AlbumTrack
+
+        mapping = None
+        if sonic_song.album_id is not None and sonic_song.album is not None:
+            mapping = self._get_item_mapping(MediaType.ALBUM, sonic_song.album_id, sonic_song.album)
+
         track = track_class(
             item_id=sonic_song.id,
             provider=self.instance_id,
             name=sonic_song.title,
-            album=self._get_item_mapping(MediaType.ALBUM, sonic_song.album_id, sonic_song.album),
+            album=mapping,
             duration=sonic_song.duration if sonic_song.duration is not None else 0,
             **extra_init_kwargs or {},
             provider_mappings={
@@ -282,13 +288,15 @@ class OpenSonicProvider(MusicProvider):
         if not extra_init_kwargs:
             track.track_number = int(sonic_song.track) if sonic_song.track is not None else 1
 
-        track.artists.append(
-            self._get_item_mapping(MediaType.ARTIST, sonic_song.artist_id, sonic_song.artist)
-        )
+        if sonic_song.artist_id is not None and sonic_song.artist is not None:
+            track.artists.append(
+                self._get_item_mapping(MediaType.ARTIST, sonic_song.artist_id, sonic_song.artist)
+            )
         for entry in sonic_song.artists:
             if entry.id == sonic_song.artist_id:
                 continue
-            track.artists.append(self._get_item_mapping(MediaType.ARTIST, entry.id, entry.name))
+            if entry.id is not None and entry.name is not None:
+                track.artists.append(self._get_item_mapping(MediaType.ARTIST, entry.id, entry.name))
         return track
 
     def _parse_playlist(self, sonic_playlist: SonicPlaylist) -> Playlist:
@@ -530,6 +538,7 @@ class OpenSonicProvider(MusicProvider):
                 # keep reading from the audio buffer until there is no more data
                 chunk = await audio_buffer.get()
                 if chunk == b"":
+                    await self._run_async(self._conn.scrobble, streamdetails.item_id)
                     break
                 yield chunk
         finally:
index 0a5ebab611d4ee0798fc469e00b1c7aa81156e2b..0e4a4fc29ed725a9cbfb5745440762231fc70ef7 100644 (file)
@@ -21,7 +21,7 @@ music-assistant-frontend==2.1.0
 orjson==3.9.12
 pillow==10.2.0
 plexapi==4.15.7
-py-opensonic>=5.0.1
+py-opensonic>=5.0.2
 PyChromecast==13.0.8
 pycryptodome==3.20.0
 python-slugify==8.0.1