Autor Tema: Pido ayuda con script que creo puede interesar  (Leído 9534 veces)

mmggmm

  • Comenzando
  • *
  • Mensajes: 14
Pido ayuda con script que creo puede interesar
« on: 12 ene 2012, 06:28 am »
Código: [Seleccionar]
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:


Código: [Seleccionar]
#!/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

Código: [Seleccionar]
[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]
« Última Modificación: 24 ene 2012, 07:24 am por mmggmm »

invisible

  • Moderador
  • Palizas oficial
  • *****
  • Mensajes: 8097
    • INVItARTE
Re: Pido ayuda con script que creo puede interesar
« Respuesta #1 on: 12 ene 2012, 09:57 am »
Hola,

Yo estoy usando éste en kde, lo adapté para tener la interfaz de kdialog y me funciona muy bien, además lo integré en dolphin para lanzarlo desde el menú contextual al hacer clic derecho con el ratón...

No sé si te sirve... A ver si luego tengo un ratillo y subo el código. q:)
"Si quieres ver lo invisible, observa con atención lo visible."
                                                     Manuel Álvarez Bravo (1902-2002)

mmggmm

  • Comenzando
  • *
  • Mensajes: 14
Re: Pido ayuda con script que creo puede interesar
« Respuesta #2 on: 12 ene 2012, 10:41 am »
Hola Hombre _Invisible.
Yo también estoy utilizando el mítico script de Redy, algo adaptado, y me va de maravilla. Pero éste que yo propongo es para poder seleccionar en Geeqi (no sé si también  en Nautilus) varias fotos y añadirles etiquetas y palabras clave (IPTC o Exif, no estoy seguro), cosa que en Geeqi hay que hacer una a una.

invisible

  • Moderador
  • Palizas oficial
  • *****
  • Mensajes: 8097
    • INVItARTE
Re: Pido ayuda con script que creo puede interesar
« Respuesta #3 on: 12 ene 2012, 11:16 am »
Perdona. Acabo de caer en la cuenta de que antes, con las prisas, te entendí al revés... Entendí que querías el script adaptado a kde y, ahora, al leer tu respuesta, me he dado cuenta de que es justo lo contrario... Siento no poder ayudarte, pero seguro que, de un momento a otro, aparece redy y te echa una mano... ya verás. :-)
"Si quieres ver lo invisible, observa con atención lo visible."
                                                     Manuel Álvarez Bravo (1902-2002)

mmggmm

  • Comenzando
  • *
  • Mensajes: 14
Re: Pido ayuda con script que creo puede interesar
« Respuesta #4 on: 24 ene 2012, 07:32 am »
Tras mucho investigar, he llegado a una versión que funciona. Aún quedan cosas por arreglar, pero, por si a alguien le interesa:
Código: [Seleccionar]
#!/bin/bash
# Copyright 2011 JP Verrue
# Licence GPL
# Traducido al español y adaptado a Zenity por Marcial Gómez Martín.

progname=$(basename "$0" .sh)"-Rellenar campos IPTC" # 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="Seleccionar Archivos" ; itemSelectFiles="f"
labelInputKeywords="Escribir las Palabras Clave" ; itemInputKeywords="k"
labelInputDescription="Escribir una Descripción" ; itemInputDescription="d"
labelTagFiles="Guardar las Nuevas Etiquetas en los Campos IPTC 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...
unset itemSelectFiles labelSelectFiles # Suppresión del item y de la etiqueta del menú por los archivos seleccionados.

# Modificamos la entrada del menú por defecto.
labelDefault="${labelInputKeywords}"

# A continuación, se recuperan los argumentos de la línea de comandos para crear la lista de archivos a etiquetar y
# se modifica el 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; para sustituir los espacios en blanco por una nueva línea.
files="$*" # Se necesitan comillas para esta expresión: $*(todos los parámetros posicionales vistos como una sola palabra)
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 a este bucle.
# Se modifica la variable IFS para que los espacios que contenga la salida de dicha variable
# no la corten en múltiples argumentos si está presente. (No_WPS= no white space)

OLDIFS=${IFS}
IFS=${No_WSP}

# Vamos a elegir la salida de la variable "item".
item=$(zenity --list \
--text="Pasos a Segir Para Introducir Palabras Clave y Descripciones (o Comentarios) en los Campos IPTC de Tus Imágenes" \
--title="${progname}" --width=500 --height=200 \
--column="" --column="¿Qué Quieres Hacer Ahora?" --hide-column=1 \
${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}

# Si nos encontramos con que la variable "${itemSelectFiles}" está 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 (con:-) que fuerza un valor si está vacía.
# Así evitamos que se nos ofrezca esta opción.

case "${item}" in # En el caso de que la salida de la expresión "${item}" concuerde con
${itemSelectFiles:-laVariableEstáVacía})

files=$(zenity --file-selection --title="Selecciona los Ficheros que Quieres Etiquetar" \
--multiple --confirm-overwrite "${currentdir}" )

if [ $? = 0 ] ; then # si la salida del último comando ejecutado es igual a 0 (éxito), entonces...

# Extracción del repertorio de selección 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 # volver a comenzar el bucle.
fi
if [ -z "${keywords}" -a -z "${description}" ] ; then
zenity --error --text="\¡No se han especificado palabras clave o descripciones\!" \
continue # volver a comenzar el bucle.
fi

# confirmación
if [ ! -z "${keywords}" ] ; then
optKeywords="-keywords+=${keywords}"
labelKeywords="Palabras clave: ${keywords}\n"
fi

if [ ! -z "${description}" ] ; then
optDescription="-description=${description}"
labelDescription="Descripción : ${description}\n"
fi

message="\n¿Modificar estas imágenes?\n\n"

OLDIFS=${IFS}
IFS=$'\x0d'

zenity --question --text="Los Campos IPTC se Modificarán.\nLas Palabras Clave se AÑADIRÁN a las existentes.\nLa Descripción SUSTITUIRÁ a la anterior, de haberla. \
\n
\n${labelKeywords} \
\n${labelDescription}${message} \
${files}"
IFS=${OLDIFS}

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}

# Con las siguentes líneas, hacemos que el script se cierre si todo ha salido bien.
if [ $? = 0 ] ; then
exit
fi
;;
*)
;;
esac
# descomentar el signo "&" en la siguiente línea para que se ejecute en segundo plano.
done # &
exit 0