DiffusionGemma Advertisement Master Finisher
How the End Card Keeps Your 30-Second Ad at 30 Seconds
- assembled_master
- master_audio
- end_card_images
- finished_master
- finished_audio
- finish_report_json
- status
- ready
DiffusionGemmaAdvertisementMasterFinisher is the node that puts the deterministic end card where it belongs - inside your 30-second master - without making the video a millisecond longer. Its description says it in one line: it replaces, rather than appends, the exact contracted master tail. That distinction is the whole craft of ad finishing. If you naively glued a three-second end card onto the end of a 30-second video you'd get 33 seconds of deliverable and a broken duration contract. This node swaps the last three seconds of generated footage for the end card so the delivery stays exactly 30 seconds, frame-count locked.
It's the seam between two other nodes in the stack. Inputs: assembled_master and master_audio come from the Master Assembler; end_card_images and end_card_report_json come from the End Card Renderer; plus advertisement_contract_json and assembly_report_json for the contract and assembly evidence. The finisher verifies the assembled master is the exact expected frame count, replaces its governed tail (the last end_card_duration_seconds worth of frames - three seconds by default) with the deterministic end-card frames, and verifies the result against the master audio's exact duration. Outputs: finished_master, finished_audio, finish_report_json, and the status/ready pair.
Why replace footage instead of just appending a card? Beyond the duration math, there's an editorial reason: the last few seconds of a generated ad are usually not worth keeping. The tail of an H3 lane is where motion and continuity are weakest, and it's the part nobody watches once the CTA should be on screen. Trading those frames for a crisp, exact-copy brand card is both a legal requirement (your CTA, legal line, and claims have to appear verbatim) and a creative win. And this node is part of why the whole stack is honest about generated content: the card is the only place exact copy is guaranteed - generated in-scene labels are explicitly not trustworthy typography.
The failure mode to expect: a mismatch anywhere in the chain stops the run. If the assembled master doesn't have the exact expected frame count, or the end card's frame count doesn't match the contracted duration, or the contract revision doesn't line up with the reports, this node fails closed rather than producing a master that drifts. If you see it error out, work backward - check the assembler's report against the plan, then the end card's report against the contract. It's usually one stale node upstream.
Also worth knowing: the finisher checks the master is raster-compatible with the contracted aspect tolerance, rejecting dimensions outside it. So don't try to finish a 16:9 experiment through the 9:16 governed pipeline - the contract says 9:16, and the finisher enforces the contract.
Install is pack-wide: ComfyUI Manager search "DiffusionGemma Prompt Builder", or git clone https://github.com/exportAnything/ComfyUI-DiffusionGemmaPromptBuilder into custom_nodes and restart. The surrounding ad workflow wants ComfyUI 0.33.1+ and the H3 model files; the finisher itself is frame replacement and verification - cheap. Get the assembled master and end card right, and this node is where the governed campaign finally becomes the exact 720-frame, 30.000-second deliverable the QA gate will judge.
Inputs (6)
| Name | Type | Default | Description |
|---|---|---|---|
| assembled_master | IMAGE | — | |
| master_audio | AUDIO | — | |
| end_card_images | IMAGE | — | |
| end_card_report_json | STRING | — | |
| advertisement_contract_json | STRING | — | |
| assembly_report_json | STRING | — |
Outputs (5)
| Name | Type | Description |
|---|---|---|
| finished_master | IMAGE | — |
| finished_audio | AUDIO | — |
| finish_report_json | STRING | — |
| status | STRING | — |
| ready | BOOLEAN | — |