#1 Le 01/09/2010, à 13:57
- Maarek
[script] Shotwell et Tag enregistré sur les photos
Bonjour,
J'ai jamais eu l'occasion d'aidé quelqu'un sur le forum ubuntu-fr,
alors je profite pour posté un script qui peut aider.
Même si l'utilité du script peut être limité, j'utilise une connexion dans une base de donné SQLite3, et j'utilise exiftool pour tagé des photos, Alors sa peut etre utiles de comprendre le principe du script, pour celui qui souhaite apprendre a faire du script python.
But du script:
J'utilise Shotwell depuis quelques jours mais j'ai remarqué que les photos tagué avec Shotwell sont tagué que sur Shotwell.
Donc le script utilise la base de donnée Shotwell pour tagué les photos dans ses tag exifs.
Préalable
Il faut au préalable avoir installé libimage-exiftool-perl
Script
#!/usr/bin/python
# -*- coding: utf-8 -*-
import sqlite3
import commands
# Connexion avec la base de données de shotwell
connexion = sqlite3.connect("/home/maarek/.shotwell/data/photo.db")
connexion.row_factory = sqlite3.Row
cursor = connexion.cursor()
# On associe les IDs et les photos dans un dictionnaire
cursor.execute("SELECT id , filename FROM PhotoTable")
dico = {}
for row in cursor:
dico["%i"%(row["id"])] = row["filename"]
# On récupère les tags et les photos tagé
cursor.execute("SELECT name , photo_id_list FROM TagTable")
for row in cursor:
#row["name"] <=> Nom du tag
#row["photo_id_list"] <=> Liste des Ids de photo contenant le tag row["name"]
tag = row["name"]
print tag
for file in row["photo_id_list"].split(","):
# On parcours la liste des Ids
if dico.has_key(file) and dico[file].find(u"é") == dico[file].find(u"è"): # Si l'Id existe dans le dico et que le nom ne comporte pas d'accent
s=u'exiftool -overwrite_original -Subject+="%s" -Keywords+="%s" "%s"'%(tag,tag,dico[file]) # On prepare le tagage de la photo
print "{0} : {1}".format(tag,dico[file]) # On informe de l'avancement
u=commands.getoutput(s) #On tag la photo
# On deconnecte la base de données
connexion.close()
Améliorations
Si quelqu'un souhaite amélioré le script c'est avec plaisir.
Ce qu'il serais bien d'améliorer, c'est d'utiliser un module python pour accéder aux données exifs des images, et ne plus utiliser une commande shell.
Faire en sorte que les photos ne soit pas taguées plusieurs fois avec les mêmes tags.
Dernière modification par Maarek (Le 01/09/2010, à 20:41)
Hors ligne
#2 Le 31/10/2010, à 09:28
- tsly
Re : [script] Shotwell et Tag enregistré sur les photos
merci !
je viens de m'en rendre compte également... après 2 soirées complètes à tagguer comme un fou...
j'essaie ton script et si j'ai le temps, voir si on peut y apporter les modifs souhaitées...
Tom
Hors ligne
#3 Le 19/12/2010, à 21:27
- bece
Re : [script] Shotwell et Tag enregistré sur les photos
Merci ton script m'a permit de trouver ce que je cherchais : quelles options de exiftool pour tagger les fichiers.
Un des problèmes que tu cites est le duplicata des tags.
Mais quand tu fais ceci :
-Subject+="%s" -Keywords+="%s"
Ne dupliques-tu pas déjà une même information (l'une dans le XMP, l'autre dans le IPTC) ?
"L'informatique, c'est l'art de passer 15 jours à gagner 5 millisecondes"
Hors ligne
#4 Le 20/12/2010, à 00:55
- Maarek
Re : [script] Shotwell et Tag enregistré sur les photos
C'est possible, je ne m'y connais pas du tout en tag exif et j'avais chopé cette
commande sur internet.
Une autre technique alors pour pouvoir tagué les photos proprement ?
Hors ligne
#5 Le 20/12/2010, à 11:25
- bece
Re : [script] Shotwell et Tag enregistré sur les photos
Je ne m'y connais pas non plus, et après quelques essai, il semblerait que le problème ne vienne pas de là.
Par contre, sais-tu à quoi sert le "%s"'%(tag,tag,dico[file]) à la suite du taggage ?
En faîte je suis en train de faire un script qui tag les images automatiquement en fonction du dossier qui contient l'image.
"L'informatique, c'est l'art de passer 15 jours à gagner 5 millisecondes"
Hors ligne
#6 Le 20/12/2010, à 21:09
- Maarek
Re : [script] Shotwell et Tag enregistré sur les photos
Par contre, sais-tu à quoi sert le "%s"'%(tag,tag,dico[file]) à la suite du taggage ?
Bah le %(tag, tag, dico[file]) c'est comme le printf du c, en faite sa remplace les %s dans la chaine par tag, tag et dico[file].
lien vers la doc
par exemple
print "%s %i est %s"%("Ubuntu", 10 , "Genial")
affichera
Ubuntu 10 est Genial
Hors ligne
#7 Le 21/12/2010, à 10:43
- bece
Re : [script] Shotwell et Tag enregistré sur les photos
Ok, je ne connais pas du tout le python.
"L'informatique, c'est l'art de passer 15 jours à gagner 5 millisecondes"
Hors ligne
#8 Le 21/12/2010, à 17:10
- greg73
Re : [script] Shotwell et Tag enregistré sur les photos
Bonjour,
Merci pour le script. Je cherchais un sript pour tagger les images en fonction du dossier qui contient l'image. Je vais aussi m'inspirer de ton script Maarek, à moins que bece partage le sien
Bon sinon deux petites infos concernent Shotwell: Pour le moment, les tags sont écrits dans les fichiers lorsque les images sont exportées. Mais la la version en développement de Shotwell semble permettre la mise à jour et la lecture des tags IPTC. Il semble même que la base de données de Shotwell sera synchronisée aux tags des fichiers à chaque lancement du programme...
Hors ligne
#9 Le 21/12/2010, à 18:58
- bece
Re : [script] Shotwell et Tag enregistré sur les photos
Salut, bien sur, voici le script, merci à postmortem et emhicky pour m'avoir aider à le réaliser.
#!/bin/bash
# Ce script écrit les tags keywords (IPTC)
# Auteur : bece
#
#!/usr/bin/env bash
clear
DIR="$1" # On récupère le répertoire spécifié par l'utilisateur
EXT="$2" # On récupère l'extension que souhaite l'utilisateur
# on teste le nombre d'arguments
if [ $# -ne 2 ]
then
echo "Nombre d'arguments incorrect"
echo "Usage : $0 repertoire extension"
echo "Exemple : $0 $HOME/Pictures/ jpg"
exit 1
fi
# on teste que le premier argument soit un repertoire
if [ ! -d $dir ] ; then
echo "$dir n'est pas un repertoire"
echo "Usage : $0 repertoire extension"
exit 2
fi
# On recherche et on tag tous les fichiers contenu dans le répertoire et tous ses sous répertoires
while read
do
exiftool -keywords="$(basename "${REPLY%/*}")" -overwrite_original "$REPLY"
done < <(find "$DIR" -type f -name "*.$EXT")
Il n'écrit pas les tags XMP
J'attend avec impatience la sortie de la 0.8
"L'informatique, c'est l'art de passer 15 jours à gagner 5 millisecondes"
Hors ligne
#10 Le 27/12/2010, à 23:48
- caracolito
Re : [script] Shotwell et Tag enregistré sur les photos
Bonjour,
J'ai jamais eu l'occasion d'aidé quelqu'un sur le forum ubuntu-fr,
alors je profite pour posté un script qui peut aider.Même si l'utilité du script peut être limité, j'utilise une connexion dans une base de donné SQLite3, et j'utilise exiftool pour tagé des photos, Alors sa peut etre utiles de comprendre le principe du script, pour celui qui souhaite apprendre a faire du script python.
But du script:
J'utilise Shotwell depuis quelques jours mais j'ai remarqué que les photos tagué avec Shotwell sont tagué que sur Shotwell.
Donc le script utilise la base de donnée Shotwell pour tagué les photos dans ses tag exifs.Préalable
Il faut au préalable avoir installé libimage-exiftool-perl
Script#!/usr/bin/python # -*- coding: utf-8 -*- import sqlite3 import commands # Connexion avec la base de données de shotwell connexion = sqlite3.connect("/home/maarek/.shotwell/data/photo.db") connexion.row_factory = sqlite3.Row cursor = connexion.cursor() # On associe les IDs et les photos dans un dictionnaire cursor.execute("SELECT id , filename FROM PhotoTable") dico = {} for row in cursor: dico["%i"%(row["id"])] = row["filename"] # On récupère les tags et les photos tagé cursor.execute("SELECT name , photo_id_list FROM TagTable") for row in cursor: #row["name"] <=> Nom du tag #row["photo_id_list"] <=> Liste des Ids de photo contenant le tag row["name"] tag = row["name"] print tag for file in row["photo_id_list"].split(","): # On parcours la liste des Ids if dico.has_key(file) and dico[file].find(u"é") == dico[file].find(u"è"): # Si l'Id existe dans le dico et que le nom ne comporte pas d'accent s=u'exiftool -overwrite_original -Subject+="%s" -Keywords+="%s" "%s"'%(tag,tag,dico[file]) # On prepare le tagage de la photo print "{0} : {1}".format(tag,dico[file]) # On informe de l'avancement u=commands.getoutput(s) #On tag la photo # On deconnecte la base de données connexion.close()
Améliorations
Si quelqu'un souhaite amélioré le script c'est avec plaisir.
Ce qu'il serais bien d'améliorer, c'est d'utiliser un module python pour accéder aux données exifs des images, et ne plus utiliser une commande shell.
Faire en sorte que les photos ne soit pas taguées plusieurs fois avec les mêmes tags.
Bonjour,
Interessant ton script.
petite suggestion - ne connaissant pas python, je subodore que le nom de l'utilisateur dans la commande
connexion = sqlite3.connect("/home/maarek/.shotwell/data/photo.db")
n'est-il pas possible en python de faire en sorte que ce soit l'USR courant ? ca je ne sais pas faire.
ainsi ton script (que je n'ai pas encore essayé ) s'adapte à n'importe quel USR.
j'ai vu la base de données photo.db avec SQLiteDatabaseBrowser - on y apprend plein de choses.
Ce qui me gene dans shotwell c'est les deux dossiers avec les vignettes de differentes tailles.
aujourd'hui j'ai plus de 50.000 photos ca fait du monde !
Il y a aussi cette notion d'"evenement" que je ne comprends pas. On ne voit plus les dossiers des images, je vois par contre des evenements en double trible etc... je n'y comprends rien..
Merci,
Pierre
Dernière modification par caracolito (Le 27/12/2010, à 23:49)
La mente es igual que un Paracaidas, Solo sirve si se abre . A.Eistein
Hors ligne
#11 Le 27/12/2010, à 23:56
- Maarek
Re : [script] Shotwell et Tag enregistré sur les photos
Bonjours,
n'est-il pas possible en python de faire en sorte que ce soit l'USR courant ? ca je ne sais pas faire
Il suffit de demander .
il faut rajouter en debut de script :
import os
et changer la ligne
connexion = sqlite3.connect("/home/maarek/.shotwell/data/photo.db")
par
connexion = sqlite3.connect(os.getenv("HOME")+"/.shotwell/data/photo.db")
Pour le reste j'ai fais comme toi, j'ai exploré la base de donnée avec SQLiteDatabaseBrowser, mais sa fais un petit moment maintenant donc je me rappelle plus trop ce que j'en avais tiré.
Bonne chance.
Hors ligne
#12 Le 28/12/2010, à 00:02
- caracolito
Re : [script] Shotwell et Tag enregistré sur les photos
Bonjours,
caracolito a écrit :n'est-il pas possible en python de faire en sorte que ce soit l'USR courant ? ca je ne sais pas faire
Il suffit de demander
.
il faut rajouter en debut de script :import os
et changer la ligne
connexion = sqlite3.connect("/home/maarek/.shotwell/data/photo.db")
par
connexion = sqlite3.connect(os.getenv("HOME")+"/.shotwell/data/photo.db")
Pour le reste j'ai fais comme toi, j'ai exploré la base de donnée avec SQLiteDatabaseBrowser, mais sa fais un petit moment maintenant donc je me rappelle plus trop ce que j'en avais tiré.
Bonne chance.
Merci pour ta rapide reponse.
Il me semble que tu connais bien le sujet python, moi sql...
deux questions a propos de imagettes.
est-ce possible de les inclure dans les images d'origine elle-memes ?
que pense-tu de les mettre dans la base de données ?
Pierre
j'oubliais: comment dans ton script afficher le nombre d'images a traiter ?
je l'ai essayé super- mais j'en ai pour la nuit.....
Dernière modification par caracolito (Le 28/12/2010, à 00:04)
La mente es igual que un Paracaidas, Solo sirve si se abre . A.Eistein
Hors ligne
#13 Le 28/12/2010, à 00:12
- Maarek
Re : [script] Shotwell et Tag enregistré sur les photos
Bonsoir,
Merci pour ta rapide reponse.
derien.
Je ne connais pas spécialement python, j'ai juste vue comment sa marcher.
Pour les imagettes, je ne sais pas pourquoi elles sont pas inclus dans les images d'origines,
Je pense que c'est surement plus rapide d'aller chercher des vignette dans une base de donné, (une requette et un long traitement) qui effectue un seul accès disque, que de charger 50 000 vignettes une à une (donc 50 000 accès disque) corriger moi si je me trompe.
Windows aussi utilise une base de donné pour stocker les vignet, on les trouves souvent dans des fichier Thumbs.db un peu partout dans chaque dossier de windows (en fichier caché il me semble).
Ce que j'en pense de les mettre dans la base de données, c'est surement une question de performance, ce que je trouve regretable c'est que c'est vignette sont stocker dans la base de donnée de shotwell, donc seul shotwell peut les utiliser, sachant que gnome aussi utilise sa propre gestion de vignette, et un peu tout les programmes utilisant des vignettes photos. Donc un peu de redondance ne fais pas de mal, mais sur 50 000 photos sa fais de la redondance en temps processeur (recalculer les vignettes pour chaque programme) et en stockage.
Donc ouii a la base de donné, mais peut etre réfléchir a un moyen d'interfacer les programmes entres eux.
Je sais pas si sa existe, un connaisseur ?
Hors ligne
#14 Le 28/12/2010, à 00:17
- caracolito
Re : [script] Shotwell et Tag enregistré sur les photos
Bonsoir,
Merci pour ta rapide reponse.
derien.
Je ne connais pas spécialement python, j'ai juste vue comment sa marcher.
Pour les imagettes, je ne sais pas pourquoi elles sont pas inclus dans les images d'origines,
Je pense que c'est surement plus rapide d'aller chercher des vignette dans une base de donné, (une requette et un long traitement) qui effectue un seul accès disque, que de charger 50 000 vignettes une à une (donc 50 000 accès disque) corriger moi si je me trompe.Windows aussi utilise une base de donné pour stocker les vignet, on les trouves souvent dans des fichier Thumbs.db un peu partout dans chaque dossier de windows (en fichier caché il me semble).
Ce que j'en pense de les mettre dans la base de données, c'est surement une question de performance, ce que je trouve regretable c'est que c'est vignette sont stocker dans la base de donnée de shotwell, donc seul shotwell peut les utiliser, sachant que gnome aussi utilise sa propre gestion de vignette, et un peu tout les programmes utilisant des vignettes photos. Donc un peu de redondance ne fais pas de mal, mais sur 50 000 photos sa fais de la redondance en temps processeur (recalculer les vignettes pour chaque programme) et en stockage.
Donc ouii a la base de donné, mais peut etre réfléchir a un moyen d'interfacer les programmes entres eux.
Je sais pas si sa existe, un connaisseur ?
Eh oui la redondance on la trouve partout !
Si seulement les vignettes étaient stockées dans les images on eviterait ainsi la multiplication des dossiers avec vignettes des bases de données avec vignettes ( picasa idem digikam utilise 2 bases de données dont une avec des vignettes plus de 200mo pour ce qui me concerne ! ) etc...
Je ne suis pas un spécialiste de l'image mais coté "normalisation" il ya certainement a faire de ce coté-la.
La mente es igual que un Paracaidas, Solo sirve si se abre . A.Eistein
Hors ligne
#15 Le 28/12/2010, à 00:19
- Maarek
Re : [script] Shotwell et Tag enregistré sur les photos
Ouai c'est vrai pour la redondance,
mais comme je disais, si les vignettes seraient stockés dans les images, sa serais beaucoup plus lent pour les afficher, faire 10 000 accès disque c'est plus long que de faire une requete pour recevoir 10 000 éléments. Je pense que c'est pour ça que les vignettes ne sont pas stocker dans les images.
Hors ligne
#16 Le 28/12/2010, à 00:26
- caracolito
Re : [script] Shotwell et Tag enregistré sur les photos
Ouai c'est vrai pour la redondance,
mais comme je disais, si les vignettes seraient stockés dans les images, sa serais beaucoup plus lent pour les afficher, faire 10 000 accès disque c'est plus long que de faire une requete pour recevoir 10 000 éléments. Je pense que c'est pour ça que les vignettes ne sont pas stocker dans les images.
Je ne suis pas tout a fait de cet avis. je m'explique
Si je veux afficher 10000 vignettes qu'elles soient sous forme d'mages dans un dossier ( et c'est le cas de shotwell ) il y aura 10000 acces disque ( une vignette de 200x150 px occupe une 20aine de ko avec un bon taux de compression )
si on extrait la meme vignette de l'image originale de 3mo il y aura toujours " un acces disque " selon ton raisonnement, mais j'ai chargé en mémoire la photo grandeur nature et la vignette et si je veux afficher la photo, elle est deja en memoire....le reste c'est question d'optimisation .. affaire de specialiste.
Bonne nuit et merci pour les idées et l'echange.
Pierre
La mente es igual que un Paracaidas, Solo sirve si se abre . A.Eistein
Hors ligne
#17 Le 28/12/2010, à 00:36
- Maarek
Re : [script] Shotwell et Tag enregistré sur les photos
Ah je pensais que les vignettes étaient stockées en dur dans la base.
Mais il y a comme meme un probleme avec l'approche "la vignette et l'image dans le meme fichier",
je pense que le probleme c'est
mais j'ai chargé en mémoire la photo grandeur nature et la vignette
Justement on ne veux pas charger l'image grandeur nature, meme si sa nous permet d'anticiper sur les actions de l'utilisateur,
charger 10 000 photos grandeur nature c'est juste trop long.
Donc pour reconcilier les deux approches sa serais une sorte de fusion entre la vignette, et le jpeg. On stockerais la vignette en entete de l'image, Comme ça tout au meme endroit, et si on a besoin d'un vignette, il nous suffirais de lire seulement les entetes des images concerné. Et si on veut précharger les images grandeur nature, c'est seulement apres le chargement des vignettes, c'est moins graves d'attendre une grande images, que d'en attendre 10 000 petites.
Cordialement.
Hors ligne
#18 Le 28/12/2010, à 13:38
- caracolito
Re : [script] Shotwell et Tag enregistré sur les photos
Ah je pensais que les vignettes étaient stockées en dur dans la base.
Mais il y a comme meme un probleme avec l'approche "la vignette et l'image dans le meme fichier",
je pense que le probleme c'estmais j'ai chargé en mémoire la photo grandeur nature et la vignette
Justement on ne veux pas charger l'image grandeur nature, meme si sa nous permet d'anticiper sur les actions de l'utilisateur,
charger 10 000 photos grandeur nature c'est juste trop long.Donc pour reconcilier les deux approches sa serais une sorte de fusion entre la vignette, et le jpeg. On stockerais la vignette en entete de l'image, Comme ça tout au meme endroit, et si on a besoin d'un vignette, il nous suffirais de lire seulement les entetes des images concerné. Et si on veut précharger les images grandeur nature, c'est seulement apres le chargement des vignettes, c'est moins graves d'attendre une grande images, que d'en attendre 10 000 petites.
Cordialement.
NON les vignettes ne sont pas stockées en dur dans la base mais dans deux dossiers.
./shotwell/thumbs/thumbs128 et thumbs360 au moment ou j'ecris ce message ca m'occupe pres de 400mo
la base de donnees stochee dans .shotwell/data/photo.db a une taille de plus de 3mo
c'est Digikam qui stocke les vignettes en dur dans une seconde base de données située par defaut dans le dossier /home/user/images/digikam
voila ..
Pierre
La mente es igual que un Paracaidas, Solo sirve si se abre . A.Eistein
Hors ligne