Magic Hour: Video to Video
Magic Hour's Video to Video Node
- video
- video
- video_path
- credits_charged
Restyling a video locally is a genuine project. AnimateDiff-era setups wanted a ControlNet stack and a temporal layer; the Vid2Vid routes that actually work still want depth, pose and a lot of patience. This node is the other approach: point it at a clip, pick "3D Render" from a dropdown, and get a restyled MP4 back in a couple of minutes.
It's the least controllable way to do video-to-video, and sometimes that's exactly what you want.
How it works
Same machinery as the rest of the pack: the clip is written to a temp MP4, uploaded to Magic Hour, and the job runs on their servers with wait_for_completion set, so your graph sits and waits. When it finishes, the node downloads the file into ComfyUI/output/magic_hour/ and returns it as a ComfyUI VIDEO.
Nothing here is a diffusion graph you can inspect. There's no denoise value, no sampler, no seed. The style transfer is a preset on the far side of an HTTP call, which is the trade documented under API-wrapper nodes: you skip the five-hour ControlNet setup and accept per-call billing, zero local control, and your footage going out the door. The pack is first-party (Magic Hour's own repo, Apache-2.0), which is the version of this pattern worth trusting with a key.
The inputs that matter
video - the source clip, any ComfyUI VIDEO.
art_style is the star of the show: 75 presets, defaulting to 3D Render, and the list runs through names like Airbender, Bold Anime, Celestial Skin, Chinese Swordsmen, Boba Fett. The prompt nudges, but the preset does the heavy lifting - that's the thing to internalize before you spend an hour writing a really good one. Pick two or three styles you like and A/B them on the same ten seconds.
model narrows the renderer: 3D Anime, Absolute Reality, Dreamshaper, Flat 2D Anime, Kaywaii, Soft Anime, Western Anime, plus default. Names like Dreamshaper and "Absolute Reality" will look familiar to anyone who's been around SD1.5-era checkpoints, which tells you roughly what flavor of restyle you're getting. default lets the API choose.
prompt_type - default, append_default, custom - decides how your prompt is used: as a hint, appended to a house prompt, or as the whole prompt. The catch is in the source: the node only sends prompt if the box isn't empty, but it always sends prompt_type. So custom with an empty text box is the combination to avoid.
version (default, v1, v2) picks the engine generation. fps_resolution (HALF or FULL, default HALF) is your cost dial - HALF is the cheaper pass, and it's the one to test a style with before committing a whole clip to FULL.
start_seconds / end_seconds cut the segment that gets restyled. end_seconds = 0 means "to the end of the clip," per the author's own tooltip.
Outputs
video is the restyled clip, ready for Save Video or a preview node. video_path gives you the saved file path as a string and keeps working even if your ComfyUI can't construct a VIDEO value. credits_charged is an integer telling you what that run actually cost, which on a restyle job is worth watching - style passes are billed per second of output.
Install
ComfyUI Manager → search "Magic Hour". Or:
cd ComfyUI/custom_nodes
git clone https://github.com/magichourhq/comfyui-magic-hour
pip install -r comfyui-magic-hour/requirements.txt
That installs exactly one thing, the magic-hour SDK. You need Python 3.10+ and a ComfyUI recent enough to have the VIDEO type. Then supply a key before launching ComfyUI:
export MAGIC_HOUR_API_KEY=...
# or: echo 'YOUR_KEY' > ComfyUI/custom_nodes/comfyui-magic-hour/api_key.txt
The key isn't a widget on purpose - node values get baked into workflow JSON, and a key in a shared workflow is a key leaked.
Where people get burned
Half your style list is missing. The art_style and model dropdowns are populated by introspecting the installed SDK at import time. An old or partially-installed magic-hour package falls back to a short default list. If you only see a handful of styles, fix the SDK and restart:
pip install -U 'magic-hour>=0.87.1'
Long clips, silent billing. Restyling is charged by output length, and there's no progress bar in the node - it just waits. Test on a 5–10 second window with HALF before you push a three-minute clip through FULL.
end_seconds = 0 on a clip with unreadable duration raises a clear error telling you to set end_seconds. Type a number and move on.
Style presets that reference someone's IP are the vendor's grown-up problem, not a license you've been handed. Read Magic Hour's terms before you ship anything commercial.
That's the honest summary: this is a preset machine, not a control surface. If you want to steer the look, you're back to a local ControlNet stack; if you want a stylized clip in five minutes, it's four clicks.
Inputs (9)
| Name | Type | Default | Description |
|---|---|---|---|
| video | VIDEO | — | |
| art_style | COMBO | 3D Render | 75 options: 3D Render, Airbender, Android, Anime Warrior, Armored Knight, Assassin's Creed, +69 |
| model | COMBO | default | 8 options: 3D Anime, Absolute Reality, Dreamshaper, Flat 2D Anime, Kaywaii, Soft Anime, +2 |
| prompt_type | COMBO | default | 3 options: default, append_default, custom |
| prompt | STRING | — | |
| version | COMBO | default | 3 options: default, v1, v2 |
| fps_resolution | COMBO | HALF | 2 options: HALF, FULL |
| start_seconds | FLOAT | 0.00–3600 | — |
| end_seconds | FLOAT | 0.00–3600 | 0 = to the end of the clip |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| video | VIDEO | — |
| video_path | STRING | — |
| credits_charged | INT | — |