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,
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."""
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(
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)
):
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)
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,
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(
):
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)
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"):