MetaHub Save Video
Give your VHS output the metadata it never had
- filenames
- filenames
Images have had reproducible metadata baked into PNG chunks for years. Video never got the memo. When Video Helper Suite (VHS) spits out an MP4, the file is essentially anonymous - no seed, no prompt, no model, no idea what AnimateDiff motion module made it. If you generate video regularly and ever need to reproduce or organize it later, that's a real problem. MetaHub Save Video is the fix: it takes the VHS_FILENAMES output from VHS's Video Combine node and injects the same dual metadata the image nodes write - an A1111/Civitai-style description plus a full JSON comment with generation params, workflow, and analytics.
The mechanism is the interesting part, because it explains both why this node is cheap and where it can break. It doesn't re-encode anything. It finds ffmpeg on your system and runs it with -c copy, which copies the video streams untouched and only rewrites the container's metadata fields: description for the human-readable A1111 format, comment for the JSON, and a title with the seed. No re-encoding means it's fast and lossless, and existing metadata is preserved via -map_metadata 0.
How to wire it
filenames (VHS_FILENAMES) is the only required input - connect it after VHS Video Combine. It's designed as a pass-through: the node also outputs filenames, so you can chain it into other video save/annotate nodes without breaking the flow.
Everything else is optional and defaults to auto-detect or null:
frame_rateandframe_count-0means auto-detect from the file via ffprobe. Leave them alone unless auto-detection misbehaves.motion_model_name- the AnimateDiff or other motion model used; the extractor tries to find it in the graph, but for nonstandard setups you can just type it.- The usual generation overrides -
seed,steps,cfg,sampler_name,scheduler,model_name,positive,negative,denoise,vae_name- for when auto-detection misses something in an unusual graph. user_tags,notes,project_nameandgeneration_time_override(feed it the MetaHub Timer'selapsed_time) for the Image MetaHub Pro organization and analytics side.
The gotcha the README won't tell you
The video node shells out to ffmpeg (and ffprobe for auto-detection), and it searches your PATH plus a handful of common Windows install locations. The README's install section doesn't mention this at all - the dependency is in the source, not the docs. So if you're on a bare setup that never installed ffmpeg, the node will run, save nothing useful, and the metadata injection will quietly fail. If you've ever processed video anywhere on this machine you almost certainly have ffmpeg already; if not, that's the first thing to check when your video comes out metadata-less.
Installing
Same pack, one install covers all five nodes. ComfyUI Manager, search ImageMetaHub Save, restart. Or:
cd ComfyUI/custom_nodes
git clone https://github.com/LuqP2/ImageMetaHub-ComfyUI-Save.git
No Python dependencies beyond ComfyUI's own stack and no models to download. The rest of the pack's troubleshooting applies too - "model hash is 0000000000" and undetected LoRAs are the same story here as on the image nodes, and standard LoraLoader nodes are what the extractor understands.
Inputs (18)
| Name | Type | Default | Description |
|---|---|---|---|
| filenames | VHS_FILENAMES | — | |
| seedopt | INT | Override seed | |
| stepsopt | INT | Override steps | |
| cfgopt | FLOAT | Override CFG scale | |
| sampler_nameopt | STRING | Override sampler name | |
| scheduleropt | STRING | Override scheduler | |
| model_nameopt | STRING | Override model filename | |
| positiveopt | STRING | Override positive prompt | |
| negativeopt | STRING | Override negative prompt | |
| denoiseopt | FLOAT | Override denoise strength | |
| vae_nameopt | STRING | Override VAE filename | |
| frame_rateopt | FLOAT | 0.000–120 | Video frame rate (FPS). 0 = auto-detect from file |
| frame_countopt | INT | 0 | Number of frames. 0 = auto-detect from file |
| motion_model_nameopt | STRING | Motion model name (AnimateDiff, etc.) | |
| user_tagsopt | STRING | User tags (comma-separated) | |
| notesopt | STRING | Notes | |
| project_nameopt | STRING | Project name | |
| generation_time_overrideopt | FLOAT | Timestamp from MetaHub Timer Node |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| filenames | VHS_FILENAMES | — |