diff --git a/sort_ym/source.py b/sort_ym/source.py index 1a54ce9..e1412c9 100644 --- a/sort_ym/source.py +++ b/sort_ym/source.py @@ -19,7 +19,10 @@ from . import fetch from .ymclient import chunked, with_retries HOST_RE = re.compile(r"^(?:www\.)?music\.yandex\.[a-z]{2,3}$", re.IGNORECASE) -UUID_RE = re.compile(r"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$", re.IGNORECASE) +# "lk." (личный кабинет) - префикс у ссылок на персональные плейлисты (например, "Мне нравится"), +# в отличие от чистого uuid у редакционных плейлистов - подтверждено вживую через client.playlist(): +# без префикса API отвечает NotFoundError, префикс - часть самого uuid, а не что-то, что надо отрезать. +UUID_RE = re.compile(r"^(?:lk\.)?[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$", re.IGNORECASE) _LINK_HINT = ( "Ожидается ссылка вида https://music.yandex.ru/users/<логин>/playlists/<номер> - " diff --git a/tests/test_source.py b/tests/test_source.py index a0189dc..888775f 100644 --- a/tests/test_source.py +++ b/tests/test_source.py @@ -110,6 +110,16 @@ def test_parse_playlist_url_accepts_uuid_form(): assert ref.kind is None +def test_parse_playlist_url_accepts_lk_prefixed_uuid_form(): + # "lk." (личный кабинет) - реальный префикс у ссылок на персональные плейлисты вроде "Мне + # нравится" (подтверждено вживую через client.playlist()); префикс - часть самого uuid для + # API, а не что-то, что нужно отрезать при парсинге. + ref = source.parse_playlist_url( + "https://music.yandex.ru/playlists/lk.dff9b654-af53-4c65-ab4a-d4ed5a0ae72d?utm_source=desktop" + ) + assert ref.uuid == "lk.dff9b654-af53-4c65-ab4a-d4ed5a0ae72d" + + REJECTED_URLS = [ "", " ",