From 48cd01d0f9576482ce0cd3ccef937f2a47e870fe Mon Sep 17 00:00:00 2001 From: jze9 Date: Tue, 14 Jul 2026 15:10:17 +0500 Subject: [PATCH] =?UTF-8?q?expand=5Furl:=20watch-=D1=81=D1=81=D1=8B=D0=BB?= =?UTF-8?q?=D0=BA=D0=B0=20=D1=81=20list=3D=20=D1=80=D0=B0=D1=81=D0=BA?= =?UTF-8?q?=D1=80=D1=8B=D0=B2=D0=B0=D0=B5=D1=82=D1=81=D1=8F=20=D0=B2=20?= =?UTF-8?q?=D0=B2=D0=B5=D1=81=D1=8C=20=D0=BF=D0=BB=D0=B5=D0=B9=D0=BB=D0=B8?= =?UTF-8?q?=D1=81=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Fable 5 --- api/lib/youtube.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/api/lib/youtube.py b/api/lib/youtube.py index a2f2f2e..07786a9 100644 --- a/api/lib/youtube.py +++ b/api/lib/youtube.py @@ -18,9 +18,19 @@ _VIDEO_EXTS = {".mp4", ".mkv", ".webm", ".m4a", ".mp3", ".mov", ".opus", ".ogg", def expand_url(url: str) -> dict: """Определяет, видео это или плейлист, и возвращает список элементов. + Ссылка вида watch?v=…&list=… (видео внутри плейлиста) трактуется как весь + плейлист — именно её люди копируют из адресной строки. + Returns: {"kind": "video"|"playlist", "title": str, "entries": [{"url": str, "title": str}, ...]} """ + m = re.search(r"[?&]list=([A-Za-z0-9_\-]+)", url) + if m and "playlist?" not in url: + # RD… и LL/WL — авто-миксы и служебные списки, их не разворачиваем + list_id = m.group(1) + if not list_id.startswith(("RD", "LL", "WL")): + url = f"https://www.youtube.com/playlist?list={list_id}" + opts = { "extract_flat": "in_playlist", "quiet": True,