This update prevents the need to run containers with root privileges by
properly configuring user permissions.
Changes:
- Add user: "${UID:-1000}:${GID:-1000}" to docker-compose.yml
- Create .env file with UID/GID configuration
- Add .env.example template for users
- Update .gitignore to exclude downloads.old/
- Add comprehensive troubleshooting section in README.md
- Document 3 solutions for permission issues (recommended vs avoid)
- Explicitly warn against using user: root
This configuration works perfectly with Docker and Docker Compose.
For Podman rootless, additional step may be needed:
podman unshare chown -R 1000:1000 downloads/
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
|
2 months ago | |
|---|---|---|
| docs | 2 months ago | |
| templates | 2 months ago | |
| .dockerignore | 2 months ago | |
| .env.example | 2 months ago | |
| .gitignore | 2 months ago | |
| Dockerfile | 2 months ago | |
| LICENSE | 2 months ago | |
| README.md | 2 months ago | |
| app.py | 2 months ago | |
| docker-compose.yml | 2 months ago | |
README.md
🎬 yt-dlp Web Interface
Interface web moderne et sécurisée pour télécharger des vidéos YouTube, avec options de conversion et affichage détaillé. Utilise l'excellent yt-dlp. Le tout conteneurisé avec Docker/Podman. Codé avec mon ami : Claude AI
✨ Fonctionnalités
🎥 Téléchargement
- 🔍 Analyse complète des formats vidéo et audio disponibles
- 🎯 Sélection précise des formats (qualité, codec, bitrate)
- ⚙️ Options de sortie personnalisables (MP4, MKV, WebM)
- 🎵 Transcodage audio (AAC, MP3, Opus) avec contrôle du bitrate
- 🎵 Mode audio seulement pour extraire uniquement l'audio
📊 Interface & UX
- 📦 Interface moderne et responsive
- 📈 Barre de progression en temps réel avec SSE (Server-Sent Events)
- ⚡ Téléchargements non-bloquants - multiples téléchargements simultanés
- 💨 Vitesse et ETA affichés pendant le téléchargement
- 📋 Affichage de la commande yt-dlp exécutée pour transparence
🔒 Sécurité
- ✅ Validation stricte des URLs YouTube (protection contre injection de commandes)
- 🛡️ Protection path traversal sécurisée
- 👤 Container non-root (exécution en tant qu'utilisateur
appuser) - 🔐 Validation des inputs (conteneurs, codecs, bitrate)
- 🔍 Logging complet pour audit et debugging
🚀 Performance & Fiabilité
- 🆔 Sessions UUID isolées - pas de conflit entre téléchargements
- 🧹 Nettoyage automatique des fichiers anciens (>1h)
- 🔄 Healthcheck intégré pour monitoring
- 📝 Logs détaillés avec rotation automatique
- 🐳 Conteneurisé pour un déploiement facile
🚀 Démarrage rapide
Avec Docker
docker pull raynoxis/yt-dlp-web-interface:latest
docker run -d -p 5000:5000 --name ytdlp-web raynoxis/yt-dlp-web-interface:latest
Avec Podman
podman pull docker.io/raynoxis/yt-dlp-web-interface:latest
podman run -d -p 5000:5000 --name ytdlp-web raynoxis/yt-dlp-web-interface:latest
Avec Docker Compose (Recommandé)
git clone https://github.com/Raynoxis/yt-dlp-Web-Interface.git
cd yt-dlp-Web-Interface
docker-compose up -d
Note pour WSL2 : Un fichier .env est inclus pour éviter les problèmes de permissions. Le conteneur s'exécutera avec votre UID/GID au lieu de root.
Accédez à l'interface : http://localhost:5001 (ou 5000 si vous utilisez la commande docker run directe)
📖 Documentation
🛠️ Build depuis les sources
# Cloner le repo
git clone https://github.com/Raynoxis/yt-dlp-Web-Interface.git
cd yt-dlp-Web-Interface
# Build avec Docker
docker build -t raynoxis/yt-dlp-web-interface .
# Ou avec Podman
podman build -t raynoxis/yt-dlp-web-interface .
# Lancer
docker run -d -p 5000:5000 --name ytdlp-web raynoxis/yt-dlp-web-interface
🎯 Utilisation
- Collez l'URL d'une vidéo YouTube
- Cliquez sur "Analyser la vidéo"
- Sélectionnez les formats vidéo et audio souhaités
- Choisissez les options de sortie (conteneur, codec audio, bitrate)
- Cliquez sur "Télécharger"
- Suivez la progression en temps réel avec la barre de progression
- Téléchargez le fichier généré
📸 Screenshots
Etape 1 - Analyse
Etape 2 - Sélection des formats
Etape 3 - Téléchargement avec progression
🔧 Configuration avancée
Volumes persistants
docker run -d \
-p 5000:5000 \
-v ./downloads:/app/downloads \
--name ytdlp-web \
raynoxis/yt-dlp-web-interface:latest
Variables d'environnement
docker run -d \
-p 5000:5000 \
-e FLASK_ENV=production \
-e PYTHONUNBUFFERED=1 \
--name ytdlp-web \
raynoxis/yt-dlp-web-interface:latest
Compose complet
version: '3.8'
services:
ytdlp-webinterface:
image: raynoxis/yt-dlp-web-interface:latest
container_name: ytdlp-webinterface
user: "${UID:-1000}:${GID:-1000}" # Exécute avec votre UID/GID
ports:
- "5001:5000"
volumes:
- ./downloads:/app/downloads
restart: unless-stopped
environment:
- FLASK_ENV=production
- PYTHONUNBUFFERED=1
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:5000/"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
Créer un fichier .env pour définir UID/GID :
echo "UID=$(id -u)" > .env
echo "GID=$(id -g)" >> .env
🔐 Sécurité
Mesures de sécurité implémentées
- ✅ Validation stricte : Seules les URLs YouTube valides sont acceptées
- ✅ Protection injection : Validation des inputs avant exécution
- ✅ Path traversal : Protection contre l'accès à des fichiers non autorisés
- ✅ Isolation : Chaque téléchargement dans un répertoire UUID unique
- ✅ Non-root : Le container s'exécute avec un utilisateur non-privilégié
- ✅ Logging : Tous les événements sont tracés pour audit
- ✅ Nettoyage : Suppression automatique des fichiers après 1 heure
Bonnes pratiques recommandées
# Utiliser un reverse proxy avec SSL/TLS
# Limiter l'accès par IP avec un firewall
# Configurer des limites de ressources sur le container
docker run -d \
--memory="2g" \
--cpus="1.0" \
-p 5000:5000 \
raynoxis/yt-dlp-web-interface:latest
📊 API Endpoints
Analyse de vidéo
POST /api/analyze
Content-Type: application/json
{
"url": "https://www.youtube.com/watch?v=VIDEO_ID"
}
Téléchargement
POST /api/download
Content-Type: application/json
{
"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
}
Progression en temps réel (SSE)
GET /api/progress/<session_id>
Télécharger le fichier
GET /api/download-file/<session_id>/<filename>
Nettoyage
POST /api/cleanup/<session_id>
POST /api/cleanup-all
🗂️ Architecture
yt-dlp-Web-Interface/
├── app.py # Backend Flask avec SSE
├── templates/
│ └── index.html # Frontend avec progress bar
├── downloads/ # Fichiers téléchargés (UUID sessions)
│ ├── <uuid-session-1>/
│ └── <uuid-session-2>/
├── Dockerfile # Image Docker (non-root)
├── docker-compose.yml # Configuration Compose
└── docs/ # Documentation
🔄 Gestion des fichiers
Nettoyage automatique
- Déclenchement : À chaque nouveau téléchargement
- Rétention : 1 heure par défaut
- Action : Suppression des répertoires de session > 1h
Nettoyage manuel
# Nettoyer une session spécifique
curl -X POST http://localhost:5000/api/cleanup/<session_id>
# Nettoyer toutes les sessions
curl -X POST http://localhost:5000/api/cleanup-all
🐛 Dépannage
Les téléchargements échouent
- Vérifiez que l'URL YouTube est valide
- Certains formats peuvent ne pas être disponibles
- Consultez les logs :
docker logs ytdlp-web
Erreur de permissions (WSL2 / Linux)
Symptôme : Erreur serveur 500 lors du téléchargement, ou le conteneur ne démarre pas.
Cause : Le répertoire downloads appartient à un autre utilisateur (souvent créé par un conteneur root).
Solutions :
✅ Solution 1 : Utiliser le fichier .env (Recommandé)
Le fichier .env est déjà fourni dans le dépôt. Il configure le conteneur pour s'exécuter avec votre UID/GID :
# Le fichier .env contient :
UID=1000
GID=1000
# Démarrez simplement avec docker-compose
docker-compose up -d
✅ Solution 2 : Recréer le répertoire downloads
Si le répertoire a de mauvaises permissions :
# Renommer l'ancien répertoire
mv downloads downloads.old
# Créer un nouveau répertoire avec les bonnes permissions
mkdir downloads
# Relancer le conteneur
docker-compose up -d
✅ Solution 3 : Corriger les permissions (si vous avez sudo)
# Donner la propriété à votre utilisateur
sudo chown -R $(id -u):$(id -g) downloads/
# Relancer le conteneur
docker-compose up -d
❌ À ÉVITER : user: root
N'ajoutez JAMAIS user: root dans docker-compose.yml :
- ❌ Risque de sécurité majeur
- ❌ Fichiers téléchargés appartiennent à root
- ❌ Vous ne pouvez pas les supprimer sans sudo
Erreur de permissions avec Podman
# Avec Podman, ajuster les permissions du volume
podman unshare chown -R 1000:1000 downloads/
Le healthcheck échoue
- Attendez 40 secondes (start_period)
- Vérifiez que le port 5000 est accessible
🤝 Contribution
Les contributions sont les bienvenues ! N'hésitez pas à :
- Fork le projet
- Créer une branche (
git checkout -b feature/amelioration) - Commit vos changements (
git commit -am 'Ajout nouvelle fonctionnalité') - Push vers la branche (
git push origin feature/amelioration) - Ouvrir une Pull Request
📝 License
Ce projet est sous licence MIT. Voir le fichier LICENSE pour plus de détails.
🙏 Remerciements
- yt-dlp - Le meilleur outil de téléchargement vidéo
- Flask - Framework web Python
- FFmpeg - Traitement vidéo et audio
- Claude AI - Assistant de développement
📈 Changelog
v2.0.0 (2025-11-25)
- ✨ Ajout de la barre de progression en temps réel avec SSE
- 🔒 Amélioration majeure de la sécurité (validation URL, path traversal)
- 🆔 Sessions UUID isolées pour téléchargements concurrents
- 👤 Container non-root pour meilleure sécurité
- 📝 Logging complet pour audit et debugging
- ⚡ Téléchargements non-bloquants avec threads
- 🧹 Nettoyage automatique des sessions anciennes
v1.0.0 (Initial)
- 🎬 Interface web pour yt-dlp
- 🎯 Sélection de formats vidéo/audio
- 🎵 Mode audio seulement
- 🐳 Conteneurisation Docker/Podman
⚠️ Avertissement
Cet outil est destiné à un usage personnel et éducatif. Respectez les conditions d'utilisation de YouTube et les lois sur le droit d'auteur de votre pays.
📧 Contact
Raynoxis - GitHub
Lien du projet: https://github.com/Raynoxis/yt-dlp-Web-Interface
Lien Docker Hub: https://hub.docker.com/r/raynoxis/yt-dlp-web-interface


