darktable-org / darktable-org/lua-scripts

dtutils.string: build_substitute_list errors when a metadata field (e.g. rights) has been removed

Open Beginner friendly
#716 2 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Dominant language
Lua
Stars
219
Forks
142
PR merge metrics
No merged PRs in 30d

Description

Describe the bug

lib/dtutils/string.lua build_substitute_list() throws when a metadata field it references has been removed from darktable's metadata definitions. Any script using variable substitution (e.g. contrib/rename_images) then fails, regardless of which variables its pattern actually uses.

In darktable 5.x, metadata fields are user-configurable (stored in data.db meta_data). If a user removes e.g. Xmp.dc.rights, the rights field is no longer registered on dt_lua_image_t, and indexing it raises an error rather than returning nil. So the existing guard

image.rights and image.rights or "",   -- RIGHTS

doesn't protect against it. The same applies to image.title, image.description, image.creator, image.publisher and image.version_name (lines ~810 and 877–886).

To reproduce

  1. In the metadata editor preferences, remove the rights (Xmp.dc.rights) field and restart darktable.
  2. Enable contrib/rename_images.
  3. Rename any image with any pattern, e.g. $(EXIF.YEAR)$(EXIF.MONTH)$(EXIF.DAY)_$(SEQUENCE).$(FILE_EXTENSION).

Log (darktable -d lua)

LUA pattern is $(EXIF.YEAR)$(EXIF.MONTH)$(EXIF.DAY)_$(SEQUENCE).$(FILE_EXTENSION)
LUA ERROR : ...urces/share/darktable/lua-scripts/lib/dtutils/string.lua:885: field "rights" not found for type dt_lua_image_t

stack traceback:
	[C]: in ?
	[C]: in metamethod 'index'
	...urces/share/darktable/lua-scripts/lib/dtutils/string.lua:885: in function 'lib/dtutils.string.build_substitute_list'
	...es/share/darktable/lua-scripts/contrib/rename_images.lua:144: in upvalue 'do_rename'
	...es/share/darktable/lua-scripts/contrib/rename_images.lua:211: in function <...es/share/darktable/lua-scripts/contrib/rename_images.lua:210>
	[C]: in ?

Suggested fix

Read the metadata fields through a protected lookup, e.g.

local function get_field(image, field)
  local ok, value = pcall(function() return image[field] end)
  return (ok and value) and value or ""
end

and use get_field(image, "rights") etc. in the replacements table.

Workaround

Re-add the missing metadata field in the metadata editor preferences.

Platform

  • darktable 5.6.0 (Lua API 9.7.0), lua-scripts as bundled with the official macOS package
  • macOS 26.6.2, Apple M2

Contributor guide

No contributing guide indexed for this repository

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start in lib/dtutils/string.lua at build_substitute_list(), then inspect the call from contrib/rename_images.lua. Reproduce with darktable -d lua after removing the rights metadata field, and verify that variable substitution and image renaming work without the field being registered.

Written by the indexing model from the issue text.

Assessment

Tech stack
lua
Domain
tooling
Issue type
Bug
Difficulty
2/5
Estimated time
1-3 hours
Activity status
Active
Clarity
Clearly specified
Newbie friendliness
78/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.