ext_proc
This commit is contained in:
@@ -1 +1,3 @@
|
|||||||
# dtlua -- darktable lua scripts
|
# dtlua -- darktable lua scripts
|
||||||
|
|
||||||
|
* `ext_proc`: external processing with arbitrary command
|
||||||
|
|||||||
171
contrib/ext_proc.lua
Normal file
171
contrib/ext_proc.lua
Normal file
@@ -0,0 +1,171 @@
|
|||||||
|
--[[
|
||||||
|
|
||||||
|
ext_proc.lua - export and process with an arbitrary binary
|
||||||
|
|
||||||
|
Copyright (C) 2025 Florian Tham <fgtham@gmail.com>.
|
||||||
|
|
||||||
|
Heavily based on gimp.lua and thus is
|
||||||
|
|
||||||
|
Copyright (c) 2016 Bill Ferguson
|
||||||
|
|
||||||
|
|
||||||
|
This program is free software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
]]
|
||||||
|
--[[
|
||||||
|
ext_proc - export images and process with an arbitrary binary
|
||||||
|
|
||||||
|
This script provides another storage (export target) for darktable. Selected
|
||||||
|
images are exporte in the specified format to temporary storage. The script
|
||||||
|
given in executable_path is launched, possibly with the parameters from executable_args,
|
||||||
|
followed by the list of exported files. After script execution the temporary
|
||||||
|
files are removed.
|
||||||
|
|
||||||
|
USAGE
|
||||||
|
* require this script from your main lua file
|
||||||
|
* select an image or images
|
||||||
|
* in the export dialog select "external process" and select the format and bit depth for the
|
||||||
|
exported image(s). Specify the full path to your script.
|
||||||
|
* Specify the script parameters, if any.
|
||||||
|
* Press "export"
|
||||||
|
|
||||||
|
BUGS, COMMENTS, SUGGESTIONS
|
||||||
|
* Send to Florian Tham, fgtham@gmail.com
|
||||||
|
|
||||||
|
]]
|
||||||
|
|
||||||
|
local dt = require "darktable"
|
||||||
|
local du = require "lib/dtutils"
|
||||||
|
local df = require "lib/dtutils.file"
|
||||||
|
local dtsys = require "lib/dtutils.system"
|
||||||
|
local ext_proc_widget = nil
|
||||||
|
|
||||||
|
local wg = {}
|
||||||
|
|
||||||
|
local MODULE = "ext_proc"
|
||||||
|
|
||||||
|
du.check_min_api_version("7.0.0", MODULE)
|
||||||
|
|
||||||
|
local gettext = dt.gettext
|
||||||
|
local localedir = dt.configuration.config_dir .. "/lua/locale/"
|
||||||
|
gettext.bindtextdomain(MODULE, localedir)
|
||||||
|
|
||||||
|
local function _(msgid)
|
||||||
|
return gettext.dgettext(MODULE, msgid)
|
||||||
|
end
|
||||||
|
|
||||||
|
-- return data structure for script_manager
|
||||||
|
|
||||||
|
local script_data = {}
|
||||||
|
|
||||||
|
script_data.metadata = {
|
||||||
|
name = _("external processing"),
|
||||||
|
purpose = _("export and process with an arbitrary executable"),
|
||||||
|
author = "Florian Tham <fgtham@gmail.com>",
|
||||||
|
help = "https://docs.darktable.org/lua/stable/lua.scripts.manual/scripts/contrib/ext_proc"
|
||||||
|
}
|
||||||
|
|
||||||
|
script_data.destroy = nil -- function to destory the script
|
||||||
|
script_data.destroy_method = nil -- set to hide for libs since we can't destroy them commpletely yet, otherwise leave as nil
|
||||||
|
script_data.restart = nil -- how to restart the (lib) script after it's been hidden - i.e. make it visible again
|
||||||
|
script_data.show = nil -- only required for libs since the destroy_method only hides them
|
||||||
|
|
||||||
|
local function run_executable(storage, image_table, extra_data) --finalize
|
||||||
|
|
||||||
|
local executable_path = wg.text_executable_path.text
|
||||||
|
local executable_args = wg.text_executable_args.text
|
||||||
|
|
||||||
|
local executable_exists = df.check_if_file_exists(executable_path)
|
||||||
|
local has_exec_bit = df.test_file(executable_path, "x")
|
||||||
|
|
||||||
|
if not executable_exists then
|
||||||
|
dt.print(executable_path .. ": file not found")
|
||||||
|
dt.print_error("file not found")
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
if not has_exec_bit then
|
||||||
|
dt.print(executable_path .. ": not executable")
|
||||||
|
dt.print_error("file is not executable")
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
dt.preferences.write(MODULE, "executable_path", "string", executable_path)
|
||||||
|
dt.preferences.write(MODULE, "executable_args", "string", executable_args)
|
||||||
|
|
||||||
|
-- list of exported images
|
||||||
|
local img_list
|
||||||
|
|
||||||
|
-- reset and create image list
|
||||||
|
img_list = ""
|
||||||
|
|
||||||
|
for _,exp_img in pairs(image_table) do
|
||||||
|
exp_img = df.sanitize_filename(exp_img)
|
||||||
|
img_list = img_list ..exp_img.. " "
|
||||||
|
end
|
||||||
|
|
||||||
|
dt.print(_("launching script..."))
|
||||||
|
|
||||||
|
local cmdline = executable_path .. " " .. executable_args .. " " .. img_list
|
||||||
|
|
||||||
|
dt.print_log(cmdline)
|
||||||
|
|
||||||
|
dtsys.external_command(cmdline)
|
||||||
|
dt.print(_("done"))
|
||||||
|
|
||||||
|
for _,exp_img in pairs(image_table) do
|
||||||
|
os.remove(exp_img)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local function destroy()
|
||||||
|
dt.destroy_storage(MODULE)
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Register
|
||||||
|
|
||||||
|
wg.text_executable_path = dt.new_widget("entry"){
|
||||||
|
text = dt.preferences.read(MODULE, "executable_path", "string"),
|
||||||
|
placeholder = _("/path/to/executable"),
|
||||||
|
tooltip = _("absolute path to the binary or script that should be called"),
|
||||||
|
editable = true,
|
||||||
|
}
|
||||||
|
|
||||||
|
wg.text_executable_args = dt.new_widget("entry"){
|
||||||
|
text = dt.preferences.read(MODULE, "executable_args", "string"),
|
||||||
|
tooltip = _("optional parameters to be passed to the executable"),
|
||||||
|
editable = true,
|
||||||
|
}
|
||||||
|
|
||||||
|
local ext_proc_widget = dt.new_widget("box"){
|
||||||
|
orientation = "vertical",
|
||||||
|
dt.new_widget("label"){label = _("absolute file path")},
|
||||||
|
wg.text_executable_path,
|
||||||
|
dt.new_widget("label"){label = _("optional parameters")},
|
||||||
|
wg.text_executable_args,
|
||||||
|
}
|
||||||
|
|
||||||
|
dt.register_storage(
|
||||||
|
MODULE,
|
||||||
|
_("external processing"),
|
||||||
|
nil,
|
||||||
|
run_executable,
|
||||||
|
nil,
|
||||||
|
nil,
|
||||||
|
ext_proc_widget
|
||||||
|
)
|
||||||
|
|
||||||
|
--
|
||||||
|
script_data.destroy = destroy
|
||||||
|
|
||||||
|
return script_data
|
||||||
BIN
locale/de_DE/LC_MESSAGES/ext_proc.mo
Normal file
BIN
locale/de_DE/LC_MESSAGES/ext_proc.mo
Normal file
Binary file not shown.
54
locale/de_DE/LC_MESSAGES/ext_proc.po
Normal file
54
locale/de_DE/LC_MESSAGES/ext_proc.po
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
# SOME DESCRIPTIVE TITLE.
|
||||||
|
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
|
||||||
|
# This file is distributed under the same license as the PACKAGE package.
|
||||||
|
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
||||||
|
#
|
||||||
|
#, fuzzy
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"Project-Id-Version: PACKAGE VERSION\n"
|
||||||
|
"Report-Msgid-Bugs-To: \n"
|
||||||
|
"POT-Creation-Date: 2025-03-17 14:22+0100\n"
|
||||||
|
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||||
|
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||||
|
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||||
|
"Language: \n"
|
||||||
|
"MIME-Version: 1.0\n"
|
||||||
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
|
||||||
|
#: contrib/ext_proc.lua:72 contrib/ext_proc.lua:160
|
||||||
|
msgid "external processing"
|
||||||
|
msgstr "externe Weiterverarbeitung"
|
||||||
|
|
||||||
|
#: contrib/ext_proc.lua:73
|
||||||
|
msgid "export and pass to an arbitrary executable"
|
||||||
|
msgstr "exportiere Bilder und verarbeite mit beliebiger ausführbarer Datei"
|
||||||
|
|
||||||
|
#: contrib/ext_proc.lua:117
|
||||||
|
msgid "launching script..."
|
||||||
|
msgstr "starte Script ..."
|
||||||
|
|
||||||
|
#: contrib/ext_proc.lua:124
|
||||||
|
msgid "done"
|
||||||
|
msgstr "fertig"
|
||||||
|
|
||||||
|
#: contrib/ext_proc.lua:139
|
||||||
|
msgid "/path/to/executable"
|
||||||
|
msgstr "/Pfad/zur/Datei"
|
||||||
|
|
||||||
|
#: contrib/ext_proc.lua:140
|
||||||
|
msgid "absolute path to the binary or script that should be called"
|
||||||
|
msgstr "Der absolute Pfad zur ausführbaren Datei, an welche die markierten Bilder übergeben werden sollen."
|
||||||
|
|
||||||
|
#: contrib/ext_proc.lua:146
|
||||||
|
msgid "optional parameters to be passed to the executable"
|
||||||
|
msgstr "Optionale Parameter, mit denen die ausführbare Datei aufgerufen werden soll, können hier angegeben werden."
|
||||||
|
|
||||||
|
#: contrib/ext_proc.lua:152
|
||||||
|
msgid "absolute file path"
|
||||||
|
msgstr "Programm zur Weiterverarbeitung"
|
||||||
|
|
||||||
|
#: contrib/ext_proc.lua:154
|
||||||
|
msgid "optional parameters"
|
||||||
|
msgstr "Kommandozeilen-Parameter"
|
||||||
Reference in New Issue
Block a user