Zenity, pour rendre ses scripts plus interactifs
Le contexte est le suivant : Ma belle-mère, que j’ai converti à Ubuntu il y a maintenant un peu plus d’un an, s’est offert il y a quelques jours un lecteur multimédia Archos 3cam Vision. Bien que l’appareil ne casse pas trois pattes à un canard, il reste raisonnable vu son prix (70€). Bref, Belle-maman étant fan d’opéras en tous genre, elle a donc extrait plusieurs CD en MP3 (merci Sound Juicer!) et les a transférés sur son Archos. Problème : Un opéra, ça s’écoute dans l’ordre et malgré des noms de fichiers suivant l’ordre alphabétique, les MP3 se retrouvaient complètement mélangés quand on les parcourait depuis le lecteur.
Après quelques recherches, j’ai appris que chez Archos, ils n’ont rien trouvé de mieux que de classer les fichiers non pas par ordre alphabétique comme la logique le voudrait, mais par date de transfert… Je ne sais pas quelle est la raison de ce choix mais j’imagine que Windows doit copier les fichiers d’un emplacement à un autre par ordre alphabétique et que, comme la majorité des PC tournent sous Windows, blablabla, on connaît la chanson. Il s’agit d’une simple supposition mais je ne vois pas vraiment d’autres explications rationnelles…
Quoi qu’il en soit c’est un problème connu et en cherchant un peu sur le Net, j’ai trouvé une ligne de commande permettant de copier le contenu d’un dossier vers un autre emplacement en transférant les fichiers un par un dans l’ordre alphabétique. La ligne provient de là et ressemble à ça :
find . -type f -print0 | sort -z -n | xargs -0 cp --target-directory='/media/A3cam/Music/mon_album'
Seulement voilà! Je me voyais mal expliquer à Belle-maman que pour transférer un album, il fallait qu’elle crée préalablement dans /media/A3cam/Music un dossier de destination pour l’album en question, qu’elle se rende en ligne de commande dans le dossier contenant les MP3 qu’elle souhaitait transférer et qu’elle exécute cette ligne de commande tout en modifiant le chemin de destination en conséquence… Dieu sait si j’aime la ligne de commande mais, même moi, ça me gênerait de devoir faire ça pour mettre correctement de la musique sur mon lecteur MP3. Bref, c’est là qu’intervient Zenity et j’ai envie de dire qu’après une intro comme ça, il était temps
Zenity, qu’est-ce que c’est? Zenity, installé de base sur Ubuntu (et sur Arch avec Gnome?), permet de créer des boîtes de dialogue simples en GTK+ depuis le shell. Ce n’est pas fait pour créer une interface complète mais ça permet quand même de donner une peu d’interactivité à ses scripts. Le principe est très simple. La commande zenity suivie d’une option (–file-selection, –info, –calendar, …) permet de générer une boîte de dialogue. Chaque boîte possède ensuite ses propres options de façon à la personnaliser. Ainsi, j’ai pu adapter la ligne de commande précédente de la façon suivante :
#!/bin/sh ARCHOS='/media/A3cam/Music' if [ ! -d $ARCHOS ] zenity --error --text="Le lecteur MP3 ne semble pas branché\\!" exit fi FILE=`zenity --file-selection --filename=/home/user/Musique/ --directory --title="Sélectionnez un dossier à transférer"` case $? in 0) FOLDER=${ARCHOS}/`basename $FILE` mkdir $FOLDER find $FILE -type f -print0 | sort -z -n | xargs -0 cp -v --target-directory="$FOLDER" zenity --info --text="Transfert effectué avec Succès\\!";; 1|-1) zenity --error --text="Impossible d'effectuer de transfert. Le lecteur MP3 est-il bien branché et allumé? Avez-vous bien sélectionné le dossier à transférer?";; esac
Détaillons rapidement tout ça :
- La première ligne spécifie le chemin vers le dossier Music de l’Archos. La suite teste l’existence de ce chemin et renvoie une pop-up d’erreur le cas échéant.
- On récupère ensuite dans la variable FILE le chemin choisi dans la fenêtre de sélection de dossier créée par Zenity. À noter le paramètre –filename qui permet de présélectionner un dossier, le paramètre –directory qui oblige à ne sélectionner que des dossiers, et le paramètre –title afin de donner un titre à la boîte de dialogue.
- Zenity retourne également un code de sortie qui est égal à 0 si tout s’est bien passé, 1 ou -1 sinon (erreur, annulation). En bash, la variable $? permet de récupérer le code de sortie de la dernière commande exécutée. Un switch/case classique permet alors de trier ces codes de retour.
- Si un dossier a bien été sélectionné, on crée un dossier de même nom sur le lecteur MP3 (on notera l’utilisation de basename qui, entre autres, pour un chemin quelconque renvoie le nom du dossier courant). On exécute la commande qui va faire la copie élément par élément par ordre alphabétique et on génère une pop-up quand cette copie est terminée.
- Dans le cas où la sélection de dossier retourne un code d’erreur, on génère une pop-up en conséquence.
Ce script est encore perfectible mais il permet de proposer l’exécution d’une commande spécifique de manière un tant soit peu interactive. Zenity est au bout du compte très basique mais suffisant pour beaucoup de choses. On notera par exemple le calendrier ou la barre de progression. Enfin de la personnalisation de contenu est possible grâce à des balises type HTML. Une documentation est disponible sur le site de Gnome et sur Ubuntu-fr.
NB : Si quelqu’un possède un Archos 3cam Vision ou équivalent, a-t-il une idée de comment sont organisés les dossiers? Les fichiers, maintenant c’est assez clair, mais les dossiers ont l’air de suivre encore une autre logique… Les gars de chez Archos ont-ils choisi de trier les dossier en fonction de la taille moyenne des noms de fichiers qu’ils contiennent?!…