Happy Horse Load Video (Ace Data Cloud)
The small node that turns a CDN link into a real ComfyUI VIDEO
- video
Most API node packs hand you a URL and wish you luck. You end up downloading the file manually, dropping it in ComfyUI/input, and loading it with a video-load node that half-works. This one closes the loop: give it the link a retrieve node produced and it hands back ComfyUI's native VIDEO type, ready for Save Video or anything else that takes a video. Unglamorous, and probably the reason you'd install this pack instead of the half-dozen alternatives.
What it actually does
One input, video_url. It checks the URL is HTTPS on an allowlisted Ace Data Cloud media host (cdn.acedata.cloud, cdn.acedata2.cloud, platform2.cdn.acedata.cloud), downloads with streaming and no redirect-following, retries up to three times on a network error, and enforces a 128 MiB cap both from the response's declared length and from the bytes actually received. Then it wraps the whole thing in memory and returns it as a VideoFromFile - native VIDEO, one output socket named video.
Two consequences of that design. The good one: nothing touches your disk, so there's no half-downloaded file to clean up and no path to get wrong. The acceptable one: the clip lives in RAM while it's being handled, which is fine for a 3–15 second clip and strictly capped so it can't become a memory problem.
It is not a general video loader
This is the mistake people make. Feed it a YouTube link, a HuggingFace sample, a direct link from your own bucket, and it refuses: "Video URL must be an Ace Data Cloud HTTPS media link." The allowlist is deliberate - it stops the node being turned into a generic fetcher - but it does mean Load Video is only useful for media that came out of this service. If your clip is sitting anywhere else, this isn't the node for it.
Practical upshot: it pairs with Happy Horse Retrieve Task, and that's it. Retrieve's video_url output into Load Video's video_url input is the intended wiring, and it's the second half of the pack's own 02-retrieve-and-save example.
The error you'll actually hit
Empty video_url raises "Task is still pending. Retrieve the same task ID again." That looks like a bug and isn't. It means the retrieve node upstream ran out of its 240-second polling budget before the job finished, so it passed an empty string downstream. Your job is not lost - the ID is still good. Go back to Happy Horse Retrieve Task, keep the same ID, and run that graph again. Do not go back and re-submit; the submit node bills you and you'd end up with two clips.
Version requirement
This node imports ComfyUI's native video helper from comfy_api.latest, so the pack wants ComfyUI 0.39.0 or newer. On an older build, the submit and retrieve nodes will happily run and then the chain dies at the last step with an import error. If everything looks right up to Load Video and it falls over there, that's the first thing to check. Nothing else in the pack cares about your ComfyUI version.
Install
Manager → Custom Nodes → search Happy Horse → confirm publisher acedatacloud and package Happy Horse by Ace Data Cloud → install → restart. Manually:
cd ComfyUI/custom_nodes
git clone https://github.com/AceDataCloud/HappyHorseComfyUI.git
cd HappyHorseComfyUI && python -m pip install -r requirements.txt
export ACEDATACLOUD_API_KEY='paste-your-key-here'
python main.py --cpu
requests is the entire dependency list - no torch, no ffmpeg install script, no model files. The key goes in the environment of the ComfyUI process (or ACEDATACLOUD_API_TOKEN), and the process needs a restart to see it. Yes, this node needs the key too: downloading an Ace CDN link is authenticated.
Where it fits
The full shape of a Happy Horse job is four nodes: a submit node that prints a task ID, Retrieve Task that resolves it to a URL, Load Video that makes the URL into a VIDEO, and Save Video that writes a file. Once you've seen that, the whole pack makes sense - and the reason Load Video is worth its own page is that it's the piece other API packs usually skip. Handing a graph a proper VIDEO object instead of a string means your downstream is just ComfyUI, with all the core nodes and every other pack you own. That's the difference between "an API call in a graph" and "an API call that behaves like a local model."
Inputs (1)
| Name | Type | Default | Description |
|---|---|---|---|
| video_url | STRING | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| video | VIDEO | — |