Do tej pory nauczyliśmy się używać lua do adaptacji Ansel 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 Ansel.

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

 1Ansel = require "Ansel"
 2
 3Ansel.preferences.register("scp_export","export_path",
 4  "string","docelowa sciezka SCP",
 5  "Kompletna sciezka do skopiowania. Moze zawierac uzytkownika i hostname","")
 6
 7Ansel.register_storage("scp_export","Eksport SCP",
 8  function( storage, image, format, filename,
 9     number, total, high_quality, extra_data)
10    if not Ansel.control.execute("scp "..filename.." "..
11      Ansel.preferences.read("scp_export",
12         "export_path","string")) then
13      Ansel.print_error("Blad scp: "..tostring(image))
14    end
15end)

Ansel.preferences.register dodaje nowe ustawienie do menu ustawień Ansel. 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ą.

Ansel.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 Ansel.

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

  • We use preferences to configure the target path. It would be nicer to add an element to the export UI in Ansel. We will detail how to do that in the next section.

  • We do not check the returned value of scp. That command might fail, in particular if the user has not correctly set the preference.

  • This script can’t read input from the user. The remote scp must use password-less copy – scp can’t be provided with a password easily, so we will leave it that way.

  • There is no message displayed once the example is done, only the progress bar on the lower left side tells the user that the job is complete.

  • We use coroutine.yield to call an external program. The normal os.execute would block other lua codes from happening.