darktable-org / darktable-org/lua-scripts
dtutils.string: build_substitute_list errors when a metadata field (e.g. rights) has been removed
Personne n'a encore pris cette issue.
- Langage dominant
- Lua
- Étoiles
- 219
- Forks
- 142
- Métriques de merge des PR
- Aucune PR mergée en 30 j
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
- In the metadata editor preferences, remove the
rights(Xmp.dc.rights) field and restart darktable. - Enable
contrib/rename_images. - 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
Guide de contribution
Aucun guide de contribution indexé pour ce dépôt
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Piste de recherche
Commencez dans lib/dtutils/string.lua, au niveau de build_substitute_list(), puis examinez l’appel depuis contrib/rename_images.lua. Reproduisez le problème avec darktable -d lua après avoir supprimé le champ de métadonnées rights, et vérifiez que la substitution de variables et le renommage des images fonctionnent sans que le champ soit enregistré.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Évaluation
- Stack technique
- lua
- Domaine
- tooling
- Type d'issue
- Bug
- Difficulté
- 2/5
- Temps estimé
- 1-3 heures
- Activité
- Active
- Clarté
- Clairement spécifiée
- Accessibilité débutants
- 78/100