From: Marcel van der Veldt Date: Thu, 20 Jul 2023 12:44:21 +0000 (+0200) Subject: Add workaround for unavailable provider items X-Git-Url: https://git.kitaultman.com/?a=commitdiff_plain;h=b95835bd9392aaf97a60138c2ea412dcbc33ad16;p=music-assistant-server.git Add workaround for unavailable provider items --- diff --git a/music_assistant/common/models/media_items.py b/music_assistant/common/models/media_items.py index f8a3d377..b881896d 100755 --- a/music_assistant/common/models/media_items.py +++ b/music_assistant/common/models/media_items.py @@ -268,6 +268,12 @@ class MediaItem(DataClassDictMixin): """Return (calculated) availability.""" return any(x.available for x in self.provider_mappings) + @available.setter + def available(self, available: bool): + """Set availability.""" + for provider_mapping in self.provider_mappings: + provider_mapping.available = available + @property def image(self) -> MediaItemImage | None: """Return (first/random) image/thumb from metadata (if any).""" diff --git a/music_assistant/server/controllers/media/base.py b/music_assistant/server/controllers/media/base.py index b0846753..d81b80f3 100644 --- a/music_assistant/server/controllers/media/base.py +++ b/music_assistant/server/controllers/media/base.py @@ -409,14 +409,29 @@ class MediaControllerBase(Generic[ItemCls], metaclass=ABCMeta): # There is a possibility that the (streaming) provider changed the id of the item # so we return the previous details (if we have any) marked as unavailable, so # at least we have the possibility to sort out the new id through matching logic. - if not fallback: - fallback = await self.get_library_item_by_prov_id( - item_id, provider_instance_id_or_domain + fallback = fallback or await self.get_library_item_by_prov_id( + item_id, provider_instance_id_or_domain + ) + if fallback and isinstance(fallback, ItemMapping): + # create a fake item on the fly from the ItemMapping details + fallback_item: MediaItemType = self.item_cls( + item_id=fallback.item_id, provider=fallback.provider, name=fallback.name ) - if fallback: - fallback_item = ItemMapping.from_item(fallback) - fallback_item.available = False - return fallback_item + if provider := self.mass.get_provider(fallback_item.provider): + fallback_item.provider_mappings.add( + ProviderMapping( + item_id=fallback_item.item_id, + provider_domain=provider.domain, + provider_instance=provider.instance_id, + available=False, + ) + ) + return fallback_item + elif fallback: + # simply return the fallback item (marked as unavailable) + fallback.available = False + return fallback + # all options exhausted, we really can not find this item raise MediaNotFoundError( f"{self.media_type.value}://{item_id} not " f"found on provider {provider_instance_id_or_domain}"