Експортування зображень за допомогою Lua

Дотепер ми навчилися використовувати Lua для адаптації Darktable до нашого конкретного робочого процесу. Давайте зараз розглянемо, як за допомогою Lua легко експортувати зображення в онлайн-сервіс. Якщо ви можете завантажити зображення в цей сервіс через командний рядок, ви можете використовувати Lua для інтеграції цього в інтерфейс користувача Darktable.

У цьому наступному прикладі ми будемо використовувати Lua для експорту через scp. У інтерфейсі користувача Darktable з’явиться новий тип сховища, який експортуватиме зображення до віддаленої цілі за допомогою механізму копіювання в ssh.

darktable = require "darktable"

darktable.preferences.register("scp_export","export_path",
  "string","target SCP path",
  "Complete path to copy to. Can include user and hostname","")

darktable.register_storage("scp_export","Export via 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("scp failed for "..tostring(image))
    end
end)

darktable.preferences.register додасть нове налаштування до меню налаштувань Darktable, scp_export та export_path дозволять нам однозначно визначити наші уподобання. Ці поля використовуються повторно, коли ми читаємо значення налаштування. Поле string повідомляє механізму Lua, що налаштування є рядком. Це також може бути ціле число, ім’я файлу або будь-який з типів, докладно описаних в посібнику API, що стосуються types_lua_pref_type. Тоді ми маємо мітку для налаштування в меню налаштувань, підказку при наведенні на значення та значення за замовчуванням.

darktable.register_storage – це виклик, який фактично реєструє новий тип сховища. Перший аргумент – це ім’я типу сховища, другий – мітка, яка відображатиметься в інтерфейсі, а останній – це функція, яка викликається на кожне зображення. Ця функція має багато параметрів, але в цьому прикладі ми використовуємо лише filename. Він містить ім’я тимчасового файлу, куди зображення було експортовано Darktable.

Цей код буде працювати, але він має кілька обмежень. Зрештою, це лише простий приклад:

  • Ми використовуємо налаштування, щоб задати цільовий шлях. Було б краще додати елемент до інтерфейсу експорту в Darktable. Ми докладно розповімо, як це зробити в наступному розділі.

  • Ми не перевіряємо повернене значення scp. Ця команда може бути невдалою, зокрема, якщо користувач неправильно встановив налаштування.

  • Цей сценарій не може прочитати введення від користувача. Віддалений scp має підтримувати безпарольне копіювання – scp не може бути легко забезпечений паролем, тому ми залишимо його таким.

  • Після закінчення нашого прикладу повідомлення не відображається, лише індикатор виконання внизу ліворуч повідомляє користувачеві, що завдання виконано.

  • Ми використовуємо coroutine.yield для виклику зовнішньої програми. Звичайний os.execute заблокує інші коди Lua.

translations