Estou procurando uma maneira de assistir a vídeos do YouTube no terminal (não em um navegador ou outra janela, mas ali mesmo, em qualquer sessão do bash).
Existe uma maneira simples de fazer isso?
Imagino algo assim:
$ youtube <video-url>
Eu já sei como reproduzir um vídeo usando mplayer
:
$ mplayer -vo caca local-file.avi
No entanto, isso abre uma nova janela. Seria legal jogar no terminal.
Além disso, deve ser compatível com tmux
as sessões.
fiz outra pergunta paracomo evitar a abertura de uma nova janela.
Para aqueles que se perguntam onde preciso dessa funcionalidade, iniciei um projeto experimental chamadoTmuxOS- com o conceito de quetudo deve rodar dentro de uma tmux
sessão.
Então, de fato, preciso de um reprodutor de vídeo para vídeos locais e remotos. :-)
Responder1
Você pode baixar vídeos e/ou apenas o áudio e depois assisti-los/ouvi-los usandoyoutube-dl
. O script é escrito em Python e faz uso de ffmpeg
I believe.
$ 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)
...
...
Para baixar vídeos, basta fornecer o URL da página em que deseja o vídeo e o script faz o resto:
$ 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
Você pode então usar vlc
ou mplayer
para assisti-los localmente:
$ 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"
OK, mas quero assistir a esses vídeos conforme eles são transmitidos e em ASCII
Encontrei este artigo do blog intitulado:Em ascii, youtube e deixar ir (Wayback Machine)isso demonstra o método que discuti na sala de chat, principalmente usando youtube-dl
como "backend" que poderia fazer o download do stream do YouTube e depois redirecioná-lo para algum outro aplicativo.
Este artigo mostra isso sendo feito com mplayer
:
$ youtube-dl http://www.youtube.com/watch?v=OC83NA5tAGE -o - | \
mplayer -vo aa -monitorpixelaspect 0.5 -
O vídeo que está sendo baixado youtube-dl
é redirecionado via STDOUT acima, -o -
. Há umdemonstração do efeito aqui.
Com a instalação de bibliotecas adicionais, o vídeo ASCII pode ser aprimorado ainda mais.
OK, mas quero o vídeo no meu terminal real?
Encontrei este truque que permite que o vídeo seja reproduzido em um xterm
artigo da O'Reilly intitulado:Assista a vídeos em arte ASCII.
$ xterm -fn 5x7 -geometry 250x80 -e "mplayer -vo aa:driver=curses j.mp4
O procedimento acima resulta na xterm
abertura de uma janela onde o vídeo é reproduzido.
Então pensei, por que não juntar a manteiga de amendoim e o chocolate assim:
$ xterm -fn 5x7 -geometry 250x80 -e \
"youtube-dl http://www.youtube.com/watch?v=OC83NA5tAGE -o - | \
mplayer -vo aa:driver=curses -"
Isso quase funciona! Não sei por que o vídeo não pode ser reproduzido na janela, mas parece que deveria ser possível. A janela aparece e começa a tocar, mas depois fecha. Vejo o vídeo por alguns segundos e depois nada.
Talvez o que foi dito acima o aproxime da solução definitiva, ou talvez apenas precise de um pequeno ajuste nas opções.
Bibliotecas adicionais
Se você libcaca
instalou (a versão colorida do aalib
) e reduziu o tamanho da fonte para gnome-terminal
algo realmente pequeno, como, digamos, 3, o comando a seguir exibirá um vídeo ASCII com muito melhor aparência diretamente no terminal:
$ CACA_DRIVER=ncurses mplayer -vo caca video.mp4
Terminais
Parece que a escolha do terminal pode ser um grande problema se é mplayer
possível jogar diretamente dentro do terminal ou se ele abre uma janela separada. O cache também mplayer
fez uma diferença dramática na capacidade de jogar diretamente nos terminais.
Usando este comando, consegui reproduzir terminator
pelo menos o primeiro 1/4 do vídeo antes de ser cortado:
$ youtube-dl http://www.youtube.com/watch?v=OC83NA5tAGE -o - | \
mplayer -cache 32767 -vo aa:driver=curses -
A versão colorida usou este comando:
$ youtube-dl http://www.youtube.com/watch?v=OC83NA5tAGE -o - | \
CACA_DRIVER=ncurses mplayer -cache 64000 -vo caca -
gnome-terminal
Esses mesmos comandos também podem ser usados xterm
.
OBSERVAÇÃO:Isso é (da esquerda para a direita) xterm
, terminator
, gnome-terminal
, e terminology
.
Responder2
Então comTerminologia (provavelmente a melhor coisa que já aconteceu com um emulador de terminal, aliás) no momento em que este livro foi escritoos seguintes trabalhos:
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
)
O terminology
bit específico é o then
bloco play()
na printf \033}...
linha. terminology
aceita escapes de terminal estendidos para imprimir mídia na tela - como cores de prompt, mas também vídeo de alta definição e basicamente tudo o que você quiser.
O resto é um pequeno curl | sed
script que:
- Aceita um link normal do YouTube como primeiro argumento...
ytplay 'https://www.youtube.com/watch?v=${id}'
e assim por diante...
- Extrai o HTML e encontra o código javascript relevante para fluxos de download alternativos...
- fazer
curl "$yturl" | grep url_encoded_fmt_stream_map
para ver todo o quarteirão.
- fazer
- A partir desse bloco, ele seleciona o primeiro fluxo alternativo oferecido.
- muitos são oferecidos - se você fez o
grep
acima, encontrará a lista no campo"
delimitado por aspas...stream_map: "
. - embora no início eu pensasse que só conseguiria mp4s, cada vez mais recebo webms também. Então, editei-o para fluxo e para atribuir a extensão do arquivo por tipo MIME.
- até aqui- seja webm ou mp4 - o primeiro fluxo alternativo é a qualidade mais alta oferecida por vídeo -geralmente720p .mp4 - que é o que estou procurando e, portanto, não há lógica aqui para selecionar outros. Minha última edição adicionou alguns testes de modularidade/explícitos para tornar isso possível. Veressepara o script perl que mencionei ao escrever originalmente a função.
- muitos são oferecidos - se você fez o
- Analisa a
%[[:hexdigit:]]\{2\}
codificação em links funcionais.- Veressepara minha referência de trabalho.
- Tenta baixar o arquivo até 5 vezes com um pouco de espera.
- Por padrão, o arquivo é,
/tmp/vid.${mime-type}
mas seytplay
for chamado com um segundo argumento, ele o interpretará como o nome do arquivo de download de destino - enquanto ainda acrescenta a extensão de acordo com o tipo MIME.
- Por padrão, o arquivo é,
- Se o destino do download tiver um tamanho maior que zero após qualquer uma de suas tentativas, ele permitirá que o download continue em segundo plano e imprima
terminology
oscoloque a mídia em segundo plano agoraescape do terminal, caso contrário, ele simplesmente desiste e deixa uma mensagem de erro em letras maiúsculas.\033}bt[LINK/FILE]\0
para reprodução em janela inteira.pn
o abriria em uma nova janela. Existem outros para limitar geometricamente a área de jogo – como apenas para uma parte da janela, por exemplo.
Isto sofreu apenas um pouco mais demuito mínimotestando, mas até agora funcionou para todos os links sem falhar, exceto um - e como eu não estava realmente interessado em assistir aquele que não tocava, não tentei descobrir o porquê.
Embora tenha funcionado para todos eles, não necessariamentejogarcada um - e isso ocorre porque, a princípio, anexei cegamente a .mp4
extensão ao arquivo de destino, sem verificar se estava correto. É possível que aquele que eu não olhei antes fosse apenas isso também. De qualquer forma, mudei para lidar com isso.
Como mencionei antes, o único terminology
bit específico está na última função - play()
- e então você pode facilmente alterá-la para fazer o que quiser com o arquivo de vídeo baixado/baixado - como usá-lo com mplayer
as bibliotecas CACA de em outro terminal, ou então coloque-o em uma vlc
janela ou algo assim. Mas se você gostar, assistirá em alta definição no formato terminology
.
Ah, e por último, isso normalmente émuito rápido- minhas velocidades maximizaram minha largura de banda até agora em todas as tentativas, mas terminology
não preciso do arquivo inteiro para começar a reproduzi-lo de qualquer maneira.
Aqui está funcionando:
Responder3
Tem tutorial para isso no youtube:
https://www.youtube.com/watch?v=QCuq0_nY3Xk
De acordo com esse vídeo, o seguinte deve funcionar:
mplayer -cookies -cookies-file /tmp/cook.txt $(youtube-dl -g --cookies /tmp/cook.txt "https://www.youtube.com/watch?v=QCuq0_nY3Xk")
Você pode criar uma função simples para esta finalidade:
playtube () {
mplayer -cookies -cookies-file /tmp/cook.txt $(youtube-dl -g --cookies /tmp/cook.txt "$1")
}
Responder4
Dehttps://github.com/mps-youtube/mps-youtube
sudo docker run --device /dev/snd -it --rm --name mpsyt rothgar/mpsyt