Add curl-cffi dependency and update README for browser impersonation support. Enhanced configuration options for yt-dlp to include impersonation settings, improving compatibility with anti-bot measures. Updated logging in main.py to reflect new impersonation settings.

This commit is contained in:
Leonid Pershin
2026-06-21 10:58:14 +03:00
parent eae4def0bf
commit ea906bbf0e
6 changed files with 155 additions and 2 deletions
+3
View File
@@ -48,6 +48,9 @@ class Settings:
cookies_from_browser: str | None = os.environ.get("PVDL_COOKIES_FROM_BROWSER") or None
# Файл cookies в формате Netscape (cookies.txt).
cookies_file: Path | None = _env_path_opt("PVDL_COOKIES_FILE")
# Импперсонация браузера (TLS-отпечаток) для yt-dlp — нужна сайтам с анти-ботом
# (иначе CDN рвёт соединение / 410). "chrome" по умолчанию; пусто — выключить.
impersonate: str | None = os.environ.get("PVDL_IMPERSONATE", "chrome") or None
settings = Settings()
+2
View File
@@ -53,6 +53,8 @@ async def lifespan(app: FastAPI):
logger.info("yt-dlp cookies: из браузера %s", settings.cookies_from_browser)
if settings.cookies_file:
logger.info("yt-dlp cookies: файл %s", settings.cookies_file)
if settings.impersonate:
logger.info("yt-dlp импперсонация: %s", settings.impersonate)
try:
yield
finally:
+6
View File
@@ -348,6 +348,12 @@ class YtDlpDownloader(Downloader):
"noplaylist": True,
**_ytdlp_cookie_opts(settings.cookies_from_browser, settings.cookies_file),
}
if settings.impersonate:
# Глобально: браузерный отпечаток на ВСЕ запросы (страница + медиа),
# иначе CDN рвёт скачивание видео-данных.
from yt_dlp.networking.impersonate import ImpersonateTarget
base_opts["impersonate"] = ImpersonateTarget.from_str(settings.impersonate)
default_tmpl = str(self._dir / "%(title)s [%(id)s].%(ext)s")
# Фаза 1: узнаём имя файла, не качая, чтобы развести дубли как браузер.