我如何才能仅下载 YouTube 播放列表而不下载其中的文件?

我如何才能仅下载 YouTube 播放列表而不下载其中的文件?

在 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 列出 Youtube 播放列表

无论如何,在这里我将尝试解释您可以做什么(摘自之前的网站)

尝试使用此命令:

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 输出传递给jqJSON 处理器(您必须先安装它参见 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 的速度。

相关内容