MediaHub Resolve Video
The node that waits on cloud video renders — and finally hands you an MP4
- job
- video
- video_url
- raw_json
MediaHubSubmitVideo gets the ball rolling, but MediaHubResolveVideo is where the patience happens. This is the node that takes the job from Submit, polls the provider until the render is done, downloads the finished file, and hands you a real VIDEO - the thing you wire into ComfyUI's built-in SaveVideo (or any video-consuming node) and actually watch.
It takes your api_key and a job (a MEDIAHUB_JOB, which only MediaHubSubmitVideo produces). It outputs video (a VIDEO), video_url (the hosted URL), and raw_json (the final query response). No request here, no config - the job already encodes which provider and task to check.
How the waiting works
Under the hood it's a polling loop straight out of the pack's core services. It queries the provider's task status, checks the state, and:
- if the state is
completed, it grabs the final video URL and streams the MP4 down to a temp directory (amediahub_video_*folder), verifying the content type is actually video along the way; - if the state is
failed, it raises an error that includes the provider's raw response; - otherwise it sleeps and polls again.
It polls every 5 seconds with a hard timeout of 600 seconds - ten minutes. That's the window your cloud render has to finish. Most Hailuo, Seedance, Wan, and HappyHorse clips land well inside it, but heavy 1080p long-duration jobs can get uncomfortably close, and on a bad day a queue-backed provider will blow past it.
Two practical consequences follow. First, the node blocks the queue while it waits - ComfyUI isn't doing the rendering, but your workflow is sitting there polling, so don't queue a dozen of these and walk away expecting them to parallelize. Second, the downloaded file lives in a temp directory. Save it somewhere permanent with SaveVideo before you close ComfyUI, or the clip can disappear with the temp dir. The video_url output is your portable copy in the meantime.
Like the other execution nodes, it always runs (IS_CHANGED is NaN), so there's no caching - every execution is a fresh poll cycle, and every upstream re-run is a fresh paid submission.
Installing it
Pack install, same as the rest of MediaHub:
cd ComfyUI/custom_nodes
git clone https://github.com/vantang/ComfyUI-MediaHub.git
/path/to/ComfyUI/python -m pip install -r ComfyUI-MediaHub/requirements.txt
Restart ComfyUI and it's under MediaHub/Video. Only requests, Pillow, and numpy are required - the heavy lifting is all on the provider's servers.
Common gotchas
The classic mistake: connecting MediaHubResolveVideo directly to a config node's request output. It takes a job, not a request. Submit has to sit in between - config → Submit → Resolve → SaveVideo. A timeout error after ten minutes usually means the job is still rendering (or the provider is backed up), not that your workflow is broken; rerun the resolve with a job from a completed submission, or check raw_json to see where the provider thinks the task is.
Inputs (2)
| Name | Type | Default | Description |
|---|---|---|---|
| api_key | STRING | — | |
| job | MEDIAHUB_JOB | — |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| video | VIDEO | — |
| video_url | STRING | — |
| raw_json | STRING | — |