eksport zdjęć przy użyciu lua

Do tej pory nauczyliśmy się używać lua do adaptacji darktable w naszym systemie pracy. Zobaczmy teraz, jak zaprząc lua do łatwego eksportu zdjęć do serwisu online. Jeśli jesteś w stanie przesłać plik na serwer przy użyciu linii poleceń, możesz użyć lua do automatyzacji tego z poziomu interfejsu użytkownika darktable.

W tym przykładzie użyjemy lua do eksportu poprzez scp. W interfejsie darktable pojawi się nowy typ miejsca docelowego, który wyeksportuje zdjęcia do zdalnej lokacji poprzez mechanizm kopiowania w ssh.

darktable = require "darktable"

darktable.preferences.register("scp_export","export_path",
  "string","docelowa sciezka SCP",
  "Kompletna sciezka do skopiowania. Moze zawierac uzytkownika i hostname","")

darktable.register_storage("scp_export","Eksport SCP",
  function( storage, image, format, filename,
     number, total, high_quality, extra_data)
    if not darktable.control.execute("scp "..filename.." "..
      darktable.preferences.read("scp_export",
         "export_path","string")) then
      darktable.print_error("Blad scp: "..tostring(image))
    end
end)

darktable.preferences.register dodaje nowe ustawienie do menu ustawień darktable. scp_export oraz export_path pozwalają na unikalne określenie parametru. Pola te zostaną wykorzystane, kiedy odczytamy z nich wartość ustawienia. Pole string' nakazuje silnikowi lua odczytanie tego ustawienia jako łańcucha znaków. Można określić również liczbę całkowitą, nazwę pliku lub jakikolwiek typ, zdefiniowany w API, odnoszący się do types_lua_pref_type`. Mamy więc opis ustawienia w menu ustawień, tekst pomocy (tooltip) po najechaniu myszką na wartość oraz wartość domyślną.

darktable.register_storage jest wywołaniem, rejestrującym nowe miejsce zapisu danych. Pierwszy argument to nazwa miejsca, drugi to etykieta, wyświetlana w interfejsie, a trzeci to funkcja, wywoływana na każdym zdjęciu. Funkcja posiada wiele parametrów, ale w przykładzie użyjemy tylko filename. Zawiera on nazwę pliku tymczasowego, do którego zdjęcie zostało wyeksportowane przez silnik darktable.

Kod działa, ale ma kilka ograniczeń. W końcu to tylko prosty przykład:

  • Dla określenia ścieżki docelowej użyliśmy preferencji. Lepiej byłoby dodać element do eksportowego interfejsu w darktable. Omówimy to dokładniej w dalszej części.

  • Nie sprawdziliśmy wartości zwracanej z scp. Komenda mogła zakończyć się błędem, na przykład jeśli użytkownik nie ustawił poprawnie wartości.

  • Skrypt nie może czytać wejścia od użytkownika. Zdalne scp musi korzystać z bezhasłowego copy – do scp nie da się w łatwy sposób przekazać hasła, musimy więc tak to zostawić.

  • O zakończeniu działania przykładu nie informuje nas żaden komunikat, jedyny element to pasek postępu w lewej dolnej części, pokazujący użytkownikowi, że zadanie zostało wykonane.

  • Dla wywołania zewnętrznego programu korzystamy z coroutine.yield. Użycie os.execute zablokowałoby działanie innych kodów lua.

translations