Assista a vídeos do YouTube no terminal

Assista a vídeos do YouTube no terminal

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 tmuxas 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 tmuxsessã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 ffmpegI 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 vlcou mplayerpara 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-dlcomo "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.

          ss#1

Com a instalação de bibliotecas adicionais, o vídeo ASCII pode ser aprimorado ainda mais.

               ss#2

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

Encontrei este truque que permite que o vídeo seja reproduzido em um xtermartigo 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 xtermabertura de uma janela onde o vídeo é reproduzido.

   ss#3

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ê libcacainstalou (a versão colorida do aalib) e reduziu o tamanho da fonte para gnome-terminalalgo 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

   ss#4

Terminais

Parece que a escolha do terminal pode ser um grande problema se é mplayerpossível jogar diretamente dentro do terminal ou se ele abre uma janela separada. O cache também mplayerfez uma diferença dramática na capacidade de jogar diretamente nos terminais.

Usando este comando, consegui reproduzir terminatorpelo 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-terminalEsses mesmos comandos também podem ser usados xterm.

    montagem ss

    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 terminologybit específico é o thenbloco play()na printf \033}...linha. terminologyaceita 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 | sedscript que:

  1. Aceita um link normal do YouTube como primeiro argumento...
    • ytplay 'https://www.youtube.com/watch?v=${id}'e assim por diante...
  2. Extrai o HTML e encontra o código javascript relevante para fluxos de download alternativos...
    • fazer curl "$yturl" | grep url_encoded_fmt_stream_mappara ver todo o quarteirão.
  3. A partir desse bloco, ele seleciona o primeiro fluxo alternativo oferecido.
    • muitos são oferecidos - se você fez o grepacima, 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.
  4. Analisa a %[[:hexdigit:]]\{2\}codificação em links funcionais.
    • Veressepara minha referência de trabalho.
  5. Tenta baixar o arquivo até 5 vezes com um pouco de espera.
    • Por padrão, o arquivo é, /tmp/vid.${mime-type}mas se ytplayfor 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.
  6. 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 terminologyoscoloque 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]\0para reprodução em janela inteira. pno 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 .mp4extensã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 terminologybit 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 mplayeras bibliotecas CACA de em outro terminal, ou então coloque-o em uma vlcjanela 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 terminologynão preciso do arquivo inteiro para começar a reproduzi-lo de qualquer maneira.

Aqui está funcionando:

terminologia rochas

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

informação relacionada