High-resolution video and photo downloader for YouTube, Instagram, Facebook, TikTok, X/Twitter, and many other sites.
Paste or drag-and-drop media URLs into a local web UI. Downloads run in parallel, land on disk in high quality, and support per-site authentication, multi-account round-robin, and proxy settings.
Built with Flask and yt-dlp.
- Download videos and photos from social media via URL
- Multi-threaded queue (parallel downloads)
- Drag-and-drop or paste multiple URLs
- High-resolution format selection (best video + audio)
- Per-site authentication (cookies, login, API keys)
- Multiple accounts per site with round-robin and health status
- Paste HTTP / cURL requests to auto-configure auth
- Proxy support (HTTP / SOCKS5) for geo-restricted media
- Windows and Linux / macOS launchers
- Python 3.10+ (3.11–3.14 recommended)
- FFmpeg (optional but recommended for merging best video + audio)
- Network access to the platforms you download from
run.batOr manually:
py -3 -m venv .venv
.venv\Scripts\pip install -r requirements.txt
.venv\Scripts\python app.pychmod +x run.sh
./run.shOr manually:
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
python app.pyOpen http://127.0.0.1:5000 in your browser.
HOST=0.0.0.0 PORT=5000 ./run.shOn Windows PowerShell:
$env:HOST="0.0.0.0"; $env:PORT="5000"; .\.venv\Scripts\python.exe app.py- Paste one or more media URLs (one per line), or drag links onto the composer.
- Click Start download.
- Watch progress in the Download queue.
- Files are saved under the local
downloads/folder (also downloadable from the UI).
- Open Auth settings.
- Pick a site (Instagram, Facebook, YouTube, …).
- Add account or Paste request (raw HTTP / cURL / headers).
- Enable healthy accounts — red status accounts are skipped.
- Use Accounts status to toggle, edit, or delete accounts.
- Open Auth settings → Network / Proxy.
- Enter a proxy URL (
http://…,socks5://…) or host/port credentials. - Enable and save — applied to all downloads.
├── app.py # Flask web server + API
├── downloader.py # Thread pool + yt-dlp downloads
├── auth_config.py # Per-site multi-account auth
├── proxy_config.py # Proxy settings
├── templates/ # HTML UI
├── static/ # CSS / JS
├── config/ # Local secrets (gitignored) + examples
├── downloads/ # Downloaded media (gitignored)
├── requirements.txt
├── run.bat # Windows launcher
└── run.sh # Linux / macOS launcher
Local runtime data is not committed:
| Path | Purpose |
|---|---|
config/auth.json |
Auth accounts & cookies metadata |
config/proxy.json |
Proxy settings |
config/cookies/ |
Uploaded cookie files |
downloads/ |
Downloaded media |
Example templates:
Copy and rename if you want to seed config manually; the app also creates these files from the UI.
| Method | Path | Description |
|---|---|---|
GET |
/ |
Web UI |
POST |
/api/download |
Start downloads { "urls": ["…"] } |
GET |
/api/jobs |
List jobs |
POST |
/api/jobs/<id>/cancel |
Cancel a job |
GET |
/api/settings/auth |
Auth profiles |
GET / PUT |
/api/settings/proxy |
Proxy settings |
GET |
/api/health |
Health check |
| Issue | What to try |
|---|---|
| YouTube 403 Forbidden | Add logged-in YouTube cookies under Auth; update yt-dlp; enable a proxy |
| YouTube Video unavailable | Region lock → proxy; age-gate → cookies; or the video may be removed |
[Errno 22] Invalid argument |
Fixed via Windows-safe filenames; update to latest code and restart |
| Merge / best quality fails | Install FFmpeg and ensure it is on PATH |
| Private Instagram / Facebook | Use browser cookies or upload cookies.txt for that site |
Keep yt-dlp current:
pip install -U "yt-dlp[default]"Use FrameFetch only for content you have the right to download. Respect each platform’s terms of service and copyright law. This tool is for personal / educational use.
MIT — see LICENSE.