* fix(video): Easy_LoadVideo degrades to silence on sources with no audio track
VHS returns a lazy audio map (LazyAudioMap, a collections.abc.Mapping) for
the AUDIO output, deferring `ffmpeg -f f32le` until something reads it. Since
ComfyUI core c01175530, comfy/model_patcher.py walks every linked output
hunting for model patchers and recurses into any Mapping via .values() --
which forces that extraction even when nothing consumes the AUDIO socket.
On a source with no audio stream, ffmpeg has nothing to mux and exits -22
("Output file does not contain any stream"), so VHS raises and the whole
prompt dies. That is every Nuke mov64 write: video plus timecode, no audio.
Easy_LoadVideo now wraps the deferred map at both VHS return paths. When the
ffmpeg report lists no audio stream it substitutes silence and logs once; any
other extraction failure is re-raised untouched so real problems stay loud.
The wrapper stays lazy, so nothing runs ffmpeg that did not run before, and
_is_lazy_mapping targets non-dict Mappings only -- VHS builds video_info as a
plain dict, so that slot is left alone.
Verified against the reporting file (Nuke ProRes 4444, video + timecode, no
audio) with the live install's real ffmpeg and torch, driven the way core
does: raises before the guard, yields [1, 2, 1] @ 44100 after it.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
* fix(video): only degrade to silence on proof the source has no audio
Review of #284 found the guard masking failures it promised to re-raise.
The discriminator tested for ABSENCE OF EVIDENCE -- "the ffmpeg report does
not mention an audio stream" -- and degraded to silence whenever that held.
But a missing ffmpeg binary, a permission error, a subprocess timeout, an
empty message, a truncated log, and any non-ffmpeg exception all lack that
line too, so every one of them was silently converted to silent audio. That
contradicts the PR's own contract that non-no-audio failures stay loud, and
is exactly the silent corruption the guard was written to avoid.
_reports_source_has_no_audio now requires EVIDENCE OF ABSENCE: ffmpeg opened
the input, listed its streams, none of them is audio, and the audio muxer then
had nothing to write. All four must hold. Anything unrecognised re-raises, so
a future ffmpeg wording change surfaces as a visible error rather than silent
corruption.
Second finding, same review: the guard wrapped any non-dict Mapping in the
result tuple rather than the AUDIO slot specifically. No live impact -- VHS
builds video_info as a plain dict -- but an unrelated deferred Mapping would
have had its failures rewritten as missing audio. _guard_lazy_audio now scopes
by RETURN_TYPES and touches only the declared AUDIO output.
Tests: seven ambiguous failure shapes assert both that the predicate rejects
them and that the wrapper re-raises, the latter with torch stubbed so the test
cannot pass merely because silence was unconstructible. The VHS test doubles
gained the RETURN_TYPES every real ComfyUI node declares, rather than the
production code growing a getattr fallback that would quietly skip guarding.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
* fix(tests): drop import orphaned by the module-qualified guard calls
The guard tests now reach through k_video_load so they survive the
importlib.reload other tests in the file perform, which left the top-level
_guard_lazy_audio import unused. Ruff F401 in Lint & Smoke.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
ComfyUI-Koolook
Kforge Labs for ComfyUI: a project-kit sidebar plus Koolook nodes for VFX, image, and video workflows.
Start here: KForge Labs ComfyUI-Koolook overview
That overview explains the sidebar, snapshots, saved workflows, modules, recovery tools, and included nodes for new users.
The main experience is the Kforge Labs sidebar. It helps you keep a project setup together: favorite nodes, saved workflows, reusable modules, tags, snapshots, and recovery tools.
Kforge Labs Sidebar
Use the sidebar as a reusable project kit.
| Feature | What it does |
|---|---|
| Snapshots | Save and load the whole Kforge Labs state: favorite nodes, workflows, modules, tags, archive, and recovery data. |
| Search | Find nodes, workflows, directories, and tags from one field. Tags keep exact capitalization, so Depth and depth can be separate folders. |
| Nodes | Keep favorite nodes close, grouped by theme or repository name. |
| Workflows | Save the whole script, save a selection of nodes, load workflows, or insert saved modules into the current canvas. |
| Recovery | Use autosaves, starter presets, snapshot library settings, and missing-pack install helpers. |
New here? Start with the KForge overview. Using it inside ComfyUI? Open the operational guide:
- Browse on the web: malkuthro.github.io/ComfyUI-Koolook/web/guide/
- Inside ComfyUI: Kforge Labs sidebar → Tools row → Help (
Hicon). The in-app button opens the bundled offline copy atweb/guide/index.html.
Included Nodes
| Node ID | Display name | Category |
|---|---|---|
EasyWan22Prompt |
Wan 2.2 Easy Prompt (Koolook) | Koolook/Wan_Video |
EasyResize_Koolook |
Easy Resize (Koolook) | Koolook/Image |
EasyAIPipeline |
Easy AI Pipeline (Koolook) | Koolook/Pipeline |
easy_ImageBatch |
Easy Image Batch (Koolook) | Koolook/Image |
KoolookLoadCameraPosesAbsolute |
Koolook Load Camera Poses (Absolute Path) | Koolook/Camera |
Easy_hdr_VAE_encode |
Easy HDR VAE Encode (Koolook) | Koolook/VAE |
Easy_hdr_VAE_decode |
Easy HDR VAE Decode (Koolook) | Koolook/VAE |
Easy_Pattern |
Easy Pattern (Koolook) | Koolook/Testing |
Easy_LoadVideo |
Easy Load Video (Koolook) | Koolook/Video |
Easy_VideoCombine |
Easy Video Combine (Koolook) | Koolook/Video |
Easy_Utility |
Easy Utility (Koolook) | Koolook/Utility |
Koolook_LoopStatus |
Koolook Loop Status | Koolook/Loop |
Koolook_PublishInput |
Koolook Publish Input | Koolook/Publish |
Koolook_PublishOutput |
Koolook Publish Output | Koolook/Publish |
Koolook_PublishRouter |
Koolook Publish Router | Koolook/Publish |
Koolook_PublishResult |
Koolook Publish Result | Koolook/Publish |
LTXDirector__koolook |
LTX Director (Koolook) | Koolook/PromptRelay |
The root Koolook nodes and the slim Radiance Koolook VAE wrappers have no
extra Python dependencies beyond torch, which ComfyUI already requires.
The video wrappers require Video Helper Suite, and the LTX Director fork is
for workflows that already use the LTX / Prompt Relay node ecosystem.
The Koolook Matte nodes additionally need diffusers (already pulled in by the
LTX Director / Radiance forks) and use huggingface_hub to download the SVD +
VideoMaMa model weights at runtime.
Install
ComfyUI-Manager
- Open ComfyUI Manager.
- Choose Install Custom Nodes.
- Install by Git URL:
https://github.com/malkuthro/ComfyUI-Koolook.git - Restart ComfyUI.
- Open the Kforge Labs sidebar tab.
Manual
Clone this repository into ComfyUI/custom_nodes/:
git clone https://github.com/malkuthro/ComfyUI-Koolook.git
Restart ComfyUI after installation.
One install at a time. If you already installed Kforge Labs via ComfyUI Manager, it lives at
custom_nodes/koolook/(the Manager / Registry-derived folder name). A secondcustom_nodes/ComfyUI-Koolook/created bygit cloneis a parallel install — ComfyUI loads BOTH on every boot, both register the same routes and sidebar tab, and the workflow store silently corrupts on every restart. From v0.3.8 the plugin detects this and prints a critical log naming both paths, disabling the non-winning copy — but the cleanest fix is to remove one folder. Pick the install method you want and stick with it.
Learn More
- Public overview: kforgelabs.com/comfyui-projects/comfyui-koolook/
- In-app visual guide: malkuthro.github.io/ComfyUI-Koolook/web/guide/
(offline copy:
web/guide/index.html) - Support / bug reports:
SUPPORT.md - User guide:
docs/user_guide/ - Change history:
CHANGELOG.md - Maintainer docs:
docs/maintainers/ - Fork attribution and provenance:
forks/THIRD_PARTY.md - Versioning reference:
docs/reference/versioning.md
Troubleshooting
| What you see | What it usually means | What to do |
|---|---|---|
| The Kforge Labs tab does not appear | ComfyUI needs a restart, or the extension did not load | Restart ComfyUI and check the terminal for [Koolook] messages. |
| The Help guide does not open | The browser blocked the popup | Allow popups for the ComfyUI page, or open web/guide/index.html directly. |
| Missing custom nodes after loading a workflow | One or more node packs used by that workflow are not installed | In Kforge Labs, use Tools → Install missing packs, or use ComfyUI Manager's Install Missing Custom Nodes flow. |
| Snapshot save/load fails | The snapshot library path may be missing, read-only, or unavailable | Use Snapshot → Save to... or Load from... and choose a writable folder. |
| A loaded snapshot looks older than expected | Named saves and auto-saves are intentionally separate | In Snapshot → Load, select the snapshot and check Recovery auto-saves for a newer periodic/pre-load recovery. |
Support
For reproducible bugs, open a
GitHub issue.
For the fastest answer, include your ComfyUI version, Koolook version,
operating system, install method, terminal log, browser console errors, and
steps to reproduce. See SUPPORT.md for the exact checklist.
If Koolook helps your ComfyUI work, you can support development on Ko-fi.
Stability
For production work, install a pinned release tag or commit instead of following a moving branch head. Node IDs are treated carefully so saved ComfyUI workflows continue to load across compatible updates.
License
GPL-3.0. See LICENSE.
This package incorporates and adapts GPL-3.0 code from
fxtdstudios/radiance under
forks/radiance_koolook/. Attribution and per-fork modification notes are
tracked in forks/THIRD_PARTY.md and
forks/forks_manifest.yaml.