如何使用 youtube-dl 和 mpv 启用 YouTube 自动播放?

如何使用 youtube-dl 和 mpv 启用 YouTube 自动播放?

有没有办法播放视频并使其跟随 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 进行流式传输。

我的剧本正是你想要的。这很简单...

  1. 检查是否是 YT 链接,
  2. 检查给定的参数
    • -d 用于下载
    • -nv 表示没有视频,因此您可以听音乐视频。
  3. 例如,使用 wget 获取 YT 链接的来源
  4. 通过一些 grep 和剪切,获取以下所有推荐视频的视频 ID
  5. 将它们一一播放

答案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的播放列表中。

相关内容