APNext H3 Scenes Load (from disk)
Re-render without paying the LLM a second time
- audio
- scenes
- durations
- lengths
- audio_segments
- segment_table
- scenes_text
- synopsis
- cast
- scene_count
- song_seconds
- info
- clip_starts
In the H3 scene workflows, the LLM call is the cheap-looking part that actually isn't. Every time a writer re-runs, a model re-invents your ten scenes from scratch - and the API or Claude Code seat spend adds up fast. H3ScenesLoad is the answer the pack built for that: a file picker that loads a saved run from disk and re-renders it without a single LLM call. The prompt-writing is already paid for; this node makes sure you don't pay twice.
How it works
When a writer like the Music Video Writer finishes a successful generation, its save_scenes toggle (on by default) writes one self-contained JSON bundle into output/apnext_scenes/. Inside: the scenes themselves, the synopsis, segment times, durations, frame lengths, clip starts, cast, and the summary tables - everything needed to reproduce the run.
H3ScenesLoad lists those bundles in its file dropdown, newest first. Pick one and it hands back exactly what the writer would have produced, so it drops into the same downstream graph without changing anything:
scenes,durations,lengths,audio_segments- the lists, in the same order and types the writer outputs.scenes→ your review/render path,lengths→ the video node'slength,audio_segments→ref_audio_1for per-clip audio.clip_starts- the per-scene start times, for the masked-audio workflow.segment_table,scenes_text,synopsis,cast,scene_count,song_seconds,info- the metadata and preview strings.
The one genuinely useful extra input is audio. Connect the same song the scenes were written for and the node re-slices the per-clip audio_segments from the saved segment times - so ref_audio workflows rebuild without re-running the model. It's not needed for the masked-audio path, where clip_starts plus the master song already cover it.
Why reach for this instead of just re-running the writer? Because re-rendering is where you iterate. You changed the video settings, the seed, the upscaler, the length. None of that needs new prompts - you want the same scenes, rendered differently. Or it's Tuesday and you're picking up a project you wrote last week. The bundle is your insurance policy against throwing good tokens after a bad render.
Installing it
Part of the dagthomas/comfyui_dagthomas pack ("SDXL Auto Prompter"). Install via ComfyUI Manager (search "comfyui_dagthomas") or:
cd ComfyUI/custom_nodes
git clone https://github.com/dagthomas/comfyui_dagthomas
cd comfyui_dagthomas
pip install -r requirements.txt
Restart ComfyUI. No API keys, no model downloads - this node only reads JSON off your disk.
Gotchas
The dropdown is built at page load. Saved a new bundle while ComfyUI was open? Refresh the browser to re-scan the folder; it won't appear on its own. If it says "(no saved scenes found)", you haven't run a writer with save_scenes on yet - go do that first. And if you connect an audio input that's a different length than the song the scenes were written for, the node warns you in the console because the slices won't line up. Since the bundles are plain JSON, you can also back them up or peek inside them - handy when you want to know exactly what a run cost you.
Inputs (2)
| Name | Type | Default | Description |
|---|---|---|---|
| file | COMBO | A scenes bundle saved by a writer's `save_scenes` toggle (output/apnext_scenes/), newest first. Refresh the browser to re-scan the folder. | |
| audioopt | AUDIO | The same song the scenes were written for. Connect it to rebuild the per-clip `audio_segments` (ref_audio_1) from the saved segment times. Not needed for the masked-audio workflow (clip_starts + the master song cover it). |
Outputs (12)
| Name | Type | Description |
|---|---|---|
| scenes | STRING | — |
| durations | FLOAT | — |
| lengths | INT | — |
| audio_segments | AUDIO | — |
| segment_table | STRING | — |
| scenes_text | STRING | — |
| synopsis | STRING | — |
| cast | STRING | — |
| scene_count | INT | — |
| song_seconds | FLOAT | — |
| info | STRING | — |
| clip_starts | FLOAT | — |