Fix: Allow updating of media item object from api
authorMarcel van der Veldt <m.vanderveldt@outlook.com>
Tue, 18 Feb 2025 15:38:22 +0000 (16:38 +0100)
committerMarcel van der Veldt <m.vanderveldt@outlook.com>
Tue, 18 Feb 2025 15:38:22 +0000 (16:38 +0100)
music_assistant/controllers/media/albums.py
music_assistant/controllers/media/artists.py
music_assistant/controllers/media/audiobooks.py
music_assistant/controllers/media/base.py
music_assistant/controllers/media/playlists.py
music_assistant/controllers/media/podcasts.py
music_assistant/controllers/media/radio.py
music_assistant/controllers/media/tracks.py
music_assistant/providers/theaudiodb/__init__.py

index 678c7d7d2ad780fd2a598ffb496a961f6a18af4b..9ad20ca7060ed6d88b5a4561415f6397533260f3 100644 (file)
@@ -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
index 80095719f16c3d76f1e38cd136bf236a52018dbd..d3f224ce7184a7bfe780ebc9fa43004c8c34120c 100644 (file)
@@ -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
index b7fee93a06e3c9dc0389cf620574ed70bd05de5c..af4c699e3cdcc203ec49094ffc08721212d26b0a 100644 (file)
@@ -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
index cbfa95db71b1cbed97ecaa268b95be9a93625d16..66a9885b5d6fba26d6f3b4fcbbb9e2227fef99ca 100644 (file)
@@ -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)
index 9bd021ada54c16d9518c9ac4c4e8b541d9d6c3a9..365a83d7d459a3226ee4e55ec4be8c2bcedb6348 100644 (file)
@@ -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
index 18c8c066b650974945d7f0126b2c6dde4d0a1d74..314c4d0faf4f734e45c7b4301b67f710335e929a 100644 (file)
@@ -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
index 28e0357c0c92818ba1bd43ce6eabd70a00853c49..dbb13df3d6755f4172d90b498d7643613f330bc0 100644 (file)
@@ -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
index 9842d1bbd6bc18571b361514a834c5b819843b42..d67f252bce850f33a6007c2ff9767bf59f26fb18 100644 (file)
@@ -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
index c732284d5bf040a5e53ccaba96685ec576479fa5..7a548ee08ede4cc5cc657efefedd0396bf1a0bd2 100644 (file)
@@ -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,