YouTube Video Downloader
Pull a clip into your workflow
- video_path
- audio_path
YouTube Video Downloader does what it says: paste a URL, get the video (or just its audio) saved to disk, without leaving ComfyUI. It's a thin wrapper around yt-dlp, the same battle-tested downloader half the internet uses under the hood, dressed up as a node so it can sit at the front of a video-to-video or reference workflow. Need a clip to drive a ControlNet pass, extract frames from, or lip-sync against? Grab it here instead of alt-tabbing to a sketchy download site.
It's part of DoctorDiffusion's MediaMixer pack, and it's the one node in the suite with a real dependency - yt_dlp, which the pack's requirements.txt pulls in.
What it actually gives you
Here's the important mental adjustment: this node does not output frames. It outputs file paths - strings pointing at where it saved the download. That surprises people. You still need a Load Video node (VideoHelperSuite's, say) pointed at that path to turn the file into the IMAGE frame batch your workflow can chew on. Think of this node as the "fetch" step, not the "load" step.
The inputs that matter
Five inputs, and you'll set most of them once and forget them:
youtube_url(STRING) - paste the link. This is the only one you touch every run.resolution(enum) -360p,480p,720p, or1080p, defaulting to720p. Pick the smallest that serves your purpose; if you're only extracting frames for ControlNet you rarely need 1080p.audio_only(boolean, default off) - flip it on to skip the video and just pull the audio track. Handy for grabbing a song or voice clip to sync against.save_as_mp4(boolean, default off) - forces the output into mp4 rather than whatever container yt-dlp would otherwise land on.download_path(STRING) - where the file goes. Read the next section before you trust the default.
The two outputs are video_path and audio_path (both strings). Wire whichever you need into a loader node downstream.
The default path is a trap on anything but Windows
The download_path default is D:\ComfyUI_windows_portable\ComfyUI\downloads - a hardcoded Windows path from the author's own machine. If you're on Linux, macOS, or a cloud runner, that path doesn't exist and the download has nowhere to land. Change it to something real on your system before your first run. This is the single most common reason people say the node "doesn't work."
Installing it
ComfyUI Manager: search MediaMixer, install, restart. Or manually:
cd ComfyUI/custom_nodes
git clone https://github.com/DoctorDiffusion/ComfyUI-MediaMixer.git
cd ComfyUI-MediaMixer
pip install -r requirements.txt
then restart. If yt_dlp refuses to install into the Python environment ComfyUI actually uses - a classic portable-build headache - the README gives the fix directly: from your ComfyUI folder, run
.\python_embed\python.exe -s -m pip install yt_dlp
so it lands in the embedded interpreter and not some system Python that ComfyUI never sees.
When it stops working out of nowhere
The one recurring gotcha isn't this node's fault - it's the nature of scraping YouTube. Google changes things, and yt-dlp periodically breaks until its maintainers push a fix. So if downloads suddenly start failing after months of working fine, the culprit is almost always a stale yt-dlp. Update it (pip install -U yt_dlp, or the embedded-python variant above) before you suspect anything in MediaMixer itself.
Two smaller notes. On a cloud or serverless setup the file lands in an ephemeral container, so whatever you download vanishes when the session ends - fine for a one-shot workflow, useless as storage. And because the outputs are paths, not frames, the node graph won't "see" the content until a loader reads the file, so a red error on the loader (not the downloader) usually means the path was wrong or the download quietly failed.
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| youtube_url | STRING | — | |
| download_path | STRING | D:\ComfyUI_windows_portable\ComfyUI\downloads | — |
| resolution | COMBO | 720p | 4 options: 360p, 480p, 720p, 1080p |
| save_as_mp4 | BOOLEAN | false | — |
| audio_only | BOOLEAN | false | — |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| video_path | STRING | — |
| audio_path | STRING | — |