You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
4.1 KiB
4.1 KiB
🎬 yt-dlp Web Interface
Modern, hardened web UI for downloading YouTube videos with conversion options and detailed status. Built on the excellent yt-dlp and fully containerized with Docker/Podman. Coded with my friend: Claude AI
✨ Highlights
- 🎯 Choose exact video/audio formats with custom containers and codecs
- 📈 Real-time progress via SSE; shows speed, ETA, and the yt-dlp command used
- 🛡️ Hardened: strict URL validation, path traversal protection, non-root container, full logging
- ⚡ Concurrent, non-blocking downloads with automatic cleanup after 1h
- 🐳 Ready-to-run images for Docker and Podman
🚀 Deploy
Docker
docker pull raynoxis/yt-dlp-web-interface:latest
docker run -d -p 5000:5000 --name ytdlp-web raynoxis/yt-dlp-web-interface:latest
Docker Compose (recommended)
git clone https://github.com/Raynoxis/yt-dlp-Web-Interface.git
cd yt-dlp-Web-Interface
docker-compose up -d
Access the UI: http://localhost:5001 (Compose) or http://localhost:5000 (direct run).
Persist downloads:
docker run -d -p 5000:5000 \
-v ./downloads:/app/downloads \
--name ytdlp-web \
raynoxis/yt-dlp-web-interface:latest
Build from source (optional):
git clone https://github.com/Raynoxis/yt-dlp-Web-Interface.git
cd yt-dlp-Web-Interface
docker build -t raynoxis/yt-dlp-web-interface .
docker run -d -p 5000:5000 --name ytdlp-web raynoxis/yt-dlp-web-interface
📸 Screenshots
Step 1 - Analysis
Step 2 - Format selection
Step 3 - Download with progress
🎯 How it works
- Paste a YouTube URL and click Analyze video to list available streams.
- Pick video and audio formats; choose container, codec, and bitrate.
- Click Download and follow live progress (speed, ETA, executed yt-dlp command).
- Download the generated file when it completes.
API (if you automate)
POST /api/analyze
{ "url": "https://www.youtube.com/watch?v=VIDEO_ID" }
POST /api/download
{
"url": "https://www.youtube.com/watch?v=VIDEO_ID",
"video_format": "299",
"audio_format": "140",
"output_container": "mp4",
"audio_codec": "aac",
"audio_bitrate": "192k",
"audio_only": false
}
GET /api/progress/<session_id>
GET /api/download-file/<session_id>/<filename>
POST /api/cleanup/<session_id>
POST /api/cleanup-all
Permissions tips
- Keep the container non-root (default). Do not set
user: root. - If
downloads/was created by root, recreate it orchownit to your user. - On Podman rootless, run
./fix-permissions.sh(orpodman unshare chown 1000:1000 downloads/) if you hit permission errors.
🤝 Contributing
Contributions are welcome! Feel free to:
- Fork the project
- Create a branch (
git checkout -b feature/improvement) - Commit your changes (
git commit -am 'Add new feature') - Push the branch (
git push origin feature/improvement) - Open a Pull Request
📝 License
This project is under the MIT License. See LICENSE for details.
🙏 Credits
- yt-dlp - The best video download tool
- Flask - Python web framework
- FFmpeg - Audio/video processing
- Claude AI - Development assistant
⚠️ Disclaimer
This tool is for personal and educational use. Respect YouTube's terms of service and your local copyright laws.
📧 Contact
Raynoxis - GitHub
Project link: https://github.com/Raynoxis/yt-dlp-Web-Interface
Docker Hub link: https://hub.docker.com/r/raynoxis/yt-dlp-web-interface


