Guarda i video di YouTube nel terminale


107

Sto cercando un modo per guardare i video di YouTube nel terminale (non in un browser o in un'altra finestra, ma proprio lì, in qualsiasi sessione bash).

C'è un modo semplice per fare questo?

Immagino qualcosa del genere:

$ youtube <video-url>     

So già come riprodurre un video usando mplayer:

$ mplayer -vo caca local-file.avi

Tuttavia, questo apre una nuova finestra. Sarebbe bello giocarci nel terminale.

Inoltre, dovrebbe essere compatibile con le tmuxsessioni.


Ho fatto un'altra domanda su come impedire l'apertura di una nuova finestra .


Per coloro che si chiedono dove ho bisogno di tale funzionalità, ho avviato un progetto sperimentale chiamato TmuxOS - con l'idea che tutto dovrebbe funzionare all'interno di una tmuxsessione .

Quindi, in effetti, ho bisogno di un lettore video per video locali e remoti. :-)


2
Intendi in questo modo? google.com/…
caos

1
@chaos Esattamente. :-) Sto cercando questo da mesi, ma non ho ancora trovato nulla. Ho deciso di chiedere qui ...
Ionică Bizău,

VLC è in grado di riprodurre video di Youtube, ma non è sicuro che abbia funzionalità di output terminale.

Con mpv puoi farlo mpv <youtube url>. Funziona anche con molti altri siti di video. Ma questo apre una nuova finestra.
Gerardo Marset,

1
Questa è una domanda affascinante e ho imparato molto dalle risposte. Ma per curiosità: perché mai hai bisogno di farlo? ;-)
Digital Trauma,

Risposte:


132

Puoi scaricare video e / o solo l'audio e poi guardarli / ascoltarli usando youtube-dl. La sceneggiatura è scritta in Python e ffmpegci credo.

$ 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)
...
...

Per scaricare video, devi semplicemente assegnargli l'URL dalla pagina in cui desideri che il video e lo script faccia il 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

È quindi possibile utilizzare vlco mplayerper guardare questi 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, ma voglio guardare questi video mentre sono trasmessi in streaming e in ASCII

Ho trovato questo articolo del blog intitolato: su ascii, youtube e lasciarsi andare che dimostra il metodo che ho discusso nella chatroom, principalmente usando youtube-dlcome "backend" che potrebbe fare il download del flusso di YouTube e quindi reindirizzarlo su qualche altra app.

Questo articolo mostra che è stato fatto con mplayer:

$ youtube-dl http://www.youtube.com/watch?v=OC83NA5tAGE -o - | \
    mplayer -vo aa -monitorpixelaspect 0.5 - 

Il video è stato scaricato dal youtube-dlviene reindirizzato tramite STDOUT sopra, -o -. C'è una demo dell'effetto qui .

          ss # 1

Con l'installazione di librerie aggiuntive è possibile migliorare ulteriormente il video ASCII.

               ss # 2

OK ma voglio il video nel mio vero terminale?

Ho trovato questo trucco che consente di riprodurre il video in un articolo xtermdi O'Reilly intitolato: Guarda i video in ASCII Art .

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

Quanto sopra si traduce in una xtermfinestra aperta in cui viene riprodotto il video.

   ss # 3

Quindi ho pensato, perché non unire il burro di arachidi e il cioccolato in questo modo:

$ xterm -fn 5x7 -geometry 250x80 -e \
    "youtube-dl http://www.youtube.com/watch?v=OC83NA5tAGE -o - | \
    mplayer -vo aa:driver=curses -"

Questo funziona quasi! Non sono sicuro del motivo per cui il video non può essere riprodotto nella finestra, ma sembra che dovrebbe essere in grado di farlo. La finestra si apre e inizia a suonare ma poi si chiude. Vedo il video per alcuni secondi e poi niente.

Forse quanto sopra ti avvicinerà alla tua soluzione definitiva, o forse deve solo essere modificato un po 'sulle opzioni.

Biblioteche aggiuntive

Se hai libcacainstallato (la versione colorata di aalib) e riduci la dimensione del carattere in gnome-terminalqualcosa di veramente piccolo, come dire 3, il seguente comando mostrerà un video ASCII molto più bello direttamente all'interno del terminale:

$ CACA_DRIVER=ncurses mplayer -vo caca video.mp4

   ss # 4

terminali

Sembrerebbe che la scelta del terminale possa fare molto se è mplayerpossibile giocare direttamente all'interno del terminale o se apre una finestra separata. Anche la memorizzazione nella cache ha mplayerfatto la differenza nel poter giocare direttamente nei propri terminali.

Usando questo comando sono stato in grado di riprodurre terminator, almeno per il primo 1/4 del video prima del taglio:

$ youtube-dl http://www.youtube.com/watch?v=OC83NA5tAGE -o - | \
    mplayer -cache 32767 -vo aa:driver=curses -

La versione colorata utilizzava questo comando:

$ youtube-dl http://www.youtube.com/watch?v=OC83NA5tAGE -o - | \
    CACA_DRIVER=ncurses mplayer -cache 64000 -vo caca -

Questi stessi comandi potrebbero essere riprodotti anche in gnome-terminal& xterm.

    montaggio ss

    NOTA: Questo è (da sinistra a destra) xterm, terminator, gnome-terminal, e terminology.


2
Puoi giocarci terminology- e non solo con le librerie caca. È possibile utilizzare le escape di terminale per specificare una porzione mappata della finestra terninale e riprodurla proprio lì in alta definizione. Puoi persino impostare il video sullo sfondo e lavorarci sopra. terminologycapisce anche gli URI: ottieni un link webm per il tuo video di YouTube e semplicemente printfsullo schermo come un prompt del terminale.
Mikeserv,

@mikeserv - è fantastico, non ho mai sentito parlare di quell'emulatore di terminale. L'ho provato ed è bello poter riprodurre video in background, lo tybg my.avifa.
slm

Sì, preferisco il printfmetodo. Fai tybg somefile | sed -n lper vedere come funziona: utilizza solo estensioni di terminale estese. Sono documentati nella manpagina. Puoi fare lo stesso con ty{ls,cat}. Ma quelle piccole app sono solo vecchi wrapper demo della cosa reale e forse non sono così capaci. Comunque, se la tua versione è stata costruita negli ultimi due mesi, la miniview potrebbe piacerti tanto quanto me: fai ctrl + maiusc + h. Tutta l'illuminazione è altrettanto buona - è per questo che ti ho suggerito di provarla di recente. È anche follemente veloce.
Mikeserv,

3
Quali sono le librerie ASCII aggiuntive dette?
PythonNut,

1
@slm peccato, suppongo che solo le build deb-multimedia lo abbiano abilitato. Mi chiedo perché gli altri no, immagino che probabilmente considerano la libcaca uno scherzo e un gonfiore.
derobert,

14

Quindi, con Terminology (probabilmente la cosa migliore che sia mai successa a un emulatore di terminale, tra l'altro) al momento della stesura di questo articolo i seguenti lavori:

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
)

Il terminologybit specifico è il thenblocco play()- la printf \033}...riga. terminologyaccetta estensioni di terminale estese per la stampa di supporti sullo schermo - un po 'come i colori precisi ma anche video ad alta definizione e praticamente qualsiasi altra cosa tu voglia.

Il resto è un po 'di curl | sedscript che:

  1. Accetta un normale link di YouTube come primo argomento ...
    • ytplay 'https://www.youtube.com/watch?v=${id}' e così via...
  2. Estrae l'HTML e trova il codice javascript pertinente per flussi di download alternativi ...
    • fare curl "$yturl" | grep url_encoded_fmt_stream_mapper vedere l'intero blocco.
  3. Dall'interno di quel blocco seleziona il primo flusso alternativo offerto.
    • molti sono offerti - se hai fatto quanto grepsopra troverai l'elenco nel campo "delimitato da virgolette ...stream_map: ".
    • mentre all'inizio pensavo che avrei avuto solo mp4 sempre di più e anche webms. Quindi l'ho modificato per il flusso e per assegnare l'estensione del file per tipo mime.
    • finora - che sia webm o mp4 - il primo stream alternativo è la massima qualità offerta per video - di solito 720p .mp4 - che è comunque quello che sto cercando e quindi non c'è logica qui per selezionare gli altri. La mia ultima modifica ha aggiunto alcuni test di modularità / espliciti per renderlo possibile, però. Vedi questo per lo script perl a cui ho fatto riferimento durante la scrittura originale della funzione.
  4. Analizza la %[[:hexdigit:]]\{2\}codifica in collegamenti funzionanti.
    • Vedi questo per il mio riferimento di lavoro.
  5. Cerca di scaricare il file fino a 5 volte con un po 'di backoff.
    • Per impostazione predefinita, il file è, /tmp/vid.${mime-type}ma se ytplayviene chiamato con un secondo argomento, lo interpreterà come il nome del file di download di destinazione, pur aggiungendo l'estensione in base al tipo MIME.
  6. Se la destinazione del download ha una dimensione maggiore di zero dopo uno qualsiasi dei suoi tentativi, consente al download di continuare in background e di stampare terminologyil supporto posto in background, ora il terminale scappa, altrimenti si arrende e ti lascia un messaggio di errore tutto in maiuscolo.
    • \033}bt[LINK/FILE]\0per giocare a tutta finestra. pnlo farebbe apparire in una nuova finestra. Ce ne sono altri per limitare geometricamente l'area di gioco, ad esempio solo per una parte della finestra.

Questo ha subito solo un po 'più di test molto minimi , ma finora ha funzionato per ogni collegamento senza fallire tranne uno - e poiché in realtà non ero interessato a guardare quello che non giocava non ho provato a scoprirlo perché.

Mentre ha funzionato per tutti, non ha necessariamente riprodotto ognuno di essi - e questo perché all'inizio ho aggiunto ciecamente l' .mp4estensione al file di destinazione senza verificare se fosse corretta. È possibile che quello a cui non avevo mai esaminato prima fosse solo questo. In ogni caso, l'ho cambiato per gestirlo.

Come accennato in precedenza, l'unico terminologybit specifico è nell'ultima funzione - play()e quindi potresti facilmente alterarlo per fare tutto ciò che vuoi con il file video scaricato / scaricato - come usarlo con mplayerle librerie CACA in un altro terminale, oppure espellilo in una vlcfinestra o altro. Ma se ti piaci, lo guarderai in alta definizione terminology.

Oh, e infine, questo è in genere molto veloce - le mie velocità hanno raggiunto il limite massimo della mia larghezza di banda per la durata finora ad ogni tentativo, ma terminologynon ho bisogno dell'intero file per iniziare a riprodurlo comunque.

Qui funziona:

rocce terminologiche


1
Invece di /tmp/vid.mp4forse dovresti usare mktemp --suffix=.mp4, no?
Braiam,

@Braiam - è un'ottima idea, ma probabilmente dovrei aggiungere la logica per ripulire. In questo modo almeno si sovrascrive sempre. Il file non viene mai letto da nulla che tenti di eseguirlo e quindi non lo considero un vettore - a meno che terminologyil gstreamerbackend non possa accidentalmente eseguire codice eseguibile in un file video ... Forse. Ne dubito, ma non sono abbastanza per dirlo con certezza. Ad ogni modo, preferisco sempre scrivere sullo stesso file, a meno che non dica diversamente, ma se riesco a migliorarlo - come la selezione delle dimensioni e simili - risolverò sicuramente anche quello.
Mikeserv,

@Braiam - rielaborato - dai un'occhiata. Probabilmente il prossimo sarà una directory tmp / mktemp dedicata.
Mikeserv,

@Ramesh - guarda di nuovo. Se hai utilizzato l'ultima versione, è meglio.
Mikeserv,

1
@DmitriDB - il problema è che non stai stampando quelle fughe di terminologya tutti - coloro che stanno per tmux's ptyperché tmuxpossiede il lato master di coloro che intervengono ptys e terminologypossiede il lato master di tmux' s pty. Per gestire che si può fare come ... PTTY=$(tty) tmux ...poi nella tmuxsessione di come ... tybg >"$PTTY". In realtà ho appena risposto allo stesso problema che hai riscontrato qui solo ieri. In questo modo lo script sopra dovrebbe funzionare come ytplay ... >"$PTTY"all'interno di un multiplexer.
Mikeserv,

6

C'è un tutorial per questo su YouTube:

https://www.youtube.com/watch?v=QCuq0_nY3Xk

Secondo quel video dovrebbe funzionare quanto segue:

mplayer -cookies -cookies-file /tmp/cook.txt $(youtube-dl -g --cookies /tmp/cook.txt "https://www.youtube.com/watch?v=QCuq0_nY3Xk")

È possibile creare una semplice funzione per questo scopo:

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

Questo è ciò che ottengo sulla mia macchina: paste.ubuntu.com/8527219
Ionică Bizău

1
@ IonicăBizău provare:mplayer <(youtube-dl -o - "https://www.youtube.com/watch?v=QCuq0_nY3Xk")
Martin von Wittich,

@MartinvonWittich Funziona, ma non è un video ASCII, nel terminale ma in un'altra finestra ...: - /
Ionică Bizău

2
Qualcuno deve racchiuderlo in un programma che consente di cercare video di YouTube nel terminale e contrassegnarli per il download in batch. e poi avvolgilo ancora una volta per eliminare l'mp3 ed eliminare l'mp4. Potrei farlo a un certo punto se nessun altro lo fa, ma non lo sarà nei prossimi giorni.
Millie Smith,

@ IonicăBizău mplayersceglie automaticamente il miglior driver di output e se hai Xorg in esecuzione, probabilmente sceglierà il xvdriver. Prova ad aggiungere la seguente opzione mplayerdi scegliere il driver arte console ASCII: -vo caca.
Martin von Wittich,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.