Niveau :      
Résumé : ~/.gnome2/nautilus-scripts

Aujourd'hui parlons un peu d'interface utilisateur. Vous arrive-t-il souvent de lancer la même commande sur plein de fichiers ? Avez-vous une personne de votre famille qui perd son temps à ouvrir des fichiers un par un pour faire une modification dans chaque ?

Si ces opérations sont automatisables (calculs openoffice, modification d'image, ajout d'une ligne de texte ...) alors il y a un moyen pour les rendre accessible directement depuis le navigateur de fichier. Pour cela, il suffit d'écrire un script et de le placer dans ~/.gnome2/nautilus-scripts. Essayer de bien le nommer car il apparaîtra tel quel dans le menu contextuel "Scripts" de nautilus.

Pour parler concrètement, nous allons faire un outil de réduction d'image disponible directement depuis le navigateur de fichier. Nous allons donc éditer le fichier ~/.gnome2/nautilus-scripts/ReductionPhotos qui nous permettra d'appeler imagemagick pour réduire la taille des photos sélectionnées (en ajoutant un préfixe pour ne rien perdre). Nous feront notre démo sur tous les fichiers sélectionnés à la souris pour bien montrer qu'on automatise un comportement d'utilisateur "normal".

Le script reçoit ses informations dans des variables d'environnement. La plus importante dans notre cas est NAUTILUS_SCRIPT_SELECTED_FILE_PATHS qui contient la liste des fichiers sélectionnés séparés par des retours à la ligne. Donc une petite boucle pour les traiter tous d'un coup :

echo -n "$NAUTILUS_SCRIPT_SELECTED_FILE_PATHS" | while read in_file
do
        process_file $in_file
done

Alors il se peut que le script ait des questions à poser à l'utilisateur. C'est le moment d'utiliser zenity. Un petit outil sympa, équivalent de dialog, mais bien mieux intégré dans gnome. Petite exemple avec la sélection d'un nombre dans une intervalle de 0 à 100 :

$ percent=$(zenity --scale --title="Choix du pourcentage" --text "Pourcents : " --value="50" --min-value="0" --max-value="100" --step="1")

Simple non ?

Pour traiter les images en ligne de commande, vous connaissez imagemagick. Voici la commande à utiliser dans mon cas :

convert image1.jpg -quality 80 -resize 1200 image2.jpg

Voila, on a toutes les briques pour faire le script.

#!/bin/bash
#
# Name : ReductionPhoto
# Author : peck
# Licence : GPLv2
#

set -x

#################################################
#       FONCTIONS
ask_questions ()
{
        # question communes à tous les fichieirs
        quality=$(zenity --scale --title="Choix de qualite" --text "Qualite" --value="75" --min-value="0" --max-value="100" --step="1")
        width=$(zenity --entry --title="Largeur de l'ecran" --text "Largeur" --entry-text="1200")
}

reduct()
{
        # options de reduction
        options="-quality $quality -resize $width"
echo $options >> /tmp/debug

        # sauter les non-images
        if identify "$1" >/dev/null
        then
                # convertir
                convert "$1" $options "$2"
        fi
}

#################################################
#       PROGRAMME
if [ $# -eq 0 ]; then
        zenity --error --title="Erreur" --text="Pas de fichier selectionne pour la conversion"
        exit 1
fi
if which convert 2>/dev/null
then
        true
else
        zenity --error --title="Erreur" --text="ImageMagick n'est pas installe"
        exit 1
fi

# c'est parti
ask_questions
echo -n "$NAUTILUS_SCRIPT_SELECTED_FILE_PATHS" | while read in_file
do
        ibase=$(basename "$in_file")
        idir=$(dirname "$in_file")
        out_file="$idir/r_$ibase"

        # on fait gaffe aux fichiers qu'on ecrase
        if ls "$out_file"
        then
                if zenity --question --title="Fichier existant" --text="Remplacer r_$ibase ?"
                then
                        reduct "$in_file" "$out_file"
                fi
        else
                reduct "$in_file" "$out_file"
        fi
done

# et ouala
zenity --text "Fin" --info "Reduction terminee"

À vous de faire tout ce qui vous intéresse, le reste de la doc se trouve dans la faq du site