Fix phantom artists in library (#1290)
authorMarvin Schenkel <marvinschenkel@gmail.com>
Fri, 10 May 2024 18:09:40 +0000 (20:09 +0200)
committerGitHub <noreply@github.com>
Fri, 10 May 2024 18:09:40 +0000 (20:09 +0200)
* Fix phantom artists in library

* Fix phantom artists in library

* Fix phantom artists in library

music_assistant/common/models/media_items.py
music_assistant/server/controllers/media/artists.py

index 62f6d744df7fcc9aa1b3c55085fbc72192657e58..83af5cfa6b54daee19ab8af353bcf807dd2afbb4 100644 (file)
@@ -348,24 +348,6 @@ class MediaItem(_MediaItemBase):
             return None
         return next((x for x in self.metadata.images if x.type == ImageType.THUMB), None)
 
-    @classmethod
-    def from_item_mapping(cls: type, item: ItemMapping) -> Self:
-        """Instantiate MediaItem from ItemMapping."""
-        # NOTE: This will not work for albums and tracks!
-        return cls.from_dict(
-            {
-                **item.to_dict(),
-                "provider_mappings": [
-                    {
-                        "item_id": item.item_id,
-                        "provider_domain": item.provider,
-                        "provider_instance": item.provider,
-                        "available": item.available,
-                    }
-                ],
-            }
-        )
-
 
 @dataclass(kw_only=True)
 class ItemMapping(_MediaItemBase):
index 1fcfebe71c40160cf4dcc1d8ec773af33d8d0238..20ae7a08ded1feb21c7b64bfe88bd5c2744e1901 100644 (file)
@@ -294,7 +294,7 @@ class ArtistsController(MediaControllerBase[Artist]):
     async def _add_library_item(self, item: Artist | ItemMapping) -> int:
         """Add a new item record to the database."""
         if isinstance(item, ItemMapping):
-            item = 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_ID_MBID
@@ -508,3 +508,22 @@ class ArtistsController(MediaControllerBase[Artist]):
                     await self._update_library_item(db_artist.item_id, prov_artist)
                     return True
         return False
+
+    def _artist_from_item_mapping(self, item: ItemMapping) -> Artist:
+        domain, instance_id = None, None
+        if prov := self.mass.get_provider(item.provider):
+            domain = prov.domain
+            instance_id = prov.instance_id
+        return Artist.from_dict(
+            {
+                **item.to_dict(),
+                "provider_mappings": [
+                    {
+                        "item_id": item.item_id,
+                        "provider_domain": domain,
+                        "provider_instance": instance_id,
+                        "available": item.available,
+                    }
+                ],
+            }
+        )