Add Recommendations to nugs.net (#2492)
authorbrian10048 <brian@mcmpest.com>
Wed, 8 Oct 2025 16:50:49 +0000 (12:50 -0400)
committerGitHub <noreply@github.com>
Wed, 8 Oct 2025 16:50:49 +0000 (18:50 +0200)
music_assistant/providers/nugs/__init__.py

index 731103c0188d1468c0b16f6562d703ce5453be5b..6969985ecc20cd10134becb891efbed93a78526c 100644 (file)
@@ -32,6 +32,7 @@ from music_assistant_models.media_items import (
     MediaItemMetadata,
     Playlist,
     ProviderMapping,
+    RecommendationFolder,
     Track,
     UniqueList,
 )
@@ -56,6 +57,7 @@ SUPPORTED_FEATURES = {
     ProviderFeature.LIBRARY_ALBUMS,
     ProviderFeature.LIBRARY_PLAYLISTS,
     ProviderFeature.ARTIST_ALBUMS,
+    ProviderFeature.RECOMMENDATIONS,
 }
 
 
@@ -207,6 +209,46 @@ class NugsProvider(MusicProvider):
             path=stream_url,
         )
 
+    @use_cache(3600 * 4)  # Cache for 4 hours
+    async def recommendations(self) -> list[RecommendationFolder]:
+        """Get this provider's recommendations."""
+        popular = "releases/popular"
+        recom_shows = "me/releases/recommendations"
+        recent = "releases/recent"
+
+        popular_folder = RecommendationFolder(
+            name="Most Popular",
+            item_id="nugs_popular_shows",
+            provider=self.lookup_key,
+        )
+        recommended_folder = RecommendationFolder(
+            name="Recommended Shows",
+            item_id="nugs_recommended_shows",
+            provider=self.lookup_key,
+        )
+        recent_folder = RecommendationFolder(
+            name="Recent Shows",
+            item_id="nugs_recent_shows",
+            provider=self.lookup_key,
+        )
+        popular_data = await self._get_data("catalog", popular, limit=20)
+        for item in popular_data["items"]:
+            endpoint = f"shows/{item['id']}"
+            response = await self._get_data("catalog", endpoint)
+            popular_folder.items.append(self._parse_album(response["Response"]))
+        recommended_data = await self._get_data("catalog", recom_shows)
+        for item in recommended_data["items"]:
+            recommended_folder.items.append(self._parse_album(item))
+        recent_data = await self._get_data("catalog", recent, limit=50)
+        for item in recent_data["items"]:
+            recent_folder.items.append(self._parse_album(item))
+
+        return [
+            popular_folder,
+            recommended_folder,
+            recent_folder,
+        ]
+
     def _parse_artist(self, artist_obj: dict[str, Any]) -> Artist:
         """Parse nugs artist object to generic layout."""
         artist_id = artist_obj.get("artistID") or artist_obj.get("id")
@@ -459,11 +501,10 @@ class NugsProvider(MusicProvider):
         headers = {}
         url: str | None = None
         timeout = ClientTimeout(total=120)
-        if nugs_api in ("stash", "subscription", "user"):
-            tokeninfo = kwargs.pop("tokeninfo", None)
-            if tokeninfo is None:
-                tokeninfo = await self.login()
-            headers = {"Authorization": f"Bearer {tokeninfo}"}
+        tokeninfo = kwargs.pop("tokeninfo", None)
+        if tokeninfo is None:
+            tokeninfo = await self.login()
+        headers = {"Authorization": f"Bearer {tokeninfo}"}
         if nugs_api == "catalog":
             url = f"https://catalog.nugs.net/api/v1/{endpoint}"
         if nugs_api == "stash":