R42/R43 · Universal or Viggle Animation
Switch Animation Branches at the Finish Line
- cine_linx
- standard_frames
- standard_audio
- viggle_frames
- viggle_audio
- editor_cine_linx
- video_path
- frames
- audio
- current_segment
- total_segments
- fps
- resolved_render_id
- report
Most "or" nodes in ComfyUI are switches you throw after everything has already run. This one throws the switch before, and that's the entire reason it exists.
You have two ways to finish a shot: the standard universal H3 route, or a Viggle character-animation route where a driving video moves a reference character. Both are big. Both are slow. In a normal graph you'd wire both, and pay for both, every time. Here, mode decides which branch's inputs ComfyUI is even allowed to evaluate - check_lazy_status requests either the seven standard_* inputs or the two viggle_* ones, and the unselected branch never executes.
The two modes
standard_universal passes the universal branch through: standard_path, standard_frames, standard_audio, standard_current_segment, standard_total_segments, standard_fps, standard_render_id. It validates: no IMAGE frames, no output; a missing or empty AUDIO waveform, no output. Then it returns your cine_linx untouched, along with the frames, audio, counters, fps, render id and a report line.
viggle_animation takes the Viggle branch's generated frames and audio, and rewrites the project plan to match. The adapted cine_linx gets task_mode: viggle_animation, fps fixed at 24, a single chunk labelled "Viggle animation" sized to the frame count, and a render id of viggle_animation - because a Viggle render isn't a segment of a segmented roll, it's one animated shot. video_path comes back empty in this mode on purpose: the asset is in memory, not a file yet.
Note what it does not do: it doesn't import Viggle's implementation. It's a bridge over media the pack already carries, so the R42/R43 generation branches stay exactly as they were and Viggle remains an optional dependency you can simply not have installed until you want it.
Outputs
editor_cine_linx (the project bus, adapted or passed through), video_path, frames, audio, current_segment, total_segments, fps, resolved_render_id, report. Wire the linx and the media forward; the counters and fps are there so a downstream editor node works identically no matter which mode produced the shot.
The quiet piece of engineering
There's a monkeypatch in this module that you'd never find by reading the node list: VHS exposes a lazy AUDIO output on every loaded video, and iterating it raises if the container has no audio stream - which kills the graph before any downstream node can substitute silence. The bridge patches exactly that one FFmpeg "no stream" condition into a silent fallback (flagged internally, 32 kHz), while leaving real decode failures and corrupt files to raise normally.
If you've ever had a video-only driving clip blow up a character-animation workflow for no apparent reason, that's the bug, and this is the fix. The patch is scoped narrowly for a reason: swallowing genuine audio errors would be much worse than the crash.
Install
cd ComfyUI/custom_nodes
git clone https://github.com/IAMCCS/IAMCCS-nodes.git
Manager → IAMCCS Nodes, restart, hard-refresh, one copy in the repo. Then: VideoHelperSuite is effectively required here, since the audio patch targets it, and your Viggle route needs whatever local Viggle-Animate-H3 setup you're running - the pack deliberately doesn't ship or vendor it. If Viggle isn't installed, leave the node on standard_universal and nothing changes.
Honest expectations
Viggle-style character animation has been a known trick since 2024 - a driving performance plus a character image, mixed with ComfyUI for cleanup. The failure mode has never been the mechanism; it's identity. The knowledge base's line on this is blunt: cross-clip character consistency is unsolved without careful engineering, and any animation route that rewrites a character per frame will drift. The reference_image you feed ViggleCineMedia is doing most of the work. Judge the output on the face, not the motion.
One practical note: the R42/R43 revision labels in these names are the author's internal branch revisions, kept in the class names so saved workflows load with the behaviour they were built against. Don't rename them in a hope of tidying a graph.
Inputs (11)
| Name | Type | Default | Description |
|---|---|---|---|
| cine_linx | IAMCCS_SUPERNODE_LINX | — | |
| mode | COMBO | standard_universal | 2 options: standard_universal, viggle_animation |
| standard_pathopt | STRING | — | |
| standard_framesopt | IMAGE | — | |
| standard_audioopt | AUDIO | — | |
| standard_current_segmentopt | INT | — | |
| standard_total_segmentsopt | INT | — | |
| standard_fpsopt | INT | — | |
| standard_render_idopt | STRING | — | |
| viggle_framesopt | IMAGE | — | |
| viggle_audioopt | AUDIO | — |
Outputs (9)
| Name | Type | Description |
|---|---|---|
| editor_cine_linx | IAMCCS_SUPERNODE_LINX | — |
| video_path | STRING | — |
| frames | IMAGE | — |
| audio | AUDIO | — |
| current_segment | INT | — |
| total_segments | INT | — |
| fps | INT | — |
| resolved_render_id | STRING | — |
| report | STRING | — |