Replace UUID check on MusicBrainz ID (#1015)
authorMarcel van der Veldt <m.vanderveldt@outlook.com>
Sun, 21 Jan 2024 22:30:46 +0000 (23:30 +0100)
committerGitHub <noreply@github.com>
Sun, 21 Jan 2024 22:30:46 +0000 (23:30 +0100)
music_assistant/common/helpers/util.py
music_assistant/common/models/media_items.py

index 1a73f44cadb21ed91360466aa85a8115132eb6c6..d5ff70e64adaa75cc4f24fc4beff49a5cb7b39b5 100755 (executable)
@@ -6,6 +6,7 @@ import os
 import socket
 from collections.abc import Callable
 from typing import Any, TypeVar
+from uuid import UUID
 
 # pylint: disable=invalid-name
 T = TypeVar("T")
@@ -277,3 +278,12 @@ def empty_queue(q: asyncio.Queue) -> None:
             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
index 85c2ec6fb87ad8935fddc6f81ca96b3b4fb0426a..aace45cb13c1bdc109c114129158aab14d86cae3 100755 (executable)
@@ -8,7 +8,7 @@ from typing import Any, Self
 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,
@@ -17,6 +17,7 @@ from music_assistant.common.models.enums import (
     LinkType,
     MediaType,
 )
+from music_assistant.common.models.errors import InvalidDataError
 
 MetadataTypes = int | bool | str | list[str]
 
@@ -222,8 +223,8 @@ class _MediaItemBase(DataClassDictMixin):
         """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)