Phase 2 Complete: SQL migration with SQLModel and Alembic
This commit is contained in:
@@ -1,274 +1,127 @@
|
||||
# Ohm Stream Downloader
|
||||
|
||||
**Application web complète pour télécharger des animes, séries TV et fichiers depuis divers hébergeurs.**
|
||||
**Application web complète pour rechercher, streamer et télécharger des animes, séries TV et films.**
|
||||
|
||||
Interface moderne avec recherche unifiée, watchlist automatique, métadonnées enrichies, téléchargements parallèles et streaming vidéo.
|
||||
Interface moderne (SPA-like) avec recherche unifiée, watchlist automatique, métadonnées enrichies, téléchargements parallèles et intégration Sonarr.
|
||||
|
||||
## ✨ Fonctionnalités
|
||||
|
||||
### 🎬 Recherche d'Animes & Séries TV
|
||||
- **Recherche unifiée** : Recherchez animes et séries TV simultanément
|
||||
- **Providers Anime** : Anime-Sama, Neko-Sama, Anime-Ultime, Vostfree, French-Manga
|
||||
- **Providers Séries** : FS7 (French-Stream)
|
||||
- **Métadonnées riches** : Synopsis, genres, notes, année de sortie, studio, nombre d'épisodes
|
||||
- **Téléchargement par épisode** : Sélectionnez et téléchargez des épisodes individuels
|
||||
- **Téléchargement de saison complète** : Téléchargez tous les épisodes d'un coup
|
||||
- **Streaming vidéo** : Regardez vos animes directement dans le navigateur
|
||||
- **Recherche floue** : Gestion des fautes de frappe et variations de noms
|
||||
### 🎬 Recherche & Streaming
|
||||
- **Recherche unifiée** : Recherchez animes et séries TV simultanément.
|
||||
- **Providers Anime** : Anime-Sama, Neko-Sama, Anime-Ultime, Vostfree, French-Manga.
|
||||
- **Providers Séries** : FS7 (French-Stream).
|
||||
- **Métadonnées riches** : Synopsis, genres, notes, studio via intégration Kitsu.
|
||||
- **Streaming vidéo** : Lecteur intégré supportant divers hébergeurs.
|
||||
- **Téléchargement flexible** : Épisode par épisode ou saison complète.
|
||||
|
||||
### 📋 Watchlist (Suivi Automatique)
|
||||
- **Ajout à la watchlist** : Suivez vos animes préférés depuis la recherche
|
||||
- **Téléchargement automatique** : Télécharge tous les épisodes dès le suivi
|
||||
- **Vérification automatique** : Le planificateur vérifie les nouveaux épisodes automatiquement
|
||||
- **Intervalle configurable** : Paramétrez la fréquence de vérification (1-168 heures)
|
||||
- **Notifications** : Recevez des alertes pour les nouveaux épisodes
|
||||
- **Filtres** : Visualisez tous / actifs / en pause / terminés
|
||||
- **Contrôle granulaire** : Pausez, reprenez, vérifiez manuellement chaque anime
|
||||
### 📋 Watchlist & Automatisation
|
||||
- **Suivi intelligent** : Ajoutez des animes à votre watchlist pour ne rater aucun épisode.
|
||||
- **Auto-Download** : Téléchargement automatique des nouveaux épisodes dès leur sortie.
|
||||
- **Planificateur (Scheduler)** : Vérification périodique configurable (1h à 168h).
|
||||
- **Filtres avancés** : Visualisation par statut (Actif, En pause, Terminé).
|
||||
- **Intégration Sonarr** : Support des webhooks pour une automatisation complète du homelab.
|
||||
|
||||
### 📁 Hébergeurs de Fichiers Supportés
|
||||
- **1fichier** (1fichier.com, 1fichier.fr)
|
||||
- **Uptobox** (uptobox.com, uptobox.fr)
|
||||
- **Doodstream** (doodstream.com, dood.to, dood.lol, etc.)
|
||||
- **Rapidfile** (rapidfile.net, rapidfile.com)
|
||||
- **Uqload** (uqload.co, uqload.io)
|
||||
- **OneUpload** (oneupload.co)
|
||||
- **SendVid** (sendvid.com)
|
||||
- **VidZ** (vidzi.tv)
|
||||
### 🚀 Gestionnaire de Téléchargements
|
||||
- **Multi-threading** : Jusqu'à 5 téléchargements simultanés avec gestion de file d'attente.
|
||||
- **Pause/Reprise** : Support du protocole HTTP Range pour reprendre les téléchargements interrompus.
|
||||
- **Progression Temps Réel** : Vitesse (Mo/s), pourcentage et estimation du temps restant.
|
||||
- **Sanitisation** : Nettoyage automatique des noms de fichiers pour une compatibilité maximale.
|
||||
|
||||
### 🎥 Hébergeurs Vidéo Supportés
|
||||
- **VidMoly** (vidmoly.to, vidmoly.com)
|
||||
- **SendVid** (sendvid.com)
|
||||
- **DoodStream** (doodstream.com)
|
||||
- **LPlayer** (lplayer.net)
|
||||
- **VidZy** (vidzy.tv)
|
||||
## 🏗️ Architecture (Three-Tier System)
|
||||
|
||||
### 🚀 Gestion des Téléchargements
|
||||
- **Téléchargements parallèles** : Hasta 5 téléchargements simultanés
|
||||
- **Pause/Reprise** : Contrôle total sur vos téléchargements
|
||||
- **Progression en temps réel** : Vitesse, progression, taille
|
||||
- **Reprise automatique** : Support des HTTP Range pour reprendre les téléchargements interrompus
|
||||
L'application repose sur un système à trois couches pour une robustesse maximale :
|
||||
1. **Catalogues (Anime/Series Sites)** : Extraction des listes d'épisodes et métadonnées.
|
||||
2. **Players Vidéo (Video Players)** : Extraction des liens de téléchargement direct depuis les embeds (VidMoly, DoodStream, etc.).
|
||||
3. **Manager (Download Manager)** : Orchestration asynchrone des transferts de fichiers.
|
||||
|
||||
### 🌐 Interface Web
|
||||
- **Design moderne** : Interface sombre avec onglets
|
||||
- **5 onglets** : Accueil, Recherche, Séries, Providers, Watchlist
|
||||
- **Responsive** : Fonctionne sur desktop et mobile
|
||||
- **Mise à jour automatique** : Rafraîchissement automatique du contenu
|
||||
- **Métadonnées visuelles** : Affichage des informations anime avec icônes
|
||||
## 📁 Hébergeurs Supportés
|
||||
|
||||
### 🔌 API REST
|
||||
- **Endpoints REST** : Intégration facile avec d'autres applications
|
||||
- **Documentation automatique** : Swagger UI disponible
|
||||
| Type | Services Supportés |
|
||||
| :--- | :--- |
|
||||
| **Catalogues** | Anime-Sama, Neko-Sama, Anime-Ultime, Vostfree, French-Manga, FS7 |
|
||||
| **Players/Hosts** | VidMoly, DoodStream, 1fichier, Uptobox, SendVid, Sibnet, Lplayer, Uqload, Rapidfile, LuLuvid, Smoothpre, Vidzy |
|
||||
|
||||
## 📋 Configuration Requise
|
||||
|
||||
- Python 3.8+
|
||||
- pip
|
||||
- **Python 3.11+**
|
||||
- **Node.js** (pour les tests frontend uniquement)
|
||||
- **Playwright** (pour l'extraction dynamique sur certains sites)
|
||||
|
||||
## 🚀 Installation
|
||||
## 🚀 Installation Rapide
|
||||
|
||||
```bash
|
||||
# Cloner le repository
|
||||
git clone https://git.lanro.eu/Roman/ohm_streaming.git
|
||||
cd ohm_streaming
|
||||
|
||||
# Créer l'environnement virtuel
|
||||
# Environnement Python
|
||||
python3 -m venv venv
|
||||
source venv/bin/activate # Windows: venv\Scripts\activate
|
||||
|
||||
# Installer les dépendances
|
||||
source venv/bin/activate
|
||||
pip install -r requirements.txt
|
||||
|
||||
# Lancer le serveur de développement
|
||||
# Initialisation Playwright (requis pour VidMoly)
|
||||
playwright install chromium
|
||||
|
||||
# Lancer l'application
|
||||
uvicorn main:app --reload --host 0.0.0.0 --port 3000
|
||||
```
|
||||
Accès Web : `http://localhost:3000/web`
|
||||
|
||||
Accédez à l'interface : http://localhost:3000/web
|
||||
## 🧪 Tests & Qualité
|
||||
|
||||
## 📖 Utilisation
|
||||
|
||||
### Interface Web
|
||||
|
||||
1. **Onglet Accueil** :
|
||||
- Dernières sorties anime et séries populaires
|
||||
- Recommandations personnalisées
|
||||
|
||||
2. **Onglet Recherche** :
|
||||
- Entrez le nom d'un anime (ex: "Naruto", "Frieren")
|
||||
- Sélectionnez la langue (VOSTFR ou VF)
|
||||
- Cliquez sur "Rechercher"
|
||||
- Sélectionnez un épisode et cliquez sur "Télécharger"
|
||||
- Ou utilisez "Toute la saison" pour tout télécharger
|
||||
- Cliquez sur "➕ Suivre" pour ajouter à la watchlist
|
||||
|
||||
3. **Onglet Séries** :
|
||||
- Recherchez des séries TV (Breaking Bad, Game of Thrones, etc.)
|
||||
- Téléchargez des épisodes
|
||||
|
||||
4. **Onglet Providers** :
|
||||
- Liste des hébergeurs de fichiers disponibles
|
||||
|
||||
5. **Onglet Watchlist** :
|
||||
- Visualisez vos animes suivis
|
||||
- Contrôlez le planificateur automatique
|
||||
- Paramétrez l'intervalle de vérification
|
||||
- Filtrez par statut (tous, actifs, en pause, terminés)
|
||||
|
||||
### API Endpoints
|
||||
|
||||
#### Authentication
|
||||
| Méthode | Endpoint | Description |
|
||||
|---------|----------|-------------|
|
||||
| POST | `/api/auth/register` | Créer un compte |
|
||||
| POST | `/api/auth/login` | Connexion (JWT) |
|
||||
| GET | `/api/auth/me` | Profil utilisateur |
|
||||
|
||||
#### Téléchargements
|
||||
| Méthode | Endpoint | Description |
|
||||
|---------|----------|-------------|
|
||||
| POST | `/api/download` | Créer un nouveau téléchargement |
|
||||
| GET | `/api/downloads` | Lister tous les téléchargements |
|
||||
| GET | `/api/download/{task_id}` | Statut d'un téléchargement |
|
||||
| POST | `/api/download/{task_id}/pause` | Mettre en pause |
|
||||
| POST | `/api/download/{task_id}/resume` | Reprendre |
|
||||
| DELETE | `/api/download/{task_id}` | Annuler/Supprimer |
|
||||
| GET | `/api/download/{task_id}/file` | Télécharger le fichier terminé |
|
||||
|
||||
#### Anime
|
||||
| Méthode | Endpoint | Description |
|
||||
|---------|----------|-------------|
|
||||
| GET | `/api/anime/search` | Rechercher un anime |
|
||||
| GET | `/api/anime/metadata` | Obtenir les métadonnées |
|
||||
| GET | `/api/anime/episodes` | Liste des épisodes |
|
||||
| POST | `/api/anime/download` | Télécharger un épisode |
|
||||
| POST | `/api/anime/download-season` | Télécharger toute une saison |
|
||||
|
||||
#### Watchlist
|
||||
| Méthode | Endpoint | Description |
|
||||
|---------|----------|-------------|
|
||||
| GET | `/api/watchlist` | Liste des animes suivis |
|
||||
| POST | `/api/watchlist` | Ajouter à la watchlist |
|
||||
| DELETE | `/api/watchlist/{item_id}` | Supprimer de la watchlist |
|
||||
| POST | `/api/watchlist/check-all` | Vérifier tous les animes |
|
||||
| GET | `/api/watchlist/settings` | Paramètres |
|
||||
| PUT | `/api/watchlist/settings` | Mettre à jour les paramètres |
|
||||
|
||||
### Exemples API
|
||||
|
||||
**Rechercher un anime :**
|
||||
```bash
|
||||
curl "http://localhost:3000/api/anime/search?q=frieren&lang=vostfr"
|
||||
```
|
||||
# Backend (Pytest)
|
||||
pytest # Tous les tests
|
||||
pytest -m "unit" # Tests unitaires rapides
|
||||
|
||||
**Ajouter à la watchlist :**
|
||||
```bash
|
||||
curl -X POST http://localhost:3000/api/watchlist \
|
||||
-H "Authorization: Bearer YOUR_TOKEN" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{"anime_title": "Frieren", "anime_url": "https://anime-sama.si/catalogue/frieren/saison1/vostfr/", "provider_id": "animesama", "lang": "vostfr"}'
|
||||
# Frontend (Vitest & Playwright)
|
||||
npm test # Tests unitaires JS
|
||||
npx playwright test # Tests E2E
|
||||
```
|
||||
|
||||
## 🏗️ Structure du Projet
|
||||
|
||||
```
|
||||
Ohm_streaming/
|
||||
├── main.py # Application FastAPI & endpoints API
|
||||
├── main.py # Point d'entrée & API FastAPI
|
||||
├── app/
|
||||
│ ├── models/ # Modèles Pydantic
|
||||
│ ├── downloaders/ # Downloaders par provider
|
||||
│ │ ├── anime_sites/ # Providers anime
|
||||
│ │ └── series_sites/ # Providers séries
|
||||
│ ├── providers.py # Configuration des providers
|
||||
│ ├── download_manager.py # Gestionnaire de file d'attente
|
||||
│ ├── watchlist.py # Gestion de la watchlist
|
||||
│ ├── episode_checker.py # Vérification des nouveaux épisodes
|
||||
│ └── auto_download_scheduler.py # Planificateur automatique
|
||||
├── templates/ # Templates HTML
|
||||
│ ├── index.html # Interface web principale
|
||||
│ └── components/ # Composants réutilisables
|
||||
├── static/ # Fichiers statiques (CSS, JS)
|
||||
└── requirements.txt # Dépendances Python
|
||||
│ ├── downloaders/ # Logique d'extraction (Scraping)
|
||||
│ │ ├── anime_sites/ # Catalogues Anime
|
||||
│ │ ├── series_sites/ # Catalogues Séries
|
||||
│ │ └── video_players/ # Extracteurs de liens directs
|
||||
│ ├── routers/ # Routes API modulaires (Auth, Watchlist, etc.)
|
||||
│ ├── download_manager.py # Moteur de téléchargement asynchrone
|
||||
│ ├── watchlist.py # Logique métier du suivi
|
||||
│ └── scheduler.py # Planificateur de tâches
|
||||
├── static/ # Frontend (JS Vanilla, CSS)
|
||||
├── templates/ # Vues Jinja2
|
||||
└── config/ # Données persistantes (JSON)
|
||||
```
|
||||
|
||||
## ⚙️ Configuration
|
||||
|
||||
Les paramètres peuvent être configurés via variables d'environnement ou fichier `.env` :
|
||||
|
||||
```
|
||||
JWT_SECRET_KEY=votre-clé-secrète
|
||||
DOWNLOAD_DIR=downloads
|
||||
MAX_PARALLEL_DOWNLOADS=5
|
||||
```
|
||||
|
||||
## 🔧 Ajouter un Provider
|
||||
|
||||
Voir la documentation dans le code source pour ajouter de nouveaux providers.
|
||||
|
||||
## 🤝 Contribution
|
||||
|
||||
Les contributions sont les bienvenues !
|
||||
|
||||
1. Fork le projet
|
||||
2. Créez une branche (`git checkout -b feature/AmazingFeature`)
|
||||
3. Commit (`git commit -m 'Add some AmazingFeature'`)
|
||||
4. Push (`git push origin feature/AmazingFeature`)
|
||||
5. Ouvrez une Pull Request
|
||||
|
||||
## 🗺️ Plan d'Évolution Global (Modernisation)
|
||||
|
||||
Ce plan détaille les étapes nécessaires pour transformer Ohm Stream Downloader en une application de production robuste, sécurisée et évolutive.
|
||||
### ✅ Phase 1 : Restructuration (Terminé)
|
||||
- Migration vers une architecture modulaire pour les downloaders.
|
||||
- Séparation stricte entre catalogues et hébergeurs vidéo.
|
||||
- Amélioration de la gestion des erreurs et des retries.
|
||||
|
||||
### Phase 1 : Consolidation de la Donnée (Fondation)
|
||||
*Objectif : Remplacer les fichiers JSON par une base de données relationnelle.*
|
||||
- **Migration SQL** : Utiliser **SQLModel** (SQLAlchemy + Pydantic) pour gérer la persistance.
|
||||
- Tables : `users`, `watchlist`, `tasks`, `favorites`, `settings`.
|
||||
- **Gestion des Migrations** : Mettre en place **Alembic** pour suivre l'évolution du schéma sans perte de données.
|
||||
- **Support Multi-base** : Configurer SQLite par défaut et PostgreSQL pour les déploiements avancés.
|
||||
### ✅ Phase 2 : Consolidation & SQL (Terminé)
|
||||
- Migration complète des fichiers JSON vers **SQLModel** (SQLite).
|
||||
- Mise en place d'**Alembic** pour les migrations de base de données.
|
||||
- Centralisation des métadonnées et persistance robuste.
|
||||
|
||||
### Phase 2 : Robustesse du Scraping (Cœur Technique)
|
||||
*Objectif : Rendre l'extraction de données résiliente aux changements des sites tiers.*
|
||||
- **Abstraction DSL (Domain Specific Language)** : Déporter les sélecteurs CSS et Regex dans des fichiers **YAML/JSON**.
|
||||
- Permet de mettre à jour un provider sans modifier le code Python.
|
||||
- **Découplage des Métadonnées** : Utiliser exclusivement les API de **Kitsu**, **Anilist** ou **MyAnimeList** pour les fiches d'animes.
|
||||
- Le scraping ne sert plus qu'à récupérer les flux vidéo.
|
||||
- **Health Checks Automatisés** : Script quotidien vérifiant que chaque provider répond toujours correctement (alerte en cas d'échec).
|
||||
- **Service Playwright (Headless)** : Intégrer un service optionnel pour scraper les sites protégés par Cloudflare ou du JS complexe.
|
||||
- **Résolution de Domaines (Auto-Mirrors)** : Détection automatique des changements de domaine (.si, .co, .pw) via DNS-over-HTTPS.
|
||||
### 🏗️ Phase 3 : UX & Modernisation Frontend (En cours)
|
||||
- Adoption de **HTMX/Alpine.js** pour dynamiser l'interface.
|
||||
- Intégration du lecteur vidéo avancé **Plyr.io**.
|
||||
- Amélioration de la réactivité de la recherche et de la watchlist.
|
||||
|
||||
### Phase 3 : Modernisation du Frontend (UX & Maintenance)
|
||||
*Objectif : Simplifier le code JS et améliorer l'expérience utilisateur.*
|
||||
- **Adoption de HTMX/Alpine.js** : Réduire la complexité du Vanilla JS en utilisant **HTMX** pour les mises à jour partielles (DOM diffing) et **Alpine.js** pour la réactivité légère.
|
||||
- **Lecteur Vidéo Professionnel** : Intégrer **Plyr** ou **Video.js** pour supporter :
|
||||
- Les sous-titres (.srt, .vtt).
|
||||
- La gestion avancée du cache et du buffering.
|
||||
- Une interface personnalisée et responsive.
|
||||
- **Système de Toasts & Notifications** : Alertes visuelles pour la progression des tâches et les nouveaux épisodes détectés.
|
||||
- **Design "Mobile First"** : Optimisation complète des CSS pour une utilisation fluide sur smartphone (PWA).
|
||||
## 📝 Licence & Sécurité
|
||||
|
||||
### Phase 4 : Sécurité et DevOps (Professionnalisation)
|
||||
*Objectif : Sécuriser les accès et faciliter le déploiement.*
|
||||
- **Dockerisation Complète** : `docker-compose.yml` incluant App, Redis (cache), PostgreSQL et Playwright.
|
||||
- **Journalisation Structurée** : Remplacer les `print` par un logger structuré (ex: `structlog`) avec rotation des logs.
|
||||
- **Rate Limiting** : Protection des endpoints API contre le brute-force et le spam de recherche.
|
||||
- **Gestion Stricte des Secrets** : Validation rigoureuse des variables d'environnement et suppression des IPs codées en dur (CORS).
|
||||
|
||||
### Phase 5 : Nouvelles Fonctionnalités (Valeur Ajoutée)
|
||||
*Objectif : Étendre les capacités du service.*
|
||||
- **Transcodage à la volée** : Option FFmpeg pour convertir les .mkv incompatibles vers .mp4.
|
||||
- **Bot de Notification** : Intégration Telegram/Discord pour être alerté dès qu'un épisode de la watchlist est téléchargé.
|
||||
- **Multi-Utilisateurs Réel** : Bibliothèques et historiques de lecture totalement isolés par compte.
|
||||
- **Support des Sous-titres Externes** : Upload de fichiers de sous-titres personnalisés pour le streaming.
|
||||
|
||||
## 📝 Licence
|
||||
|
||||
Ce projet est à usage éducatif uniquement. Respectez les droits d'auteur et les lois locales.
|
||||
|
||||
## ⚠️ Avertissement
|
||||
|
||||
Ce logiciel est destiné à un usage personnel et éducatif. Les utilisateurs sont responsables de vérifier qu'ils ont le droit de télécharger du contenu protégé par des droits d'auteur dans leur juridiction.
|
||||
- Ce projet est à usage **éducatif et personnel** uniquement.
|
||||
- Respectez les droits d'auteur et les conditions d'utilisation des sites sources.
|
||||
- Ne partagez jamais votre `JWT_SECRET_KEY` en production.
|
||||
|
||||
---
|
||||
|
||||
**Version actuelle : 2.3**
|
||||
**Dernière mise à jour : Mars 2026**
|
||||
**Développé avec ❤️ pour la communauté anime**
|
||||
|
||||
*Version actuelle : 2.2*
|
||||
*Dernière mise à jour : Février 2026*
|
||||
|
||||
Reference in New Issue
Block a user