Bonjour à tous,
Me voici de retour après qq jours pour déposer mon script de transfert de tags de Elements à Lightroom.
Comme Lightroom ne contient pas de reconnaissance de visage, j'utilise Elements et sa fonctionnalité automatique (qui est pas mal efficace) pour envoyer les tags sous Lightroom.
Bon, visiblement pas vraiment beaucoup de monde intéressé (merci FX Belloir), mais je partage quand même, c'est comme ça.
Je comprends bien que les infos ci-dessous ne sont sans doute pas compréhensibles pour tout le monde (et c'est long à lire), mais là n'est pas le but. Je fais juste passer le message que je travaille dessus pour qu'une recherche sur le net montre qu'un travail est en cours.
Quand le script sera terminé, je ferai un modop plus... accessible.
Voici en fin de post, le script en l'état, et il reste beaucoup de trucs à faire. Pour le moment, il ne fonctionne que sur un seul xmp, et n'est en réalité qu'un des 2 moteurs du script.
Le reste à faire est :
- Recherche des XMP dans l'arborescence totale -> priorité haute
- Ecriture dans une arborescence différente de la source -> priorité haute
- Création d'un .BAK de l'ancien fichier pour un rollback et écriture directement dans le bon fichier (tout rollback sera manuel, je ne prévoie pas de scripter ça). -> priorité max
- Gestion du cas du fichier JPG sous Elements (2eme moteur) -> priorité basse
- Emballage cadeau (pour rendre user friendly avec force blablas, interactions etc...) --> priorité basse
- Sécurisation en vérifiant que la source provient bien de elements et que la destination provient bien de lr.-> priorité basse
- Utilisation de paramètres dans la ligne de commande -> priorité moyenne
- ---> Faites-moi vos suggestions.
Bien entendu, ce script est à prendre tel quel. Si vous cassez quelque chose chez vous en utilisant ce script, ne venez pas me voir, ce sera pas ma faute... Ce n'est pas censé arriver, mais bon, certaines personnes sont tellement tordues.... ;-)
Mode d'emploi :
Copier les lignes ci-dessous dans un fichier texte qui s'appellera "transfert.ps1".
Lancer le script en ligne de commande windows avec :
powershell ./transfert.ps1
et la magie opère.
Prérequis :
Les versions que j'utilise : Elements 10 (maj automatique) et Lightroom 3 (maj automatique) et Powershell sous Windows (de série depuis au moins Windows Seven).
Pour mes besoins, j'ai posé des valeurs par défaut :
Le fichier xmp de photoshop element doit s'appeler el_IMG_7294.xmp
Le fichier xmp de lightroom doit s'appeler lr_IMG_7294.xmp
Les deux fichiers sont dans le répertoire courant, qui contient le fichier de script lui-même.
Le fichier resultant s'appele "retag_IMG_7294.xmp"
La création des fichiers sidecar se fait sous lightroom en choisissant la (les) photos et en cliquant bouton droit sur métadonnées / enregistrer les métadonnées sur le fichier.
La création des fichiers sidecar se fait sous Photoshop elements en choisissant la (les) photos et en tapant CTRL-W (ou fichier / Ecrire infos d'etiq. de mots-clés/de propr. dans photo).
Attention, avec photoshop elements, si les fichiers sont des JPG, les infos sont écrites dans le fichier lui-même. Mon script ne récupère pas ces infos pour le moment et en plus, la manip sous Elements modifie le fichier JPG lui-même en écrivant dans les exifs (sans toucher à l'image).
Important :
Ce script n'est pour le moment utile que pour les photos RAW pour lesquelles Elements crée un fichier sidecar XMP.
Lors de l'export sous XMP dans Elements, il convient donc de ne sélectionner QUE Les fichiers RAW.
Pour ma part, j'ai dupliqué toutes mes photos et tous les side car Lightroom dans un répertoire dédié à Elements. J'ai conservé mes originaux sur un répertoire dédié à Lightroom, que j'utilise principalement. Elements n'est là que pour faire la détection de visages et la pose de tags automatiques (nombre de visages, gros plans, qualité de l'image etc).
Je ne pense pas que je préconiserai d'autre moyen de faire dans le futur.
Une fois le script lancé
Rien ne se passe !
Le fichier nouvellement créé (retag_imgxxx.xmp) doit être renommé et doit être recopié à la place de l'ancien fichier XMP de Lightroom.
Pour importer le nouveau fichier sous lightroom et lui faire prendre en compte les nouveaux tags, il convient de cliquer à droite sur l'image et de faire : métadonnées / lire les métadonnées depuis le fichier.
Si tout est correct, les nouveaux tags sont automatiquement mis dans la base de Lightroom et si ces tags existents déjà, la hierarchisation est automatiquement mise à jour.
Pour vérifier cette hierarchisation, il est possible de réécrire dans le XMP et de l'éditer avec notepad.
Ce que fait le script :
Ceux qui comprennent un peu la programmation comprendront que le script parcourt le fichier xmp de photoshop element à la recherche des tags, qu'il stocke tout ça dans une variable, qu'il parcourt le fichier destination à la recherche d'un endroit où déposer les tags et ajoute ces tags dans le xmp de lightroom à la bonne place (soit : juste avant les tags existants s'il y a déjà des tags, et juste un peu avant la fin s'il n'y a pas déjà des tags).
Et c'est tout ce qu'il fait pour le moment... !
Et voilà le petit script :
-----------------------------------------------------
$nomfichier="IMG_7294.xmp"
$source=(get-content .\el_$nomfichier)
$destination=(get-content .\lr_$nomfichier)
$output="retag_$nomfichier"
$dc=0
$rdf=0
foreach ($linesource in $source)
{
if ($linesource -match "<dc:subject>")
{
$dc=$dc+1
}
if ($linesource -match "</dc:subject>")
{
$dc=$dc-1
}
if ($linesource -match "<rdf:Bag>")
{
$rdf=$rdf+1
}
if ($linesource -match "</rdf:Bag>")
{
$rdf=$rdf-1
}
if ($linesource -match "<rdf:li>")
{
if ($dc -eq 1)
{
if ($rdf -eq 1)
{
$remplace += $linesource
}
}
}
}
$dc=0
$rdf=0
foreach ($linesource in $destination)
{
if ($linesource -match "<dc:subject>")
{
$dc=$dc+1
}
if ($linesource -match "</dc:subject>")
{
$dc=$dc-1
}
if ($linesource -match "<rdf:Bag>")
{
$rdf=$rdf+1
}
if ($linesource -match "</rdf:Bag>")
{
if ($dc -eq 1)
{
if ($rdf -eq 1)
{
$remplace>>$output
$remplacedone=1
}
}
$rdf=$rdf-1
}
if ($linesource -match "</rdf:Description>")
{
if ($remplacedone -ne 1)
{
"<dc:subject><rdf:Bag>$remplace</rdf:Bag></dc:subject>">>$output
$remplacedone=1
}
$rdf=$rdf-1
}
$linesource>>$output
}