From b58dc26bd4342a4e2a94f388ea4ccf7de5f416ce Mon Sep 17 00:00:00 2001 From: Mattias Tall Date: Tue, 26 May 2026 10:10:58 +0200 Subject: [PATCH] =?UTF-8?q?Switch=20to=20android=5Fvr=20player=20client=20?= =?UTF-8?q?=E2=80=94=20no=20Node.js=20required?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit android_vr provides pre-signed format URLs that bypass YouTube's n-challenge and signature JS requirements entirely. Tested: 23 video formats available without any JavaScript runtime installed. Reverts Node.js Dockerfile addition (which failed to build anyway). Co-Authored-By: Claude Sonnet 4.6 --- backend/Dockerfile | 4 +--- backend/routers/settings.py | 2 +- backend/services/ytdlp.py | 4 ++-- 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/backend/Dockerfile b/backend/Dockerfile index 3601400..5a86fa2 100644 --- a/backend/Dockerfile +++ b/backend/Dockerfile @@ -2,9 +2,7 @@ FROM python:3.12-slim WORKDIR /app -RUN apt-get update && apt-get install -y ffmpeg gosu nodejs && \ - ln -sf /usr/bin/nodejs /usr/bin/node && \ - rm -rf /var/lib/apt/lists/* +RUN apt-get update && apt-get install -y ffmpeg gosu && rm -rf /var/lib/apt/lists/* COPY backend/requirements.txt ./backend/requirements.txt RUN pip install --no-cache-dir -r backend/requirements.txt && pip install --no-cache-dir -U yt-dlp diff --git a/backend/routers/settings.py b/backend/routers/settings.py index a0dcbc2..e1099bd 100644 --- a/backend/routers/settings.py +++ b/backend/routers/settings.py @@ -247,7 +247,7 @@ def ytdlp_test( "yt-dlp", "https://www.youtube.com/watch?v=dQw4w9WgXcQ", "--dump-json", "--no-download", "--no-playlist", - "--extractor-args", "youtube:player_client=web", + "--extractor-args", "youtube:player_client=android_vr", *cookie_args, ], capture_output=True, text=True, timeout=30, diff --git a/backend/services/ytdlp.py b/backend/services/ytdlp.py index c58a844..ba6fc99 100644 --- a/backend/services/ytdlp.py +++ b/backend/services/ytdlp.py @@ -216,7 +216,7 @@ def fetch_video_metadata(video_id: str) -> dict | None: base_cmd = [ "yt-dlp", url, "--dump-json", "--no-download", "--no-playlist", - "--extractor-args", "youtube:player_client=web", + "--extractor-args", "youtube:player_client=android_vr", ] stdout, stderr, code = _run([*base_cmd, *cookie_args], timeout=30) if code != 0: @@ -567,7 +567,7 @@ def start_download( "--no-part", "--no-mtime", "-o", output_template, "--newline", "--progress", "--no-colors", - "--extractor-args", "youtube:player_client=web", + "--extractor-args", "youtube:player_client=android_vr", *cookie_args, ], stdout=subprocess.PIPE,