π₯ Instagram Video Downloader *DRE
Instagram Reels as a VIDEO Node, Because Copy-Pasting URLs Shouldn't Be a Workflow Step
- video
- file_path
Sooner or later your video workflow needs footage you didn't generate. A reel you want to restyle, a clip you want to continue with a v2v pass, a reference take whose framing you want to copy. The usual move is: download it with some other tool, save an mp4, drag it into Load Video. This node deletes the middle of that.
It takes an Instagram URL and hands back a VIDEO - the same type your sampler produces - plus the path on disk as a string. Wire it into Save Video or Get Video Components and the reel is frames in a graph.
What it actually does
It's a thin wrapper over yt-dlp, called in-process. No API, no key, no credits, no upload - just an HTTPS fetch from Instagram's CDN using the tool everyone uses to archive video.
- The URL is host-checked. Anything that isn't
instagram.comor a subdomain raisesNot an Instagram URL, so you can't point it somewhere unexpected. subfoldermust be a relative path inside ComfyUI's output folder. Absolute paths and..are rejected, so the worst a typo does is fail a run.- Files land in
ComfyUI/output/<subfolder>/, withrestrictfilenamesandnoplayliston. - The download is returned as a
VideoFromFile- the modern ComfyUI video I/O object, not a filepath pretending to be one. That's what makes it composable.
This is the ingest half of a Wan or LTX pipeline. The graph could always generate video; it had no door for video that already exists.
The inputs that matter
Five widgets, and you'll touch three on a normal run.
url - the reel, post or story link. Paste the share URL; https://www.instagram.com/reel/... is the shape.
subfolder - defaults to instagram. Keep it, and "where did that download go" stays a one-second question.
filename - empty is the good default here. yt-dlp then names the file uploader_shortcode, which is unique and traceable. Fill it in only to deliberately overwrite the last download.
resolution - best, 1080p, 720p, 480p. It caps, it doesn't upscale: 1080p means highest available at or below 1080, with a fallback if nothing matches.
cookies_from_browser - none, chrome, firefox, edge, brave. The tooltip is the author being straight with you: "Instagram blocks most downloads unless you are logged in. Pick the browser you are logged in with." none works for some public reels and fails on plenty; stories fail almost always.
Outputs are video and file_path - the second a STRING, for when something downstream wants the literal location.
Installing it
It ships in the DenRakEiw Nodes pack, so install the pack. In ComfyUI Manager, search the pack title DenRakEiw Nodes, install, restart. By hand:
cd ComfyUI/custom_nodes
git clone https://github.com/DenRakEiw/DenRakEiw_Nodes
cd DenRakEiw_Nodes
pip install -r requirements.txt
# restart ComfyUI
Heads up on that requirements file: it's the whole pack's, so it drags in diffusers, transformers, kornia, color-matcher and opencv-python for nodes you may never touch. The downloader needs exactly one line - yt-dlp>=2026.8.19, next to the author's own note: "Keep this current; Instagram and other sites break old versions regularly."
When it doesn't work
Nothing appears in the node menu. Read the console. The pack prints β InstagramVideoDownloader failed: ... (pip install yt-dlp), but that hint is a guess. The two real causes are missing yt_dlp, or a ComfyUI old enough that comfy_api.input_impl doesn't exist - which is where VideoFromFile lives. On the second, pip won't save you; update ComfyUI, because the VIDEO type is part of the newer video API.
"Login required" / "Sign in to confirm you're not a bot". Set cookies_from_browser to the browser you're actually logged into Instagram with. This is the flakiest part of any yt-dlp setup. Firefox is the most reliable source; Chrome and Edge on Windows have had stretches where their cookie encryption changed and extraction broke. Try another browser before editing code.
It worked last month, now it doesn't. Update yt-dlp in the environment ComfyUI runs from:
pip install -U yt-dlp
Instagram changes endpoints, the extractor gets patched, and stale yt-dlp is the usual reason a downloader "broke for no reason".
Merging complaints. best and 1080p prefer separate video and audio streams, and yt-dlp needs ffmpeg to glue them into the mp4. If it complains ffmpeg isn't installed, put ffmpeg on PATH - or pick 720p/480p, where single-file variants are likelier.
A carousel gave you one video, or Instagram returned no downloadable video. noplaylist is on, so a multi-video post resolves to a single item, and a photo-only post resolves to nothing. That's the node reporting honestly, not a bug.
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| url | STRING | β | |
| subfolder | STRING | β | |
| filename | STRING | β | |
| resolution | COMBO | 4 options: best, 1080p, 720p, 480p | |
| cookies_from_browser | COMBO | Instagram blocks most downloads unless you are logged in. Pick the browser you are logged in with. |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| video | VIDEO | β |
| file_path | STRING | β |