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

107

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

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

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

$ youtube <video-url>     

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

$ mplayer -vo caca local-file.avi

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

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


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


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

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

Ионика Бизэу
источник
2
Вы имеете в виду, как это? google.com/…
хаос
1
@chaos Точно. :-) Я искал это месяцами, но пока ничего не нашел. Решил спросить здесь ...
Ionică Bizau
VLC может воспроизводить видео с YouTube, но не уверен, что у него есть возможность вывода на терминал.
С MPV вы можете сделать mpv <youtube url>. Это также работает для множества других видео сайтов. Но это открывает новое окно.
Херардо Марсет
1
Это увлекательный вопрос, и я многому научился из ответов. Но из любопытства - с какой стати тебе это нужно? ;-)
Цифровая травма

Ответы:

132

Вы можете загружать видео и / или только аудио, а затем смотреть / слушать их, используя 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 и leting go, которая демонстрирует метод, который я обсуждал в чате, в основном используя 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 О'Рейли под названием « Смотреть видео в 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тоже.

    монтаж

    Примечание: Это (слева направо) xterm, terminator, gnome-terminalи terminology.

SLM
источник
2
Вы можете играть в нее, terminologyа не только с кака-либами. Вы можете использовать экранирование терминала, чтобы указать отображенную часть оконного окна и воспроизвести его прямо в высоком разрешении. Вы даже можете установить видео на свой фон и работать над ним. terminologyтакже понимает URI - получите веб-ссылку на ваше видео на YouTube и просто printfна экран, как в терминальной подсказке.
mikeserv
@mikeserv - это круто, никогда не слышал об этом эмуляторе терминала. Я попробовал это, и это здорово, что вы можете воспроизводить видео в фоновом режиме, tybg my.aviделает это.
SLM
Да, я предпочитаю printfметод. Сделайте, tybg somefile | sed -n lчтобы увидеть, как это работает - он просто использует расширенные выходы терминала. Они задокументированы на manстранице. Вы можете сделать то же самое с ty{ls,cat}. Но эти маленькие приложения - просто старые демонстрационные обертки реальной вещи и, возможно, не настолько способные. В любом случае, если ваша версия была создана за последние пару месяцев, вам может понравиться мини-просмотр так же, как и я, - нажмите Ctrl + Shift + H. Все просветление в значительной степени так же хорошо - вот почему я предложил вам попробовать это недавно. Это также безумно быстро.
mikeserv
3
Какие упомянутые дополнительные ASCII библиотеки?
PythonNut
1
@ плохо, я думаю, только в сборках deb-multimedia она включена. Интересно, почему другие не думают, наверное, они считают libcaca шуткой и раздуванием.
Дероберт
14

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

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любом случае не требуется весь файл, чтобы начать его воспроизведение.

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

терминология пород

mikeserv
источник
1
Вместо того, /tmp/vid.mp4может быть, вы должны использовать mktemp --suffix=.mp4, нет?
Брайам,
@Braiam - это очень хорошая идея, но тогда мне, вероятно, придется добавить логику для очистки. Таким образом, по крайней мере, он всегда перезаписывается. Файл никогда не читал ничего , что пытается выполнить его , и поэтому я не считаю , что вектор - если terminology«s gstreamerбэкенд не может случайно запустить исполняемый код в видеофайле ... Может быть. Я сомневаюсь в этом, но я не достаточно, чтобы сказать наверняка. В любом случае, я предпочитаю всегда писать поверх одного и того же файла, если я не скажу иначе, но если мне удастся сделать его лучше - например, выбор размера и тому подобное - я обязательно исправлю это тоже.
mikeserv
@Braiam - переработал это - посмотрите. Вероятно, выделенный tmp dir / mktemp следующий.
mikeserv
@ Рамеш - посмотри еще раз. Если вы использовали последнюю версию, это лучше.
mikeserv
1
@DmitriDB - проблема в том , что вы не печатает эти побеги , чтобы terminologyу всех - те , которые собираются tmux«s , ptyпотому что tmuxвладеет мастер стороны лиц , выступающих ptyс и terminologyвладеет мастер стороны tmux» с pty. Для того, чтобы справиться с этим вы можете сделать , как ... PTTY=$(tty) tmux ...то в tmuxсессии , как ... tybg >"$PTTY". Я на самом деле только что ответил на ту же проблему, что у вас здесь только вчера. Сценарий, приведенный выше, должен работать как ytplay ... >"$PTTY"мультиплексор.
mikeserv
6

Для этого на 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")
}
jimmij
источник
Вот что я получаю на своей машине: paste.ubuntu.com/8527219
Ionică Bizau,
1
@ IonicăBizau попробуйте:mplayer <(youtube-dl -o - "https://www.youtube.com/watch?v=QCuq0_nY3Xk")
Мартин фон Виттих
@MartinvonWittich Это работает, но это не видео ASCII, в терминале, но в другом окне ...: - /
Ionică Bizau,
2
Кто-то должен обернуть это в программу, которая позволяет искать видео на YouTube в терминале и отмечать их для пакетной загрузки. и затем оберните это еще раз, чтобы раздеть mp3 и удалить mp4. Я мог бы сделать это в какой-то момент, если никто не сделает, но это не будет в ближайшие несколько дней.
Милли Смит
@ IonicăBizeve mplayerавтоматически выбирает лучший выходной драйвер, и если у вас работает Xorg, он, вероятно, выберет xvдрайвер. Попробуйте добавить следующую опцию , mplayerчтобы выбрать драйвер консоли ASCII арт: -vo caca.
Мартин фон Виттих