From: Marcel van der Veldt Date: Thu, 20 Jul 2023 13:16:13 +0000 (+0200) Subject: Handle invalid items in streaming provider X-Git-Url: https://git.kitaultman.com/?a=commitdiff_plain;h=66cb0a3adbb3bc4b52231ec81d0df7a252720107;p=music-assistant-server.git Handle invalid items in streaming provider --- diff --git a/music_assistant/server/controllers/media/base.py b/music_assistant/server/controllers/media/base.py index d81b80f3..d05f1532 100644 --- a/music_assistant/server/controllers/media/base.py +++ b/music_assistant/server/controllers/media/base.py @@ -412,23 +412,10 @@ class MediaControllerBase(Generic[ItemCls], metaclass=ABCMeta): 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 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: + if fallback and not (isinstance(fallback, ItemMapping) and self.item_cls in (Track, Album)): # simply return the fallback item (marked as unavailable) + # NOTE: we only accept ItemMapping as fallback for flat items + # so not for tracks and albums (which rely on other objects) fallback.available = False return fallback # all options exhausted, we really can not find this item diff --git a/music_assistant/server/models/music_provider.py b/music_assistant/server/models/music_provider.py index d9c2b16d..d256b659 100644 --- a/music_assistant/server/models/music_provider.py +++ b/music_assistant/server/models/music_provider.py @@ -4,7 +4,7 @@ from __future__ import annotations from collections.abc import AsyncGenerator from music_assistant.common.models.enums import MediaType, ProviderFeature -from music_assistant.common.models.errors import MediaNotFoundError +from music_assistant.common.models.errors import MediaNotFoundError, MusicAssistantError from music_assistant.common.models.media_items import ( Album, AlbumTrack, @@ -409,22 +409,25 @@ class MusicProvider(Provider): library_item = await controller.get_library_item_by_prov_mappings( prov_item.provider_mappings, ) - if not library_item: - # create full db item - # note that we skip the metadata lookup purely to speed up the sync - # the additional metadata is then lazy retrieved afterwards - prov_item.favorite = True - library_item = await controller.add_item_to_library( - prov_item, skip_metadata_lookup=True - ) - elif ( - library_item.metadata.checksum and prov_item.metadata.checksum - ) and library_item.metadata.checksum != prov_item.metadata.checksum: - # existing dbitem checksum changed - library_item = await controller.update_item_in_library( - library_item.item_id, prov_item - ) - cur_db_ids.add(library_item.item_id) + try: + if not library_item: + # create full db item + # note that we skip the metadata lookup purely to speed up the sync + # the additional metadata is then lazy retrieved afterwards + prov_item.favorite = True + library_item = await controller.add_item_to_library( + prov_item, skip_metadata_lookup=True + ) + elif ( + library_item.metadata.checksum and prov_item.metadata.checksum + ) and library_item.metadata.checksum != prov_item.metadata.checksum: + # existing dbitem checksum changed + library_item = await controller.update_item_in_library( + library_item.item_id, prov_item + ) + cur_db_ids.add(library_item.item_id) + except MusicAssistantError as err: + self.logger.warning("Skipping sync of item %s: %s", prov_item.uri, str(err)) # process deletions (= no longer in library) cache_key = f"library_items.{media_type}.{self.instance_id}"