在 youtube-dl 中,我尝试从 URL 获取播放列表内容(应该有 600 多个条目),因此:
youtube-dl -i -v --flat-playlist --skip-download https://www.youtube.com/watch?v=CNotezuR73g&list=PLm9l7EEbJuhyDYNuItj3sG8h3xAZbjIxr
根据手册页,它应该列出播放列表条目,同时阻止文件下载。
相反,在产生以下输出后它会挂起:
~ $ youtube-dl -i -v --flat-playlist --skip-download https://www.youtube.com/watch?v=CNotezuR73g&list=PLm9l7EEbJuhyDYNuItj3sG8h3xAZbjIxr
[1] 4531
~ $ [debug] System config: []
[debug] User config: []
[debug] Custom config: []
[debug] Command-line args: ['-i', '-v', '--flat-playlist', '--skip-download', 'https://www.youtube.com/watch?v=CNotezuR73g']
[debug] Encodings: locale UTF-8, fs utf-8, out UTF-8, pref UTF-8
[debug] youtube-dl version 2018.07.10
[debug] Python version 3.6.6 (CPython) - Linux-4.17.6-1-ARCH-x86_64-with-arch
[debug] exe versions: ffmpeg 4.0.1, ffprobe 4.0.1, rtmpdump 2.4
[debug] Proxy map: {}
[youtube] CNotezuR73g: Downloading webpage
[youtube] CNotezuR73g: Downloading video info webpage
[debug] Default format spec: bestvideo+bestaudio/best
我该怎么做?
答案1
你读过这个页面吗所见即所得他在评论中提出了建议?(谢谢@wysiwig!)
无论如何,在这里我将尝试解释您可以做什么(摘自之前的网站)
尝试使用此命令:
youtube-dl -j --flat-playlist "https://<yourYoutubePlaylist>" | jq -r '.id' | sed 's_^_https://youtu.be/_' > result.log
这将在 result.log 中产生类似这样的输出:
https://youtu.be/0gvUCLL-UGE
https://youtu.be/CPV7zcUy4J0
https://youtu.be/4wyZNwIrH9I
...
这应该就是您所需要的( YT 视频的离散链接列表)。
命令解释
使用-j
选项 youtube-dl 将生成一个 JSON 输出,其中包含有关您传递的链接(在本例中为播放列表)的所有信息。
然后将此 JSON 输出传递给jq
JSON 处理器(您必须先安装它参见 JQ 网站) 搜索 JSON 输出中包含的所有“id”键 (0gvUCLL-UGE、CPV7zcUy4J0、4wyZNwIrH9I、...)。然后我们将这些“id”传递给 ,sed
每个键都会加上前缀,从而https://youtu.be/
得到我之前显示的结果。
注 1:要安装 JQ,您只需使用:sudo apt-get install jq
注 2:此方法适用于YouTube仅有的。
答案2
@wysiwig
的方法确实在 Linux 上产生了输出,但不是我想要的,因此:
$ youtube-dl --flat-playlist --skip-download https://www.youtube.com/playlist?list=PLm9l7EEbJuhyDYNuItj3sG8h3xAZbjIxr
输出 :
[youtube:playlist] PLm9l7EEbJuhyDYNuItj3sG8h3xAZbjIxr:下载网页
[下载] 下载播放列表:完整版艺术电影
[youtube:playlist] PLm9l7EEbJuhyDYNuItj3sG8h3xAZbjIxr:下载页面 #1
[youtube:playlist] PLm9l7EEbJuhyDYNuItj3sG8h3xAZbjIxr:下载页面 #2
[youtube:playlist] PLm9l7EEbJuhyDYNuItj3sG8h3xAZbjIxr:下载页面 #3
[youtube:playlist] PLm9l7EEbJuhyDYNuItj3sG8h3xAZbjIxr:下载页面 #4
[youtube:playlist] PLm9l7EEbJuhyDYNuItj3sG8h3xAZbjIxr:正在下载页面 #5
[youtube:playlist] PLm9l7EEbJuhyDYNuItj3sG8h3xAZbjIxr:正在下载页面 #6
[youtube:playlist] 播放列表全长艺术电影:正在下载 636 个视频
[下载] 正在下载视频 1/636 个
[下载] 正在下载视频 2/636 个
[下载] 正在下载视频 3/636 个
...
我真正想要从播放列表中获取的是视频名称,以便我可以只挑选出我想要下载的视频,我可以使用以下命令获得这些视频:
$ youtube-dl -i --get-filename --skip-download https://www.youtube.com/playlist?list=PLm9l7EEbJuhyDYNuItj3sG8h3xAZbjIxr
输出 :
侍者(完整长度的电影,整部故事片,完整电影)_免费观看完整电影-CNotezuR73g.mp4
马尔科姆 X(MORGAN FREEMAN,完整电影,英语,完整长度的电影)_免费观看完整电影-3C8j1C7HMj8.mp4
亚利桑那小子 - 西部片,完整电影,由 ROY ROGERS 主演的全长故事片,经典电影-8McZ6G2Uud8.mp4
亡命之徒又名鼠尾草小径(西部电影,完整长度的电影,故事片,经典电影)-7udmB5M6IIE.mp4
...
答案3
看起来您没有引用 URL。总是引用 URL。在任何操作系统上。
在您的示例中,问题显而易见:
~ $ youtube-dl -i -v --flat-playlist --skip-download https://www.youtube.com/watch?v=CNotezuR73g&list=PLm9l7EEbJuhyDYNuItj3sG8h3xAZbjIxr [1] 4531
[1] 4531
表示作业(ID 1)已启动并且正在以 PID 4531 运行。
该命令行大致相当于:
youtube-dl -i -v --flat-playlist --skip-download https://www.youtube.com/watch?v=CNotezuR73g &
list=PLm9l7EEbJuhyDYNuItj3sG8h3xAZbjIxr
末尾的 & 符号表示第 1 行将在后台执行。它仍将连接到您的 shell,因此您将看到其输出。它可能没有挂起,只是完成了:毕竟,它只是一个视频链接。
list
第 2 行是 Bash 中的变量赋值。如果变量不存在,它将定义一个名为的变量。它可以像这样使用:
~ $ echo $list
PLm9l7EEbJuhyDYNuItj3sG8h3xAZbjIxr
您要使用的正确命令行是:
youtube-dl -i -v --flat-playlist --skip-download "https://www.youtube.com/watch?v=CNotezuR73g&list=PLm9l7EEbJuhyDYNuItj3sG8h3xAZbjIxr"
答案4
我的解决方案。使用 perl,但执行整个通道:
#!/usr/bin/perl
# Make a plain text list of the videos in all the playlists of a
# YouTube channel, using yt-dlp. The crucial item is the "/playlists"
# after the channel URL.
use strict;
use warnings 'all';
use open qw/:std :encoding(utf8)/;
use JSON;
my $prog = q(yt-dlp --dump-json --ignore-errors --flat-playlist);
my $chan = q(https://www.youtube.com/@jidanni2);
for ( split /\n/, qx!$prog $chan/playlists! ) {
for ( decode_json $_) {
printf "==== %s |%s\n", $_->{url}, $_->{title};
my $c;
for ( split /\n/, qx!$prog $_->{url}! ) {
for ( decode_json $_) {
printf "%03d|%s|%s\n", ++$c, $_->{id}, $_->{title};
}
}
}
}
输出:
==== https://www.youtube.com/playlist?list=PLU... |其他 Etc.
001|Pqz7tTlNLB8|積丹尼 (Dan Jacobson) 在 HackingThursday 的 ed 快講
002|r8VJXO195R8|mini Debian Camp 2009 Day 1
003|rrrrrxxxxxx|Nibblesford Olympics
==== https://www.youtube.com/playlist?list=PLURD44... |Ernest P. Worrell
001|xxxxyyyyyyy|Ernest goes to the laundromat
002|xxxxyyyyyzz|Ernest goes to the taxidermist
etc.
运行速度超快!我认为没有比这更快的方法了。
输出中每个播放列表 URL 末尾添加空格,以便于鼠标抓取。
播放列表索引(001、002......)不是官方的 %(playlist_index),但估计值足够好,因为我们想要使用 --flat-playlist 的速度。