Fix missing disc and track number in db (#324)
authorMarcel van der Veldt <m.vanderveldt@outlook.com>
Wed, 18 May 2022 22:19:52 +0000 (00:19 +0200)
committerGitHub <noreply@github.com>
Wed, 18 May 2022 22:19:52 +0000 (00:19 +0200)
music_assistant/controllers/music/albums.py
music_assistant/controllers/music/providers/filesystem.py
music_assistant/controllers/music/tracks.py
music_assistant/helpers/database.py
music_assistant/models/media_items.py

index 5e7a5b064b4889a4a12588d07b78f7b88cadf85e..a35d70767a0add559c82b0c2dd4b5c77aa5d18af 100644 (file)
@@ -5,7 +5,7 @@ import asyncio
 import itertools
 from typing import Dict, List, Optional
 
-from music_assistant.helpers.compare import compare_album, compare_strings
+from music_assistant.helpers.compare import compare_album, compare_artist
 from music_assistant.helpers.database import TABLE_ALBUMS
 from music_assistant.helpers.json import json_serializer
 from music_assistant.models.enums import EventType, ProviderType
@@ -55,7 +55,10 @@ class AlbumsController(MediaControllerBase[Album]):
         # merge duplicates using a dict
         final_items: Dict[str, Track] = {}
         for track in tracks:
-            key = f"{track.disc_number}.{track.track_number}"
+            if track.disc_number is None or track.track_number is None:
+                key = f"{track.name}.{track.version}"
+            else:
+                key = f"{track.disc_number}.{track.track_number}"
             if key in final_items:
                 final_items[key].provider_ids.update(track.provider_ids)
             else:
@@ -72,15 +75,14 @@ class AlbumsController(MediaControllerBase[Album]):
         """Return all versions of an album we can find on all providers."""
         album = await self.get(item_id, provider, provider_id)
         prov_types = {item.type for item in self.mass.music.providers}
-        search_query = f"{album.artist.name} {album.name}"
         return [
             prov_item
             for prov_items in await asyncio.gather(
-                *[self.search(search_query, prov_type) for prov_type in prov_types]
+                *[self.search(album.name, prov_type) for prov_type in prov_types]
             )
             for prov_item in prov_items
             if prov_item.sort_name == album.sort_name
-            and compare_strings(prov_item.artist.name, album.artist.name)
+            and compare_artist(prov_item.artist, album.artist)
         ]
 
     async def add(self, item: Album) -> Album:
index d53d2a585968a02df569e6b85337790aeb6f6a9a..9deb0ddb07c38d7edaad1c2a816533492c806ea6 100644 (file)
@@ -265,7 +265,7 @@ class FileSystemProvider(MusicProvider):
         if db_id is None:
             raise MediaNotFoundError(f"Album not found: {prov_album_id}")
         query = f"SELECT * FROM tracks WHERE album LIKE '%\"{db_id}\"%'"
-        query += f" AND provider_ids like  '%\"{self.type.value}\"%'"
+        query += f" AND provider_ids LIKE '%\"{self.type.value}\"%'"
         return await self.mass.music.tracks.get_db_items(query)
 
     async def get_playlist_tracks(self, prov_playlist_id: str) -> List[Track]:
index 50d249612b1fbc9d575db5d5ced9e4bc96707fd0..899b4953e57bfad711c9dfda821791fede4ca4b5 100644 (file)
@@ -213,6 +213,8 @@ class TracksController(MediaControllerBase[Track]):
                     "metadata": json_serializer(metadata),
                     "provider_ids": json_serializer(provider_ids),
                     "isrc": track.isrc or cur_item.isrc,
+                    "disc_number": track.disc_number or cur_item.disc_number,
+                    "track_number": track.track_number or cur_item.track_number,
                 },
                 db=_db,
             )
index 4721234ca124a06dbe6fdd5fd46b9ee87959df69..3ace0931d63ebad7d3aeabce016aa959fcd3b384 100755 (executable)
@@ -10,7 +10,7 @@ if TYPE_CHECKING:
     from music_assistant.mass import MusicAssistant
 
 
-SCHEMA_VERSION = 11
+SCHEMA_VERSION = 12
 
 TABLE_PROV_MAPPINGS = "provider_mappings"
 TABLE_TRACK_LOUDNESS = "track_loudness"
@@ -185,8 +185,8 @@ class Database:
                 # always create db tables if they don't exist to prevent errors trying to access them later
                 await self.__create_database_tables(db)
 
-                if prev_version < 10:
-                    # refactored file provider, start clean just in case.
+                if prev_version < 12:
+                    # fixed nasty bugs in file provider, start clean just in case.
                     await db.execute(f"DROP TABLE IF EXISTS {TABLE_ARTISTS}")
                     await db.execute(f"DROP TABLE IF EXISTS {TABLE_ALBUMS}")
                     await db.execute(f"DROP TABLE IF EXISTS {TABLE_TRACKS}")
@@ -198,12 +198,6 @@ class Database:
                     # recreate missing tables
                     await self.__create_database_tables(db)
 
-                if prev_version < 11:
-                    # fix for duplicate thumbs creation
-                    await db.execute(f"DROP TABLE IF EXISTS {TABLE_THUMBS}")
-                    # recreate missing tables
-                    await self.__create_database_tables(db)
-
             # store current schema version
             await self.set_setting("version", str(SCHEMA_VERSION), db=db)
 
@@ -277,6 +271,8 @@ class Database:
                     artists json,
                     album json,
                     metadata json,
+                    disc_number INTEGER NULL,
+                    track_number INTEGER NULL,
                     provider_ids json
                 );"""
         )
index f095d2bbf485acf0897ad78e18565ccad111bf23..ca8d224c5044817f45032a2e36fcf316c7ba7c4f 100755 (executable)
@@ -163,8 +163,6 @@ class MediaItem(DataClassDictMixin):
                 "media_type",
                 "uri",
                 "album",
-                "disc_number",
-                "track_number",
                 "position",
             ]
         }