From 3abd18be6bb9c12dfcdfeb1ab3be612d9f717445 Mon Sep 17 00:00:00 2001 From: Eric Munson Date: Wed, 24 Jan 2024 12:48:57 -0500 Subject: [PATCH] Some fixes to the Subsonic provider (#1027) --- .../providers/opensubsonic/manifest.json | 2 +- .../providers/opensubsonic/sonic_provider.py | 25 +++++++++++++------ requirements_all.txt | 2 +- 3 files changed, 19 insertions(+), 10 deletions(-) diff --git a/music_assistant/server/providers/opensubsonic/manifest.json b/music_assistant/server/providers/opensubsonic/manifest.json index cdc9904d..0fe2a1df 100644 --- a/music_assistant/server/providers/opensubsonic/manifest.json +++ b/music_assistant/server/providers/opensubsonic/manifest.json @@ -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 } diff --git a/music_assistant/server/providers/opensubsonic/sonic_provider.py b/music_assistant/server/providers/opensubsonic/sonic_provider.py index bd3c14bf..f5a37423 100644 --- a/music_assistant/server/providers/opensubsonic/sonic_provider.py +++ b/music_assistant/server/providers/opensubsonic/sonic_provider.py @@ -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: diff --git a/requirements_all.txt b/requirements_all.txt index 0a5ebab6..0e4a4fc2 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -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 -- 2.34.1