Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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

bece a écrit :

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 wink

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 smile


"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

Maarek a écrit :

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,

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 big_smile.
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

Maarek a écrit :

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 big_smile.
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

Maarek a écrit :

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

Maarek a écrit :

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

Maarek a écrit :

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.

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