Как включить автовоспроизведение YouTube с помощью youtube-dl и mpv?

Окончательный ответ:

{ find <DIR> -type f -name "*.<EXT>" -printf "%s+"; echo 0; } | bc

и даже более быстрая версия, не ограниченная ОЗУ, но требующая GNU AWK с поддержкой bignum:

find <DIR> -type f -name "*.<EXT>" -printf "%s\n" | gawk -M '{t+=$1}END{print t}'

Эта версия имеет следующие особенности:

  • все возможности find , чтобы указать файлы, которые вы ищете
  • поддерживает миллионы файлов
    • другие ответы здесь ограничены максимальной длиной списка аргументов
  • только появляются 3 простых процесса с минимальной пропускной способностью канала
    • многие ответы здесь порождают процессы C + N, где C - некоторая константа, а N - количество файлов
  • не беспокоит манипуляции со строками
    • эта версия не выполняет никаких greping или regexing
    • хорошо, find выполняет простое сопоставление имен файлов с использованием подстановочных знаков
  • необязательно форматирует сумма в удобочитаемой форме (например, 5,5K , 176,7M , ...)
    • для этого добавить | numfmt --to = si
8
11.08.2016, 02:15
3 ответа

Можно стримить с youtube-dl и mpv.

Мой скрипт делает именно то, что вам нужно. Это очень просто...

  1. проверяет, является ли это ссылкой на YT или нет,
  2. проверяет заданные параметры
    • -d для загрузки
    • -nv для отсутствия видео, поэтому вы можете слушать музыкальное видео.
  3. с помощью wget получить источник ссылки YT, например
  4. с помощью поиска и обрезки получить идентификаторы видео всех следующих рекомендуемых видео
  5. воспроизвести их по одному
1
27.01.2020, 20:13

Я думаю, что вам лучше всего с наименьшими усилиями использовать связанные с видео функции терминальной программы mps-youtube. Посмотрите здесь: https://github.com/mps-youtube/mps-youtube.

Например:

Если вы хотите посмотреть несколько видео, посвящённых Крису Корнеллу, и у вас установлен и запущен mps-youtube, вы можете использовать следующую команду, чтобы установить для воспроизведения видео значение «true» (в противном случае вы только получить аудио)

set show_video true

Затем найдите видео или плейлист, который вы хотите воспроизвести:

Для видео:

.Chris Cornell Tribute

Затем выберите видео, к которому вы хотите добавить похожие видео:

r 1

(где 1 – это видео, которое вы хотите видео для)

Затем просто введите диапазон видео, которые вы хотите воспроизвести.

1-50

(будут воспроизводиться все связанные видео, до номера 50.)

Вам также может понадобиться установить видеоплеер по умолчанию на mpv, так как я думаю, что программа по умолчанию использует mPlayer. Я понимаю, что это добавляет в микс совершенно отдельную программу, но она действительно использует технологию, о которой вы спрашиваете, оставляя вас в терминале.

1
27.01.2020, 20:13

упрощенный подход

можно использовать небольшой скрипт:

#!/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

или прямо в вашей оболочке:

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, один для сценария ).

избегайте повторяющихся идентификаторов

Приведенный выше код является базовым примером и не позволяет избежать циклов. если вы хотите избежать повторного воспроизведения видео с одним и тем же идентификатором, этого можно добиться, добавив ведро:

#!/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.

сложнее избегать повторяющихся идентификаторов

однако в некоторых редких (? )случаев, когда вы, возможно, уже воспроизвели все идентификаторы текущей страницы YouTube. затем скрипт должен искать страницы уже просмотренных идентификаторов:

#!/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
25.10.2020, 10:52

Теги

Похожие вопросы