Note de ce sujet :
  • Moyenne : 0 (0 vote(s))
  • 1
  • 2
  • 3
  • 4
  • 5
Images sans mots clés
#1
Dans CE FIL, on parle actuellement des scripts disponibles avec darktable. Pour répondre , j'ai revisité le répertoire qui les contient, et j'ai revu le script purge_unused_tags.sh.

Cela m'a rappelé que j'ai récemment fait un traitement du même genre sur mes photos : Assigner des mots clés à toutes les images n'en possédant pas.

Pour cela il m'a d'abord fallu identifier dans ma collection d'images celles qui n'étaient pas tagguées. Pour faire cela j'ai utilisé une requête SQL. la voici :
<pre>
Code :
select images.id as "image_id", images.filename , film_rolls.id as "filmroll_id", film_rolls.folder
from images, film_rolls
where  images.film_id = film_rolls.id
and images.id not in
(select tagged_images.imgid from tagged_images, tags
where tagged_images.tagid = tags.id
and tags.name not like "darktable%")
order by images.film_id, images.id ;
</pre>

Pour l'utiliser, copier la requête dans un fichier : requete.sql par exemple. Puis dans un terminal taper :
Code :
sqlite3 .config/darktable/library.db < requete.sql

Le résultat est une liste de lignes comme celle-ci :
Code :
20098|JPV_048520.RAF|480|/home/jpv/Photos/2016/09/26
qui donne pour chaque photo non tagguée, le numéro interne du fichier dans la BdD, le nom du fichier, le numéro de la pellicule et enfin le chemin de la pellicule.

Cependant j'avais de nombreuses pellicules (C. à D. dossiers ou répertoires), contenant des photos non taguées. Traiter les photos une à une était beaucoup trop fastidieux. J'ai donc amélioré un peu ma requête, pour qu'elle ne me liste que les noms de dossiers avec uniquement un nom de dossier, même s'il contient plusieurs photos sans tags. La voici :
<pre>
Code :
select distinct film_rolls.folder
from images, film_rolls
where images.film_id = film_rolls.id
and images.id not in
(select tagged_images.imgid from tagged_images, tags
where tagged_images.tagid = tags.id
and tags.name not like "darktable%")
order by images.film_id, images.id ;
</pre>


J'obtenais donc une liste avec un nom de dossier par ligne. Mais j'ai encore voulu faire mieux. J'ai donc sophistiqué encore un peu ma requête. La voici :
<pre>
Code :
select distinct film_rolls.folder
from images, film_rolls
where images.film_id = film_rolls.id
and images.id not in
(select tagged_images.imgid from tagged_images, tags
where tagged_images.tagid = tags.id
and tags.name not like "darktable%")
order by images.film_id, images.id
limit 1 ;
</pre>

Cette fois je n'obtenais plus que la première ligne de la liste, ce qui me permettait de l'utiliser dans un terminal de la façon suivante :
Code :
darktable "$(sqlite3 .config/darktable/library.db < requete.sql)"
Explications :
J'extrais le premier nom de dossier contenant des photos non tagguées, mais je l'utilise comme argument de darktable. darktable, démarre et ouvre directement ce dossier. Je taggue les photos et je quitte darktable. Je n'ai plus qu'a recommencer le cycle pour traiter le dossier suivant, etc, jusqu'à ce qu'il ne reste plus aucun dossier à traiter.

Avec ce système j'ai traité environ 300 dossiers en une journée !

Voili-voilà, j'espère que ça pourra aider quelqu'un un jour... N'hésitez pas à demander si vous avez un doute, car je ne suis pas certain d'avoir été assez clair ;-)
Mes photos : jpverrue.fr
Répondre
#2
Merci pour ces routine SQL, je n'ai jamais pensé à voir l'utilisation de la base de données de darktable.

Ancien analyse-programmeur AS400, j'ai installé DB Browser for SQLite pour voir les services que pourrait me rendre cette base de données.
Répondre


Atteindre :


Utilisateur(s) parcourant ce sujet : 1 visiteur(s)