Skip to content

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

Description

@paulglover

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

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions