exportar imágenes con lua

Hasta ahora hemos aprendido a usar lua para adaptar darktable a nuestro flujo de trabajo particular. Veamos ahora cómo usar lua para exportar imágenes fácilmente a un servicio en línea. Si puede cargar una imagen en un servicio a través de la línea de comando, puede usar lua para integrar esto en la interfaz de usuario de darktable.

En el siguiente ejemplo usaremos lua para exportar vía scp. Aparecerá un nuevo tipo de almacenamiento en la interfaz de usuario de darktable que exportará imágenes a un objetivo remoto a través del mecanismo de copia en 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 agregará una nueva preferencia al menú de preferencias de darktable, scp_export y export_path nos permiten identificar de manera única nuestra preferencia. Estos campos se reutilizan cuando leemos el valor de la preferencia. El campo string le dice al motor lua que la preferencia es una cadena. También podría ser un número entero, un nombre de archivo o cualquiera de los tipos detallados en el manual de la API relacionado con types_lua_pref_type. Luego tenemos la etiqueta para la preferencia en el menú de preferencias, la información sobre herramientas al pasar el cursor sobre el valor y un valor predeterminado.

darktable.register_storage es la llamada que realmente registra un nuevo tipo de almacenamiento. El primer argumento es un nombre para el tipo de almacenamiento, el segundo es la etiqueta que se mostrará en la interfaz de usuario y el último es una función para llamar a cada imagen. Esta función tiene muchos parámetros, pero filename es el único que usamos en este ejemplo. Contiene el nombre de un archivo temporal donde la imagen fue exportada por el motor de darktable.

Este código funcionará pero tiene un par de limitaciones. Después de todo, este es solo un ejemplo simple:

  • Usamos preferencias para configurar la ruta de destino. Sería mejor agregar un elemento a la interfaz de usuario de exportación en darktable. Detallaremos cómo hacerlo en la siguiente sección.

  • No verificamos el valor devuelto de scp. Ese comando puede fallar, en particular si el usuario no ha configurado correctamente la preferencia.

  • Este script no puede leer la entrada del usuario. El scp remoto debe usar una copia sin contraseña; no se puede proporcionar una contraseña a scp fácilmente, así que lo dejaremos así.

  • No se muestra ningún mensaje una vez finalizado el ejemplo, solo la barra de progreso en la parte inferior izquierda le dice al usuario que el trabajo está completo.

  • Usamos coroutine.yield para llamar a un programa externo. El os.execute normal bloquearía otros códigos lua para que no sucedan.