main
Raynoxis 7 months ago
parent a2a672ae68
commit a4bef47106

@ -1,208 +1,75 @@
# 🎬 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](https://github.com/yt-dlp/yt-dlp). Le tout conteneurisé avec Docker/Podman. Codé avec mon ami : Claude AI
Modern, hardened web UI for downloading YouTube videos with conversion options and detailed status. Built on the excellent [yt-dlp](https://github.com/yt-dlp/yt-dlp) and fully containerized with Docker/Podman. Coded with my friend: Claude AI
![License](https://img.shields.io/badge/license-MIT-blue.svg)
![Docker](https://img.shields.io/badge/docker-ready-blue.svg)
![Python](https://img.shields.io/badge/python-3.11-blue.svg)
![Security](https://img.shields.io/badge/security-hardened-green.svg)
## ✨ Fonctionnalités
## ✨ 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
### 🎥 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
## 🚀 Deploy
### 📊 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
```bash
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
```bash
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é)
### Docker Compose (recommended)
```bash
git clone https://github.com/Raynoxis/yt-dlp-Web-Interface.git
cd yt-dlp-Web-Interface
# Pour Docker
docker-compose up -d
# Pour Podman (rootless)
./fix-permissions.sh # Configure les permissions
podman compose up -d
```
**Note pour WSL2 & Podman** : Un script `fix-permissions.sh` est fourni pour configurer automatiquement les permissions du dossier downloads avec Podman rootless.
Accédez à l'interface : **http://localhost:5001** (ou 5000 si vous utilisez la commande docker run directe)
## 📖 Documentation
- [Installation détaillée](docs/INSTALLATION.md)
- [Guide d'utilisation](docs/USAGE.md)
## 🛠️ Build depuis les sources
```bash
# 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
1. Collez l'URL d'une vidéo YouTube
2. Cliquez sur **"Analyser la vidéo"**
3. Sélectionnez les formats vidéo et audio souhaités
4. Choisissez les options de sortie (conteneur, codec audio, bitrate)
5. Cliquez sur **"Télécharger"**
6. **Suivez la progression en temps réel** avec la barre de progression
7. Téléchargez le fichier généré
## 📸 Screenshots
### Etape 1 - Analyse
![Etape 1](docs/screenshots/step1.png)
### Etape 2 - Sélection des formats
![Etape 2](docs/screenshots/step2.png)
### Etape 3 - Téléchargement avec progression
![Etape 3](docs/screenshots/step3.png)
Access the UI: **http://localhost:5001** (Compose) or **http://localhost:5000** (direct run).
## 🔧 Configuration avancée
### Volumes persistants
Persist downloads:
```bash
docker run -d \
-p 5000:5000 \
docker run -d -p 5000:5000 \
-v ./downloads:/app/downloads \
--name ytdlp-web \
raynoxis/yt-dlp-web-interface:latest
```
### Variables d'environnement
```bash
docker run -d \
-p 5000:5000 \
-e FLASK_ENV=production \
-e PYTHONUNBUFFERED=1 \
--name ytdlp-web \
raynoxis/yt-dlp-web-interface:latest
```
### Compose complet
```yaml
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 :
Build from source (optional):
```bash
echo "UID=$(id -u)" > .env
echo "GID=$(id -g)" >> .env
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
```
## 🔐 Sécurité
### Mesures de sécurité implémentées
## 📸 Screenshots
### Step 1 - Analysis
![Step 1](docs/screenshots/step1.png)
- ✅ **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
### Step 2 - Format selection
![Step 2](docs/screenshots/step2.png)
### Bonnes pratiques recommandées
### Step 3 - Download with progress
![Step 3](docs/screenshots/step3.png)
```bash
# 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
```
## 🎯 How it works
1. Paste a YouTube URL and click **Analyze video** to list available streams.
2. Pick video and audio formats; choose container, codec, and bitrate.
3. Click **Download** and follow live progress (speed, ETA, executed yt-dlp command).
4. Download the generated file when it completes.
## 📊 API Endpoints
### Analyse de vidéo
### API (if you automate)
```bash
POST /api/analyze
Content-Type: application/json
{ "url": "https://www.youtube.com/watch?v=VIDEO_ID" }
{
"url": "https://www.youtube.com/watch?v=VIDEO_ID"
}
```
### Téléchargement
```bash
POST /api/download
Content-Type: application/json
{
"url": "https://www.youtube.com/watch?v=VIDEO_ID",
"video_format": "299",
@ -212,187 +79,47 @@ Content-Type: application/json
"audio_bitrate": "192k",
"audio_only": false
}
```
### Progression en temps réel (SSE)
```bash
GET /api/progress/<session_id>
```
### Télécharger le fichier
```bash
GET /api/download-file/<session_id>/<filename>
```
### Nettoyage
```bash
GET /api/progress/<session_id>
GET /api/download-file/<session_id>/<filename>
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
### Permissions tips
- Keep the container non-root (default). Do not set `user: root`.
- If `downloads/` was created by root, recreate it or `chown` it to your user.
- On Podman rootless, run `./fix-permissions.sh` (or `podman unshare chown 1000:1000 downloads/`) if you hit permission errors.
### Nettoyage manuel
```bash
# 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
```
## 🤝 Contributing
## 🐛 Dépannage
Contributions are welcome! Feel free to:
### 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 :
```bash
# 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 :
```bash
# 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)
```bash
# 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 (rootless)
Podman en mode rootless utilise un mapping d'UID. Pour que le conteneur puisse écrire dans le dossier downloads :
```bash
# Utiliser le script fourni (recommandé)
./fix-permissions.sh
# OU manuellement :
podman unshare chown 1000:1000 downloads/
podman unshare chmod 755 downloads/
# Puis démarrer le conteneur
podman compose up -d
```
**Explication** : Podman mappe l'UID 1000 du conteneur (appuser) vers l'UID 100999 sur l'hôte. Le script configure automatiquement cette permission.
### 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 à :
1. Fork le projet
2. Créer une branche (`git checkout -b feature/amelioration`)
3. Commit vos changements (`git commit -am 'Ajout nouvelle fonctionnalité'`)
4. Push vers la branche (`git push origin feature/amelioration`)
5. Ouvrir une Pull Request
1. Fork the project
2. Create a branch (`git checkout -b feature/improvement`)
3. Commit your changes (`git commit -am 'Add new feature'`)
4. Push the branch (`git push origin feature/improvement`)
5. Open a Pull Request
## 📝 License
Ce projet est sous licence MIT. Voir le fichier [LICENSE](LICENSE) pour plus de détails.
## 🙏 Remerciements
- [yt-dlp](https://github.com/yt-dlp/yt-dlp) - Le meilleur outil de téléchargement vidéo
- [Flask](https://flask.palletsprojects.com/) - Framework web Python
- [FFmpeg](https://ffmpeg.org/) - Traitement vidéo et audio
- [Claude AI](https://claude.ai) - Assistant de développement
## 📈 Changelog
### v2.0.2 (2025-11-28)
- 🐛 Fix permissions issues with Podman rootless mode
- 📝 Add `fix-permissions.sh` script for easy setup
- 🔧 Update Dockerfile to not pre-create downloads folder
- 📚 Improve documentation for Podman users
### v2.0.1 (2025-11-27)
- 📝 Update documentation with WSL2 permissions fix
This project is under the MIT License. See [LICENSE](LICENSE) for details.
### 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
## 🙏 Credits
### v1.0.0 (Initial)
- 🎬 Interface web pour yt-dlp
- 🎯 Sélection de formats vidéo/audio
- 🎵 Mode audio seulement
- 🐳 Conteneurisation Docker/Podman
- [yt-dlp](https://github.com/yt-dlp/yt-dlp) - The best video download tool
- [Flask](https://flask.palletsprojects.com/) - Python web framework
- [FFmpeg](https://ffmpeg.org/) - Audio/video processing
- [Claude AI](https://claude.ai) - Development assistant
## ⚠️ Avertissement
## ⚠️ Disclaimer
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.
This tool is for personal and educational use. Respect YouTube's terms of service and your local copyright laws.
## 📧 Contact
Raynoxis - [GitHub](https://github.com/Raynoxis)
Lien du projet: [https://github.com/Raynoxis/yt-dlp-Web-Interface](https://github.com/Raynoxis/yt-dlp-Web-Interface)
Project link: [https://github.com/Raynoxis/yt-dlp-Web-Interface](https://github.com/Raynoxis/yt-dlp-Web-Interface)
Lien Docker Hub: [https://hub.docker.com/r/raynoxis/yt-dlp-web-interface](https://hub.docker.com/r/raynoxis/yt-dlp-web-interface)
Docker Hub link: [https://hub.docker.com/r/raynoxis/yt-dlp-web-interface](https://hub.docker.com/r/raynoxis/yt-dlp-web-interface)

@ -7,7 +7,7 @@ services:
ports:
- "5001:5000"
volumes:
- ./downloads:/app/downloads:Z
- /tmp:/app/downloads
restart: unless-stopped
environment:
- FLASK_ENV=production

@ -1,81 +0,0 @@
# 📦 Guide d'installation
## Prérequis
- Docker ou Podman installé
- 2 Go d'espace disque disponible
- Connexion internet
## Installation avec Docker
### 1. Via Docker Hub
```bash
docker pull raynoxis/yt-dlp-web-interface:latest
docker run -d -p 5000:5000 --name ytdlp-web raynoxis/yt-dlp-web-interface:latest
```
### 2. Build depuis les sources
```bash
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
```
## Installation avec Podman
### 1. Via registre
```bash
podman pull raynoxis/yt-dlp-web-interface:latest
podman run -d -p 5000:5000 --name ytdlp-web raynoxis/yt-dlp-web-interface:latest
```
### 2. Build depuis les sources
```bash
git clone https://github.com/Raynoxis/yt-dlp-Web-Interface.git
cd yt-dlp-Web-Interface
podman build -t raynoxis/yt-dlp-web-interface .
podman run -d -p 5000:5000 --name ytdlp-web raynoxis/yt-dlp-web-interface
```
## Configuration avancée
### Avec volumes persistants
```bash
mkdir -p ~/ytdlp-downloads
docker run -d \
-p 5000:5000 \
-v ~/ytdlp-downloads:/app/downloads:Z \
--name ytdlp-web \
raynoxis/yt-dlp-web-interface:latest
```
### Avec Docker Compose
```bash
docker-compose up -d
```
## Vérification
Accédez à http://localhost:5000 dans votre navigateur.
## Dépannage
### Le conteneur ne démarre pas
```bash
docker logs ytdlp-web
```
### Port déjà utilisé
Changez le port :
```bash
docker run -d -p 8080:5000 --name ytdlp-web raynoxis/yt-dlp-web-interface:latest
```
### Permissions SELinux
Ajoutez `:Z` au volume :
```bash
-v ~/downloads:/app/downloads:Z
```

@ -1,124 +0,0 @@
# 📖 Guide d'utilisation
## Interface principale
### 1. Analyser une vidéo
1. Collez l'URL YouTube dans le champ de saisie
2. Cliquez sur "🔍 Analyser la vidéo"
3. Attendez quelques secondes
L'application va récupérer :
- Le titre de la vidéo
- La miniature
- Tous les formats disponibles (vidéo et audio)
### 2. Sélectionner les formats
#### Format vidéo
- Choisissez la résolution souhaitée (1080p, 720p, etc.)
- Ou laissez "Meilleure qualité auto"
#### Format audio
- Sélectionnez la qualité audio
- Ou laissez "Meilleure qualité auto"
### 3. Options de sortie
#### Conteneur
- **MP4** : Compatible universellement (recommandé)
- **MKV** : Meilleure qualité, fichiers plus gros
- **WebM** : Format web, plus léger
#### Codec Audio
- **AAC** : Standard, excellente qualité (recommandé)
- **MP3** : Compatible partout
- **Opus** : Meilleure qualité/taille
- **Copy** : Conserve l'audio original (pas de réencodage)
#### Bitrate Audio
- **128 kbps** : Qualité correcte, fichier léger
- **192 kbps** : Bon compromis (recommandé)
- **256 kbps** : Très bonne qualité
- **320 kbps** : Qualité maximale
> ⚠️ Le bitrate est désactivé si vous sélectionnez "Copy"
### 4. Télécharger
1. Cliquez sur "⬇️ Télécharger"
2. Attendez la fin du traitement
3. Consultez la commande exécutée
4. Cliquez sur "💾 Télécharger le fichier"
## Exemples d'utilisation
### Qualité maximale MP4
1. Sélectionnez le format vidéo le plus élevé (ex: 1080p60)
2. Sélectionnez le format audio le plus élevé
3. Conteneur : MP4
4. Codec : AAC
5. Bitrate : 320k
### Audio seulement
1. Ne sélectionnez pas de format vidéo
2. Sélectionnez le meilleur format audio
3. Codec : MP3 ou AAC
4. Bitrate : 320k
### Copie directe (rapide)
1. Sélectionnez vos formats
2. Codec : Copy
3. Le téléchargement sera plus rapide (pas de réencodage)
## Commandes équivalentes
L'interface affiche la commande yt-dlp exécutée. Exemples :
### Qualité max avec AAC
```bash
yt-dlp -f "137+140" --merge-output-format mp4 --postprocessor-args "ffmpeg:-c:a aac -b:a 192k" "URL"
```
### Copy direct
```bash
yt-dlp -f "137+140" --merge-output-format mp4 "URL"
```
## Astuces
### Téléchargement rapide
- Utilisez "Copy" si les formats natifs vous conviennent
- Évitez le réencodage audio
### Meilleure qualité
- Sélectionnez manuellement les meilleurs formats
- Utilisez AAC 320k
- Préférez MKV pour la qualité maximale
### Compatibilité maximale
- Utilisez MP4 + AAC 192k
- Fonctionne sur tous les appareils
## FAQ
**Q : Pourquoi le téléchargement est long ?**
R : Le réencodage audio prend du temps. Utilisez "Copy" pour accélérer.
**Q : Le bitrate est grisé, pourquoi ?**
R : Vous avez sélectionné "Copy", le bitrate ne peut pas être modifié sans réencodage.
**Q : Puis-je télécharger plusieurs vidéos ?**
R : Oui, mais une à la fois. Les anciens fichiers sont automatiquement supprimés.
**Q : Où sont stockés les fichiers ?**
R : Dans le conteneur à `/app/downloads`. Configurez un volume pour les conserver.
## Limites
- Vidéos publiques YouTube uniquement
- Timeout à 10 minutes par téléchargement
- Un téléchargement à la fois

Binary file not shown.

Before

Width:  |  Height:  |  Size: 73 KiB

After

Width:  |  Height:  |  Size: 95 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 196 KiB

After

Width:  |  Height:  |  Size: 193 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 225 KiB

@ -1,21 +0,0 @@
#!/bin/bash
# Fix permissions for Podman rootless mode
# This script sets the correct ownership for the downloads folder
set -e
echo "Fixing permissions for Podman rootless mode..."
# Create downloads directory if it doesn't exist
mkdir -p downloads
# Set correct ownership using podman unshare
# This maps UID 1000 in the container namespace to the correct UID on the host
podman unshare chown 1000:1000 downloads
podman unshare chmod 755 downloads
echo "✓ Permissions fixed successfully!"
echo "The downloads folder is now owned by UID 100999 on the host,"
echo "which maps to UID 1000 (appuser) in the container."
echo ""
echo "You can now start the container with: podman compose up -d"
Loading…
Cancel
Save