Modifier le path des photos dans Shotwell
Dans quelques jours sortira la version officielle d’Ubuntu 10.10. Dans cette nouvelle version, Shotwell remplacera F-Spot pour la gestion des photos.
Je ne sais pas ce qu’il en sera de la version qui sera proposée dans Maverick mais jusqu’à présent, il n’est pas possible de changer le chemin des photos une fois que celles-ci ont été importées dans Shotwell. Cela veut dire que si vous changez vos photos de place, que vous les placez dans un autre répertoire, il n’est pas possible de l’indiquer à Shotwell. Vous continuerez à voir les miniatures s’afficher dans Shotwell mais impossible d’afficher la photo à sa taille réelle parce que, forcément, Shotwell ne connait pas le nouveau chemin.
Je me suis trouvé devant ce problème et la seule solution que j’ai trouvée est de modifier le chemin des photos directement dans la base de données utilisée par Shotwell.
Il faut savoir que Shotwell stoque les informations sur les photos dans une base de données sqlite qui se trouve dans le répertoire ~/.shotwell/data/photo.db.
Si vous jeter un oeil au contenu de cette base de données sqlite, vous verrez qu’une des tables s’appelle PhotoTable. Celle-ci contient un numéro d’index unique pour chaque photo, le chemin complet et le nom de fichier de la photo.
Il suffit donc simplement d’écrire un petit script simple pour modifier dans la base de données le chemin des photos. La base de données étant une base de données sqlite, j’ai choisi d’écrire le programme en python puisque celui-ci supporte nativement sqlite. De plus, comme son nom l’indique, sqlite permet de dialoguer avec la base de données au moyen de commandes SQL, ce qui simplifie les choses.
Voici le script que j’ai utilisé:
#! /usr/bin/env python # -*- coding: utf-8 -*- import sqlite3 # !!! Donnez à oldpath et newpath les bonnes valeurs !!! oldpath = /ancien/path/des/photos newpath = /nouveau/path conn = sqlite3.connect('~/.shotwell/data/photo.db') # Permet d'accéder aux colonnes en utilisant leur nom conn.row_factory = sqlite3.Row c = conn.cursor() # On utilise l'index le plus élevé comme limite de la boucle last_rowid = c.execute("""SELECT MAX(id) FROM PhotoTable""").fetchone()[0] for row in xrange(1, last_rowid+1): line = c.execute("""SELECT * FROM PhotoTable where id=?""", (row,)).fetchone() # Certaines lignes ont pu être supprimées et donc certains index ne pas exister if line: newline = line['filename'].replace('oldpath', 'newpath') rowid = line['id'] c.execute("""UPDATE PhotoTable SET filename=? where id=?""", (newline, rowid)) conn.commit() c.close()
Si vous utilisez ce script, n’oubliez pas de modifier dans celui-ci les variables oldpath et newpath en y mettant l’ancien chemin et le nouveau.
Posted: octobre 5th, 2010 under python, Ubuntu.
Comments: 12
Tweet
Comments
Comment from caracole
Time: 10 octobre 2010, 16 h 20 min
Cette idée devrait e
etre integrée dans le logiciel même . De bonnes idées quand meme dans shotwell, mais fait quand-même rudimentaire.
Comment from caracole
Time: 10 octobre 2010, 18 h 18 min
Encore moi…
J’ai oublié de dire que j’ai viré ce shotwell et remis fspot.
Comment from Franck Micro38
Time: 19 octobre 2010, 8 h 37 min
dehors Shotwell ! Je l’ai viré, je n’utilise pas tellement F-Spot mais au moins il n’est pas aussi vide de fonctionnalités, ni autant buggé.
Dommage que Canonical se croie obligé de copier les mauvaises idées windowsiennes (Picasa au hasard), au lieu de laisser les gens gérer leurs photos de manière simple (je crée un dossier avec dateYYMMDD+nom, je mets mes photos dedans et basta) !
Franck
Ubuntu10.10
Comment from Caracole
Time: 19 octobre 2011, 11 h 09 min
Interessant, mais nul en developpement, j’aimerai savoir s’il est possible d’integrer ce code dans un script zenity qui demanderait où sauvegarder la base de données shotwell.
Merci
Comment from Caracole
Time: 19 octobre 2011, 11 h 25 min
EN jetant un « Oeil » dans la base de données Shotwell, il y a aussi une autre table a modifier: videotable ( pour les fichiers videos )
Comment from Caracole
Time: 19 octobre 2011, 11 h 37 min
J’ai bien essayé, mais le script ne fonctionne pas. ( j’utilise Sqliteman pour visualiser la base de données. )
j’ai essaye avec
oldpath = /home/pierre/Imágenes
newpath = /media/Elements/Imágenes
ca ne fonctionne pas
j’ai essayé avec
oldpath = ‘/home/pierre/Imágenes’
newpath = ‘/media/Elements/Imágenes’
ca ne fonctionne pas mieux
je ne connais pas python
merci
Comment from Michel Leunen
Time: 19 octobre 2011, 17 h 15 min
@caracole
Il y a un message d’erreur ?
Il faut normalement des guillemets avec le path du fichier:
oldpath = « /home/pierre/Imágenes »
Comment from Caracole
Time: 27 octobre 2011, 22 h 33 min
J’ai tout essayé, même apprendre un peu python ( sql je connais ) rien a faire ca ne roule pas.
j’execute le script et je me suis rendu compte qu’apres avoir mis une instruction print derriere newline = line[‘filename’].replace(‘oldpath’, ‘newpath’) que new line est inchangé j’ai comme l’impression que .replace ne fonctionne pas.
Comment from Michel Leunen
Time: 28 octobre 2011, 20 h 39 min
Et si tu nous donnais le script tel que tu l’utilises et qui ne fonctionne pas. De cette façon, on pourrait tester et peut-être voir ce qui ne va pas.
Comment from Caracole
Time: 30 octobre 2011, 20 h 53 min
Bien, je me suis mis à Python et je subodore d’ou vient le probleme…
voici la recopie de l’execution sous la console.
pierre@pierre-Aspire-6930:~/.gnome2/nautilus-scripts$ python BDShotwell
2500
/home/pierre/Imágenes/2011/09/14/IMG_0001.JPG
Traceback (most recent call last):
File « BDShotwell », line 26, in
newline = line[‘filename’].replace(oldpath,newpath) #ca ne fonctionne pas !
UnicodeDecodeError: ‘ascii’ codec can’t decode byte 0xc3 in position 15: ordinal not in range(128)
pierre@pierre-Aspire-6930:~/.gnome2/nautilus-scripts$
voici le script modifié.
#! /usr/bin/env python
# -*- coding: utf-8 -*-
import sqlite3
# !!! Donnez à oldpath et newpath les bonnes valeurs !!!
oldpath = « /home/pierre/Imágenes »
newpath = « /home/pierre/Photos »
conn = sqlite3.connect(« /home/pierre/.shotwell/data/new-photo.db »)
# Permet d’accéder aux colonnes en utilisant leur nom
conn.row_factory = sqlite3.Row
c = conn.cursor()
# On utilise l’index le plus élevé comme limite de la boucle
last_rowid = c.execute(« SELECT MAX(id) FROM PhotoTable »).fetchone()[0]
print last_rowid
for row in xrange(1, last_rowid+1):
line = c.execute(« SELECT * FROM PhotoTable where id=? », (row,)).fetchone()
# Certaines lignes ont pu être supprimées et donc certains index ne pas exister
if line:
print line[‘filename’]
newline = line[‘filename’].replace(oldpath,newpath) #ca ne fonctionne pas !
print newline[‘filename’]
rowid = line[‘id’]
print rowid,newline
#c.execute(« UPDATE PhotoTable SET filename=? where id=? », (newline,rowid))
conn.commit()
c.close()
je pense que le probleme vient du fait que le répertoire Imágenes contient un á ( je suis en espagne et la version installée de ubuntu Natty est españole.
donc à mon avis le problème vient de la codification Unicode du á.
Quelle solution pour que la méthode .replace fonctionne où est-ce un bug de python ?
Merci de vos lumières
PS:Python c’est génial
Comment from Caracole
Time: 30 octobre 2011, 22 h 27 min
Bien j’ai une solution plus simple ( qui fonctionne) sous SQLITE mais je ne sais pas comment l’integrer dans un script Python en parametrant correctrement cette SQL
Il s’agit de la sequence SQL ci-dessous
update Phototable
set filename = REPLACE(filename, ‘/home/pierre/Imágenes’, ‘/media/Elements/images’) ;
Comment from egan
Time: 5 octobre 2010, 20 h 53 min
C’est là qu’on voit à quel point c’est débile d’avoir mis F-Spot ou Shotwell par défaut au lieu d’utiliser un bon vieux GThumb des familles qui n’embête pas le monde avec des histoires de bases de données.