Forum darktable FR

Version complète : Exportation des mots-clés par image
Vous consultez actuellement la version basse qualité d’un document. Voir la version complète avec le bon formatage.
Bonjour,

Dans mon mode opératoire, j'importe mes RAW's dans DT et je stocke les JPEG du boîtier dans un répertoire de mon disque dur. La plupart de mes RAW's sont taggés, mais pas les JPEG, bien sûr. Je compte utiliser exiftool dans un script pour injecter les mots-clés de mes RAW's au champ 'Subject' des exif des JPEG. Je pourrais exporter tous mes RAW's depuis DT, mais j'aime garder les JPEG du boîtier dont le rendu est souvent meilleur.

Dans DT j'ai cherché le moyen de créer la liste des RAW's ayant un ou plusieurs tag sans succès. L'option d'aller fouiller dans chaque XMP pour en extraire les tags ne me semble pas très productif, je rame souvent quand je dois extraire des valeurs de champs d'un fichier XML ou JSON avec les utilitaires comme xmllint ou jq.

Le seul moyen à ma portée que j'ai trouvé est de faire une extraction de ces valeurs des data.db et library.db par script. Y a-t-il un autre moyen ?

Pour info, voici le script sqlite que j'utilise :

Code :
ATTACH 'data.db' as data;
SELECT i.filename, ti.tagid, t.name
    FROM tagged_images ti
    JOIN images i ON ti.imgid=i.id
    JOIN data.tags t ON ti.tagid=t.id
    WHERE t.name NOT LIKE 'darktable%'
    ORDER BY i.filename DESC;
Bonjour,
et en s'inspirant du dernier post de ce fil ? https://forums.darktable.fr/showthread.php?tid=6367&page=2
Ce fil concerne à première vue l'inverse : "tagger" les RAW avant importation dans DT. Dans mon cas il s'agit de tagger les JPEG du boîtier stockés sur mon disque dur à partir des tags que j'ai attribués aux RAW's dans DT. Je pense m'en tirer avec ma requête SQL dans les DB et ensuite, par script, les injecter dans les exif des JPEG boîtier. Je posterai ce script dès qu'il est au point.

^_^

Jean-Luc
Bonjour,

J'ai un script bash (nommé mots-clés-JPG) qui fait plus ou moins ça, sans toutefois taper dans la base, mais qui s'appuie sur les xmp.
Il recopie des mots clés associés aux RAW (en vérité figurant dans les xmp associés) dans les JPG correspondants.
 
Je le mets à disposition ici pour qui en veut.

Il devrait être mis dans $HOME/.local/share/nautilus/scripts (à créer si existe pas) puis rendu exécutable par un :
Code :
chmod +x $HOME/.local/share/nautilus/scripts/mots-clés-JPG

Ensuite, il suffit de faire un clic droit sur un dossier contenant des photos, choisir Scripts puis mots-clés-JPG et se laisser guider par les popups.
J'ai, entre-temps ,terminé mon script, mais je serais curieux de jeter un coup d'oeil sur le tien, surtout la partie extraction des tags des XMP. J'avoue que je suis à la peine dans le traitement de structures XML et JSON.

Voici le mien à adapter selon vos arborescences. Exiftool n'est pas très véloce en exécution  depuis awk, mais soit, il fait ce qu'on lui demande.

Code :
#!/bin/dash

DATA_DB="/home/jeanluc/scripts/darktable/data/data.db"
LIBRARY_DB="/home/jeanluc/scripts/darktable/data/library.db"
JPEG_DIR="/data/photos_jpg/"

# Extraction des tags
sqlite3 -separator ";" $LIBRARY_DB \
"ATTACH '$DATA_DB' as data;
SELECT i.filename, ti.tagid, t.name
    FROM tagged_images ti
    JOIN images i ON ti.imgid=i.id
    JOIN data.tags t ON ti.tagid=t.id
    WHERE t.name NOT LIKE 'darktable%'
    ORDER BY i.filename DESC;
" > /tmp/tags

# Liste des JPG à tagger
ls $JPEG_DIR > /tmp/jpegs

awk -F";" -v jpeg_dir=$JPEG_DIR '

# Concaténation des tags pour un RAW donné séparés par une virgule (premier fichier en entrée)
FNR == NR {    delimiter = ""
    if (filenames[$1]) {
        delimiter = ","
    }
    filenames[$1] = filenames[$1] delimiter $3
}

# Liste des jpeg du boîtier (deuxième fichier en entrée)
FNR != NR {
    jpegs[$0] = 1
}

END {

    # Boucle sur les RAW avec tags
    for ( filename in filenames ) {
        # nom sans extension (remplace ORF par JPG)
        jpeg_name = gensub(/\..+/, ".JPG", "g", filename)

        # Si le JPG existe, injection des tags
        if (jpegs[jpeg_name]) {
            counter+=1
            printf("\n%s\n", counter)
            cmd = sprintf("exiftool -preserve -overwrite_original -subject=\047%s\047 %s%s", filenames[filename], jpeg_dir, jpeg_name)
            print cmd
            system(cmd)
        }
    }
}
' /tmp/tags /tmp/jpegs
@manu propose un script très fini pour traiter le problème posé.
En acceptant moins de perfectionnement on peut utiliser exiftool.
La façon la plus simple d'extraire les mots-clefs des fichiers xmp est d'utiliser exiftool :
Code :
exiftool -subject nom_fichier
; on obtient la liste des mots-clefs rangés par ordre alphabétique, séparés par des virgules (modifiable). Avec -hierarchicalSubject on conserve la structure des mots-clefs. Avec -subject="aaaaaa" on affecte les mots-clefs au fichier.
Le problème posé est donc de traiter chaque fichier d'un répertoire en extrayant des informations d'un fichier et en les injectant dans un autre lié. C'est exactement ce que fait le script proposé par @Clo dans le post indiqué plus haut.
exiftool permet de le faire en une ligne de commande. Supposons que les raw ont l'extension ORF, qu'ils se trouvent dans repRAW et que les jpg (ou JPG sans importance) sont dans repJPG. En ouvrant un terminal dans repRAW et en tapant :
Code :
exiftool -overwrite_original_in_place -tagsfromfile %f.ORF.xmp -subject chemin_vers_repJPG 2>>erreur.log
on obtient le résultat voulu, et en plus le nombre de fichiers modifiés ou non. Dans le fichier erreur.log on trouve les fichiers jpg orphelins et les fichiers raw sans mots-clefs.
L'option -overwrite_original_in_place conserve la date de création du fichier original et empêche exiftool de faire une copie du fichier d'origine. L'option -preserve ne conserve pas cette date sous linux, au moins chez moi. Si c'est sans importance -overwrite_original est un peu plus rapide.

Le script de @Clo modifie les données au passage : ça aussi exiftool sait le faire.

exiftool c'est bien utile.