π₯ Batch Load Video
Batch video upscaling stops being a babysitting job
- VIDEO
- SLOT
- TOTAL
- RELATIVE_PATH
Video is where this pack earns its keep, and not by accident. It was built for a SeedVR2 + NVIDIA VFX upscale workflow - the kind of thing where each clip is a multi-GB frame batch, each item takes minutes on your GPU, and a crash on clip 17 of 60 used to mean starting the whole queue over. BatchLoadVideo is the source node of the video pair: scan a folder tree of clips, hand out one per run, and let BatchSaveVideo keep the batch alive until they're all done.
It's a drop-in replacement for core LoadVideo. The output is a VIDEO container - same lazy VideoFromFile type core uses, so it plugs straight into GetVideoComponents and friends, then down your normal chain to CreateVideo. "Lazy" is doing real work here: the Load node hands out the clip's container, not a fully-decoded VRAM megaton, and downstream components pull frames when they need them. That's how the same graph that processes one clip from the loader also processes a folder full of them.
Inputs
Same three widgets as the rest of the pack:
folder_path- absolute path to the root of the video tree.recursive- walk subfolders (default on).container_format-mp4/mov/mkv/webm/avi, orall_videos. Defaultmp4.
Yes, the same silent-ignore gotcha applies: files outside the selected format aren't logged or counted. One format per run, or all_videos.
Outputs
VIDEO - the current clip as a lazy video container. Then SLOT (0-based index), TOTAL (matching clip count), and RELATIVE_PATH - wire all three into BatchSaveVideo.
Under the hood it uses the same slot trick as the rest of the pack: rescan the folder on every execution, derive the next file from which destinations already exist in the output tree. Crash mid-batch, restart ComfyUI, add new clips between runs - no reset step, it just picks up where the output tree left off. The Load node also fakes a changing fingerprint each call so ComfyUI never serves a stale cached item.
Why the memory hygiene matters more here
Every node downstream of the Load produces a fresh cache entry per item, and in a video workflow those entries are multi-GB frame batches. ComfyUI's default cache doesn't prune re-keyed entries, so an unmanaged batch of videos would fill your RAM after an item or two - on Linux, the OOM killer beats the cache's allocation-pressure release. This pack wraps the prompt executor and releases all cached outputs downstream of the Load node at the start of each item, keeping the model loaders upstream resident and only the current item's intermediates in memory. It's the difference between a 60-clip batch running overnight and a 60-clip batch that dies on clip three. The models - SeedVR2 DiT/VAE, the VFX upscaler, whatever's in your chain - stay loaded across items, which is the entire point: no reloading between clips.
And when a clip does crash the chain - OOM on a malformed file, a corrupt input, SeedVR2 choking on a bad clip - the JS watchdog catches ComfyUI's execution_error, the server logs it and drops a .error marker, and the batch skips that clip and continues. One attempt per clip, then moved on. Before this pack, that single failure meant babysitting the whole queue.
Install
cd ComfyUI/custom_nodes
git clone https://github.com/lordekeen/comfyui-simple-batch
Restart ComfyUI, or search ComfyUI Simple Batch in Manager. No pip install and no model downloads - PyAV ships with ComfyUI and this node adds nothing beyond it. Needs a recent ComfyUI with the V3 API. Set output_root on BatchSaveVideo to a folder outside your input tree and hit Queue.
Inputs (3)
| Name | Type | Default | Description |
|---|---|---|---|
| folder_path | STRING | Root of the input folder tree (absolute path). | |
| recursive | BOOLEAN | true | Walk subfolders recursively. |
| container_format | COMBO | mp4 | Only files with this extension (or all_videos) are processed. |
Outputs (4)
| Name | Type | Description |
|---|---|---|
| VIDEO | VIDEO | The current clip, as a VideoFromFile β plugs into GetVideoComponents etc. |
| SLOT | INT | 0-based index of the current file for this run. |
| TOTAL | INT | Total matching file count for this run. |
| RELATIVE_PATH | STRING | Current file's path relative to folder_path (posix separators). |