Я ищу способ смотреть видео 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 -
. Естьдемо эффекта здесь.
Установив дополнительные библиотеки, можно еще больше улучшить ASCII-видео.
Хорошо, но я хочу, чтобы видео было на моем реальном терминале?
Я нашел этот трюк, который позволяет воспроизводить видео в xterm
статье O'Reilly под названием:Смотреть видео в ASCII Art.
$ xterm -fn 5x7 -geometry 250x80 -e "mplayer -vo aa:driver=curses j.mp4
В результате xterm
открывается окно, в котором воспроизводится видео.
Поэтому я подумал, почему бы не соединить арахисовое масло и шоколад вот так:
$ 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
Терминалы
Казалось бы, выбор терминала может иметь большое значение в том, 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
.
решение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
сценария, который:
- Принимает обычную ссылку YouTube в качестве первого аргумента...
ytplay 'https://www.youtube.com/watch?v=${id}'
и так далее...
- Извлекает HTML и находит соответствующий код JavaScript для альтернативных потоков загрузки...
- сделать
curl "$yturl" | grep url_encoded_fmt_stream_map
, чтобы увидеть весь блок.
- сделать
- Из этого блока он выбирает первый предложенный альтернативный поток.
- предлагается множество вариантов — если вы выполнили вышеперечисленное,
grep
вы найдете список в поле"
, разделенном кавычками...stream_map: "
. - в то время как сначала я думал, что буду получать только mp4s, все больше и больше я получаю и webms. Поэтому я отредактировал его для потока и назначил расширение файла по типу mime.
- до сих пор- будь то webm или mp4 - первый альтернативный поток имеет наивысшее качество, предлагаемое для каждого видео -обычно720p .mp4 - это то, что я ищу в любом случае, и поэтому здесь нет логики для выбора других. Моя последняя редакция добавила некоторые модульные/явные тесты, чтобы сделать это возможным. Смотритеэтотдля скрипта Perl, на который я ссылался при первоначальном написании функции.
- предлагается множество вариантов — если вы выполнили вышеперечисленное,
- Разбирает
%[[:hexdigit:]]\{2\}
кодировку на рабочие ссылки.- Видетьэтотдля моей рабочей справки.
- Пытается загрузить файл до 5 раз с небольшой задержкой.
- По умолчанию файл — ,
/tmp/vid.${mime-type}
но еслиytplay
он вызывается со вторым аргументом, он будет интерпретировать его как имя целевого загружаемого файла — при этом расширение будет добавлено в соответствии с типом MIME.
- По умолчанию файл — ,
- Если после любой из попыток целевой объект загрузки имеет размер больше нуля, он позволяет продолжить загрузку в фоновом режиме и
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