Add darktable ghost publish plugin
Signed-off-by: Nikolaos Karaolidis <nick@karaolidis.com>
This commit is contained in:
133
hosts/common/configs/user/gui/darktable/publish/publish.lua
Normal file
133
hosts/common/configs/user/gui/darktable/publish/publish.lua
Normal file
@@ -0,0 +1,133 @@
|
||||
local dt = require "darktable"
|
||||
local df = require "lib/dtutils.file"
|
||||
local os = require "os"
|
||||
|
||||
-- Some fucking bullshit happening right here.
|
||||
function os.capture(command, raw)
|
||||
local f = assert(io.popen(command, 'r'))
|
||||
local s = assert(f:read('*a'))
|
||||
f:close()
|
||||
if raw then return s end
|
||||
s = string.gsub(s, '^%s+', '')
|
||||
s = string.gsub(s, '%s+$', '')
|
||||
s = string.gsub(s, '[\n\r]+', ' ')
|
||||
return s
|
||||
end
|
||||
|
||||
local publish_title = dt.new_widget("entry") {
|
||||
placeholder = "Post Title",
|
||||
tooltip = "enter title for the post"
|
||||
}
|
||||
|
||||
local publish_slug = dt.new_widget("entry") {
|
||||
placeholder = "post-slug",
|
||||
tooltip = "enter slug for the post (URL-friendly)"
|
||||
}
|
||||
|
||||
local publish_keywords = dt.new_widget("entry") {
|
||||
placeholder = "keywords (space-separated)",
|
||||
tooltip = "enter keywords (tags) for the post"
|
||||
}
|
||||
|
||||
local strip_gps_checkbox = dt.new_widget("check_button") {
|
||||
label = "Strip GPS data",
|
||||
value = false,
|
||||
tooltip = "remove GPS metadata from files before uploading"
|
||||
}
|
||||
|
||||
local widget = dt.new_widget("box") {
|
||||
orientation = "vertical",
|
||||
publish_title,
|
||||
publish_slug,
|
||||
publish_keywords,
|
||||
strip_gps_checkbox
|
||||
}
|
||||
|
||||
local function initialize(storage, format, images, high_quality, extra_data)
|
||||
extra_data.exported_files = {}
|
||||
extra_data.cleanup_files = {}
|
||||
|
||||
if publish_title.text == "" then
|
||||
extra_data.title = df.get_basename(images[1].filename)
|
||||
else
|
||||
extra_data.title = publish_title.text
|
||||
end
|
||||
|
||||
if publish_slug.text == "" then
|
||||
extra_data.slug = df.get_basename(images[1].filename)
|
||||
else
|
||||
extra_data.slug = publish_slug.text
|
||||
end
|
||||
|
||||
extra_data.keywords = publish_keywords.text
|
||||
extra_data.strip_gps = strip_gps_checkbox.value
|
||||
|
||||
return images
|
||||
end
|
||||
|
||||
local function store(storage, image, format, filename, number, total, high_quality, extra_data)
|
||||
if extra_data.strip_gps then
|
||||
local command = string.format("exiftool -gps:all= -overwrite_original '%s'", filename)
|
||||
os.execute(command)
|
||||
end
|
||||
|
||||
if image.is_raw then
|
||||
local original_path = image.path .. "/" .. image.filename
|
||||
local raw_filename = original_path
|
||||
|
||||
if extra_data.strip_gps then
|
||||
local tmpfile = os.tmpname()
|
||||
local command = string.format("exiftool -gps:all= -o '%s' '%s'", tmpfile, original_path)
|
||||
os.execute(command)
|
||||
table.insert(extra_data.cleanup_files, tmpfile)
|
||||
raw_filename = tmpfile
|
||||
end
|
||||
|
||||
table.insert(extra_data.exported_files, filename .. ":" .. raw_filename)
|
||||
else
|
||||
table.insert(extra_data.exported_files, filename)
|
||||
end
|
||||
end
|
||||
|
||||
local function finalize(storage, image_table, extra_data)
|
||||
local files_arg = table.concat(extra_data.exported_files, " ")
|
||||
|
||||
local command = string.format(
|
||||
"darktable-publish --title '%s' --slug '%s' %s",
|
||||
extra_data.title, extra_data.slug, files_arg
|
||||
)
|
||||
if extra_data.keywords ~= "" then
|
||||
command = command .. string.format(" --keywords %s", extra_data.keywords)
|
||||
end
|
||||
|
||||
-- Ignore that I use an external tool (written in JavaScript god forbid)
|
||||
-- I am _not_ doing JSON generation and web requests in Lua
|
||||
local result = os.capture(command)
|
||||
|
||||
if result and result:match("^http") then
|
||||
dt.print("Post published: " .. result)
|
||||
else
|
||||
dt.print("Failed to publish post.")
|
||||
end
|
||||
|
||||
local command = string.format("xdg-open %s", result)
|
||||
os.execute(command)
|
||||
|
||||
for _, tmpfile in ipairs(extra_data.cleanup_files) do
|
||||
os.remove(tmpfile)
|
||||
end
|
||||
end
|
||||
|
||||
local function supported(storage, format)
|
||||
return true
|
||||
end
|
||||
|
||||
dt.register_storage(
|
||||
"ghost_publish",
|
||||
"publish to Ghost CMS",
|
||||
store,
|
||||
finalize,
|
||||
supported,
|
||||
initialize,
|
||||
widget
|
||||
)
|
Reference in New Issue
Block a user