From ed2ad99b00c9a6ef647543052803892a2d0e7186 Mon Sep 17 00:00:00 2001 From: Marcel van der Veldt Date: Tue, 18 Feb 2025 16:38:22 +0100 Subject: [PATCH] Fix: Allow updating of media item object from api --- music_assistant/controllers/media/albums.py | 2 +- music_assistant/controllers/media/artists.py | 9 +++++---- music_assistant/controllers/media/audiobooks.py | 2 +- music_assistant/controllers/media/base.py | 9 ++++----- music_assistant/controllers/media/playlists.py | 2 +- music_assistant/controllers/media/podcasts.py | 2 +- music_assistant/controllers/media/radio.py | 2 +- music_assistant/controllers/media/tracks.py | 2 +- music_assistant/providers/theaudiodb/__init__.py | 5 +++++ 9 files changed, 20 insertions(+), 15 deletions(-) diff --git a/music_assistant/controllers/media/albums.py b/music_assistant/controllers/media/albums.py index 678c7d7d..9ad20ca7 100644 --- a/music_assistant/controllers/media/albums.py +++ b/music_assistant/controllers/media/albums.py @@ -24,7 +24,7 @@ if TYPE_CHECKING: 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 diff --git a/music_assistant/controllers/media/artists.py b/music_assistant/controllers/media/artists.py index 80095719..d3f224ce 100644 --- a/music_assistant/controllers/media/artists.py +++ b/music_assistant/controllers/media/artists.py @@ -29,7 +29,7 @@ if TYPE_CHECKING: 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 @@ -337,7 +337,7 @@ class ArtistsController(MediaControllerBase[Artist, Artist | ItemMapping]): 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 @@ -368,7 +368,7 @@ class ArtistsController(MediaControllerBase[Artist, Artist | ItemMapping]): 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) @@ -512,7 +512,8 @@ class ArtistsController(MediaControllerBase[Artist, Artist | ItemMapping]): 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 diff --git a/music_assistant/controllers/media/audiobooks.py b/music_assistant/controllers/media/audiobooks.py index b7fee93a..af4c699e 100644 --- a/music_assistant/controllers/media/audiobooks.py +++ b/music_assistant/controllers/media/audiobooks.py @@ -24,7 +24,7 @@ if TYPE_CHECKING: 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 diff --git a/music_assistant/controllers/media/base.py b/music_assistant/controllers/media/base.py index cbfa95db..66a9885b 100644 --- a/music_assistant/controllers/media/base.py +++ b/music_assistant/controllers/media/base.py @@ -21,7 +21,6 @@ from music_assistant_models.media_items import ( Album, ItemMapping, MediaItemType, - MediaItemTypeOrItemMapping, ProviderMapping, SearchResults, Track, @@ -36,9 +35,9 @@ if TYPE_CHECKING: from music_assistant import MusicAssistant -MediaItemTypeBound = MediaItemTypeOrItemMapping + ItemCls = TypeVar("ItemCls", bound="MediaItemType") -LibraryUpdate = TypeVar("LibraryUpdate", bound="MediaItemTypeBound") + JSON_KEYS = ( "artists", @@ -74,7 +73,7 @@ SORT_KEYS = { } -class MediaControllerBase(Generic[ItemCls, LibraryUpdate], metaclass=ABCMeta): +class MediaControllerBase(Generic[ItemCls], metaclass=ABCMeta): """Base model for controller managing a MediaType.""" media_type: MediaType @@ -161,7 +160,7 @@ class MediaControllerBase(Generic[ItemCls, LibraryUpdate], metaclass=ABCMeta): 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) diff --git a/music_assistant/controllers/media/playlists.py b/music_assistant/controllers/media/playlists.py index 9bd021ad..365a83d7 100644 --- a/music_assistant/controllers/media/playlists.py +++ b/music_assistant/controllers/media/playlists.py @@ -22,7 +22,7 @@ from music_assistant.models.music_provider import MusicProvider from .base import MediaControllerBase -class PlaylistController(MediaControllerBase[Playlist, Playlist]): +class PlaylistController(MediaControllerBase[Playlist]): """Controller managing MediaItems of type Playlist.""" db_table = DB_TABLE_PLAYLISTS diff --git a/music_assistant/controllers/media/podcasts.py b/music_assistant/controllers/media/podcasts.py index 18c8c066..314c4d0f 100644 --- a/music_assistant/controllers/media/podcasts.py +++ b/music_assistant/controllers/media/podcasts.py @@ -24,7 +24,7 @@ if TYPE_CHECKING: 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 diff --git a/music_assistant/controllers/media/radio.py b/music_assistant/controllers/media/radio.py index 28e0357c..dbb13df3 100644 --- a/music_assistant/controllers/media/radio.py +++ b/music_assistant/controllers/media/radio.py @@ -14,7 +14,7 @@ from music_assistant.helpers.json import serialize_to_json from .base import MediaControllerBase -class RadioController(MediaControllerBase[Radio, Radio]): +class RadioController(MediaControllerBase[Radio]): """Controller managing MediaItems of type Radio.""" db_table = DB_TABLE_RADIOS diff --git a/music_assistant/controllers/media/tracks.py b/music_assistant/controllers/media/tracks.py index 9842d1bb..d67f252b 100644 --- a/music_assistant/controllers/media/tracks.py +++ b/music_assistant/controllers/media/tracks.py @@ -41,7 +41,7 @@ from music_assistant.models.music_provider import MusicProvider from .base import MediaControllerBase -class TracksController(MediaControllerBase[Track, Track]): +class TracksController(MediaControllerBase[Track]): """Controller managing MediaItems of type Track.""" db_table = DB_TABLE_TRACKS diff --git a/music_assistant/providers/theaudiodb/__init__.py b/music_assistant/providers/theaudiodb/__init__.py index c732284d..7a548ee0 100644 --- a/music_assistant/providers/theaudiodb/__init__.py +++ b/music_assistant/providers/theaudiodb/__init__.py @@ -18,6 +18,7 @@ from music_assistant_models.enums import ( from music_assistant_models.media_items import ( Album, Artist, + ItemMapping, MediaItemImage, MediaItemLink, MediaItemMetadata, @@ -325,6 +326,8 @@ class AudioDbMetadataProvider(MetadataProvider): 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, @@ -371,6 +374,8 @@ class AudioDbMetadataProvider(MetadataProvider): 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, -- 2.34.1