有没有办法播放视频并使其跟随 YouTube 自动播放视频?
youtube-dl
这可以用and/or来完成mpv
吗?
答案1
简化方法
你可以使用一个小脚本:
#!/usr/bin/perl
use strict;
use warnings;
my $id = $ARGV[0] or die "youtube ID as param needed";
$id =~ s/.*v=//;
my $yt = "https://www.youtube.com/watch?v=";
while(1){
`mpv $yt$id`;
($id) = `wget -q -O- "$yt$id"` =~ /"autoplay":\{.*?"videoId":"([^"]+)"/;
print "$id\n";
}
将其另存为autoplay.pl
,调用chmod 755 autoplay.pl
,然后尝试例如./autoplay.pl 5YTxsc3Cz24
或者,直接在您的 shell 中:
perl -e 'my $id="5YTxsc3Cz24"; my $yt = "https://www.youtube.com/watch?v="; while(1){`mpv $yt$id`; ($id) = `wget -q -O- "$yt$id"` =~ /"autoplay":\{.*?"videoId":"([^"]+)"/; print "$id\n";}'
您可以通过按 ctrl+c 结束播放(两次,一次用于 mpv,一次用于脚本)。
避免重复的 ID
上面的代码是一个基本示例,并没有避免任何循环。如果你想避免重复播放同一个ID的视频,可以通过添加一个bucket来实现:
#!/usr/bin/perl
use strict;
use warnings;
my $id = $ARGV[0] or die "youtube ID or youtube url as param needed";
$id =~ s/.*v=//;
my $yt = "https://www.youtube.com/watch?v=";
my %bucket = ($id => 1);
while(defined $id){
print "$id\n";
`mpv $yt$id`;
my @ids = `wget -q -O- "$yt$id"` =~ /"videoId":"([^"]+)"/g;
undef $id;
for my $i(@ids){
unless($bucket{$i}){
$id = $i;
++$bucket{$id};
}
}
}
此代码在当前 YouTube 页面中搜索所有 ID,并跳过那些已播放的 ID。如果当前页面没有找到未播放的ID,则结束。
更难避免重复出现的 ID
但是,在某些罕见的(?)情况下,您可能已经播放了当前 YouTube 页面的所有 ID。那么脚本应该查找已经看到的 ID 的页面:
#!/usr/bin/perl
use strict;
use warnings;
my $id = $ARGV[0] or die "youtube ID or youtube url as param needed";
$id =~ s/.*v=//;
my $yt = "https://www.youtube.com/watch?v=";
my %bucket = ($id => 1);
sub get_new_videoID{
my $id = shift;
my @ids = `wget -q -O- "$yt$id"` =~ /"videoId":"([^"]+)"/g;
my $new_id;
for my $i(@ids){
unless($bucket{$i}){
++$bucket{$i};
$new_id = $i;
last;
}
}
return $new_id;
}
sub search_seen_videos{
my @seen_IDs = keys %bucket;
my $new_id;
for my $id(@seen_IDs){
$new_id = get_new_videoID($id);
last if defined $new_id;
}
return $new_id;
}
while(defined $id){
print "$id\n";
`mpv $yt$id`;
$id = get_new_videoID($id) // search_seen_videos();
}
print "you have watched all related videos. better do something else now.\n";
答案2
可以使用 youtube-dl 和 mpv 进行流式传输。
我的剧本正是你想要的。这很简单...
- 检查是否是 YT 链接,
- 检查给定的参数
- -d 用于下载
- -nv 表示没有视频,因此您可以听音乐视频。
- 例如,使用 wget 获取 YT 链接的来源
- 通过一些 grep 和剪切,获取以下所有推荐视频的视频 ID
- 将它们一一播放
答案3
我认为您最省力的选择可能是使用终端程序 mps-youtube 的相关视频功能。在这里查看:https://github.com/mps-youtube/mps-youtube。
例如:
如果你想观看一堆 Chris Cornell 致敬视频,并且你已经安装并启动了 mps-youtube,你可以使用以下命令将视频播放设置为“true”(否则你只会得到音频)
set show_video true
然后,找到您想要播放的视频或播放列表:
对于视频:
.Chris Cornell Tribute
然后选择您想要相关视频的视频:
r 1
(其中 1 是您想要相关视频的视频)
然后只需输入您想要播放的视频范围即可。
1-50
(将播放所有相关视频,最多 50 个。)
您可能还需要将默认视频播放器设置为 mpv,因为我认为该程序默认为 mPlayer。我意识到这在组合中添加了一个完全独立的程序,但它确实利用了您所要求的技术,同时让您留在终端中。
答案4
我已经创建了一个脚本mpv
我为此https://github.com/cvzi/mpv-youtube-upnext
如果您启动 YouTube 视频,它总是会将自动播放视频添加到mpv
的播放列表中。