Thunar Custom Actions – Scripts vidéos

Un petit rappel et un autre sur les paramètres qu’on peut fournir à un script. Vous comprendrez mieux les incantations magiques dans la suite de l’article : $*, $@, $1, $2, etc.

Pour les gens particulièrement attentifs, vous avez dû remarquer la présence de thumbnail.sh dans mon fichier uca.xml. Si vous reprenez l’article mpv pour créer des thumbnails de vidéos, vous avez vers la fin de l’article ce script.

#!/bin/bash
# thumbnail.sh v1.0
#
# 24/08/2015
#

tmp_dir=$(mktemp -d)
mpv -vo image:outdir="$tmp_dir" -sstep 30 -end -30 "$*"
montage $tmp_dir/*.jpg -geometry 200x+0+0 "$*".jpg
rm -r $tmp_dir

Ce script ne fonctionnera pas de manière optimale dans le cas d’une action personnalisée. Pourquoi ? Car il est conçu pour traiter un fichier par un fichier et non plusieurs sélectionnés d’un coup. Voici le script final que j’utilise aujourd’hui, c’est celui que je vous invite à utiliser. Le précédent n’était pas faux et permettait d’avoir une approche didactique et évolutive mais il est moins bien conçu que celui-ci.

#!/bin/bash
# thumbnail.sh v1.1
#
# 25/08/2015
#

for i in "$@"; do
    tmp_dir=$(mktemp -d)
    mpv -vo image:outdir="$tmp_dir" -sstep 30 -end -30 "$i"
    montage $tmp_dir/*.jpg -geometry 200x+0+0 "$i".jpg
    rm -r $tmp_dir
done

Qu’est-ce qu’on a fait de plus finalement ? Bah pas grand-chose, on a juste rajouté une boucle et changer des paramètres pour être raccord avec l’utilisation d’une boucle. Je vous invite à consulter les liens fournis au tout début de l’article pour voir les différences entre $* et $@ hé, hé, hé. Je ne suis pas un monstre quand-même, si vous ne comprenez pas je vous répondrai dans les commentaires bien sûr.

THUMBNAIL

Reprenons notre action Thumbnail dans le fichier uca.xml.

<action>
	<icon>/home/babar/Icons/thumbnail.png</icon>
	<name>Thumbnail</name>
	<unique-id>1399215671623455-4</unique-id>
	<command>/home/babar/thumbnail.sh %N</command>
	<description>Créer des thumbnails de vidéos</description>
	<patterns>*</patterns>
	<video-files/>
</action>

On utilise %N qui correspond aux noms des fichiers sélectionnés (sans les chemins). On peut donc en sélectionner plusieurs par exemple a.mkv, b.wmv, c.mov, d.mp4, e.avi via un clic droit et choisir l’action personnalisée Thumbnail, notre script thumbnail.sh (version 1.1) génèrera pour chacun de ces fichiers un thumbnail en l’occurrence a.mkv.jpg, b.wmv.jpg, c.mov.jpg, d.mp4.jpg, e.avi.jpg.

Dans notre script thumbnail.sh on récupère les noms des fichiers sélectionnés via $@.

CUT AVCONV

Je suis volontairement allé un peu vite sur l’action précédente car ce sera plus précis, intéressant et pointu sur cette action.

<action>
	<icon>/home/babar/Icons/cut.png</icon>
	<name>Cut avconv</name>
	<unique-id>1397790123469842-1</unique-id>
	<command>position=$(zenity --entry --title="Début de la capture" --text="Début" --entry-text="00:20:00"); duration=$(zenity --entry --title="Durée de la capture" --text="Durée" --entry-text="60"); folder=$(zenity --list  --title="Choix du dossier" --text "Dans quel dossier ?" --radiolist --column "Cocher" --column "Dossier" FALSE Films TRUE Séries FALSE Famille); /home/babar/guake_avconv.sh %d %n $position $duration $folder</command>
	<description>Couper une vidéo avec avconv</description>
	<patterns>*</patterns>
    <video-files/>
</action>

Cette action permet de couper un morceau d’une vidéo. J’utilise avconv (vous pouvez utiliser ffmpeg ou mpv si vous le souhaitez), l’opération ne dure que quelques secondes. Pour pouvoir couper un morceau d’une vidéo il faut 4 informations principales. La première c’est le nom du fichier en entrée. La seconde c’est où débute la capture. La troisième c’est combien de temps dure la capture (la durée de la capture) et enfin la dernière c’est le nom du fichier en sortie. Voici un exemple d’une ligne de commande pour couper une vidéo avec avconv.

avconv -i "a.mkv" -vcodec copy -acodec copy -ss 00:18:20 -t 120 Cut_a.mkv

a.mkv : Le nom du fichier en entrée
-vcodec copy : On utilise le même codec vidéo que le fichier en entrée. On peut également l’écrire ainsi -c:v copy
-acodec copy : On utilise le même codec audio que le fichier en entrée. On peut également l’écrire ainsi -c:a copy
-ss 00:18:20 : On débute la capture à 18 mn et 20 secondes
-t 120 : La durée de la capture qui est de 120 secondes
Cut_a.mkv : Le nom du fichier en sortie

A noter que pour cet exemple j’obtiens un temps « real » donné par l’outil time de 0m0.426s. Expliquons maintenant la commande de cette action personnalisée. N’oubliez pas d’installer zenity (apt-get install zenity) pour jouer avec des boîtes de dialogue.

position=$(zenity --entry --title="Début de la capture" --text="Début" --entry-text="00:20:00"); : On crée une variable nommée position contenant où débute la capture. On crée une boîte de dialogue grâce à Zenity (Zenity est un outil qui permet d’afficher des boîtes de dialogue). Le titre de cette boîte de dialogue sera Début de la capture --title="Début de la capture", le texte dans cette boîte de dialogue sera Début --text="Début" enfin le champ de texte à remplir sera déjà pré-rempli avec 00:20:00 --entry-text="00:20:00" ce qui nous évitera de devoir tout taper à chaque fois
duration=$(zenity --entry --title="Durée de la capture" --text="Durée" --entry-text="60"); : On crée une variable nommée duration contenant la durée de la capture. On crée une boîte de dialogue grâce à Zenity. Le titre de cette boîte de dialogue sera Durée de la capture --title="Durée de la capture", le texte dans cette boîte de dialogue sera Durée --text="Durée" enfin le champ de texte à remplir sera déjà pré-rempli avec 60 (comprendre 60 secondes) --entry-text="60" ce qui nous évitera de devoir tout taper à chaque fois (dans mon cas il est rare que je dépasse les 60 secondes pour une capture)
folder=$(zenity --list --title="Choix du dossier" --text "Dans quel dossier ?" --radiolist --column "Cocher" --column "Dossier" FALSE Films TRUE Séries FALSE Famille); : On crée une variable nommée folder contenant le nom du dossier où sera placé notre vidéo coupée. On crée une boîte de dialogue grâce à Zenity. Le titre de cette boîte de dialogue sera Choix du dossier --title="Choix du dossier", le texte dans cette boîte de dialogue sera Dans quel dossier ? --text="Dans quel dossier ?" enfin nous aurons 3 choix possibles grâce à des boutons radio --radiolist --column "Cocher" --column "Dossier" FALSE Films TRUE Séries FALSE Famille
/home/babar/guake_avconv.sh %d %n $position $duration $folder : On va donner au script guake_avconv.sh 5 paramètres. %d le répertoire contenant le fichier, %n le nom du fichier sélectionné, la variable $position contenant le début de la capture, la variable $duration contenant la durée de la capture et enfin la variable $folder contenant le nom du dossier où sera placé notre vidéo coupée

Afin que ce soit un peu plus parlant, le déroulement en images.

Zenity

Voici le script guake_avconv.sh, vous allez commencer à voir le bout du tunnel !

#!/bin/bash
# guake_avconv.sh v1.0
#
# 12/07/2015
#

guake -n NEW_TAB && guake -e "avconv -i "$1/$2" -vcodec copy -acodec copy -ss $3 -t $4 "/home/babar/Vidéos/Cut/$5/Cut_$2""

Avant de parler de quoi que ce soit si vous n’utilisez pas guake alors ce sera plus simple et plus compréhensible, ça donnera la ligne ci-dessous.

avconv -i "$1/$2" -vcodec copy -acodec copy -ss $3 -t $4 "/home/babar/Vidéos/Cut/$5/Cut_$2"

Prenons un exemple : a.mkv est une série et elle est dans le dossier /home/babar/grosdossiertipiaksecret/, on souhaite couper 42 secondes à partir de 00:14:11. On aura donc la ligne suivante.

avconv -i "/home/babar/grosdossiertipiaksecret/a.mkv" -vcodec copy -acodec copy -ss 00:14:11 -t 42 "/home/babar/Vidéos/Cut/Séries/Cut_a.mkv"

$1 permet de récupérer %d (le répertoire contenant le fichier) : /home/babar/grosdossiertipiaksecret
$2 permet de récupérer %n (le nom du fichier sélectionné) : a.mkv
$3 permet de récupérer la variable $position (le début de la capture) : 00:14:11
$4 permet de récupérer la variable $duration (la durée de la capture) : 42
$5 permet de récupérer la variable $folder (le nom du dossier où sera placé notre vidéo coupée) : Séries

Évidemment il faut que les dossiers Films, Séries, Famille soient créés dans le dossier /home/babar/Vidéos. La vidéo coupée (le fichier de sortie) se nommera Cut_$2 (dans notre exemple ça donnera donc Cut_a.mkv). guake -n NEW_TAB ouvre un nouvel onglet dans guake et guake -e exécute la commande qui suit dans guake. Les sont là pour protéger les ".

Il est à noter que j’utilise guake tout le temps mais que ce n’est évidemment pas du tout un pré-requis pour couper une vidéo. Il y a deux avantages à l’utiliser comme je le fais. Le premier c’est que j’ai chaque commande lancée dans un onglet différent donc je peux contrôler que tout se passe bien, relancer la commande ou la modifier à la mano si besoin. Le second avantage c’est qu’on ne gère pas les doublons dans notre script. Si j’ai déjà un fichier Cut_a.mkv dans /home/babar/Vidéos/Cut/Séries/ alors on me demandera si je veux l’écraser ou pas. Vous pouvez facilement contourner ce problème en rajoutant -y après avconv afin de forcer l’écrasement.

L’article étant déjà particulièrement long et dense nous verrons les deux dernières actions personnalisées dans le prochain article.

See You Space Cowboy !

Les commentaires sont fermés.