From 0e4eec4f12004dcbb01a88205718ca5c172087e1 Mon Sep 17 00:00:00 2001 From: Jeff Emmett Date: Mon, 9 Feb 2026 18:41:19 +0000 Subject: [PATCH] fix: add web_creator client fallback, friendlier YouTube bot error - Try multiple YouTube player clients for better compatibility - Show user-friendly error suggesting upload when YouTube blocks download Co-Authored-By: Claude Opus 4.6 --- backend/app/services/download.py | 2 ++ backend/app/workers/tasks.py | 10 +++++++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/backend/app/services/download.py b/backend/app/services/download.py index c28afe4..f4ffedf 100644 --- a/backend/app/services/download.py +++ b/backend/app/services/download.py @@ -45,6 +45,8 @@ def _base_opts() -> dict: shutil.copy2(COOKIES_FILE, tmp.name) tmp.close() opts["cookiefile"] = tmp.name + # Enable remote EJS challenge solver for YouTube + opts["extractor_args"] = {"youtube": {"player_client": ["default", "web_creator"]}} return opts diff --git a/backend/app/workers/tasks.py b/backend/app/workers/tasks.py index d777995..708edd8 100644 --- a/backend/app/workers/tasks.py +++ b/backend/app/workers/tasks.py @@ -76,7 +76,15 @@ async def process_job(ctx: dict, job_id: str): os.makedirs(job_media_dir, exist_ok=True) if job.source_type == "youtube": - video_info = await download.download_video(job.source_url, job_media_dir) + try: + video_info = await download.download_video(job.source_url, job_media_dir) + except Exception as dl_err: + if "Sign in to confirm" in str(dl_err) or "bot" in str(dl_err): + raise ValueError( + "YouTube blocked this download (bot detection). " + "Try uploading the video file directly instead." + ) + raise job.title = video_info.title job.duration = video_info.duration job.media_path = video_info.video_path