Eric's Metadata Entry V2
Fill in the 'who made this and what is it' fields
- image
- image
- status
- success
Most of the time you save an image and never think about metadata again. But if you're delivering work to a client, publishing stock, or just want your archive to not be a black hole, you need to record the boring-but-important stuff: title, description, keywords, author, copyright. Eric's Metadata Entry V2 is the form for that. It takes an image, lets you fill in the standard cataloguing fields plus generation parameters, and writes them into the file in the places other tools actually read.
It's part of the AAA Metadata System pack's metadata family, and it's the manual entry point - the counterpart to the automatic extraction nodes. The pack's save nodes capture generation data automatically, but they can't know your title or your copyright. This node is where you add the human layer.
How it works
You give it an image and a filepath, type in whatever fields you care about, and it hands everything to the pack's MetadataService, which writes it out in the formats you toggle: embedded metadata in the file itself, an XMP sidecar (the format Adobe's cataloguing software reads), a human-readable text file, or the pack's SQLite database. The write_to_xmp and embed_metadata toggles default to on, which is usually what you want - embedded metadata travels with the file, XMP sidecars are what Bridge/Lightroom-style tools index.
The generation fields (prompt, negative, model, seed, steps, cfg, sampler, scheduler) mirror what the pack's own metadata structure expects, so images you tag here stay consistent with images the save nodes produced. You don't have to fill them all in - leave the ones you don't know empty.
Inputs and outputs that matter
image(required, IMAGE) - the image to tag. Pair it with a load node.input_filepath(required, STRING) - the absolute path to write to. This matters more than it looks: without a real path, the node can't persist anything to disk.title,description,keywords,author,copyright,copyright_url,category- the cataloguing fields.keywordsas a comma-separated string.rating- 1–5 stars, if you're the rating type.prompt,negative_prompt,model,seed,steps,cfg_scale,sampler,scheduler- the optional generation record.write_to_xmp/embed_metadata/write_text_file/write_to_database- where the metadata goes.
Outputs: image (pass-through), status (what happened), and success (a boolean, handy for conditional logic).
Installing it
Ships in AAA Metadata System by Eric Hiss (GitHub: EricRollei). Via ComfyUI Manager (search "AAA Metadata System") or:
cd ComfyUI/custom_nodes
git clone https://github.com/EricRollei/AAA_Metadata_System.git
cd AAA_Metadata_System
pip install -r requirements.txt
Restart ComfyUI. No extra downloads.
Common issues
The classic mistake is skipping input_filepath - you get a success: false and an empty status because there's nowhere to write. Double-check the path is absolute and the directory exists. If write_to_xmp or embed_metadata is on and the write still fails, it's often the underlying PyExiv2/ExifTool tooling being absent; the pack lists those as optional, but they do the actual heavy lifting for embedded/XMP writes on some formats, so installing them is worth it if you hit errors. And note this node writes what you give it - it doesn't read existing metadata and merge, so if you re-run with a field cleared, you're overwriting rather than appending. One licensing note: the pack is CC BY-NC 4.0 for non-commercial use with a separate commercial license, which matters if the images you're tagging are going into paid work.
Inputs (23)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| input_filepath | STRING | — | |
| titleopt | STRING | — | |
| descriptionopt | STRING | — | |
| keywordsopt | STRING | — | |
| ratingopt | COMBO | 6 options: , 1, 2, 3, 4, 5 | |
| authoropt | STRING | — | |
| copyrightopt | STRING | — | |
| copyright_urlopt | STRING | — | |
| categoryopt | STRING | — | |
| promptopt | STRING | — | |
| negative_promptopt | STRING | — | |
| modelopt | STRING | — | |
| seedopt | INT | 0 | — |
| stepsopt | INT | 0 | — |
| cfg_scaleopt | FLOAT | 0.00 | — |
| sampleropt | STRING | — | |
| scheduleropt | STRING | — | |
| write_to_xmpopt | BOOLEAN | true | — |
| embed_metadataopt | BOOLEAN | true | — |
| write_text_fileopt | BOOLEAN | false | — |
| write_to_databaseopt | BOOLEAN | false | — |
| debug_loggingopt | BOOLEAN | true | — |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |
| status | STRING | — |
| success | BOOLEAN | — |