KPhotoAlbum vers le format IPTC

Depuis environ 5 ans j’utilise KPhotoAlbum. Afin d’éviter de devoir retagger mes photos pour les partager sur mon compte flickr, j’ai modifié un script de Pierre Doucet trouvé sur le site linuxfr

A propos

  • KPhotoAlbum (se nommait auparavant kimdaba), ce logiciel fonctionne sous KDE et permet d’associer pour chaque photo des mots clefs comme par exemple (Lieu, Personne, Evènement). Vous pouvez ensuite retrouver très rapidement des photos en fonction des mots clefs désirés. Ce logiciel me permet de retrouver en moins de 5 secondes des photos sur une base de + de 20.000 photos.
  • IPTC Standard permettant de véhiculer des informations directement dans la photo. Ceci permet donc visualiser les informations depuis un logiciel compatible IPTC.

Installation

Avant d’utiliser le script il faut avant tout installer les librairies perl.

mkdir -p ~/local/bin
perl -MCPAN -e shell

Répondre oui à la question posée, ensuite exécuter les lignes suivantes

cpan>
o conf makepl_arg PREFIX=~/local
o conf commit
install Image::Kimdaba
install Image::IPTCInfo

Le script

Copier le script ci dessous vers le fichier kphotoalbum2iptc.pl

Par soucis de sécurité le script s’exécute en mode simulation, pour l’activer, modifier la variable onlyparse à 0

Exemple d’utilisation

./kphotoalbum2iptc.pl /path/album "^sous repertoire.*.jpg|.jpeg"

kphotoalbum2iptc.pl

#!/usr/bin/perl -w
# kphotoalbum2iptc.pl

# Param 1 : Chemin du catalogue KPhotoAlbum
# Param 2 : Filtre (ex: "^dvd 3.*\\.jpg|\\.jpeg" )


# A MODIFIER
use lib qw(/home/b_adele/local/share/perl5/site_perl/5.10.0/);
$verbose=0;
$onlyparse=0;

# Chargement des librairies
use Image::Kimdaba;
use Image::IPTCInfo;

my @ListOfPictures;

$folder = $ARGV[0];
$filter = $ARGV[1];

# Parse le catalogue KPhotoAlbum
print "Chemin de base: $folder\\n";
parseDB( "$folder" );

# Compte le nombre de photos
my $nb1= scalar keys %imageattributes;
my $nb2= scalar keys %imageoptions;
print "$nb1 photos dont $nb2 avec des tags:\\n";


# Ajout des infos dans la photo (IPTC)
$count=0;
foreach $kphoto (keys(%imageoptions))
{
    if ($kphoto =~ m/$filter/i ) {
        $count++;
    print "Photo en cours : $folder/$kphoto (N° $count)\\n";
        my $iptc = create Image::IPTCInfo("$folder/$kphoto");
        foreach $kkey (keys(%{$imageoptions{$kphoto}}))
        {
            if ($verbose) { print "--> $kkey\\n"; }
            foreach $values (@{${$imageoptions{$kphoto}}{$kkey}})
            {
                if ($verbose) { print "-----> $values\\n"; }
                $iptc->AddKeyword("$values");
            }
        }

    if (!$onlyparse) { $iptc->Save();}
    }
}

print "$count photos traitées";

20 réponses à Export de vos données de KPhotoAlbum vers IPTC

  1. Equinoxefr dit :

    Salut,

    Amusant de voir un vieux script, fait il y a quelques années, retrouver une utilité ;-)

    Depuis quelques temps, je suis passé à F-spot sous Gnome, toujours avec l’aide de quelques scripts perl…

    Pierre

  2. moSaN dit :

    Juste pour être certain de bien comprendre le script. Je suis loin de tout comprendre dès qu’il s’agit de perl.

    Pour désactiver le mode simulation il faut changer la variable «onlyparse» mais je ne vois aucune référence à cette variable dans le bout de code.
    Ne serait-ce pas plutôt la variable «verbose».

    Ou alors la variable «onlyparse» est une variable associée à IPTC qui bloque la fonction d’écriture Save() ?

  3. davitof dit :

    Euh, je ne connais pas perl, alors je dis surement une bêtise, mais tu es sûr, pour la variable onlyparse? Je n’en vois pas trace dans le script…

  4. b_adele dit :

    Rien de tout çà :) , ce n’était pas le bon code, j’ai corrigé l’article.

  5. davitof dit :

    @moSaN: je ne crois pas que ce soit verbose. Aussi bien par le sens du mot « verbose » en anglais que par ce que je crois comprendre du script, je pense que la variable verbose sert uniquement à afficher plus d’informations en cours d’exécution.

  6. davitof dit :

    @b_adele: ah ben là oui, je comprends :-) C’est vrai que le perl ressemble au php. Ou plutôkt le contraire ;-)

  7. b_adele dit :

    @Christophe, je ne connaissais pas Sagittarius, néanmoins il ne semble pas pouvoir exporter les tags déjà saisies dans KPhotoAlbum vers le format IPTC, le but du script est justement d’éviter de ressaisir les informations déjà saisies précédemment sur KPhotoAlbum.

  8. moSaN dit :

    Merci b_adele pour ce script qui devrait m’éviter bien du boulot :)

  9. fromlugdunum dit :

    Fspot gère mes TAG directement dans flickr…c’est pratique.

  10. Teebo dit :

    Bonjour,
    Depuis hier soir je me demande bien comment changer de logiciel sans perdre mes infos rentrées dans Kphotoalbum, et là ce matin, miracle, je tombe sur ce post (désolé de jouer les archéologues ;) ), j’essaye donc comme indiqué, il semble que l’installation se passe bien (Warning usually Harmless de YAML) mais quand j’essaye de lancer le script :
    BEGIN failed–compilation aborted at ./kphotoalbum2iptc.pl line 14.

    Je suis sous Ubuntu Koala.
    Quelqu’un aurait une idée pour moi?

  11. Teebo dit :

    EDIT: On oublie tout, appelez moi stupide, j’avais pas changé le chemin (celui directement sous le gros « A MODIFIER », oui oui, celui là même…

  12. Chaland dit :

    Je voudrais bien pouvoir transférer les infos de 10000photos de kphotoalbum sur Digikam.
    J’ai essayé le script mais je ni arrive pas . Voici ce que j’ai fait :
    Image ::kimdaba et Image::IPTCInfo sont bien installés.
    [root@sonypierre home]# ./kphotoalbum2iptc.pl /pierre/kphotoalbum.
    Le script se trouve dans home . Kphotoalbum est situé dans home/pierre.
    Voici le script:
    #! /usr/bin/perl -w
    # kphotoalbum2iptc.pl

    # Param 1 : /pierre
    # Param 2 : « \\.jpeg »

    # A MODIFIER

    use lib qw(/pierre/local/share/perl5/site_perl/5.10.0/);
    $verbose=0;
    $onlyparse=0;

    # Chargement des librairies
    use Image::Kimdaba;
    use Image::IPTCInfo;

    my @ListOfPictures;

    $folder = $ARGV[0];
    $filter = $ARGV[1];

    # Parse le catalogue KPhotoAlbum
    print « Chemin de base: $folder\\n »;
    parseDB( « $folder » );

    # Compte le nombre de photos
    my $nb1= scalar keys %imageattributes;
    my $nb2= scalar keys %imageoptions;
    print « $nb1 photos dont $nb2 avec des tags:\\n »;

    # Ajout des infos dans la photo (IPTC)
    $count=0;
    foreach $kphoto (keys(%imageoptions))
    {
    if ($kphoto =~ m/$filter/i ) {
    $count++;
    print « Photo en cours : $folder/$kphoto (N° $count)\\n »;
    my $iptc = create Image::IPTCInfo(« $folder/$kphoto »);
    foreach $kkey (keys(%}))
    {
    if ($verbose) { print « –> $kkey\\n »; }
    foreach $values (@}})
    {
    if ($verbose) { print « —–> $values\\n »; }
    $iptc->AddKeyword(« $values »);
    }
    }

    if (!$onlyparse) { $iptc->Save();}
    }
    }

    print « $count photos traitées »;

    Lorsque je le lance Voici le résultat il s’arrête à la ligne 26.
    [root@sonypierre home]# ./kphotoalbum2iptc.pl /home/pierre/kphotoalbum
    Chemin de base: /home/pierre/kphotoalbum
    Can not find KimDaBa’s database at ./kphotoalbum2iptc.pl line 26.

    Pouvez vous m’aider? Merci

  13. Chaland dit :

    Désolé j’ai fait une erreur mon album s’appelle Kphotoalbum avec un K majuscule.
    Maintenant j’ai l’anomalie suivante:
    /home/pierre/Kphotoalbum: /home/pierre/Kphotoalbum

    reference to invalid character number at line 1040, column 48, byte 46620 at /usr/lib/perl5/vendor_perl/5.10.1/i386-linux-thread-multi/XML/Parser.pm line 187
    Avez-vous une idée? Merci

  14. Keuronde dit :

    => Chaland
    A ta place, j’ouvrirai le fichier XML pour voir ce qui se trouve à la ligne 1040, colonne 48. Il y a peut-être un caractère étrange qui te donnera une idée sur ce qui ne va pas…

  15. Chaland dit :

    kphotoalbum2iptc.pl
    ! /usr/bin/perl -w
    # kphotoalbum2iptc.pl

    # Param 1 : /home/pierre
    # Param 2 : <>

    # A MODIFIER
    use lib qw(/home/pierre/local/share/perl5/site_perl/5.12.3/);
    $verbose=0;
    $onlyparse=0;

    # Chargement des librairies
    use Image::Kimdaba;
    use Image::IPTCInfo;

    my @ListOfPictures;

    $folder = $ARGV[0];
    $filter = $ARGV[1];

    # Parse le catalogue kphotoalbumavec
    print « /home/pierre/kphotoalbum:$folder\\n »;
    parseDB( « $folder » );

    # Compte le nombre de photos
    my $nb1= scalar keys %imageattributes;
    my $nb2= scalar keys %imageoptions;
    print « $nb1 photos dont $nb2 avec des tags:\\n »;

    # Ajout des infos dans la photo (IPTC)
    $count=0;
    foreach $kphoto (keys(%imageoptions))
    {
    if ($kphoto =~ m/$filter/i ) {
    $count++;
    print « Photo en cours : $folder/$kphoto (N° $count)\\n »;
    my $iptc = create Image::IPTCInfo(« $folder/$kphoto »);
    foreach $kkey (keys(%}))
    {
    if ($verbose) { print « –> $kkey\\n »; }
    foreach $values (@}})
    {
    if ($verbose) { print « —–> $values\\n »; }
    $iptc->AddKeyword(« $values »);
    }
    }

    if (!$onlyparse) { $iptc->Save();}
    }
    }

    print « $count photos traitées »;

    Ce script depuis mon dernier commentaire a toujours bien fonctionner.
    Aujourd’hui je suis passé à perl 5.12.3.
    Le script stoppe la ligne 36 avec cette info:
    « Use of uninitialized value $filter in regexp compilation at ./kphotoalbum2iptc.pl line 36. »
    Il traite toutes les photos mais ne sort rien.
    Avez vous une idée du problème?
    Merci

  16. b_adele dit :

    Avez vous indiquer les 2 paramètres lors du lancement de votre commande ? Il semblerait que la variable $filter soit vide. Sinon je ne vois pas.

  17. Chaland dit :

    Je ne comprend pas. En fait j’ai ceci: Param 2 : <>
    Est ce correct?
    De plus j’ai un problème sur cpan je ne peux installer per5 qu’en root et sur /root/local pourquoi?

  18. Chaland dit :

    param 2 :*\\.jpeg

  19. Chaland dit :

    Vous aviez raison au lancement j’avais oublié les 2 paramètres.
    Maintenant il traite toutes les données et affiche donnée en cours.
    Par contre ,il n’édite pas le fichier IPTCI.
    Merci de votre aide

Vus : 138
Publié par jesuislibre : 59