Saludos a todos.
El otro día, encontré un script en una página de "fotolibreros" franceses (no sé si es mucho decir) un script para etiquetar fotos en grupo con integración en Geeqie. El caso es que está escrito para Kde y usa Kdialog. Yo, muy osado, me puse a intentar sustituir éste por zenity, como podréis imaginar, sin mucho éxito. Como aquí hay gente que entiende de bash, quizá alguien podría echarle un tiento. La página en cuestión es esta:
[url=http://photolinux.freeforums.org/index.php] http://photolinux.freeforums.org/index.php[/url]
Os pongo el código original y mi "traducción"
Original:
[code]#!/bin/bash
# Copyright 2011 JP Verrue
# Licence GPL
progname=$(basename "$0" .sh) # nom du programme
No_WSP=$'\x0a'$'\x0d' # Pas d'espace blanc == retour à la ligne:retour chariot
# libellés et codes du menu
labelSelectFiles="Sélection des fichiers" ; itemSelectFiles="f"
labelInputKeywords="Saisie des mots clés" ; itemInputKeywords="k"
labelInputDescription="Saisie d'une description" ; itemInputDescription="d"
labelTagFiles="Tag des fichiers" ; itemTagFiles="t"
labelDefault="${labelSelectFiles}"
files= # liste des fichiers à modifier
currentdir="${PWD}" # répertoire par défaut pour la sélection des fichiers
keywords= # pour constitution de la ligne de commande exiftools
optKeywords= # pour constitution de la ligne de commande exiftools
description= # pour constitution de la ligne de commande exiftools
optDescription= # pour constitution de la ligne de commande exiftools
labelKeywords= # pour constitution de la fenêtre de confirmation
labelDescription= # pour constitution de la fenêtre de confirmation
# Si le script est lancé avec des arguments sur la ligne de commande, ceux-ci sont censés être
# des noms de fichiers image. Dans ce cas il n'est pas nécessaire de présenter l'option
# de choix de fichier dans le menu. Cette option est invalidée ci-dessous et les arguments sont
# copiés dans la liste de fichiers
if [ $# != 0 ] ; then
# suppression de l'item et du label du menu pour la selection des fichiers
unset itemSelectFiles labelSelectFiles
# modification de l'entrée du menu par defaut
labelDefault="${labelInputKeywords}"
# récupération des arguments de la ligne de commande
# pour constituer la liste des fichiers à tagger
# Modification de IFS pour gérer les noms de fichiers avec des blancs
OLDIFS=${IFS}
IFS=$'\x0a'
files="$*" # guillemets nécessaires pour remplacer le blanc par un newline
IFS=${OLDIFS}
fi
retcode=0 # code de retour du menu. gère la sortie de la boucle principale
while [ ${retcode} = 0 ] ; do
# Manipulation de la variable ${labelSelectFiles} :
# Dans la commande kdialog ci dessous, pas de guillemets autour de la variable
# pour la faire disparaitre completement si on a fait unset dans le if précedant la boucle.
# Mais modification de IFS pour que les blancs qu'elle contient ne viennent pas
# la couper en multiples arguments si elle est présente.
OLDIFS=${IFS}
IFS=${No_WSP}
item=$(kdialog --caption ${progname} --default "${labelDefault}" --title "${progname}" \
--menu "Choisissez une action :" \
${itemSelectFiles} ${labelSelectFiles} \
${itemInputKeywords} "${labelInputKeywords}" \
${itemInputDescription} "${labelInputDescription}" \
${itemTagFiles} "${labelTagFiles}" )
retcode=$? # positionner retcode en fonction du choix fait dans le menu
# restaurer IFS
IFS=${OLDIFS}
case "${item}" in
# Quand on a ${itemSelectFiles} vide (C'est le cas quand on a des arguments dans la ligne
# de commande et qu'on a fait un unset), on peut rentrer ici quand la variable item est
# également vide (sortie du menu). C'est l'objet de cette notation particulière de la
# variable qui force une valeur quand elle est vide. On empèche donc d'entrer dans ce choix
${itemSelectFiles:-laVariableEstVide})
files=$(kdialog --caption ${progname} --title "Sélection des fichiers" \
--multiple --separate-output --getopenfilename "${currentdir}" \
"image/png image/jpeg image/tiff image/x-nikon-nef image/x-adobe-dng|Images" )
if [ $? = 0 ] ; then
# Extraction du répertoire de sélection des fichiers à partir
# du premier nom de fichier dans la liste.
# "oublier" les blancs en tant que séparateurs d'arguments
OLDIFS=${IFS}
IFS=${No_WSP}
# transformer la liste des fichiers en liste
# des arguments de la ligne de commande
set ${files}
# récupérer le chemin du premier fichier de la liste
currentdir="$(dirname $1)"
# restaurer IFS
IFS=${OLDIFS}
fi
;;
${itemInputKeywords})
oldkeywords="${keywords}"
keywords=$(kdialog --caption ${progname} --title "Saisie des mots clefs" \
--inputbox "Entrez les mots-clefs séparés par une virgule :" "${keywords}")
if [ $? != 0 ] ; then
keywords="${oldkeywords}"
fi
;;
${itemInputDescription})
olddescription="${description}"
description=$(kdialog --caption ${progname} --title "Saisie d'une description" \
--inputbox "Entrez une description pour les images :" "${description}")
if [ $? != 0 ] ; then
description="${olddescription}"
fi
;;
${itemTagFiles})
# controles
if [ -z "${files}" ] ; then
kdialog --caption ${progname} \
--error "Vous n'avez sélectionné aucune image !"
continue # revenir au début de la boucle
fi
if [ -z "${keywords}" -a -z "${description}" ] ; then
kdialog --caption ${progname} \
--error "Vous n'avez saisi ni mots clefs, ni description !"
continue # revenir au début de la boucle
fi
# confirmation
if [ ! -z "${keywords}" ] ; then
optKeywords="-keywords+=${keywords}"
labelKeywords="Mots clefs : ${keywords}\n"
fi
if [ ! -z "${description}" ] ; then
optDescription="-description=${description}"
labelDescription="Description : ${description}\n"
fi
message="\nConfirmez vous la modification des images suivantes ?\n\n"
kdialog --caption ${progname} --title "Tag des fichiers" --yesno \
"${labelKeywords}${labelDescription}${message}${files}"
if [ $? != 0 ] ; then
continue # revenir au début de la boucle
fi
# modification des fichiers proprement dite.
# De nouveau modification de IFS pour gérer
# les noms de fichiers avec des blancs
OLDIFS=${IFS}
IFS=${No_WSP}
exiftool -sep "," -overwrite_original \
${optKeywords} \
${optDescription} \
${files} >/dev/null
IFS=${OLDIFS}
;;
*)
# rien
;;
esac
done & # pour éxecution en tache de fond
exit 0
Traducción que no funciona:
#!/bin/bash
# Copyright 2011 JP Verrue
# Licence GPL
progname=$(basename "$0" .sh) # nombre del programa.
No_WSP=$'\x0a'$'\x0d' # No hay espacio en blanco == salto de línea:retorno de carro.
# etiquetas y códigos del menú.
labelSelectFiles="Selección de archivos" ; itemSelectFiles="f"
labelInputKeywords="Introducción de las palabras clave" ; itemInputKeywords="k"
labelInputDescription="Introducción de una descripción" ; itemInputDescription="d"
labelTagFiles="Etiqueta de los archivos" ; itemTagFiles="t"
labelDefault="${labelSelectFiles}"
# directorio por defecto para la selección de los archivos
currentdir="${PWD}"
# files= # lista de archivos a modificar
# keywords= # para trabajar con exiftool
# optKeywords= # para trabajar con exiftool
# description= # para trabajar con exiftool
# optDescription= # para trabajar con exiftool
# labelKeywords= # para la ventana de confirmación
# labelDescription= # para la ventana de confirmación
# Si el script se lanza con argumentos desde la consola, se considera que estos son los nombres de los archivos de imagen.
# En este caso, no es necesario presentar la opción de "elegir archivos" en el menú.
# Esta opción queda invalidada a continuación y los argumentos se copian en la lista de archivos.
if [ $# != 0 ] ; then # Si la cadena de argumentos no es igual a 0...
# Suppresión del item y de la etiqueta del menú por los archivos seleccionados.
unset itemSelectFiles labelSelectFiles
# Modificación de la entrada del menú por defecto.
labelDefault="${labelInputKeywords}"
# Recuperación de los argumentos de la línea de comandos
# para crear la lista de archivos a etiquetar.
# Modificación de IFS (internal field separator) para gestionar los nombres de los archivos y los espacios en blanco.
OLDIFS=${IFS}
IFS=$'\x0a' # "\x0a" significa "salto de línea" en hexadecimal.
files="$*" # Se necesitan comillas para esta expresión: $*(todos los parámetros posicionales vistos como una sola palabra)
# sustituir los espacios en blanco por una nueva línea.
IFS=${OLDIFS}
fi
retcode=0 # Código de retorno de menú. Gestiona la salida del bucle principal.
while [ ${retcode} = 0 ] ; do
# Manipulación de la variable ${labelSelectFiles} :
# En el comando de zenity que sigue, no se ponen comillas en dicha variable para
# hacerla desaparecer del todo si hemos hecho un "unset" en el "if" que precede al bucle.
# Se modifica la variable IFS para que los espacios que contenga aquella
# no la corten en múltiples argumentos si está presente. (No_WPS= no white space)
OLDIFS=${IFS}
IFS=${No_WSP}
item=$(zenity --list --text="Elige una acción" --title="${progname}" \
--column="Posibles acciones" \
${itemSelectFiles} ${labelSelectFiles} \
${itemInputKeywords} "${labelInputKeywords}" \
${itemInputDescription} "${labelInputDescription}" \
${itemTagFiles} "${labelTagFiles}" )
retcode=$? # posicionar el código de retorno de menú en función de la elección que se haya hecho.
# restaurar IFS
IFS=${OLDIFS}
case "${item}" in
# Si nos encontramos con la variable "${itemSelectFiles}" vacía (si hay argumentos en la línea de comandos
# y hemos hecho un "unset"), se puede volver a entrar cuando la variable "item" esté también vacía (salida de menú).
# Éste es el objeto de esta particular forma de escribir la variable que fuerza un valor si está vacía.
# On empèche donc d'entrer dans ce choix
${itemSelectFiles:-laVariableEstVide})
files=$(zenity --file-selection --title="Selecciona los ficheros" \
--multiple --confirm-overwrite --directory "${currentdir}" \
"image/png image/jpeg image/tiff image/x-nikon-nef image/x-adobe-dng|Images")
if [ $? = 0 ] ; then
# Extracción del repertorio de selection de archivos a partir
# del primer nombre de archivo de la lista.
# obviar los espacios en tanto que separadores de argumentos
OLDIFS=${IFS}
IFS=${No_WSP}
# transformar la lista de archivos en lista
# de los argumentos de la línea de comandos.
set ${files}
# recuperar la ruta del primer archivo de la lista
currentdir="$(dirname $1)"
# restaurar IFS
IFS=${OLDIFS}
fi
;;
${itemInputKeywords})
oldkeywords="${keywords}"
keywords=$(zenity --entry --title="${progname}" --text="Escribe las palabras clave separadas por comas:" \
"${keywords}")
if [ $? != 0 ] ; then
keywords="${oldkeywords}"
fi
;;
${itemInputDescription})
olddescription="${description}"
description=$(zenity --entry --title="${progname}" --text="Introduce una descripción:" \
"${description}")
if [ $? != 0 ] ; then
description="${olddescription}"
fi
;;
${itemTagFiles})
# controles
if [ -z "${files}" ] ; then
zenity --error --text="\¡No hay imágenes seleccionadas\!" \
continue # revenir au début de la boucle
fi
if [ -z "${keywords}" -a -z "${description}" ] ; then
zenity --error --text="\¡No se han especificado palabras clave o descripciones\!" \
continue # revenir au début de la boucle
fi
# confirmation
if [ ! -z "${keywords}" ] ; then
optKeywords="-keywords+=${keywords}"
labelKeywords="Mots clefs : ${keywords}\n"
fi
if [ ! -z "${description}" ] ; then
optDescription="-description=${description}"
labelDescription="Description : ${description}\n"
fi
message="\n¿Modificar estas imágenes?\n\n"
zenity --question --text="¿Etiquetar los siguientes ficheros?" \
"${labelKeywords}${labelDescription}${message}${files}"
if [ $? != 0 ] ; then
continue # volver a comenzar el bucle.
fi
# modificación de los ficheros propiamente dicha.
# De nuevo, modificación de IFS para gestionar
# los nombres de los archivos y los espacios en blanco.
OLDIFS=${IFS}
IFS=${No_WSP}
exiftool -sep "," -overwrite_original \
${optKeywords} \
${optDescription} \
${files} >/dev/null
IFS=${OLDIFS}
;;
*)
# Puesta al día de nepomuk con las etiquetas nuevas.
neposync --files-to-nepomuk
;;
esac
done & # pour execution en tache de fond
exit 0
Se me había pasado: el archivo .desktop
[Desktop Action roxtag_keyword]
Exec=roxtag %U
Icon=OsmosDemo
Name=Ajouter des nouveaux mots-clefs
[Desktop Entry]
Actions=roxtag_keyword;
MimeType=
ServiceTypes=
Type=Service
X-KDE-ServiceTypes=KonqPopupMenu/Plugin,,image/jpeg
X-KDE-Submenu=
De momento, he tenido que comentar algunas variables incompletas en las primeras líneas, porque daba errores. Ahora, da un error en la línea 78 (ó 79) de elemento inesperado, o algo así cerca del útimo paréntesis de la expresión ${itemSelectFiles:-laVariableEstVide}).
Como no me ha llegado a funcionar, no sé como va, pero parece ser que a los colegas franceses les gusta mucho.
Un saludo,
Marcial
[/code]