Magic Hour: Animation
Magic Hour: Animation
- image
- audio
- video
- video_path
- credits_charged
The Animation node is the one in this pack that people reach for without reading anything first. You give it a picture and a track, and you get back a stylised animated clip that cuts on the beat. It is the closest thing here to a finished product rather than a utility - and it's also the node where a wrong setting costs you the most credits before you notice.
What it actually is
Nothing local. This is a wrapper around Magic Hour's hosted animation tool, one of the 29 they expose through the same Python SDK the pack depends on. Your image and audio get uploaded, a job starts on their servers, and the node blocks until the MP4 comes back into ComfyUI/output/magic_hour/. No VRAM, no model downloads, no 12GB checkpoint. Your GPU is idle the whole time.
That puts it squarely in the API-wrapper category: the graph looks like any other generation pipeline, but the pixels were made on someone else's machine and the picture you uploaded left your house. For a music-video styliser that's usually fine. For anything sensitive, it's the whole tradeoff. See the security section of the KB's API-node essay before you wire client material through it.
Inputs that matter
Ten required fields, and honestly four of them decide your result.
art_style is a 47-entry list - Cinematic Miyazaki, Cyberpunk, Arcane, Cubist, 90s Streets, and so on, plus a Custom entry. That custom entry is why art_style_custom exists: pick Custom and type your own style name there. The list is read from your installed SDK at import time, not hardcoded, so it stays in sync with whatever the API offers.
camera_effect is 52 entries and this is where the interesting ones live. A good chunk are suffixed - Audio Sync and do exactly what they say: zoom and bounce land on the audio rather than on a fixed timer. Those only mean anything if you connected something to the optional audio input. No audio, no beat to sync to.
prompt_type is ai_choose, custom or use_lyrics. custom reads your prompt. ai_choose picks its own description. use_lyrics does what the name suggests and wants a track with vocals in it. If prompt_type isn't custom, whatever you typed in prompt is still sent if it's non-empty, so clear it if you're relying on auto.
duration_seconds is the length of the clip you get back, 1 to 300. It's not the length of your audio - the two are independent, and mismatching them is the number one way to be annoyed by the result. A ten-second default against a three-minute song gives you a ten-second teaser.
The rest is framing: width and height default to 960×540, fps defaults to 12 (that's fine for this style of output, leave it), and transition_speed is a 1–10 dial where higher means the cuts and transitions move faster.
Optional image and audio are genuinely optional - the tool will animate from prompt and style alone - but connecting both is the intended use.
Outputs
video is a proper ComfyUI VIDEO and drops straight into Save Video or a preview node. video_path is the saved file as a STRING, useful for non-video consumers, filename nodes, or a ComfyUI build too old to have the VIDEO type. credits_charged is an INT - the real cost of that run, which is the only honest way to learn what a given duration and resolution actually costs you.
Install
cd ComfyUI/custom_nodes
git clone https://github.com/magichourhq/comfyui-magic-hour
pip install -r comfyui-magic-hour/requirements.txt
Restart ComfyUI. The pack's only dependency is magic-hour>=0.87.1, the SDK itself - no torch add-ons, no model weights. Nodes show up under Magic Hour in the menu.
The API key is deliberately not a widget, because widget values get saved into workflow JSON and leak when you share a graph:
export MAGIC_HOUR_API_KEY=your_key_here # before launching ComfyUI
Or drop the bare key into comfyui-magic-hour/api_key.txt.
Where people get burned
422on width/height. The schema accepts up to 4096, your plan doesn't. The node surfaces Magic Hour's own message, so you'll see the resolution it refused. Drop to 960×540 and scale up after.402mid-graph. Credits gone or the chosen settings need a paid tier. The error says so; it isn't a bug.- Nothing visible for two minutes. That's normal. Video jobs run tens of seconds to several minutes and the node waits synchronously - your queue is blocked, not hung.
- Audio-sync effects doing nothing. You picked an
- Audio Synceffect with noaudioconnected.
Do a first pass at 5 seconds, 960×540, and whatever the cheapest style is, just to see the cost in credits_charged before you commit to a 300-second render.
Inputs (12)
| Name | Type | Default | Description |
|---|---|---|---|
| art_style | COMBO | 3D Render | 47 options: 3D Render, 90s Streets, Abstract Minimalist, Arcane, Art Deco, Bold Colored Illustration, +41 |
| camera_effect | COMBO | Accelerate | 52 options: Accelerate, Aggressive Zoom In - Audio Sync, Aggressive Zoom Out - Audio Sync, Boost Zoom In, Boost Zoom Out, Bounce In And Out, +46 |
| prompt_type | COMBO | ai_choose | 3 options: ai_choose, custom, use_lyrics |
| prompt | STRING | — | |
| art_style_custom | STRING | — | |
| transition_speed | INT | 51–10 | — |
| duration_seconds | FLOAT | 10.01–300 | — |
| fps | FLOAT | 121–60 | — |
| width | INT | 96064–4096 | — |
| height | INT | 54064–4096 | — |
| imageopt | IMAGE | — | |
| audioopt | AUDIO | — |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| video | VIDEO | — |
| video_path | STRING | — |
| credits_charged | INT | — |