youtube dl viewer

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# 遇到报错,需要登录 youtube 获取 cookies

yt-dlp ERROR: [youtube] uqNEthI6Df8: Sign in to confirm you’re not a bot. Use --cookies-from-browser or --cookies for the authentication. See
https://github.com/yt-dlp/yt-dlp/wiki/FAQ#how-do-i-pass-cookies-to-yt-dlp for how to manually pass cookies. Also see
https://github.com/yt-dlp/yt-dlp/wiki/Extractors#exporting-youtube-cookies for tips on effectively exporting YouTube cookies

# 1.安装 chrome 插件: Get cookies.txt LOCALLY: https://chromewebstore.google.com/detail/get-cookiestxt-locally/cclelndahbckbenkjhflpdbgdldlbecc
# 2.打开 youtube 网站并登录, 使用以上插件下载 /youtube-dl/cookies.txt
# 3.在 'Advanced Options' 添加: --cookies /youtube-dl/cookies.txt
# 4.在 docker 安装 deno
rm -rf /root/.deno
apk update
apk add --no-cache deno
# 5.测试
yt-dlp -v \
  --js-runtimes deno:/usr/bin/deno \
  --cookies /youtube-dl/cookies.txt \
  "https://www.youtube.com/watch?v=DOyoYgAj-GE"

# 6. 自动下载 cookies.txt
#yt-dlp \
#  --cookies-from-browser chrome \
#  --cookies /youtube-dl/cookies.txt \

#As of 2026, the better cookie-less approach for automated Docker use is to use yt-dlp's PO Token provider.
#yt-dlp's current documentation specifically recommends a PO Token provider plugin,
#particularly with the mweb client, rather than manually generating tokens.
yt-dlp \
  --extractor-args "youtube:player_client=android_vr" \
  "https://www.youtube.com/watch?v=uqNEthI6Df8"
# or
yt-dlp \
  --extractor-args "youtube:player_client=web_embedded" \
  "https://www.youtube.com/watch?v=uqNEthI6Df8"

在 Alpine Docker 中修复 yt-dlp 的 YouTube n challenge 与 Deno 错误

本文记录一次在 youtube-dl-react-viewer 的 Alpine Linux Docker 容器中,使用 yt-dlp 下载 YouTube 视频时遇到的完整排查过程。

1. 初始错误

使用 yt-dlp 下载 YouTube 视频时,出现:

1
2
3
4
WARNING: [youtube] n challenge solving failed: Some formats may be missing.
Ensure you have a supported JavaScript runtime and challenge solver script distribution installed.

ERROR: [youtube] The page needs to be reloaded.

进一步使用:

1
2
3
yt-dlp -v \
  --cookies /youtube-dl/cookies.txt \
  "https://www.youtube.com/watch?v=VIDEO_ID"

可以看到类似:

1
2
3
4
5
6
7
8
9
Optional libraries: ..., yt_dlp_ejs-0.8.0
JS runtimes: none

[youtube] [pot] PO Token Providers: none
[youtube] [jsc] JS Challenge Providers:
  bun (unavailable),
  deno (unavailable),
  node (unavailable),
  quickjs (unavailable)

同时日志中已经出现:

1
[youtube] Found YouTube account cookies

这说明:

  • cookies.txt 已经被正确读取;
  • yt-dlp-ejs 已安装;
  • 真正缺失的是 JavaScript runtime。

对于当前版本的 yt-dlp,建议使用 Deno 作为 JavaScript runtime。


2. 确认 Docker 基础系统

进入容器后:

1
cat /etc/os-release

输出:

1
2
3
4
NAME="Alpine Linux"
ID=alpine
VERSION_ID=3.22.2
PRETTY_NAME="Alpine Linux v3.22"

因此该容器使用的是 Alpine Linux。

Alpine 的包管理器是:

1
apk

而不是:

1
2
3
apt
yum
dnf

所以安装软件应该使用:

1
2
apk update
apk add --no-cache PACKAGE_NAME

3. 不建议使用 Deno 官方安装脚本

最开始尝试:

1
curl -fsSL https://deno.land/install.sh | sh

安装得到:

1
/root/.deno/bin/deno

文件虽然存在:

1
ls /root/.deno/bin/deno

但是执行:

1
/root/.deno/bin/deno --version

却出现:

1
sh: /root/.deno/bin/deno: not found

这里的 not found 并不一定表示文件不存在。

真正的问题通常是:

  • Deno 官方安装脚本下载的是 glibc/GNU Linux 二进制;
  • Alpine Linux 默认使用 musl libc;
  • 二进制所需要的动态加载器不存在;
  • shell 最终表现为 not found

可以通过:

1
2
3
apk add --no-cache file

file /root/.deno/bin/deno

进一步确认。

如果输出中包含类似:

1
interpreter /lib64/ld-linux-x86-64.so.2

而 Alpine 使用:

1
/lib/ld-musl-x86_64.so.1

就说明这是 glibc 与 musl 的兼容问题。


4. 正确做法:直接安装 Alpine 的 Deno

对于 Alpine,最简单可靠的方法是直接安装发行版自带的 Deno:

1
2
apk update
apk add --no-cache deno

然后检查:

1
2
which deno
deno --version

正常应该类似:

1
2
/usr/bin/deno
deno 2.3.1

如果 apk 找不到 deno,检查:

1
cat /etc/apk/repositories

确保启用了 community

1
2
https://dl-cdn.alpinelinux.org/alpine/v3.22/main
https://dl-cdn.alpinelinux.org/alpine/v3.22/community

如果没有,可以添加:

1
2
3
4
echo "https://dl-cdn.alpinelinux.org/alpine/v3.22/community" >> /etc/apk/repositories

apk update
apk add --no-cache deno

5. 让 yt-dlp 使用 Deno

安装完成后,可以显式指定 Deno:

1
2
3
4
yt-dlp -v \
  --js-runtimes deno:/usr/bin/deno \
  --cookies /youtube-dl/cookies.txt \
  "https://www.youtube.com/watch?v=VIDEO_ID"

成功后,调试输出应该从:

1
JS runtimes: none

变成类似:

1
JS runtimes: deno-2.3.1

同时:

1
JS Challenge Providers: deno

也应该变为可用。


6. 新错误:Failed getting cwd

Deno 被正确识别后,又可能出现:

1
2
3
4
5
6
7
8
9
[youtube] [jsc:deno] Solving JS challenges using deno

WARNING: [youtube] [jsc] Error solving n challenge request using "deno" provider:
Error running deno process (returncode: 1):

error: Failed getting cwd.

Caused by:
    No such file or directory (os error 2).

这是另一个独立问题。

cwd 是:

1
current working directory

也就是当前工作目录。

典型原因是:

  1. 当前 shell 位于某个目录;
  2. 这个目录后来被删除;
  3. shell 仍然保留原来的路径状态;
  4. Deno 启动时调用 getcwd()
  5. 系统返回 ENOENT
  6. Deno 报:
1
Failed getting cwd

例如,当前提示符可能仍然显示:

1
~/.deno/bin #

但此前执行过:

1
rm -rf /root/.deno

那么 shell 实际上已经处于一个被删除的目录中。


7. 修复 Failed getting cwd

最简单的方法:

1
cd /

或者:

1
cd /tmp

或者:

1
cd /youtube-dl

然后确认:

1
pwd

例如:

1
/

再测试 Deno:

1
deno --version

还可以进一步测试:

1
echo 'console.log("deno ok")' | deno run -

正常输出:

1
deno ok

8. 再次测试 yt-dlp

确认当前目录有效后,再运行:

1
2
3
4
5
6
cd /

yt-dlp -v \
  --js-runtimes deno:/usr/bin/deno \
  --cookies /youtube-dl/cookies.txt \
  "https://www.youtube.com/watch?v=VIDEO_ID"

如果问题解决,应该不再出现:

1
Failed getting cwd

也不应该再因为 Deno 无法运行而出现:

1
n challenge solving failed

日志中应该正常看到:

1
[youtube] [jsc:deno] Solving JS challenges using deno

9. 下载字幕

如果同时需要下载字幕,可以使用:

1
2
3
4
5
6
7
8
yt-dlp \
  --js-runtimes deno:/usr/bin/deno \
  --cookies /youtube-dl/cookies.txt \
  --write-subs \
  --write-auto-subs \
  --sub-langs "en.*,zh-Hans,zh-Hant" \
  --sub-format vtt \
  "https://www.youtube.com/watch?v=VIDEO_ID"

如果只想查看有哪些字幕:

1
2
3
4
5
yt-dlp \
  --js-runtimes deno:/usr/bin/deno \
  --cookies /youtube-dl/cookies.txt \
  --list-subs \
  "https://www.youtube.com/watch?v=VIDEO_ID"

10. youtube-dl-react-viewer 的 Override Config

youtube-dl-react-viewer 中,可以将以下参数加入 Override Config:

1
--js-runtimes deno:/usr/bin/deno --cookies /youtube-dl/cookies.txt

如果同时需要字幕:

1
--js-runtimes deno:/usr/bin/deno --cookies /youtube-dl/cookies.txt --write-subs --write-auto-subs --sub-langs "en.*,zh-Hans,zh-Hant" --sub-format vtt

11. 最终排查结论

整个问题链可以总结为:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
YouTube 下载失败
cookies 已正确读取
yt-dlp-ejs 已安装
JS runtime 缺失
安装 Deno
官方 Deno glibc 二进制无法在 Alpine musl 上运行
改用 apk 安装 Alpine 原生 Deno
yt-dlp 正确识别 Deno
出现 Failed getting cwd
发现当前 shell 所在目录已经被删除
cd 到有效目录
Deno challenge solver 正常运行

12. 推荐的最终命令

对于 Alpine Docker + youtube-dl-react-viewer,推荐:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
apk update
apk add --no-cache deno

cd /

deno --version

yt-dlp -v \
  --js-runtimes deno:/usr/bin/deno \
  --cookies /youtube-dl/cookies.txt \
  "https://www.youtube.com/watch?v=VIDEO_ID"

需要字幕时:

1
2
3
4
5
6
7
8
yt-dlp \
  --js-runtimes deno:/usr/bin/deno \
  --cookies /youtube-dl/cookies.txt \
  --write-subs \
  --write-auto-subs \
  --sub-langs "en.*,zh-Hans,zh-Hant" \
  --sub-format vtt \
  "https://www.youtube.com/watch?v=VIDEO_ID"

13. Docker 持久化建议

需要注意,在正在运行的容器中执行:

1
apk add --no-cache deno

只会修改当前容器。

如果之后重新创建容器,Deno 可能会丢失。

更可靠的方法是创建自己的 Dockerfile,例如:

1
2
3
FROM 原来的-youtube-dl-react-viewer-image

RUN apk add --no-cache deno

然后重新构建:

1
docker build -t youtube-dl-react-viewer-with-deno .

这样 Deno 会成为镜像的一部分,不会因为容器重建而丢失。

william 支付宝支付宝
william 微信微信
0%