e39a8c0fc07b5a668b9a0d73b25416a33d2797bc
Injects PostHog init script in the locale layout head so it loads on every page.
Ombrora YTDLP
Interface web de téléchargement de vidéos via yt-dlp, avec file d'attente persistante, suivi en base de données et liens de téléchargement sécurisés.
Fonctionnement
- L'utilisateur soumet une URL depuis l'interface web.
- La demande est enregistrée en base (statut
PENDING). - Le worker Passenger (Node.js, arrière-plan) dépile les jobs et exécute
yt-dlpen parallèle (concurrence configurable). - Le fichier téléchargé est stocké localement ; un token signé (24h) est généré.
- L'utilisateur est redirigé vers une page de statut qui se rafraîchit jusqu'à ce que le fichier soit prêt.
- Un cron quotidien supprime les fichiers expirés et marque les entrées
FILE_DELETED— la DB conserve l'historique complet.
Stack technique
| Couche | Technologie |
|---|---|
| Framework | Next.js 16 (App Router) |
| Base de données | MariaDB 11 via Prisma 7 |
| Frontend | React 19, TypeScript |
| Worker | Node.js (ts-node) |
| Conteneur (dev) | Docker Compose |
Prérequis
- Node.js 20+
- Docker & Docker Compose (pour MariaDB en développement)
yt-dlpetffmpeg(binaires précompilés dans./bin/ou dans lePATH)
Démarrage rapide
# 1. Cloner le dépôt
git clone <url> ombrora-ytdlp && cd ombrora-ytdlp
# 2. Copier et remplir les variables d'environnement
cp .env.example .env
# 3. Démarrer MariaDB
docker-compose up -d
# 4. Installer les dépendances
npm install
# 5. Appliquer les migrations Prisma
npm run db:migrate
# 6. Lancer le serveur Next.js
npm run dev
# 7. Dans un autre terminal, lancer le worker
npm run worker
L'interface est accessible sur http://localhost:3000.
Variables d'environnement
| Variable | Requis | Exemple | Description |
|---|---|---|---|
DATABASE_URL |
oui | mysql://ombrora:ombrora@localhost:3306/ombrora |
Connexion MariaDB |
STORAGE_PATH |
oui | /var/www/ombrora/storage |
Répertoire de stockage des fichiers téléchargés |
BIN_DIR |
non | ./bin |
Répertoire contenant yt-dlp et ffmpeg (défaut : ./bin) |
Scripts npm
| Script | Description |
|---|---|
npm run dev |
Serveur de développement Next.js |
npm run build |
Build de production |
npm start |
Serveur de production |
npm test |
Tests Jest |
npm run worker |
Worker de téléchargement (boucle de polling) |
npm run worker:check |
Vérifie si le worker tourne, le démarre sinon (usage cron) |
npm run worker:cleanup |
Expire et supprime les fichiers anciens (usage cron) |
npm run db:migrate |
Crée et applique les migrations Prisma |
npm run db:generate |
Régénère le client Prisma |
Configuration
Les paramètres applicatifs sont centralisés dans config/app.config.ts :
DOWNLOAD_LINK_TTL_HOURS: 24 // Durée de validité du token de téléchargement
WORKER_CONCURRENCY: 3 // Téléchargements parallèles maximum
WORKER_POLL_INTERVAL_MS: 10000 // Intervalle de polling du worker (ms)
RATE_LIMIT_MAX: 5 // Soumissions max par IP par fenêtre
RATE_LIMIT_WINDOW_MS: 3600000 // Fenêtre de rate-limit (1h)
API
| Méthode | Endpoint | Description |
|---|---|---|
POST |
/api/downloads |
Soumet une URL. Corps JSON : { url, format?, quality?, subtitles?, extraArgs? }. Retourne { uuid }. |
GET |
/api/downloads/:uuid |
Statut d'un téléchargement. Retourne { status, fileName, fileSize, downloadToken?, tokenExpiresAt?, errorMsg? }. |
GET |
/api/download/:token |
Téléchargement du fichier (token à usage unique, 24h). |
Architecture
src/
├── app/
│ ├── page.tsx # Page d'accueil (formulaire de soumission)
│ ├── status/[uuid]/page.tsx # Page de suivi
│ └── api/
│ ├── downloads/route.ts # POST — création
│ ├── downloads/[uuid]/route.ts # GET — statut
│ └── download/[token]/route.ts # GET — téléchargement
├── components/
│ ├── SubmitForm.tsx # Formulaire de soumission
│ └── StatusView.tsx # Vue de suivi (polling)
└── lib/
├── prisma.ts # Client Prisma (singleton)
├── rate-limit.ts # Rate limiting par IP
├── token.ts # Génération/validation de tokens
└── ytdlp.ts # Construction des arguments yt-dlp
worker/
├── index.ts # Boucle de polling principale
├── processor.ts # Exécution de yt-dlp, mise à jour DB
├── cron-cleanup.ts # Nettoyage des fichiers expirés
└── cron-check.ts # Supervision du worker (cron)
prisma/
└── schema.prisma # Modèles : Download, DownloadToken
Déploiement (o2switch / Passenger)
Contraintes spécifiques à l'hébergement mutualisé
- Pas de compilation sur le serveur :
yt-dlpetffmpegdoivent être des binaires précompilés pour la plateforme cible, placés dansBIN_DIR. node_modulesunique : Passenger ne crée qu'un seulnode_modulesà la racine. Toute dépendance runtime importée par le frontend doit figurer dans ledependenciesdupackage.jsonracine (en plus defrontend/package.json).- Worker : lancer
npm run worker:checkdepuis un cron cPanel pour maintenir le worker actif.
Étapes de déploiement
- Uploader les sources (hors
node_modules,.env,storage/). - Déposer
yt-dlpetffmpegdansBIN_DIR. - Créer
.envavec les valeurs de production. - Via cPanel > "Setup Node.js App" : pointer sur le dépôt, lancer
npm installpuisnpm run build. - Appliquer les migrations :
npm run db:migrate. - Configurer deux crons cPanel :
npm run worker:checktoutes les 5 minutes (redémarre le worker si arrêté).npm run worker:cleanupune fois par jour (suppression des fichiers expirés).
Tests
npm test
Tests Jest (environnement Node, transpilation SWC). Les fichiers de test sont dans **/__tests__/**/*.test.ts.
Licence
Usage interne — non distribué.
Languages
TypeScript
99.7%
CSS
0.2%