Смотрите видео YouTube в терминале

Смотрите видео YouTube в терминале

Я ищу способ смотреть видео YouTube в терминале (не в браузере или другом окне, а прямо там, в любой сессии bash).

Есть ли простой способ сделать это?

Я представляю себе что-то вроде этого:

$ youtube <video-url>     

Я уже знаю, как воспроизвести видео с помощью mplayer:

$ mplayer -vo caca local-file.avi

Однако, это открывает новое окно. Было бы круто играть в терминале.

Кроме того, он должен быть совместим с tmuxсессиями.


Я задал еще один вопроскак предотвратить открытие нового окна.


Для тех, кто задается вопросом, зачем мне такая функциональность, я начал экспериментальный проект под названиемTmuxOS-- с концепцией, чтовсе должно работать внутри tmuxсеанса.

Итак, мне действительно нужен видеоплеер для локального и удаленного видео. :-)

решение1

Вы можете загружать видео и/или только аудио, а затем смотреть/слушать их с помощьюyoutube-dl. Скрипт написан на Python и использует, как ffmpegя полагаю.

$ youtube-dl --help
Usage: youtube-dl [options] url [url...]

Options:
  General Options:
    -h, --help                       print this help text and exit
    --version                        print program version and exit
    -U, --update                     update this program to latest version.
                                     Make sure that you have sufficient 
                                     permissions (run with sudo if needed)
...
...

Чтобы загрузить видео, просто введите URL-адрес страницы, на которой вы хотите разместить видео, а скрипт сделает все остальное:

$ youtube-dl https://www.youtube.com/watch?v=OwvZemXJhF4
[youtube] Setting language
[youtube] OwvZemXJhF4: Downloading webpage
[youtube] OwvZemXJhF4: Downloading video info webpage
[youtube] OwvZemXJhF4: Extracting video information
[youtube] OwvZemXJhF4: Encrypted signatures detected.
[youtube] OwvZemXJhF4: Downloading js player 7N
[youtube] OwvZemXJhF4: Downloading js player 7N
[download] Destination: Joe Nichols - Yeah (Audio)-OwvZemXJhF4.mp4
[download] 100% of 21.74MiB in 00:16

Затем вы можете использовать vlcили mplayerдля просмотра их локально:

$ vlc "Joe Nichols - Yeah (Audio)-OwvZemXJhF4.mp4"
VLC media player 2.1.5 Rincewind (revision 2.1.4-49-gdab6cb5)
[0x1cd1118] main libvlc: Running vlc with the default interface. Use 'cvlc' to use vlc without interface.
Fontconfig warning: FcPattern object size does not accept value "0"
Fontconfig warning: FcPattern object size does not accept value "0"
Fontconfig warning: FcPattern object size does not accept value "0"
Fontconfig warning: FcPattern object size does not accept value "0"

Хорошо, но я хочу смотреть эти видео в потоковом режиме и в формате ASCII.

Я нашел эту статью в блоге под названием:Об ascii, youtube и отпускании (Wayback Machine)это демонстрирует метод, который я обсуждал в чате, в основном использующийся youtube-dlв качестве «бэкэнда», который может загружать поток YouTube, а затем перенаправлять его в какое-то другое приложение.

В этой статье показано, как это делается с помощью mplayer:

$ youtube-dl http://www.youtube.com/watch?v=OC83NA5tAGE -o - | \
    mplayer -vo aa -monitorpixelaspect 0.5 - 

Видео, которое загружается, youtube-dlперенаправляется через STDOUT выше, -o -. Естьдемо эффекта здесь.

          сс#1

Установив дополнительные библиотеки, можно еще больше улучшить ASCII-видео.

               сс#2

Хорошо, но я хочу, чтобы видео было на моем реальном терминале?

Я нашел этот трюк, который позволяет воспроизводить видео в xtermстатье O'Reilly под названием:Смотреть видео в ASCII Art.

$ xterm -fn 5x7 -geometry 250x80 -e "mplayer -vo aa:driver=curses j.mp4

В результате xtermоткрывается окно, в котором воспроизводится видео.

   сс#3

Поэтому я подумал, почему бы не соединить арахисовое масло и шоколад вот так:

$ xterm -fn 5x7 -geometry 250x80 -e \
    "youtube-dl http://www.youtube.com/watch?v=OC83NA5tAGE -o - | \
    mplayer -vo aa:driver=curses -"

Это почти работает! Я не уверен, почему видео не может воспроизводиться в окне, но, похоже, должно. Окно появляется и начинает воспроизводиться, но затем закрывается. Я вижу видео в течение нескольких секунд, а затем ничего.

Возможно, вышеизложенное приблизит вас к окончательному решению, или, возможно, вам просто нужно будет немного подкорректировать некоторые параметры.

Дополнительные библиотеки

Если вы libcacaустановили (цветную версию aalib) и уменьшили размер шрифта в вашем браузере gnome-terminalдо очень маленького, например, 3, следующая команда отобразит гораздо более качественное видео ASCII прямо в терминале:

$ CACA_DRIVER=ncurses mplayer -vo caca video.mp4

   сс#4

Терминалы

Казалось бы, выбор терминала может иметь большое значение в том, mplayerможно ли играть прямо в терминале или же он открывает отдельное окно. Кэширование также mplayerвнесло существенные изменения в возможность играть прямо в терминалах.

Используя эту команду, мне удалось воспроизвести terminator, по крайней мере, первую четверть видео, прежде чем оно оборвалось:

$ youtube-dl http://www.youtube.com/watch?v=OC83NA5tAGE -o - | \
    mplayer -cache 32767 -vo aa:driver=curses -

Цветная версия использовала эту команду:

$ youtube-dl http://www.youtube.com/watch?v=OC83NA5tAGE -o - | \
    CACA_DRIVER=ncurses mplayer -cache 64000 -vo caca -

Эти же команды можно использовать и в gnome-terminal& xterm.

    монтаж ss

    ПРИМЕЧАНИЕ:Это (слева направо) xterm, terminator, gnome-terminal, и terminology.

решение2

Итак, сТерминология (кстати, это, наверное, самое лучшее, что когда-либо случалось с эмулятором терминала) на момент написания этой статьиследующие работы:

ytplay() ( 
    init() if     [ "${#1}" -gt 0 ] && i=$? du= f=
           then   durl \! \" \# \$ \% \& \' \( \) \* \
                       \+ \, \/ \: \; \= \? \@ \[ \]
                  : >"${f:=${2:-/tmp/vid}.$(
                      durl "$1" 's/.*mime=[^/]*.\([^&]*\).*/\1/'
                  )}"
                  init() { loop; }
           else   ! echo 'NO LINK SPECIFIED!' >&3
           fi
    durl() if    [ "${#du}" -eq 0 ]
           then  du=$(for c do printf 's/%%%X/\\%s/g;' "'$c" "$c"; done)
           else  curl -s "$1" | { shift
                 sed '/.*url_encoded_fmt_stream_map[^,]*url=/!d
                      s///;s/,.*//;s/\\u0026/\&/g;'"$du$*"; }
           fi
    loop() if    [ "$((i=$i+1))" -le 5 ] &&
                 sleep "$(($i*2))" 
           then  play || kill "$pid" || :
           else  ! echo 'ERROR RETRIEVING VIDEO!' >&3
           fi
    play() if    [ -s "$f" ]
           then  printf '\033}bt%s\0' "$f"; exit
           fi
    while init "$@" || exit
    do    curl -s "$(durl "$1")" >"$f" & pid=$!
    done  3>&2 2>/dev/null
)

Конкретный terminologyбит - это thenблок в play()- printf \033}...строке. terminologyпринимает расширенные управляющие команды терминала для вывода информации на экран - что-то вроде цветов подсказок, но также и видео высокой четкости и, в принципе, все, что вам нужно.

Остальное — небольшой отрывок curl | sedсценария, который:

  1. Принимает обычную ссылку YouTube в качестве первого аргумента...
    • ytplay 'https://www.youtube.com/watch?v=${id}'и так далее...
  2. Извлекает HTML и находит соответствующий код JavaScript для альтернативных потоков загрузки...
    • сделать curl "$yturl" | grep url_encoded_fmt_stream_map, чтобы увидеть весь блок.
  3. Из этого блока он выбирает первый предложенный альтернативный поток.
    • предлагается множество вариантов — если вы выполнили вышеперечисленное, grepвы найдете список в поле ", разделенном кавычками ...stream_map: ".
    • в то время как сначала я думал, что буду получать только mp4s, все больше и больше я получаю и webms. Поэтому я отредактировал его для потока и назначил расширение файла по типу mime.
    • до сих пор- будь то webm или mp4 - первый альтернативный поток имеет наивысшее качество, предлагаемое для каждого видео -обычно720p .mp4 - это то, что я ищу в любом случае, и поэтому здесь нет логики для выбора других. Моя последняя редакция добавила некоторые модульные/явные тесты, чтобы сделать это возможным. Смотритеэтотдля скрипта Perl, на который я ссылался при первоначальном написании функции.
  4. Разбирает %[[:hexdigit:]]\{2\}кодировку на рабочие ссылки.
    • Видетьэтотдля моей рабочей справки.
  5. Пытается загрузить файл до 5 раз с небольшой задержкой.
    • По умолчанию файл — , /tmp/vid.${mime-type}но если ytplayон вызывается со вторым аргументом, он будет интерпретировать его как имя целевого загружаемого файла — при этом расширение будет добавлено в соответствии с типом MIME.
  6. Если после любой из попыток целевой объект загрузки имеет размер больше нуля, он позволяет продолжить загрузку в фоновом режиме и terminologyпечатаетпоместить медиа в фоновый режим сейчасвыход из терминала, иначе он просто сдастся и выдаст сообщение об ошибке, написанное заглавными буквами.
    • \033}bt[LINK/FILE]\0для полноэкранного воспроизведения. pnвыведет его в новое окно. Есть и другие для геометрического ограничения области воспроизведения — например, только для части окна.

Это претерпело лишь немного больше, чемочень минимальныйтестирование, но до сих пор работало для всех ссылок без сбоев, кроме одной - и поскольку мне на самом деле не было интересно смотреть ту, которая не воспроизводилась, я не пытался выяснить, почему.

Хотя это сработало для всех, это не обязательноигратькаждый - и это потому, что сначала я слепо добавил .mp4расширение к целевому файлу, не проверив, правильно ли оно. Возможно, что тот, на который я не обратил внимания раньше, был только этим. В любом случае, я изменил его, чтобы справиться с этим.

Как я уже упоминал, единственный terminologyконкретный бит находится в самой последней функции - play()- и поэтому вы можете легко изменить его, чтобы сделать все, что захотите с загружаемым/скачанным видеофайлом - например, использовать его с mplayerбиблиотеками CACA в другом терминале, или вывести его в vlcокно или что-то еще. Но если вы себе этого хотите, вы посмотрите его в формате высокой четкости в terminology.

О, и последнее, это обычноочень быстро- моя скорость до сих пор максимизировала мою пропускную способность на данный момент при каждой попытке, но terminologyв любом случае для начала воспроизведения файла не требуется весь файл.

Вот это работает:

терминология рулит

решение3

На YouTube есть обучающее видео по этому вопросу:

https://www.youtube.com/watch?v=QCuq0_nY3Xk

Согласно этому видео, должно работать следующее:

mplayer -cookies -cookies-file /tmp/cook.txt $(youtube-dl -g --cookies /tmp/cook.txt "https://www.youtube.com/watch?v=QCuq0_nY3Xk")

Для этой цели можно создать простую функцию:

playtube () {
mplayer -cookies -cookies-file /tmp/cook.txt $(youtube-dl -g --cookies /tmp/cook.txt "$1")
}

решение4

Отhttps://github.com/mps-youtube/mps-youtube

sudo docker run --device /dev/snd -it --rm --name mpsyt rothgar/mpsyt

Связанный контент