accept lk.-prefixed playlist uuids in --source links

Personal playlist links (e.g. "liked tracks" shared via the web player)
use a "lk.<uuid>" playlist_uuid, not a bare uuid - confirmed live via
client.playlist(): the prefix is part of the id itself, not something
to strip. Found by testing --source against a real link.
This commit is contained in:
Andrew Pimenov 2026-08-06 19:28:39 +03:00
parent ff452b0162
commit 188fcc8b20
2 changed files with 14 additions and 1 deletions

View file

@ -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/<номер> - "

View file

@ -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 = [
"",
" ",