From: MizterB <5458030+MizterB@users.noreply.github.com> Date: Mon, 9 Feb 2026 08:28:13 +0000 (-0500) Subject: Apple Music: Fix syncing shared playlists (#3095) X-Git-Url: https://git.kitaultman.com/?a=commitdiff_plain;h=a6290c3253ee3db0333df73363516b9dea8d0e2e;p=music-assistant-server.git Apple Music: Fix syncing shared playlists (#3095) * Catch MediaNotFoundError in get_library_playlists * Undo try/except, fix is_library_id * Tests for is_library_id --------- Co-authored-by: Marvin Schenkel --- diff --git a/music_assistant/providers/apple_music/__init__.py b/music_assistant/providers/apple_music/__init__.py index c3de1646..11d5ed9d 100644 --- a/music_assistant/providers/apple_music/__init__.py +++ b/music_assistant/providers/apple_music/__init__.py @@ -1128,7 +1128,7 @@ class AppleMusicProvider(MusicProvider): """Check a library ID matches known format.""" if not isinstance(library_id, str): return False - valid = re.findall(r"^(?:[a|i|l|p]{1}\.|pl\.u\-)[a-zA-Z0-9]+$", library_id) + valid = re.findall(r"^(?:[ailp]\.)[a-zA-Z0-9]+$", library_id) return bool(valid) def _is_catalog_id(self, catalog_id: str) -> bool: diff --git a/tests/providers/apple_music/__init__.py b/tests/providers/apple_music/__init__.py new file mode 100644 index 00000000..ada22784 --- /dev/null +++ b/tests/providers/apple_music/__init__.py @@ -0,0 +1 @@ +"""Tests for the Apple Music provider.""" diff --git a/tests/providers/apple_music/test_ids.py b/tests/providers/apple_music/test_ids.py new file mode 100644 index 00000000..9fafc825 --- /dev/null +++ b/tests/providers/apple_music/test_ids.py @@ -0,0 +1,35 @@ +"""Unit tests for Apple Music ID helpers.""" + +from typing import Any + +import pytest + +from music_assistant.providers.apple_music import AppleMusicProvider + + +@pytest.fixture +def provider() -> AppleMusicProvider: + """Return a minimal AppleMusicProvider instance for helper testing.""" + # Avoid Provider __init__ complexity; is_library_id does not use instance state. + return AppleMusicProvider.__new__(AppleMusicProvider) + + +def test_is_library_id_accepts_library_prefixes(provider: AppleMusicProvider) -> None: + """Confirm expected library prefixes are accepted.""" + for prefix in ("a.", "i.", "l.", "p."): + assert provider.is_library_id(f"{prefix}ABC123") + + +def test_is_library_id_rejects_pl_u_prefix(provider: AppleMusicProvider) -> None: + """Reject the invalid pl.u- prefix.""" + assert not provider.is_library_id("pl.u-ABC123") + assert not provider.is_library_id("pl.u-1") + + +def test_is_library_id_rejects_invalid_values(provider: AppleMusicProvider) -> None: + """Reject malformed values and non-string inputs.""" + for value in ("", "a.", "x.123", "pl.123", "p.123-456"): + assert not provider.is_library_id(value) + invalid_non_str: list[Any] = [None, 123, 12.3] + for value in invalid_non_str: + assert not provider.is_library_id(value)