14-01-23, 19:01
(Modification du message : 14-01-23, 19:04 par JeanLucLacroix.)
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.
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