CineTimeline Video Extension Plan
The tiny node that hands your motion-context numbers to the plugin that actually does the work
- enabled
- source_latent_path
- context_length
- audio_context_length
- requested_frame_count
- trim_frames
This one is a pure adapter, and it's about as thin as nodes get. Its whole job: take the video_extension_plan JSON that CineTimelinePlan emits for a motion-context shot and unpack it into discrete, typed outputs that the native nodes of the ComfyUI-H3-Motion-Context plugin can consume directly.
The reason it exists is a design decision the pack is upfront about: CineTimeline doesn't reimplement motion-context continuation. That logic lives in a separate GPL-3.0 plugin (ComfyUI-H3-Motion-Context), and this node is the bridge that feeds it validated numbers. CineTimeline itself stays Apache-2.0 and stays out of third-party algorithms; it just checks the numbers first.
What it does
Feed it one input - video_extension_plan (a STRING, wired from CineTimelinePlan's video_extension_plan output) - and it returns:
enabled(BOOLEAN) - whether this shot is actually a motion-context continuation (false for the first shot, or any shot whose transition isn't "motion context").source_latent_path(STRING) - the exact AV latent file of the previous shot's active version. Not "the latest one found," the registered one.context_length(STRING) - 22 frames of video context, the pack's pinned value. Yes, it's a string for a number. It's a quirk of how the pack hands it downstream; you just wire it.audio_context_length(INT) - 24 frames of audio context.requested_frame_count(INT) - how many frames the timeline actually asked for.trim_frames(INT) - frames to trim from the context handle (same 22, since the continuation is produced a bit longer and trimmed back to the timeline).
It validates the JSON schema and - importantly - refuses to emit an enabled plan that has no source latent path. If enabled is true and the previous shot's version is missing its registered latent, this node errors out rather than letting a downstream plugin silently continue from nothing.
Installing and wiring it
cd ComfyUI/custom_nodes
git clone https://github.com/bo341805sg/ComfyUI-CineTimeline
# restart ComfyUI
The one dependency that actually matters for this node to be useful is the plugin it feeds - ComfyUI-H3-Motion-Context, which the README names as a separate GPL-3.0 pack. Grab it via ComfyUI Manager (search "H3 Motion Context") or its own repo. Note the license: separate install, separate license boundary, exactly as the README stresses. The intended chain is: CineTimelinePlan → this node → the Motion Context plugin's Load / Motion Context / Trim / Save Latent nodes, which do the real latent loading and seam work.
Gotchas
- If you're not using motion-context transitions, you don't need this node in your graph at all. Wire
CineTimelinePlan'svideo_extension_planstraight past it, or just don't connect it -enabledwill be false for any non-continuation shot. - The numbers are pinned by the pack (22 video / 24 audio frames). This isn't a tunable "context strength" knob; it's a contract between CineTimeline and the Motion Context plugin. If you want to change the seam behavior, you're better off changing the plugin's own nodes.
- It's strict by design. An invalid plan schema, or an enabled plan without a source latent, throws a
TimelineValidationErrorinstead of doing something half-right. That strictness is the anti-corruption guard for the whole "assemble complete movie" feature - the pack would rather refuse to assemble than splice a wrong continuation.
If you're building a multi-shot H3 timeline with continuity across cuts, this little adapter is the seam that makes it work without hand-juggling latent files. On its own it does nothing; in the chain it's one less thing to get wrong.
Inputs (1)
| Name | Type | Default | Description |
|---|---|---|---|
| video_extension_plan | STRING | — |
Outputs (6)
| Name | Type | Description |
|---|---|---|
| enabled | BOOLEAN | — |
| source_latent_path | STRING | — |
| context_length | STRING | — |
| audio_context_length | INT | — |
| requested_frame_count | INT | — |
| trim_frames | INT | — |