knuspermagier.de
Hallo. Ich bins! Philipp!

KirbyExport v1.0

Ich wollte schon immer mal ein Lightroom-Plugin schreiben. Weil es geht. Leider hatte ich lange keine passende Idee — bis jetzt. Auf einer Autofahrt letztens zündete es nicht nur in der Zündkerze, sondern auch in meinem Kopf!

Also, stellt euch vor, ihr habt einen Blog und postet da regelmäßig Fotos, oder ganze Galerien mit dutzenden Fotos. Alles schön exportieren, hochladen, einfügen. Nun fällt euch im Browser auf, dass die Fotos etwas zu dunkel sind oder ein paar Mülltonnen rausretuschiert werden müssen. Also nochmal bearbeiten, exportieren, hochladen, etc. Dazu kommt, dass man in Kirby auch nicht einfach durch neu-drag-and-droppen ersetzen kann, dann kommt nämlich folgendes:

kirby_duplicate.png

(Ja, wenn man das Bild einzeln anklickt, kann man irgendwo “Ersetzen” drücken, aber das ist ja anstrengend für mehrere Bilder)

Klingt nervig, was? Ich dachte also, es könnte ganz cool sein, wenn ich ein Lightroom Export-Plugin hätte, dass die Dateien direkt hochläd und austauscht. Daher habe ich es mir mal angeschaut.


Ich googelte erstmal “How to create lightroom export plugin” und fand diesen etwas älteren Blogpost. Der half mir allerdings schon ganz gut!

Man läd erstmal eine ZIP herunter, in der einige Examples sind. Ich kopierte mir das FTP-Upload-Beispiel und klöppelte etwas drauf rum. Ist gar nicht so kompliziert. Geschrieben sind die Plugins in Lua und Lightroom bringt schon einiges mit, zum Beispiel eine Library für Kommunikation per FTP, die in diesem Beispiel genutzt wurde. Glücklicherweise gibt es auch LrHttp, sogar mit einer Funktion mit der man das File Uploads machen kann, what an experience! Der Code sieht im Grunde so aus:

    for _, rendition in exportContext:renditions{ stopIfCanceled = true } do

        -- Foto rendern
        local success, pathOrMessage = rendition:waitForRender()

        -- Gucken, ob inzwischen abgebrochen wurde
        if progressScope:isCanceled() then break end

        if success then
            local filename = LrPathUtils.leafName(pathOrMessage)
            local content = { 
              { 
                name = 'exportFile',
                fileName = filename,
                filePath = pathOrMessage
              }
            }

            -- Upload!
            local response, debug = LrHttp.postMultipart(exportContext.propertyTable.kirbyUrl, content)

            LrFileUtils.delete(pathOrMessage)       
        end
    end

Nachdem ich das Plugin soweit angepasst hatte, brauchte ich noch einen kleinen Endpunkt im Blog. Hier benutze ich ja Kirby und da gestaltet sich das relativ übersichtlich (natürlich fehlt noch irgendeine Authentifizierung):

 'routes' => [
        [
            'pattern' => 'geheimer-endpunkt-name',
            'method' => 'POST',
            'action' => function() {
                if(empty($_FILES['exportFile'])) {
                    return 'No Image given';
                }

                $file = $_FILES['exportFile'];
                $name = $file['name'];

                $maybeExistingImage = site()->index()->images()->filterBy('filename', $name)->first();

                if(!empty($maybeExistingImage)) {
                    kirby()->impersonate('kirby');     
                    $maybeExistingImage->replace($file['tmp_name']);
                    return 'Replaced' . $maybeExistingImage->root();
                }

                return 'No Image Found';
            }
        ],
    // [...]
]

Das ganze lässt sich sicher auch für andere Blogsysteme anpassen.

Achja, im Export-Dialog gibt es natürlich auch ein kleines Feld, in dem man die URL angeben kann:

screenshot-2022-07-11-at-14.24.21.png

Insgesamt ging das überraschend schnell. Der Nutzen für diesen Blog hier hält sich sicher in Grenzen, aber wenn man zufällig einen Blog mit vielen Fotos hat, bei denen man durchaus ab und zu mal etwas ändert, dann ist das so schon sehr komfortabel.

Das Plugin gibt’s natürlich zur Ansicht bei Github! Achja, es funktioniert, glaube ich, nur mit Lightroom Classic. Keine Ahnung, ob es mit dem Modernen funktioniert

Kommentare, Feedback und andere Anmerkungen?
Schreib mir eine E-Mail 🤓