Développement de plugins Lightroom - ça vaut le coup?

28

J'ai récemment mis à niveau mon flux de travail d'organisation et de gestion de photos de "rien du tout" vers Lightroom 4, et bien que je sois généralement très satisfait du logiciel, une fonctionnalité qui fait cruellement défaut est la possibilité d'enregistrer n'importe quel type de macros ou de scripts pour automatiser tâches répétitives - au cours de ma migration vers lightroom, il y a eu beaucoup de tâches répétitives que je voulais faire, et je me demande s'il vaut la peine d'apprendre à écrire des plugins LR pour effectuer certaines de ces tâches. Pour vous donner des exemples des types de choses que je veux automatiser:

  • Dans un grand groupe de photos RAW + PSD + JPG empilées, sélectionnez le fichier dans chaque pile avec l'extension JPG et placez-le en haut de la pile
  • Effectuer une copie de masse des métadonnées d'un fichier RAW (existant) vers un fichier JPEG (existant)

Je peux voir beaucoup d'autres façons dont les scripts pourraient rendre la gestion des images dans Lightroom encore plus facile qu'elle ne l'est actuellement. Ma question comporte alors trois parties:

1) Est-il difficile d'écrire des plugins Lightroom? Je connais bien un certain nombre de langages de programmation (C / C ++, Python, Perl), mais je n'ai rien fait avec Lua. L'API Lightroom est-elle facile à connecter et nécessite-t-elle des outils spécialisés pour le développement?

2) Puis-je écrire des scripts pour effectuer facilement le type de tâches que je décris ci-dessus?

3) Existe-t-il de bonnes ressources ou des didacticiels que je peux lire pour commencer à développer le plugin Lightroom?

David
la source
Je ne peux pas peser sur le développement de plugins - je n'y ai pas vraiment réfléchi - mais il semble que vos utilisations soient plus spécifiquement destinées à quelqu'un qui passe de l'absence de workflow à Lightroom. Autrement dit, une fois que vous commencez à utiliser LR, vous n'aurez plus jamais besoin de copier les métadonnées d'un fichier RAW vers .jpg ou .psd, par exemple parce que c'est la raison d'être du flux de travail.
Dan Wolfgang
C'est vrai, les exemples que je donne je n'aurai (théoriquement) plus jamais à refaire une fois que j'aurai terminé mon importation initiale. Cependant, c'est peut-être le cas qu'il y a d'autres tâches que j'aimerais pouvoir automatiser à l'avenir? Je ne suis pas sûr à ce sujet. Mais s'il est assez facile de développer des plugins, alors apprendre maintenant ne me fera pas de mal et pourrait être bénéfique à l'avenir. Si le développement de plugins est complexe, je ne veux pas m'embêter et je ferai confiance à Lightroom pour faire la plupart de ce dont j'ai besoin une fois ma bibliothèque construite.
David
Oh, oui, les options d'automatisation et de connectivité sont infinies. Je le signalais simplement parce que, selon la taille de votre bibliothèque, cela ne vaut peut-être pas la peine (du moins pour moi, ce n'était pas le cas).
Dan Wolfgang
même si je ne connais pas de moyen de le faire en utilisant Lightroom, vous pouvez réellement créer un programme pour modifier les données EXIF ​​pour toutes vos photos. Veuillez consulter archive.msdn.microsoft.com/changexifwithcsharp et stackoverflow.com/questions/58649/… et stackoverflow.com/questions/226973/how-to-edit-exif-data-in-net . Vous avez mentionné que vous connaissiez le C ++, je crois que vous pouvez vous mettre en C #
K ''
+1, puisque cette question m'a donné l'idée de regarder ce sdk Lua :-)
Francesco

Réponses:

39

Je n'ai rien fait avec Lua

Lua est probablement le langage de programmation le plus simple et le plus propre que je connaisse. (Et j'en connais quelques-uns .)

La simplicité de Lua est également sa plus grande faiblesse: étant un petit langage propre par conception, il ne contient pas beaucoup de choses que vous vous attendriez à trouver en venant d'un langage de qualité industrielle comme Java ou d'une batterie -inclus le langage comme Python.

Lua est conçu pour être étendu par C, ce qui signifie dans ce cas le SDK de Lightroom. C'est formidable si Adobe a fait le travail pour fournir les outils dont vous avez besoin qui ne sont pas intégrés à Lua, mais de temps en temps, vous vous retrouverez probablement à appeler des outils externes pour faire avancer les choses.

L'API Lightroom est-elle facile à connecter

La seule partie délicate à ce sujet est que vous devez structurer votre code source d'une manière particulière et fournir un Info.luafichier spécial pour informer Lightroom de votre plugin. Tout est expliqué dans la documentation du SDK . Le SDK comprend plusieurs plugins fonctionnels pour commencer, y compris un plugin "hello world" assez élaboré qui peut être récupéré pour un code de démarrage utile.

faut-il des outils spécialisés pour le développement?

Vous pouvez vous en tirer avec un simple éditeur de texte.

Il n'y a pas de fonction de débogage intégrée à Lightroom, mais il existe une fonction de journalisation du débogage dans le SDK. Vous pouvez intercepter ces messages WinDbgsur Windows ou Consolesur OS X.

Un développement plus récent est l' IDE open source ZeroBrane Studio Lua. Vous pouvez l'utiliser à la place d'un autre éditeur de texte, mais le truc vraiment cool est qu'il est possible de le joindre à votre plugin en cours d'exécution qui vous permet de le déboguer pendant son exécution. J'ai essayé cela, et cela aide à réduire le temps de cycle de débogage de correction / rechargement / redémarrage.

Puis-je écrire des scripts pour effectuer facilement le type de tâches que je décris ci-dessus?

Je ne pense pas que l'une ou l'autre tâche soit 100% réalisable en utilisant uniquement le SDK Lightroom, mais elle peut faire beaucoup de travail pour vous.

sélectionnez le fichier dans chaque pile avec l'extension JPG et placez-le en haut de la pile

Voici un code vaguement semblable à Lua pour vous y conduire presque tout le temps:

for photo in catalog:getMultipleSelectedOrAllPhotos() do
    for peer in photo:stackInFolderMembers() do
        if string.find('%.jpg$', peer:getFormattedMetadata('fileName')) then
            -- *mumble* move 'peer' photo to top of stack *mumble*
            break
        end
    end
end

Malheureusement, je ne vois aucun moyen dans le SDK de faire l'action de cette ligne de commentaire la plus profonde, à partir de LR 5 au moins. Le mieux que je puisse trouver est d'appeler catalog:setSelectedPhotos(peer), puis de laisser à l'utilisateur le soin de cliquer sur le badge numérique pour réorganiser la pile.

Effectuer une copie de masse des métadonnées d'un fichier RAW (existant) vers un fichier JPEG (existant)

Vous pouvez le faire avec le SDK existant, mais il y a des limitations.

Par exemple, alors que vous pouvez lire la valeur du dateTimeOriginalchamp EXIF , il n'y a aucune possibilité dans le SDK lui-même pour définir la valeur. Je suppose que c'est parce que les développeurs de Lightroom ont décidé que cela ne devrait jamais être modifié par programme, que ce sont des informations précieuses de la caméra. (Pourquoi cela devrait-il être le cas lorsqu'il existe un élément de menu Métadonnées> Modifier l'heure de capture ... Je ne sais pas, mais vous l'avez.)

Mais, chaque fois que le SDK essaie de vous piéger avec l'une de ces limitations, il y a souvent une trappe d'échappement. Vous pouvez installer ExifTool et l'appeler depuis Lua, par exemple. Ce n'est pas une solution parfaite, car vous avez alors une incohérence entre les métadonnées du catalogue et les métadonnées de la photo, mais Lightroom remarquera et apposera un badge sur la photo qui, lorsque vous cliquez dessus, vous permettra de résoudre le conflit en rechargeant les métadonnées à partir de la photo.

(Vous souhaiterez que l'option "Écrire automatiquement les modifications dans XMP" soit définie dans la boîte de dialogue Paramètres du catalogue lors de l'utilisation d'un tel plug-in. Sinon, vous faciliterez la création d'un conflit bidirectionnel, où les métadonnées du catalogue et des photos ont Lightroom ne sait pas comment fusionner les deux ensembles de métadonnées; il vous fait en choisir un et il écrase l'autre copie de métadonnées avec.)

Warren Young
la source
Les limitations du SDK sont en fait substantielles, les seules actions officiellement prises en charge, conformément à ce guide, sont l'ajout de destinations d'exportation ou de publication, l'application d'un post-traitement supplémentaire à l'exportation ou l'ajout de champs de métadonnées personnalisés. Comme indiqué dans la réponse, toute action nécessitant la mise à jour de tout paramètre / valeur est probablement prise en charge jusqu'à ce que vous essayiez de définir la valeur mise à jour.
Steven Cunningham
1
@StevenCunningham: Ce guide est un document didacticiel; il ne vise pas à répertorier de manière exhaustive toutes les choses que vous pouvez faire avec le SDK. En plus de ce guide du programmeur, le SDK comprend également une référence HTML. Il y a un certain nombre de choses qu'Adobe a documentées dans cette référence qu'elles n'ont pas couvert dans le guide du programmeur PDF que vous pointez. Voir la LrPhoto:setRawMetadata()section, par exemple.
Warren Young
1
Belle réponse - +1.
D. Lambert
4

Je ne connais pas Lightroom (encore - je l'ai mais je ne l'ai pas encore installé), mais en fonction de la complexité de ce que vous essayez de faire, vous voudrez peut-être regarder un outil de macro / automatisation de clavier à l'échelle du système comme AutoHotKey . Il vous permet d'enregistrer ou de programmer n'importe quelle séquence de touches que vous pouvez comprendre, puis, lorsque vous appuyez sur une touche de raccourci, il les lit dans votre programme (comme LightRoom) afin que - en ce qui concerne le programme - il ressemble comme vous l'avez tapé. Cela vous permet d'automatiser toutes sortes de choses sans avoir à modifier vos programmes d'application.

Joe
la source
Un plugin offrira sûrement une solution d'automatisation plus fine, c'est une sorte de ratio extrême et dépend du système d'exploitation. Je suppose que les plugins sont (plus ou moins) portables entre Windows et OSX.
Francesco
1
@Francesco - Je suis sûr que vous avez raison, mais vous avez probablement besoin de beaucoup plus de compétences en programmation et d'une connaissance de l'API LightRoom (ou de tout ce qu'ils appellent l'interface des rédacteurs de macros) pour suivre cette voie. Bien qu'un bon nombre de personnes utilisent le multiboot ou utilisent vms, la plupart des gens s'en tiennent probablement à un seul système d'exploitation et il existe des macro-processeurs similaires pour Linux, Windows et OSX. La partie difficile consiste à obtenir la bonne séquence d'actions. Pour la plupart des choses simples , le recodage d'un processeur macro à un autre n'est pas très difficile.
Joe
Je vois votre point mais à mon avis, il est un peu hors de portée compte tenu de la question d'origine (OP est bien versé dans une série de langues, mais pas Lua). En tout cas, je ne pensais pas que votre réponse méritait d'être sous-estimée car elle fournit une solution possible au problème en question (c'est une sorte d'approche originale, je dirais).
Francesco
C'est certainement une option valable, et quelque chose que j'ai pensé un peu. Je pense que je préférerais une approche spécifique à Lightroom, qui semble avoir une meilleure longévité - je prévois que l'API Lightroom changera moins d'une version à l'autre qu'une solution de macro dépendante du système d'exploitation.
David
2

Je voulais juste voir comment faire un traitement par lots basé sur les noms de fichiers dans Lightroom, et pour une raison quelconque, cela semblait être la manière la plus simple de le faire via l'API. Sur la base du message de @ Warren, j'ai réussi à créer cette boucle interne pour un bouton sur un formulaire, où je pouvais également mettre un champ de texte pour la journalisation ( logs_field), et certaines valeurs d'entrée (comme un champ de texte pour inclure les noms de fichiers filenames_fieldet certains paramètres supplémentaires pour le lot traitement en rating_field):

f:push_button {
      title = "Update",
      action = function()
        import "LrTasks".startAsyncTask( function()
          logs_field.value = "Starting search\n"

          local catalog = import "LrApplication".activeCatalog()
          catalog:withWriteAccessDo("Batch set rating", function( context )
            for i,photo in ipairs(catalog:getAllPhotos()) do
              for fname in string.gmatch(filenames_field.value, "%w+") do
                if string.find(photo:getFormattedMetadata('fileName'), fname) then
                  logs_field.value = logs_field.value .. "Found filename: " .. fname .. "\n"
                  photo:setRawMetadata('label', rating_field.value)
                  photo:setRawMetadata('colorNameForLabel', rating_field.value)
                end
              end
            end
          end)
          logs_field.value = logs_field.value .. "Done...\n"
        end)
      end
 }

Cet extrait traverserait certains modèles de noms de fichiers, et appliquer une étiquette à toutes les photos (vous pouvez remplacer getAllPhotosavec getMultipleSelectedOrAllPhotosdans le cas où il vous suffit de l' exécuter sur certaines de vos photos) qui correspondent à ces modèles. J'ai dû le faire car j'avais déjà marqué les photos à l'extérieur de Lightroom, mais j'avais besoin d'un moyen facile de déplacer ces balises dans LR également en fonction des noms de fichiers.

J'ai également mis tout le projet sur github , mais l'extrait ci-dessus devrait être bien utilisé comme base pour les tâches de traitement par lots basées sur le nom de fichier.

SztupY
la source