Subsonic: Support syncing favorites to subsonic server (#2663)
authorEric Munson <eric@munsonfam.org>
Sun, 23 Nov 2025 16:34:47 +0000 (11:34 -0500)
committerGitHub <noreply@github.com>
Sun, 23 Nov 2025 16:34:47 +0000 (17:34 +0100)
music_assistant/providers/opensubsonic/sonic_provider.py

index 2797b6733a971af3802e62f9614bde59d246c183..e8d058ba1226f0db63e7b3206e143bcf242a355b 100644 (file)
@@ -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)