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. :-)
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"
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 .
Avec l'installation de bibliothèques supplémentaires, la vidéo ASCII peut encore être améliorée.
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.
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.
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
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.
REMARQUE: C'est (de gauche à droite) xterm
, terminator
, gnome-terminal
et terminology
.
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:
ytplay 'https://www.youtube.com/watch?v=${id}'
Et ainsi de suite ...curl "$yturl" | grep url_encoded_fmt_stream_map
pour voir le bloc entier.grep
ci-dessus, vous trouverez la liste dans le champ "
délimité par des guillemets ...stream_map: "
.%[[:hexdigit:]]\{2\}
En liens de travail. /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.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:
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")
}
De https://github.com/mps-youtube/mps-youtube
Sudo docker run --device /dev/snd -it --rm --name mpsyt rothgar/mpsyt