CoachBateRecordShotOutput
The receipt that makes the next shot renderable
- filenames
- exact_video_filename
It's an output node, and it's a ledger
CoachBateRecordShotOutput takes the filenames from Video Combine (VHS_FILENAMES), the same
shot_payload the rest of the shot pipeline uses, and the run's output_directory, and returns
one STRING: exact_video_filename. It's also an output node, which means it always runs - that's
deliberate, because its real job is a side effect.
What it writes is a receipt: a JSON file under .continuity/ in the run folder, keyed by a hash of
the shot id, containing the shot id, a fingerprint of the shot's generation fields, the exact
output filename, the file's size and mtime in nanoseconds, and the list of every file Video
Combine produced. That receipt is what CoachBatePrepareShotContinuity reads when the next shot
wants to continue from this one. Nothing scans filenames, nothing guesses which mp4 was the real
output.
Why size and mtime are in there
Because a continuation that starts from a file you edited afterwards is a silent quality bug. If you re-encode the source shot, trim it, or run it through a different muxer between runs, the receipt no longer matches and the continuation refuses rather than building shot 12 on a clip that isn't the one shot 11 actually produced. It's the kind of check that's annoying exactly once, when it saves you a day of "why does the lighting shift at the cut."
The fingerprint deliberately excludes editorial fields - status, title, episode_order, the
filename prefix and review notes - so reordering your shotlist or marking a shot reviewed doesn't
invalidate a perfectly good source performance. Change the generation fields and it warns; change
the metadata and nothing happens. Sensible split.
It also validates what it's been handed: if filenames[0] is falsey, Video Combine wasn't saving
(a save_output=false preview run), and you get "Video Combine must use save_output=true" rather
than a mystery. If no .mp4 turns up in the list, that's an error too. VHS puts the audio-muxed
file last, after any PNGs or intermediate video, so the node takes the last mp4 in the list rather
than the first - which is the opposite of what you'd probably write yourself. Finally, the file
has to live in the output_directory you passed: outputs are workspace-scoped by design, so a
stray Video Combine prefix pointing elsewhere is caught here.
Inputs and outputs
Required: filenames (VHS_FILENAMES), shot_payload (STRING), output_directory (STRING).
Output: exact_video_filename (STRING) - handy for logging or for feeding a downstream path
input that needs the file you just wrote rather than the prefix you asked for.
Install
cd ComfyUI/custom_nodes
git clone https://github.com/CoachBate/ComfyUI-CoachBate.git
Or ComfyUI Manager → search "CoachBate" → restart. Category: CoachBate. You need
VideoHelperSuite installed, since VHS_FILENAMES comes from it and the node expects VHS's file
ordering. No extra pip dependencies.
Where people get burned
- "Video Combine must use save_output=true." - you're running a preview. Continuity needs a real file on disk.
- "Video Combine returned no MP4 output." - the node list contained no mp4 at all, usually because Video Combine wrote images only.
- "VHS output is not in the selected run folder." -
output_directorydoesn't match where Video Combine actually saved. Keep them the same value; that's the whole design. - "MARC_INPUT_REQUIRED; render is blocked." - the shot is flagged
manual_input_requiredin the shotlist (or its prompt contains that marker). Intentional: it stops the queue instead of rendering a shot that's waiting on you.
Inputs (3)
| Name | Type | Default | Description |
|---|---|---|---|
| filenames | VHS_FILENAMES | — | |
| shot_payload | STRING | — | |
| output_directory | STRING | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| exact_video_filename | STRING | — |