Fix: don't crash recommendations if one provider fails
authorMarcel van der Veldt <m.vanderveldt@outlook.com>
Thu, 3 Apr 2025 13:05:55 +0000 (15:05 +0200)
committerMarcel van der Veldt <m.vanderveldt@outlook.com>
Thu, 3 Apr 2025 13:05:55 +0000 (15:05 +0200)
music_assistant/controllers/music.py

index 7c7ec682843606083df0b81b4573383e9bae3622..223c924ebc035843eb81270a507b94c36619a341 100644 (file)
@@ -560,7 +560,7 @@ class MusicController(CoreController):
         results_per_provider: list[list[RecommendationFolder]] = await asyncio.gather(
             self._get_default_recommendations(),
             *[
-                provider_instance.recommendations()
+                self._get_provider_recommendations(provider_instance)
                 for provider_instance in recommendation_providers
             ],
         )
@@ -1192,6 +1192,21 @@ class MusicController(CoreController):
             ),
         ]
 
+    async def _get_provider_recommendations(
+        self, provider: MusicProvider
+    ) -> list[RecommendationFolder]:
+        """Return recommendations from a provider."""
+        try:
+            return await provider.recommendations()
+        except Exception as err:
+            self.logger.warning(
+                "Error while fetching recommendations from %s: %s",
+                provider.name,
+                str(err),
+                exc_info=err if self.logger.isEnabledFor(logging.DEBUG) else None,
+            )
+            return []
+
     def _start_provider_sync(self, provider: MusicProvider, media_type: MediaType) -> None:
         """Start sync task on provider and track progress."""
         # check if we're not already running a sync task for this provider/mediatype