Main menu:

Site search

Categories

octobre 2010
L M M J V S D
 123
45678910
11121314151617
18192021222324
25262728293031

Archive

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.

Comments

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.

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’) ;