Nodes/CoachBate/CoachBateRecordShotOutput
ComfyUI Node

CoachBateRecordShotOutput

The receipt that makes the next shot renderable

By CoachBate·Created 3 months ago·Updated 21 days ago· 2
CoachBateRecordShotOutput
  • filenames
  • exact_video_filename
◄shot_payload—►
◄output_directory►

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_directory doesn'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_required in the shotlist (or its prompt contains that marker). Intentional: it stops the queue instead of rendering a shot that's waiting on you.
CategoryCoachBate

Inputs (3)

NameTypeDefaultDescription
filenamesVHS_FILENAMES—
shot_payloadSTRING—
output_directorySTRING—

Outputs (1)

NameTypeDescription
exact_video_filenameSTRING—