From ed67657216f47f4df7a969ac3513074f2c64ef83 Mon Sep 17 00:00:00 2001 From: Marcel van der Veldt Date: Tue, 30 Jul 2024 17:09:59 +0200 Subject: [PATCH] Prevent items get marked as unavailable during metadata scan (#1537) --- music_assistant/common/models/media_items.py | 16 ++++++++-------- music_assistant/server/controllers/music.py | 8 +++++++- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/music_assistant/common/models/media_items.py b/music_assistant/common/models/media_items.py index d24115d8..deba0789 100644 --- a/music_assistant/common/models/media_items.py +++ b/music_assistant/common/models/media_items.py @@ -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.""" diff --git a/music_assistant/server/controllers/music.py b/music_assistant/server/controllers/music.py index d78246c9..bd47cb83 100644 --- a/music_assistant/server/controllers/music.py +++ b/music_assistant/server/controllers/music.py @@ -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 -- 2.34.1