From: Marcel van der Veldt Date: Mon, 3 Apr 2023 18:01:54 +0000 (+0200) Subject: add some more guards for incomplete items X-Git-Url: https://git.kitaultman.com/?a=commitdiff_plain;h=e553f71076f00f3b6e9022406f9f7e7037354bda;p=music-assistant-server.git add some more guards for incomplete items --- diff --git a/music_assistant/server/controllers/media/albums.py b/music_assistant/server/controllers/media/albums.py index de863b75..3c4faa53 100644 --- a/music_assistant/server/controllers/media/albums.py +++ b/music_assistant/server/controllers/media/albums.py @@ -9,7 +9,11 @@ from typing import TYPE_CHECKING from music_assistant.common.helpers.datetime import utc_timestamp from music_assistant.common.helpers.json import serialize_to_json from music_assistant.common.models.enums import EventType, ProviderFeature -from music_assistant.common.models.errors import MediaNotFoundError, UnsupportedFeaturedException +from music_assistant.common.models.errors import ( + InvalidDataError, + MediaNotFoundError, + UnsupportedFeaturedException, +) from music_assistant.common.models.media_items import ( Album, AlbumType, @@ -50,7 +54,7 @@ class AlbumsController(MediaControllerBase[Album]): provider_instance_id_or_domain: str, force_refresh: bool = False, lazy: bool = True, - details: Album = None, + details: Album | ItemMapping = None, add_to_db: bool = True, ) -> Album: """Return (full) details for a single media item.""" @@ -77,6 +81,8 @@ class AlbumsController(MediaControllerBase[Album]): async def add(self, item: Album, skip_metadata_lookup: bool = False) -> Album: """Add album to local db and return the database item.""" + if not isinstance(item, Album): + raise InvalidDataError("Not a valid Album object (ItemMapping can not be added to db)") # resolve any ItemMapping artists item.artists = [ await self.mass.music.artists.get_provider_item( diff --git a/music_assistant/server/controllers/media/artists.py b/music_assistant/server/controllers/media/artists.py index 5d98e803..d0ddc7ba 100644 --- a/music_assistant/server/controllers/media/artists.py +++ b/music_assistant/server/controllers/media/artists.py @@ -52,8 +52,10 @@ class ArtistsController(MediaControllerBase[Artist]): self.mass.register_api_command("music/artist/update", self._update_db_item) self.mass.register_api_command("music/artist/delete", self.delete) - async def add(self, item: Artist, skip_metadata_lookup: bool = False) -> Artist: + async def add(self, item: Artist | ItemMapping, skip_metadata_lookup: bool = False) -> Artist: """Add artist to local db and return the database item.""" + if isinstance(item, ItemMapping): + skip_metadata_lookup = True # grab musicbrainz id and additional metadata if not skip_metadata_lookup: await self.mass.metadata.get_artist_metadata(item) diff --git a/music_assistant/server/controllers/media/base.py b/music_assistant/server/controllers/media/base.py index 145478ce..4fae5df0 100644 --- a/music_assistant/server/controllers/media/base.py +++ b/music_assistant/server/controllers/media/base.py @@ -567,5 +567,13 @@ class MediaControllerBase(Generic[ItemCls], metaclass=ABCMeta): ): return ItemMapping.from_item(db_artist) + # try to request the full item + artist = await self.mass.music.artists.get_provider_item( + artist.item_id, artist.provider, fallback=artist + ) + if isinstance(artist, ItemMapping): + # this can happen for unavailable items + return artist + db_artist = await self.mass.music.artists.add(artist, skip_metadata_lookup=True) return ItemMapping.from_item(db_artist) diff --git a/music_assistant/server/controllers/media/tracks.py b/music_assistant/server/controllers/media/tracks.py index d210a495..e187966f 100644 --- a/music_assistant/server/controllers/media/tracks.py +++ b/music_assistant/server/controllers/media/tracks.py @@ -6,7 +6,11 @@ import asyncio from music_assistant.common.helpers.datetime import utc_timestamp from music_assistant.common.helpers.json import serialize_to_json from music_assistant.common.models.enums import EventType, MediaType, ProviderFeature -from music_assistant.common.models.errors import MediaNotFoundError, UnsupportedFeaturedException +from music_assistant.common.models.errors import ( + InvalidDataError, + MediaNotFoundError, + UnsupportedFeaturedException, +) from music_assistant.common.models.media_items import ( Album, DbTrack, @@ -95,7 +99,10 @@ class TracksController(MediaControllerBase[Track]): async def add(self, item: Track, skip_metadata_lookup: bool = False) -> Track: """Add track to local db and return the new database item.""" - assert item.artists, "Artist(s) missing on Track" + if not isinstance(item, Track): + raise InvalidDataError("Not a valid Track object (ItemMapping can not be added to db)") + if not item.artists: + raise InvalidDataError("Track is missing artist(s)") # resolve any ItemMapping artists item.artists = [ await self.mass.music.artists.get_provider_item( @@ -404,5 +411,13 @@ class TracksController(MediaControllerBase[Track]): ): return ItemMapping.from_item(db_album) + # try to request the full item + album = await self.mass.music.albums.get_provider_item( + album.item_id, album.provider, fallback=album + ) + if isinstance(album, ItemMapping): + # this can happen for unavailable items + return album + db_album = await self.mass.music.albums.add(album, skip_metadata_lookup=True) return ItemMapping.from_item(db_album) diff --git a/music_assistant/server/providers/qobuz/__init__.py b/music_assistant/server/providers/qobuz/__init__.py index eb361b8f..9e50a13c 100644 --- a/music_assistant/server/providers/qobuz/__init__.py +++ b/music_assistant/server/providers/qobuz/__init__.py @@ -647,11 +647,9 @@ class QobuzProvider(MusicProvider): kwargs["user_auth_token"] = await self._auth_token() async with self._throttler: async with self.mass.http_session.get( - url, headers=headers, params=kwargs, ssl=False + url, headers=headers, params=kwargs, ssl=False, raise_for_status=True ) as response: try: - # make sure status is 200 - assert response.status == 200 result = await response.json() # check for error in json if error := result.get("error"):