Prevent items get marked as unavailable during metadata scan (#1537)
authorMarcel van der Veldt <m.vanderveldt@outlook.com>
Tue, 30 Jul 2024 15:09:59 +0000 (17:09 +0200)
committerGitHub <noreply@github.com>
Tue, 30 Jul 2024 15:09:59 +0000 (17:09 +0200)
music_assistant/common/models/media_items.py
music_assistant/server/controllers/music.py

index d24115d85a5561cae016e52caf8588cfa12d6cf3..deba07898940525819890a96f2755ce4bb1589cd 100644 (file)
@@ -121,18 +121,18 @@ class ProviderMapping(DataClassDictMixin):
             quality += 1
         return quality
 
-    def __post_init__(self) -> None:
-        """Call after init."""
-        # having items for unavailable providers can have all sorts
-        # of unpredictable results so ensure we have accurate availability status
+    def __post_serialize__(self, d: dict[Any, Any]) -> dict[Any, Any]:
+        """Execute action(s) on serialization."""
+        # prevent sending back unavailable items in the api if a provider has been disabled.
+        # by overriding the available flag here.
         if not (available_providers := get_global_cache_value("unique_providers")):
             # this is probably the client
-            self.available = self.available
-            return
+            return d
         if TYPE_CHECKING:
             available_providers = cast(set[str], available_providers)
-        if not available_providers.intersection({self.provider_domain, self.provider_instance}):
-            self.available = False
+        if not available_providers.intersection({d["provider_domain"], d["provider_instance"]}):
+            d["available"] = False
+        return d
 
     def __hash__(self) -> int:
         """Return custom hash."""
index d78246c9d6d6ac65e25a97f9d7a25f2a42dafa82..bd47cb83c8336e0c7cf999d23fe4977ae0d51d78 100644 (file)
@@ -9,7 +9,7 @@ import shutil
 from contextlib import suppress
 from itertools import zip_longest
 from math import inf
-from typing import TYPE_CHECKING, Final
+from typing import TYPE_CHECKING, Final, cast
 
 from music_assistant.common.helpers.datetime import utc_timestamp
 from music_assistant.common.helpers.global_cache import get_global_cache_value
@@ -510,9 +510,15 @@ class MusicController(CoreController):
         ctrl = self.get_controller(media_type)
         is_library_item = media_item.provider == "library"
 
+        available_providers = get_global_cache_value("unique_providers")
+        if TYPE_CHECKING:
+            available_providers = cast(set[str], available_providers)
+
         # fetch the first (available) provider item
         for prov_mapping in media_item.provider_mappings:
             provider = prov_mapping.provider_instance
+            if provider not in available_providers:
+                continue
             item_id = prov_mapping.item_id
             if prov_mapping.available:
                 break