web-dev-qa-db-fra.com

Regardez des vidéos YouTube dans le terminal

Je cherche un moyen de regarder des vidéos YouTube dans le terminal (pas dans un navigateur ou une autre fenêtre, mais là, dans n'importe quelle session bash).

Existe-t-il un moyen simple de procéder?

J'imagine quelque chose comme ça:

$ youtube <video-url>     

Je sais déjà comment lire une vidéo en utilisant mplayer:

$ mplayer -vo caca local-file.avi

Cependant, cela ouvre une nouvelle fenêtre. Ce serait cool de le jouer dans le terminal.

De plus, il devrait être compatible avec les sessions tmux.


J'ai posé une autre question pour comment empêcher l'ouverture d'une nouvelle fenêtre .


Pour ceux qui se demandent où j'ai besoin d'une telle fonctionnalité, j'ai commencé un projet expérimental nommé TmuxOS - avec le concept que tout devrait fonctionner à l'intérieur d'une session tmux .

Donc, en effet, j'ai besoin d'un lecteur vidéo pour les vidéos locales et distantes. :-)

109
Ionică Bizău

Vous pouvez télécharger des vidéos et/ou simplement l'audio, puis les regarder/écouter en utilisant youtube-dl . Le script est écrit en Python et utilise ffmpeg je crois.

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

Pour télécharger des vidéos, vous lui donnez simplement l'URL de la page sur laquelle vous voulez que la vidéo et le script fasse le reste:

$ 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

Vous pouvez ensuite utiliser vlc ou mplayer pour les regarder localement:

$ 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 mais je veux regarder ces vidéos en streaming et en ASCII

J'ai trouvé cet article de blog intitulé: sur ascii, youtube et lâcher prise qui montre la méthode que j'ai discutée dans le salon de discussion, utilisant principalement youtube-dl comme le "backend" qui pourrait faire le téléchargement du flux YouTube puis le rediriger vers une autre application.

Cet article montre que cela se fait avec mplayer:

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

La vidéo en cours de téléchargement par youtube-dl est redirigé via STDOUT ci-dessus, -o -. Il y a un démo de l'effet ici .

ss#1

Avec l'installation de bibliothèques supplémentaires, la vidéo ASCII peut encore être améliorée.

ss#2

OK mais je veux la vidéo dans mon terminal actuel?

J'ai trouvé cette astuce qui permet de lire la vidéo dans un xterm dans le O'Reilly intitulé: Regarder des vidéos en ASCII Art .

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

Ce qui précède entraîne l'ouverture d'une fenêtre xterm où la vidéo est lue.

ss#3

Alors j'ai pensé, pourquoi ne pas assembler le beurre d'arachide et le chocolat comme ceci:

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

Cela fonctionne presque! Je ne sais pas pourquoi la vidéo ne peut pas être lue dans la fenêtre, mais il semblerait que cela devrait être possible. La fenêtre s'ouvre et commence à jouer, puis se ferme. Je vois la vidéo pendant quelques brèves secondes puis rien.

Peut-être que ce qui précède vous rapprochera de votre solution ultime, ou peut-être qu'il suffit de modifier un peu les options.

Bibliothèques supplémentaires

Si vous avez libcaca installé (la version colorisée de aalib) et que vous réduisez la taille de police dans votre gnome-terminal à quelque chose de vraiment petit, comme par exemple 3, la commande suivante affichera une vidéo ASCII directement meilleure dans le terminal):

$ CACA_DRIVER=ncurses mplayer -vo caca video.mp4

ss#4

Terminaux

Il semblerait que le choix du terminal peut être très important pour savoir si mplayer peut jouer directement à l'intérieur du terminal ou s'il ouvre une fenêtre séparée. La mise en cache aussi sur mplayer a fait une différence dramatique en étant capable de jouer directement dans ses terminaux.

En utilisant cette commande, j'ai pu jouer dans terminator, au moins pour le premier 1/4 de la vidéo avant de la couper:

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

La version colorée utilisait cette commande:

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

Ces mêmes commandes pourraient jouer dans gnome-terminal & xterm aussi.

ss montage

REMARQUE: C'est (de gauche à droite) xterm, terminator, gnome-terminal et terminology.

133
slm

Donc, avec Terminologie (probablement la meilleure chose qui soit jamais arrivée à un émulateur de terminal, d'ailleurs)au moment de l'écriture les oeuvres suivantes:

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
)

Le bit spécifique terminology est le bloc then dans play() - la ligne printf \033}.... terminology accepte les échappements de terminal étendus pour l'impression de supports à l'écran - un peu comme les couleurs Prompt mais aussi la vidéo haute définition et essentiellement tout ce que vous voulez.

Le reste est un peu de script curl | sed Qui:

  1. Accepte un lien youtube régulier comme premier argument ...
    • ytplay 'https://www.youtube.com/watch?v=${id}' Et ainsi de suite ...
  2. Extrait le code HTML et trouve le code javascript approprié pour les flux de téléchargement alternatifs ...
    • faites curl "$yturl" | grep url_encoded_fmt_stream_map pour voir le bloc entier.
  3. Dans ce bloc, il sélectionne le premier flux alternatif proposé.
    • beaucoup sont offerts - si vous avez fait le grep ci-dessus, vous trouverez la liste dans le champ " délimité par des guillemets ...stream_map: ".
    • alors qu'au début, je pensais que je n'obtiendrais que de plus en plus de mp4, je reçois aussi des webms. Je l'ai donc édité pour le flux et pour attribuer l'extension de fichier par type MIME.
    • jusqu'à présent - que ce soit webm ou mp4 - le premier flux alternatif est la meilleure qualité offerte par vidéo - généralement 720p .mp4 - c'est ce que je recherche pour de toute façon et donc il n'y a pas de logique ici pour sélectionner les autres. Ma dernière édition a cependant ajouté des tests de modularité/explicites pour rendre cela possible. Voir this pour le script Perl auquel j'ai fait référence lors de l'écriture originale de la fonction.
  4. Analyse l'encodage %[[:hexdigit:]]\{2\} En liens de travail.
    • Voir this pour ma référence de travail.
  5. Tente de télécharger le fichier jusqu'à 5 fois avec un peu de retard.
    • Par défaut, le fichier est /tmp/vid.${mime-type} Mais si ytplay est appelé avec un deuxième argument, il interprétera cela comme le nom de fichier de téléchargement ciblé - tout en ajoutant l'extension en fonction du type MIME.
  6. Si la cible de téléchargement est à une taille supérieure à zéro après l'un de ses essais, elle permet au téléchargement de continuer en arrière-plan et imprime terminology placez le média en arrière-plan maintenant échappement du terminal , sinon il abandonne et vous laisse un message d'erreur tout en majuscules.
    • \033}bt[LINK/FILE]\0 Pour une lecture en plein écran. pn le ferait apparaître dans une nouvelle fenêtre. Il y en a d'autres pour limiter géométriquement la zone de jeu - comme seulement pour une partie de la fenêtre, par exemple.

Cela n'a subi qu'un peu plus de très minime test, mais jusqu'à présent, cela a fonctionné pour chaque lien, sauf un - et parce que je n'étais pas vraiment intéressé à regarder celui qui ne l'a pas fait jouer, je n'ai pas essayé de savoir pourquoi.

Bien que cela ait fonctionné pour chacun d'entre eux, cela n'a pas nécessairement play chacun - et c'est parce qu'au début, j'ai ajouté aveuglément l'extension .mp4 Au fichier cible sans vérifier si elle était correct. Il est possible que celui que je n'ai pas examiné auparavant ne soit que cela. En tout cas, je l'ai changé pour gérer ça.

Comme je l'ai mentionné précédemment, le seul bit spécifique terminology se trouve dans la toute dernière fonction - play() - et vous pouvez donc facilement le modifier pour faire tout ce que vous voulez avec le fichier vidéo téléchargé/téléchargé - comme l'utiliser avec les bibliothèques CACA de mplayer dans un autre terminal, ou bien le faire sortir dans une fenêtre vlc ou autre. Mais si vous vous aimez, vous le regarderez en haute définition dans terminology.

Oh, et enfin, c'est généralement très rapide - mes vitesses ont jusqu'à présent maximisé ma bande passante pour chaque durée, mais terminology n'a pas besoin de tout le fichier pour commencer à jouer quand même.

Ici ça marche:

terminology rocks

15
mikeserv

Il y a un tutoriel pour cela sur youtube:

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

Selon cette vidéo, les éléments suivants devraient fonctionner:

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

Vous pouvez créer une fonction simple à cet effet:

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

De https://github.com/mps-youtube/mps-youtube

Sudo docker run --device /dev/snd -it --rm --name mpsyt rothgar/mpsyt
1
J0hnG4lt