Some small bug fixes (#999)
authorMarcel van der Veldt <m.vanderveldt@outlook.com>
Sun, 14 Jan 2024 00:38:42 +0000 (01:38 +0100)
committerGitHub <noreply@github.com>
Sun, 14 Jan 2024 00:38:42 +0000 (01:38 +0100)
* 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
music_assistant/server/providers/filesystem_local/base.py
music_assistant/server/providers/musicbrainz/__init__.py
music_assistant/server/providers/qobuz/__init__.py

index df32fb41df5c7c9723925a9ba31e8a35b08332d9..1a5bb03b4d94b0f1eeccfa78136e908bd895ccc4 100644 (file)
@@ -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
index ebd1ff747aa9b686f34d2a47aa7c9c5234f6fe6f..9adf176d05b4269485896ba4ada1eec15dc332fe 100644 (file)
@@ -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:
index a1e0f742e3219056d1635911a7288615db6fbf63..da12609dbbd9fcd995a7238cf11805457356116a 100644 (file)
@@ -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(
index 50eac688eb34b219b49d7ccbac7ef16b91e693b3..e35b0699befb1aa05713b6ddf4a9ebe289ac5122 100644 (file)
@@ -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"]}',
                 )
             },
         )