Load Video URL
Video From Any URL, Without Installing VideoHelperSuite
- vae
- IMAGE
- frame_count
- audio
- video_info
The name says most of it: paste an http/https video URL into one string widget, run the graph, and out come frames. It's the Load Video URL node from Sam Kumar's ImageGen-Toolkit-Dev-Utils pack, and its entire pitch is that it's self-contained. It downloads the file, caches it, and decodes frames using imageio[ffmpeg] - no VideoHelperSuite, no model files, no extra runtime.
If you've wrestled with VHS's URL variant you know why this exists. VideoHelperSuite's VHS_LoadVideo is the community default, but its URL mode is famously fiddly and people get burned by it ("don't use the load video url version" is the standard fix in help threads). This node keeps the same VHS_LoadVideo-style controls so old workflows mostly transplant cleanly, then drops the dependency.
How it works
The flow is simple and defensive. First the URL gets validated - blank, malformed, or non-HTTP(S) input is rejected before any network fetch happens. Then the file downloads in 1 MB chunks with a 30-second timeout and lands in a cache folder under ComfyUI's temp directory (imagegen-toolkit-dev-utils/video-url-cache), keyed by the SHA-256 hash of the URL. Because IS_CHANGED returns that hash, running the same URL twice is a cache hit - no re-download. Decoding goes through imageio's ffmpeg plugin with a fallback to the legacy imageio.get_reader path, so you're covered either way.
The inputs that matter
Most of them mirror VHS_LoadVideo's surface:
video_url- the one you must set. A plain string, not a file upload. Must be a fullhttps://...URL.force_rate- force the output to a target FPS.0means "keep the source rate." If the source is 30 fps and you set 15, it grabs every other frame.select_every_nth- grab every Nth frame (default 1). Combine withforce_ratefreely; the node picks the more aggressive step.frame_load_cap- stop after N frames.skip_first_frames- skip the first N. Both default to0, meaning no cap and no skip.custom_width/custom_height- resize while decoding (LANCZOS).0keeps the original size; set one and the other auto-scales.
There's also an optional vae input, accepted for drop-in compatibility with VHS-style workflows. It's not actually used in the decode path - this node hands you frames, not latents - so you can leave it unplugged.
The outputs
IMAGE- the stacked frames as a float tensor, ready for a sampler or video model.frame_count- how many frames you got, handy as a loop bound.audio- alwaysNoneright now. Audio extraction isn't implemented, so don't wire this expecting sound.video_info- aVHS_VIDEOINFOpayload (source fps, loaded fps, frame counts, cached file path) that downstream VHS-style nodes expect.
Installing it
The pack installs through ComfyUI Manager - search ImageGen Toolkit Dev Utils, install, restart. That's the path the README pushes; it explicitly says the pack isn't meant for a raw git clone (that's the dev flow, and you'd need npm install && npm run build for the frontend half plus pip install "imageio[ffmpeg]" Pillow, since there's no requirements.txt).
Two real gotchas. First, the README demands a recent frontend - ComfyUI Frontend 1.24.4 at the time of writing - because the pack's frontend adds a live preview player to this node's body. Update the frontend if the preview misbehaves. Second, this is a brand-new, small personal pack (GPL v3, near-zero community footprint), so a bug here is likely to be an actual bug, not a step you missed.
Common issues
- "Load Video URL requires imageio[ffmpeg]" - the decode backend isn't installed. Manager usually handles it; otherwise
pip install "imageio[ffmpeg]"into the same Python that runs ComfyUI. - Local file paths don't work. Only absolute
http/httpsURLs. A path like/tmp/video.mp4gets rejected at validation - that's by design. - The same URL re-downloads after a restart. The cache lives in the temp directory; if ComfyUI or your OS cleans it, the file fetches again. It's a cache, not a vault.
- Slow or large videos. The whole file downloads before the first frame decodes, so a 2 GB clip means a long wait before anything shows up.
Inputs (8)
| Name | Type | Default | Description |
|---|---|---|---|
| video_url | STRING | — | |
| force_rate | FLOAT | 00–60 | — |
| custom_width | INT | 00–8192 | — |
| custom_height | INT | 00–8192 | — |
| frame_load_cap | INT | 00–9007199254740991 | — |
| skip_first_frames | INT | 00–9007199254740991 | — |
| select_every_nth | INT | 11–9007199254740991 | — |
| vaeopt | VAE | — |
Outputs (4)
| Name | Type | Description |
|---|---|---|
| IMAGE | IMAGE | — |
| frame_count | INT | — |
| audio | AUDIO | — |
| video_info | VHS_VIDEOINFO | — |