from music_assistant.models.music_provider import MusicProvider
-class AlbumsController(MediaControllerBase[Album, Album]):
+class AlbumsController(MediaControllerBase[Album]):
"""Controller managing MediaItems of type Album."""
db_table = DB_TABLE_ALBUMS
from music_assistant.models.music_provider import MusicProvider
-class ArtistsController(MediaControllerBase[Artist, Artist | ItemMapping]):
+class ArtistsController(MediaControllerBase[Artist]):
"""Controller managing MediaItems of type Artist."""
db_table = DB_TABLE_ARTISTS
async def _add_library_item(self, item: Artist | ItemMapping) -> int:
"""Add a new item record to the database."""
if isinstance(item, ItemMapping):
- item = self._artist_from_item_mapping(item)
+ item = self.artist_from_item_mapping(item)
# enforce various artists name + id
if compare_strings(item.name, VARIOUS_ARTISTS_NAME):
item.mbid = VARIOUS_ARTISTS_MBID
if isinstance(update, ItemMapping):
# NOTE that artist is the only mediatype where its accepted we
# receive an itemmapping from streaming providers
- update = self._artist_from_item_mapping(update)
+ update = self.artist_from_item_mapping(update)
metadata = cur_item.metadata
else:
metadata = update.metadata if overwrite else cur_item.metadata.update(update.metadata)
return True
return False
- def _artist_from_item_mapping(self, item: ItemMapping) -> Artist:
+ def artist_from_item_mapping(self, item: ItemMapping) -> Artist:
+ """Create an Artist object from an ItemMapping object."""
domain, instance_id = None, None
if prov := self.mass.get_provider(item.provider):
domain = prov.domain
from music_assistant.models.music_provider import MusicProvider
-class AudiobooksController(MediaControllerBase[Audiobook, Audiobook]):
+class AudiobooksController(MediaControllerBase[Audiobook]):
"""Controller managing MediaItems of type Audiobook."""
db_table = DB_TABLE_AUDIOBOOKS
Album,
ItemMapping,
MediaItemType,
- MediaItemTypeOrItemMapping,
ProviderMapping,
SearchResults,
Track,
from music_assistant import MusicAssistant
-MediaItemTypeBound = MediaItemTypeOrItemMapping
+
ItemCls = TypeVar("ItemCls", bound="MediaItemType")
-LibraryUpdate = TypeVar("LibraryUpdate", bound="MediaItemTypeBound")
+
JSON_KEYS = (
"artists",
}
-class MediaControllerBase(Generic[ItemCls, LibraryUpdate], metaclass=ABCMeta):
+class MediaControllerBase(Generic[ItemCls], metaclass=ABCMeta):
"""Base model for controller managing a MediaType."""
media_type: MediaType
return None
async def update_item_in_library(
- self, item_id: str | int, update: LibraryUpdate, overwrite: bool = False
+ self, item_id: str | int, update: ItemCls, overwrite: bool = False
) -> ItemCls:
"""Update existing library record in the library database."""
await self._update_library_item(item_id, update, overwrite=overwrite)
from .base import MediaControllerBase
-class PlaylistController(MediaControllerBase[Playlist, Playlist]):
+class PlaylistController(MediaControllerBase[Playlist]):
"""Controller managing MediaItems of type Playlist."""
db_table = DB_TABLE_PLAYLISTS
from music_assistant.models.music_provider import MusicProvider
-class PodcastsController(MediaControllerBase[Podcast, Podcast]):
+class PodcastsController(MediaControllerBase[Podcast]):
"""Controller managing MediaItems of type Podcast."""
db_table = DB_TABLE_PODCASTS
from .base import MediaControllerBase
-class RadioController(MediaControllerBase[Radio, Radio]):
+class RadioController(MediaControllerBase[Radio]):
"""Controller managing MediaItems of type Radio."""
db_table = DB_TABLE_RADIOS
from .base import MediaControllerBase
-class TracksController(MediaControllerBase[Track, Track]):
+class TracksController(MediaControllerBase[Track]):
"""Controller managing MediaItems of type Track."""
db_table = DB_TABLE_TRACKS
from music_assistant_models.media_items import (
Album,
Artist,
+ ItemMapping,
MediaItemImage,
MediaItemLink,
MediaItemMetadata,
if not compare_strings(album_artist.name, adb_album["strArtist"]):
continue
if not album_artist.mbid and album_artist.provider == "library":
+ if isinstance(album_artist, ItemMapping):
+ album_artist = self.mass.music.artists.artist_from_item_mapping(album_artist) # noqa: PLW2901
album_artist.mbid = adb_album["strMusicBrainzArtistID"]
await self.mass.music.artists.update_item_in_library(
album_artist.item_id,
if not compare_strings(album_artist.name, adb_track["strArtist"]):
continue
if not album_artist.mbid and album_artist.provider == "library":
+ if isinstance(album_artist, ItemMapping):
+ album_artist = self.mass.music.artists.artist_from_item_mapping(album_artist) # noqa: PLW2901
album_artist.mbid = adb_track["strMusicBrainzArtistID"]
await self.mass.music.artists.update_item_in_library(
album_artist.item_id,