Veja vídeos do YouTube no terminal

107

Estou procurando uma maneira de assistir a vídeos do YouTube no terminal (não em um navegador ou outra janela, mas bem ali, em qualquer sessão bash).

Existe uma maneira simples de fazer isso?

Eu imagino algo assim:

$ youtube <video-url>     

Eu já sei reproduzir um vídeo usando mplayer :

$ mplayer -vo caca local-file.avi

No entanto, isso abre uma nova janela. Seria legal jogá-lo no terminal.

Além disso, deve ser compatível com tmux sessões.

Eu fiz outra pergunta para como evitar a abertura de uma nova janela .

Para aqueles que se perguntam onde eu preciso de tal funcionalidade, eu comecei um projeto experimental chamado TmuxOS - com o conceito que tudo deve ser executado dentro de uma tmux sessão .

Então, de fato, preciso de um player de vídeo para vídeos locais e remotos. : -)

    
por Ionică Bizău 09.10.2014 / 15:31

4 respostas

132

Você pode baixar vídeos e / ou apenas o áudio e assisti-los / ouvi-los usando youtube-dl . O script é escrito em Python e faz uso de ffmpeg eu acredito.

$ 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 fazer o download de vídeos, basta fornecer o URL da página em que você 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 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 enquanto eles são transmitidos & em ASCII

Encontrei este artigo do blog intitulado: No ascii, youtube e soltando que demonstra o método que discuti na sala de bate-papo, usando principalmente youtube-dl como "backend" que poderia fazer o download do fluxo do YouTube e redirecioná-lo para outro aplicativo.

Este artigo mostra que está 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 por youtube-dl é redirecionado via STDOUT acima, -o - . Há uma demonstração do efeito aqui .

Comainstalaçãodebibliotecasadicionais,ovídeoASCIIpodesermelhoradoaindamais.

OK, mas eu quero o vídeo no meu terminal real?

Eu encontrei este truque que permite que o vídeo seja reproduzido em um xterm no O'Reilly articulado intitulado: Assista a vídeos em ASCII Arte .

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

Os resultados acima resultam em uma janela xterm sendo aberta onde o vídeo é reproduzido.

Entãoeupensei,porquenãocolocaramanteigadeamendoimeochocolatejuntosassim:

$xterm-fn5x7-geometry250x80-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 se fecha. Eu vejo o vídeo por alguns breves segundos e depois nada.

Talvez o texto acima o aproxime da sua solução definitiva, ou talvez seja necessário ajustar um pouco as opções.

Bibliotecas adicionais

Se você tiver libcaca instalado (a versão colorida de aalib ) e reduzir o tamanho da fonte em gnome-terminal para algo realmente pequeno, como digamos 3, o comando a seguir exibirá um vídeo ASCII com muito melhor aparência diretamente dentro do terminal:

$ CACA_DRIVER=ncurses mplayer -vo caca video.mp4

Terminais

Parecequeaescolhadoterminalpodefazerumgrandenegóciosemplayerpodetocardiretamentedentrodoterminalouseabreumajanelaseparada.Ocachetambémemmplayerfezumagrandediferençaempoderjogardiretamenteemalgunsterminais.

Comessecomando,pudereproduziremterminator,pelomenosnoprimeiro1/4dovídeoantesdesercortado:

$youtube-dlhttp://www.youtube.com/watch?v=OC83NA5tAGE-o-|\mplayer-cache32767-voaa:driver=curses-

Aversãocoloridausouestecomando:

$youtube-dlhttp://www.youtube.com/watch?v=OC83NA5tAGE-o-|\CACA_DRIVER=ncursesmplayer-cache64000-vocaca-

Essesmesmoscomandospodemserreproduzidosemgnome-terminal&xtermtambém.

NOTA: Isso é (da esquerda para a direita) xterm , terminator , gnome-terminal e terminology .

    
por 09.10.2014 / 16:01
14

Então, com Terminologia (provavelmente a melhor coisa que já aconteceu com um emulador de terminal, a propósito) na hora de escrever os seguintes trabalhos:

ytplay() ( 
    init() if     [ "${#1}" -gt 0 ] && i=$? du= f=
           then   durl \! \" \# \$ \% \& \' \( \) \* \
                       \+ \, \/ \: \; \= \? \@ \[ \]
                  : >"${f:=${2:-/tmp/vid}.$(
                      durl "$1" 's/.*mime=[^/]*.\([^&]*\).*//'
                  )}"
                  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 '3}bt%s
ytplay() ( 
    init() if     [ "${#1}" -gt 0 ] && i=$? du= f=
           then   durl \! \" \# \$ \% \& \' \( \) \* \
                       \+ \, \/ \: \; \= \? \@ \[ \]
                  : >"${f:=${2:-/tmp/vid}.$(
                      durl "$1" 's/.*mime=[^/]*.\([^&]*\).*//'
                  )}"
                  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 '3}bt%s%pre%' "$f"; exit
           fi
    while init "$@" || exit
    do    curl -s "$(durl "$1")" >"$f" & pid=$!
    done  3>&2 2>/dev/null
)
' "$f"; exit fi while init "$@" || exit do curl -s "$(durl "$1")" >"$f" & pid=$! done 3>&2 2>/dev/null )

O bit específico de terminology é o bloco then em play() - a linha printf 3}... . terminology aceita saídas de terminal estendidas para impressão de mídia na tela - meio como cores rápidas, mas também vídeo de alta definição e basicamente o que você quiser.

O restante é um pouco do script curl | sed que:

  1. Aceita um link regular do youtube como seu primeiro argumento ...
    • ytplay 'https://www.youtube.com/watch?v=${id}' e assim por diante ...
  2. Puxa o HTML e localiza o código javascript relevante para fluxos de download alternativos ...
    • faça curl "$yturl" | grep url_encoded_fmt_stream_map para ver o bloco inteiro.
  3. 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 " ...stream_map: " quote-delimited.
    • enquanto no começo eu achava que só conseguiria o mp4s mais e mais, eu também obtinha webms. Então eu editei para fluxo e para atribuir a extensão de arquivo por tipo mime.
    • até agora - webm ou mp4 - o primeiro fluxo alternativo é a melhor qualidade oferecida por vídeo - geralmente 720p .mp4 - que é o que eu estou procurando de qualquer maneira não há lógica aqui para selecionar outros. Minha edição mais recente adicionou alguns testes de modularidade / explícito para tornar isso possível. Veja este para o script perl que eu referenciei quando escrevi a função originalmente.
  4. Analisa a codificação %[[:hexdigit:]]\{2\} nos links de trabalho.
    • Veja this para minha referência de trabalho.
  5. Tenta fazer o download do arquivo até 5 vezes com um backoff.
    • Por padrão, o arquivo é /tmp/vid.${mime-type} , mas se ytplay for chamado com um segundo argumento, ele será interpretado como o nome de arquivo de download de destino, continuando anexando a extensão de acordo com o tipo mime.
  6. Se o destino de download estiver em um tamanho maior que zero após qualquer uma de suas tentativas, o download continuará em segundo plano e imprimirá o escape de terminology em mídia em segundo plano agora , senão ele desiste e deixa uma mensagem de erro em letras maiúsculas.
    • 3}bt[LINK/FILE]pn para reprodução em janela cheia. .mp4 sairia para uma nova janela. Existem outros para limitar geometricamente a área de jogo - por exemplo, apenas para uma parte da janela.

Isto sofreu apenas um pouco mais do que muito mínimo testes, mas até agora funcionou para todos os links sem falhar, mas um - e porque eu não estava realmente interessado em ver o que não Não tentei descobrir o porquê.

Embora funcionasse para todos eles, eles não necessariamente tocam cada um - e isso é porque no início eu cegamente adicionei a extensão terminology ao arquivo de destino sem verificar se estava correto . É possível que aquele em que eu não olhei antes fosse apenas isso também. De qualquer forma, eu mudei para lidar com isso.

Como eu mencionei antes, o único bit play() específico está na última função - mplayer - e você pode facilmente alterar isso para fazer o que quiser com o arquivo de vídeo baixado / baixado - como usá-lo com bibliotecas CACA de vlc em outro terminal, ou então coloque-o em uma janela terminology ou qualquer outra coisa. Mas se você gosta de si mesmo, vai assisti-lo em alta definição em terminology .

Ah, e por último, isso é tipicamente muito rápido - minhas velocidades têm excedido minha largura de banda pela duração até agora em todas as tentativas, mas %code% não precisa do arquivo inteiro para começar a jogar de qualquer maneira.

Aqui está funcionando:

    
por 13.10.2014 / 00:21
6

Há um tutorial para isso no youtube:

link

De acordo com o 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 essa finalidade:

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

Do link

sudo docker run --device /dev/snd -it --rm --name mpsyt rothgar/mpsyt
    
por 28.07.2017 / 15:26