From 3c3c5209810d262150d4861a37929b5122e441ad Mon Sep 17 00:00:00 2001 From: Marcel van der Veldt Date: Sun, 14 Jan 2024 01:38:42 +0100 Subject: [PATCH] Some small bug fixes (#999) * fix typo * handle (more) missing field in musicbrainz * make sure instance id is randomized * enforce initernational urls on qobuz --- music_assistant/server/controllers/config.py | 6 ++++-- .../server/providers/filesystem_local/base.py | 6 +++--- .../server/providers/musicbrainz/__init__.py | 16 +++++++++++++--- .../server/providers/qobuz/__init__.py | 10 ++++------ 4 files changed, 24 insertions(+), 14 deletions(-) diff --git a/music_assistant/server/controllers/config.py b/music_assistant/server/controllers/config.py index df32fb41..1a5bb03b 100644 --- a/music_assistant/server/controllers/config.py +++ b/music_assistant/server/controllers/config.py @@ -10,6 +10,7 @@ from typing import TYPE_CHECKING, Any from uuid import uuid4 import aiofiles +import shortuuid from aiofiles.os import wrap from cryptography.fernet import Fernet, InvalidToken @@ -696,8 +697,9 @@ class ConfigController: instance_id = provider_domain name = manifest.name else: - instance_id = f"{provider_domain}{len(existing)+1}" - name = f"{manifest.name} {len(existing)+1}" + random_id = shortuuid.random(6) + instance_id = f"{provider_domain}_{random_id}" + name = f"{manifest.name} {random_id}" # all checks passed, create config object config_entries = await self.get_provider_config_entries( provider_domain=provider_domain, instance_id=instance_id, values=values diff --git a/music_assistant/server/providers/filesystem_local/base.py b/music_assistant/server/providers/filesystem_local/base.py index ebd1ff74..9adf176d 100644 --- a/music_assistant/server/providers/filesystem_local/base.py +++ b/music_assistant/server/providers/filesystem_local/base.py @@ -375,9 +375,9 @@ class FileSystemProviderBase(MusicProvider): await self.mass.music.albums.remove_item_from_library(album_id) # check if any artists need to be cleaned up for artist_id in artist_ids: - if not self.mass.music.artists.albums( - artist_id, "library" - ) and self.mass.music.artists.tracks(artist_id, "library"): + artist_albums = await self.mass.music.artists.albums(artist_id, "library") + artist_tracks = self.mass.music.artists.tracks(artist_id, "library") + if not (artist_albums or artist_tracks): await self.mass.music.artists.remove_item_from_library(album_id) async def get_artist(self, prov_artist_id: str) -> Artist: diff --git a/music_assistant/server/providers/musicbrainz/__init__.py b/music_assistant/server/providers/musicbrainz/__init__.py index a1e0f742..da12609d 100644 --- a/music_assistant/server/providers/musicbrainz/__init__.py +++ b/music_assistant/server/providers/musicbrainz/__init__.py @@ -14,6 +14,7 @@ from typing import TYPE_CHECKING, Any import aiohttp.client_exceptions from asyncio_throttle import Throttler from mashumaro import DataClassDictMixin +from mashumaro.exceptions import MissingField from music_assistant.common.helpers.util import parse_title_and_version from music_assistant.common.models.config_entries import ConfigEntry, ConfigValueType @@ -314,7 +315,10 @@ class MusicbrainzProvider(MetadataProvider): if "id" not in result: result["id"] = artist_id # TODO: Parse all the optional data like relations and such - return MusicBrainzArtist.from_dict(replace_hyphens(result)) + try: + return MusicBrainzArtist.from_dict(replace_hyphens(result)) + except MissingField as err: + raise InvalidDataError from err raise InvalidDataError("Invalid MusicBrainz Artist ID provided") async def get_recording_details( @@ -331,7 +335,10 @@ class MusicbrainzProvider(MetadataProvider): if result := await self.get_data(f"recording/{recording_id}?inc=artists+releases"): if "id" not in result: result["id"] = recording_id - return MusicBrainzRecording.from_dict(replace_hyphens(result)) + try: + return MusicBrainzRecording.from_dict(replace_hyphens(result)) + except MissingField as err: + raise InvalidDataError from err raise InvalidDataError("Invalid ISRC provided") async def get_releasegroup_details( @@ -350,7 +357,10 @@ class MusicbrainzProvider(MetadataProvider): if result := await self.get_data(endpoint): if "id" not in result: result["id"] = releasegroup_id - return MusicBrainzReleaseGroup.from_dict(replace_hyphens(result)) + try: + return MusicBrainzReleaseGroup.from_dict(replace_hyphens(result)) + except MissingField as err: + raise InvalidDataError from err raise InvalidDataError("Invalid MusicBrainz ReleaseGroup ID or barcode provided") async def get_artist_details_by_album( diff --git a/music_assistant/server/providers/qobuz/__init__.py b/music_assistant/server/providers/qobuz/__init__.py index 50eac688..e35b0699 100644 --- a/music_assistant/server/providers/qobuz/__init__.py +++ b/music_assistant/server/providers/qobuz/__init__.py @@ -446,7 +446,7 @@ class QobuzProvider(MusicProvider): item_id=str(artist_obj["id"]), provider_domain=self.domain, provider_instance=self.instance_id, - url=artist_obj.get("url", f'https://open.qobuz.com/artist/{artist_obj["id"]}'), + url=f'https://open.qobuz.com/artist/{artist_obj["id"]}', ) }, ) @@ -481,7 +481,7 @@ class QobuzProvider(MusicProvider): sample_rate=album_obj["maximum_sampling_rate"] * 1000, bit_depth=album_obj["maximum_bit_depth"], ), - url=album_obj.get("url", f'https://open.qobuz.com/album/{album_obj["id"]}'), + url=f'https://open.qobuz.com/album/{album_obj["id"]}', ) }, ) @@ -550,7 +550,7 @@ class QobuzProvider(MusicProvider): sample_rate=track_obj["maximum_sampling_rate"] * 1000, bit_depth=track_obj["maximum_bit_depth"], ), - url=track_obj.get("url", f'https://open.qobuz.com/track/{track_obj["id"]}'), + url=f'https://open.qobuz.com/track/{track_obj["id"]}', ) }, **extra_init_kwargs, @@ -607,9 +607,7 @@ class QobuzProvider(MusicProvider): item_id=str(playlist_obj["id"]), provider_domain=self.domain, provider_instance=self.instance_id, - url=playlist_obj.get( - "url", f'https://open.qobuz.com/playlist/{playlist_obj["id"]}' - ), + url=f'https://open.qobuz.com/playlist/{playlist_obj["id"]}', ) }, ) -- 2.34.1