From f2c30347988e5c31799a9ef9efa4f19e5eff1e60 Mon Sep 17 00:00:00 2001 From: Eric Munson Date: Sun, 23 Nov 2025 11:34:47 -0500 Subject: [PATCH] Subsonic: Support syncing favorites to subsonic server (#2663) --- .../providers/opensubsonic/sonic_provider.py | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/music_assistant/providers/opensubsonic/sonic_provider.py b/music_assistant/providers/opensubsonic/sonic_provider.py index 2797b673..e8d058ba 100644 --- a/music_assistant/providers/opensubsonic/sonic_provider.py +++ b/music_assistant/providers/opensubsonic/sonic_provider.py @@ -239,6 +239,32 @@ class OpenSonicProvider(MusicProvider): return SearchResults(artists=ar, albums=al, tracks=tr) + async def set_favorite(self, prov_item_id: str, media_type: MediaType, favorite: bool) -> None: + """Set or clear favorite on the server.""" + # The subsonic spec does not support favorite-ing anything but artists, albums, and tracks + if media_type not in (MediaType.ARTIST, MediaType.ALBUM, MediaType.TRACK): + return + + track_ids: list[str] = [] + album_ids: list[str] = [] + artist_ids: list[str] = [] + + if media_type == MediaType.ARTIST: + artist_ids.append(prov_item_id) + elif media_type == MediaType.ALBUM: + album_ids.append(prov_item_id) + elif media_type == MediaType.TRACK: + track_ids.append(prov_item_id) + + if favorite: + await self._run_async( + self.conn.star, sids=track_ids, album_ids=album_ids, artist_ids=artist_ids + ) + else: + await self._run_async( + self.conn.unstar, sids=track_ids, album_ids=album_ids, artist_ids=artist_ids + ) + async def get_library_artists(self) -> AsyncGenerator[Artist, None]: """Provide a generator for reading all artists.""" artists = await self._run_async(self.conn.get_artists) -- 2.34.1