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 – doscp
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życieos.execute
zablokowałoby działanie innych kodów lua.