Fix missing provider id(s) error when updating items in the database (#429)
authorMarcel van der Veldt <m.vanderveldt@outlook.com>
Thu, 21 Jul 2022 08:42:03 +0000 (10:42 +0200)
committerGitHub <noreply@github.com>
Thu, 21 Jul 2022 08:42:03 +0000 (10:42 +0200)
music_assistant/controllers/music/albums.py
music_assistant/controllers/music/artists.py
music_assistant/controllers/music/tracks.py

index 191e79d827c20b43cf2efae389e7c52f81a9f286..2df86c6bc9298088b5bb2fc0fbeeae52905fad28 100644 (file)
@@ -151,6 +151,7 @@ class AlbumsController(MediaControllerBase[Album]):
 
     async def add_db_item(self, item: Album, overwrite_existing: bool = False) -> Album:
         """Add a new record to the database."""
+        assert isinstance(item, Album), "Not a full Album object"
         assert item.provider_ids, f"Album {item.name} is missing provider id(s)"
         assert item.artist, f"Album {item.name} is missing artist"
         async with self._db_add_lock:
@@ -343,15 +344,17 @@ class AlbumsController(MediaControllerBase[Album]):
         self, artist: Union[Artist, ItemMapping], overwrite: bool = False
     ) -> ItemMapping:
         """Extract (database) track artist as ItemMapping."""
-        if overwrite:
-            artist = await self.mass.music.artists.add_db_item(
-                artist, overwrite_existing=True
-            )
+
         if artist.provider == ProviderType.DATABASE:
             if isinstance(artist, ItemMapping):
                 return artist
             return ItemMapping.from_item(artist)
 
+        if overwrite:
+            artist = await self.mass.music.artists.add_db_item(
+                artist, overwrite_existing=True
+            )
+
         if db_artist := await self.mass.music.artists.get_db_item_by_prov_id(
             artist.item_id, provider=artist.provider
         ):
index 827da2df317c3d7134b30a20991019d80a9fb1a9..f5f4295536e302ba3a832a490ff908e40aa26129 100644 (file)
@@ -199,6 +199,7 @@ class ArtistsController(MediaControllerBase[Artist]):
         self, item: Artist, overwrite_existing: bool = False
     ) -> Artist:
         """Add a new item record to the database."""
+        assert isinstance(item, Artist), "Not a full Artist object"
         assert item.provider_ids, "Artist is missing provider id(s)"
         async with self._db_add_lock:
             # always try to grab existing item by musicbrainz_id
index 013b7516878abf0ee6e579a5f19a72cf52e9f07e..5b37324aa2f2b879f0669dcd012902f103f209ad 100644 (file)
@@ -120,6 +120,7 @@ class TracksController(MediaControllerBase[Track]):
 
     async def add_db_item(self, item: Track, overwrite_existing: bool = False) -> Track:
         """Add a new item record to the database."""
+        assert isinstance(item, Track), "Not a full Track object"
         assert item.artists, "Track is missing artist(s)"
         assert item.provider_ids, "Track is missing provider id(s)"
         async with self._db_add_lock:
@@ -192,7 +193,7 @@ class TracksController(MediaControllerBase[Track]):
             provider_ids = item.provider_ids
             metadata.last_refresh = None
             # we store a mapping to artists/albums on the item for easier access/listings
-            track_artists = await self._get_track_artists(item)
+            track_artists = await self._get_track_artists(item, overwrite=True)
             track_albums = await self._get_track_albums(item, overwrite=True)
         else:
             metadata = cur_item.metadata.update(item.metadata, overwrite)
@@ -226,6 +227,7 @@ class TracksController(MediaControllerBase[Track]):
         self,
         base_track: Track,
         upd_track: Optional[Track] = None,
+        overwrite: bool = False,
     ) -> List[ItemMapping]:
         """Extract all (unique) artists of track as ItemMapping."""
         if upd_track and upd_track.artists:
@@ -233,7 +235,9 @@ class TracksController(MediaControllerBase[Track]):
         else:
             track_artists = base_track.artists
         # use intermediate set to clear out duplicates
-        return list({await self._get_artist_mapping(x) for x in track_artists})
+        return list(
+            {await self._get_artist_mapping(x, overwrite) for x in track_artists}
+        )
 
     async def _get_track_albums(
         self,
@@ -285,16 +289,17 @@ class TracksController(MediaControllerBase[Track]):
         overwrite: bool = False,
     ) -> ItemMapping:
         """Extract (database) album as ItemMapping."""
-        if overwrite:
-            db_album = await self.mass.music.albums.add_db_item(
-                album, overwrite_existing=True
-            )
 
         if album.provider == ProviderType.DATABASE:
             if isinstance(album, ItemMapping):
                 return album
             return ItemMapping.from_item(album)
 
+        if overwrite:
+            db_album = await self.mass.music.albums.add_db_item(
+                album, overwrite_existing=True
+            )
+
         if db_album := await self.mass.music.albums.get_db_item_by_prov_id(
             album.item_id, provider=album.provider
         ):
@@ -309,15 +314,17 @@ class TracksController(MediaControllerBase[Track]):
         self, artist: Union[Artist, ItemMapping], overwrite: bool = False
     ) -> ItemMapping:
         """Extract (database) track artist as ItemMapping."""
-        if overwrite:
-            artist = await self.mass.music.artists.add_db_item(
-                artist, overwrite_existing=True
-            )
+
         if artist.provider == ProviderType.DATABASE:
             if isinstance(artist, ItemMapping):
                 return artist
             return ItemMapping.from_item(artist)
 
+        if overwrite:
+            artist = await self.mass.music.artists.add_db_item(
+                artist, overwrite_existing=True
+            )
+
         if db_artist := await self.mass.music.artists.get_db_item_by_prov_id(
             artist.item_id, provider=artist.provider
         ):