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
# 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:
"""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:
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]:
"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,
)
from music_assistant.mass import MusicAssistant
-SCHEMA_VERSION = 11
+SCHEMA_VERSION = 12
TABLE_PROV_MAPPINGS = "provider_mappings"
TABLE_TRACK_LOUDNESS = "track_loudness"
# 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}")
# 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)
artists json,
album json,
metadata json,
+ disc_number INTEGER NULL,
+ track_number INTEGER NULL,
provider_ids json
);"""
)
"media_type",
"uri",
"album",
- "disc_number",
- "track_number",
"position",
]
}