import socket
from collections.abc import Callable
from typing import Any, TypeVar
+from uuid import UUID
# pylint: disable=invalid-name
T = TypeVar("T")
q.task_done()
except (asyncio.QueueEmpty, ValueError):
pass
+
+
+def is_valid_uuid(uuid_to_test: str, version: int = 4) -> bool:
+ """Check if uuid string is a valid UUID."""
+ try:
+ uuid_obj = UUID(uuid_to_test, version=version)
+ except ValueError:
+ return False
+ return str(uuid_obj) == uuid_to_test
from mashumaro import DataClassDictMixin
from music_assistant.common.helpers.uri import create_uri
-from music_assistant.common.helpers.util import create_sort_name, merge_lists
+from music_assistant.common.helpers.util import create_sort_name, is_valid_uuid, merge_lists
from music_assistant.common.models.enums import (
AlbumType,
ContentType,
LinkType,
MediaType,
)
+from music_assistant.common.models.errors import InvalidDataError
MetadataTypes = int | bool | str | list[str]
"""Set MusicBrainz External ID."""
if not value:
return
- if len(value.split("-")) != 5:
- raise RuntimeError("Invalid MusicBrainz identifier")
+ if not is_valid_uuid(value):
+ raise InvalidDataError(f"Invalid MusicBrainz identifier: {value}")
if existing := next((x for x in self.external_ids if x[0] == ExternalID.MUSICBRAINZ), None):
# Musicbrainz ID is unique so remove existing entry
self.external_ids.remove(existing)