# Ohm Stream Downloader

**Application web complète pour rechercher, streamer et télécharger des animes, séries TV et films.**

Interface moderne (SPA-like) avec recherche unifiée, watchlist automatique, métadonnées enrichies, téléchargements parallèles et intégration Sonarr. Propulsée par FastAPI, SQLModel et une interface dynamique HTMX/Alpine.js.

## ✨ Fonctionnalités

### 🎬 Recherche & Streaming
- **Recherche unifiée** : Recherchez animes et séries TV simultanément via plusieurs sources.
- **Providers Anime** : Anime-Sama, Neko-Sama, Anime-Ultime, Vostfree, French-Manga.
- **Providers Séries** : FS7 (French-Stream), Zone-Telechargement.
- **Métadonnées riches** : Synopsis, genres, notes, studio via intégration Kitsu/MAL.
- **Streaming vidéo** : Lecteur **Plyr.io** intégré supportant plus de 15 hébergeurs.
- **Téléchargement flexible** : Épisode par épisode ou saison complète.

### 🔐 Authentification
- **Inscription / Connexion** : Système JWT avec tokens d'accès et de refresh.
- **Sécurité** : Clé secrète configurable, tokens expirables (24h access, 30j refresh).

### 📋 Watchlist & Automatisation
- **Suivi intelligent** : Ajoutez des titres à votre watchlist pour ne rater aucun épisode.
- **Auto-Download** : Téléchargement automatique des nouveaux épisodes dès leur parution.
- **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.

### ⭐ Favoris & Recommandations
- **Favoris** : Sauvegardez vos animes préférés avec tri et filtres.
- **Recommandations** : Suggestions basées sur les tendances et sorties récentes.
- **Sorties saisonnières** : Suivi des sorties anime (top, latest, seasonal).

### 🚀 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.

### ⚙️ Paramètres
- **Désactivation de providers** : Activez/désactivez les sources individuellement.
- **UI Settings** : Configuration de l'interface utilisateur.
- **Sonarr Config** : Configuration de l'intégration Sonarr avec mapping de séries.

## 🏗️ Architecture & Stack Technique

L'application repose sur une architecture moderne et robuste :
- **Backend** : Python 3.11+, **FastAPI** pour l'API asynchrone.
- **Base de Données** : **SQLModel** (SQLAlchemy + Pydantic) avec **SQLite**.
- **Migrations** : **Alembic** pour la gestion évolutive du schéma de données.
- **Frontend** : **HTMX** pour les interactions serveur, **Alpine.js** pour l'état client, **Vanilla CSS**.
- **Streaming** : **Plyr.io** pour une expérience de lecture fluide et moderne.
- **Authentification** : JWT via **python-jose** + **passlib/bcrypt**.

## 📁 Hébergeurs Supportés

| Type | Services Supportés |
| :--- | :--- |
| **Catalogues Anime** | Anime-Sama, Neko-Sama, Anime-Ultime, Vostfree, French-Manga |
| **Catalogues Séries** | FS7 (French-Stream), Zone-Telechargement |
| **Players/Hosts** | VidMoly, DoodStream, 1fichier, Uptobox, SendVid, Sibnet, Lplayer, Uqload, Rapidfile, LuLuvid, Smoothpre, Vidzy, OneUpload |

## 📊 État des Providers

| Provider | Type | Status |
| :--- | :--- | :--- |
| Anime-Sama | Anime | ✅ UP |
| Neko-Sama | Anime | ✅ UP |
| Anime-Ultime | Anime | ✅ UP |
| Vostfree | Anime | ✅ UP |
| French-Manga | Anime | ✅ UP |
| FS7 | Séries | ✅ UP |
| Zone-Telechargement | Séries | ✅ UP |

> Dernière vérification : Avril 2026

## 🚀 Installation & Configuration

### 1. Prérequis
- Python 3.11+
- Node.js (pour les tests optionnels uniquement)
- Playwright (requis pour l'extraction de certains lecteurs comme VidMoly)

### 2. Installation
```bash
# Cloner le repository
git clone https://git.lanro.eu/Roman/ohm_streaming.git
cd ohm_streaming

# Créer et activer l'environnement virtuel
python3 -m venv venv
source venv/bin/activate

# Installer les dépendances
pip install -r requirements.txt
pip install pydantic[email]  # Requis pour la validation des emails

# Initialisation Playwright (optionnel, pour l'extraction VidMoly)
playwright install chromium
```

### 3. Configuration
Créez un fichier `.env` à la racine du projet à partir du modèle :

```bash
cp .env.example .env
```

**Générez une clé secrète JWT sécurisée** (obligatoire, min. 32 caractères) :

```bash
python3 -c "import secrets; print(secrets.token_urlsafe(32))"
```

Editez le `.env` et ajoutez :
```env
JWT_SECRET_KEY=<la_clé_générée_ci_dessus>
```

> ⚠️ **Ne pas** définir `CORS_ORIGINS` dans le `.env` si vous utilisez les valeurs par défaut (format JSON requis, les valeurs par défaut du code suffisent).

### 4. Lancement
```bash
# Lancer l'application (Port 3000 par défaut)
source venv/bin/activate
uvicorn main:app --reload --host 0.0.0.0 --port 3000
```

Ou via le script fourni :
```bash
./run_app.sh
```

**Points d'accès :**
- Interface web : `http://localhost:3000/web`
- Documentation API : `http://localhost:3000/docs`
- Page de connexion : `http://localhost:3000/login`

## 🧪 Tests & Qualité

```bash
# Backend (Pytest)
pytest                          # Tous les tests
pytest -m "unit"                # Tests unitaires rapides

# Frontend (Vitest & Playwright)
npm install                     # Installer les dépendances dev
npm test                        # Tests unitaires JS (Vitest)
npx playwright test             # Tests E2E complets
```

## 🏗️ Structure du Projet

```
ohm_streaming/
├── main.py                  # Point d'entrée & Middleware FastAPI
├── app/
│   ├── downloaders/         # Logique d'extraction (Scraping multi-tier)
│   │   ├── anime_sama.py    # Downloader Anime-Sama
│   │   ├── anime_ultime.py  # Downloader Anime-Ultime
│   │   ├── neko_sama.py     # Downloader Neko-Sama
│   │   ├── vostfree.py      # Downloader Vostfree
│   │   ├── french_manga.py  # Downloader French-Manga
│   │   ├── fs7.py           # Downloader FS7
│   │   └── zone_telechargement.py  # Downloader Zone-TG
│   ├── models/              # Modèles SQLModel & Pydantic
│   ├── routers/             # Routes API modulaires (~40 endpoints)
│   ├── download_manager.py  # Moteur de téléchargement asynchrone
│   ├── watchlist.py         # Logique métier du suivi
│   ├── episode_checker.py   # Vérification automatique de nouveaux épisodes
│   ├── auto_download_scheduler.py  # Planificateur de téléchargements
│   ├── sonarr_handler.py    # Intégration Sonarr
│   ├── metadata_enrichment.py  # Enrichissement des métadonnées (Kitsu/MAL)
│   ├── recommendations.py   # Système de recommandations
│   ├── providers_manager.py # Gestion des providers (health check, activation)
│   └── database.py          # Configuration de la base de données
├── config/                  # Fichiers de configuration (Sonarr, mappings)
├── alembic/                 # Migrations de base de données
├── static/                  # Frontend (JS, CSS, Images)
├── templates/               # Vues Jinja2 (avec HTMX & Alpine.js)
├── tests/                   # Tests backend
├── scripts/                 # Scripts utilitaires
└── downloads/               # Répertoire par défaut des médias
```

## 🔧 Endpoints API Principaux

| Endpoint | Méthode | Description |
| :--- | :--- | :--- |
| `/api/auth/register` | POST | Création de compte |
| `/api/auth/login` | POST | Connexion (JWT) |
| `/api/auth/me` | GET | Profil utilisateur |
| `/api/anime/search?q=` | GET | Recherche multi-providers |
| `/api/series/search?q=` | GET | Recherche séries |
| `/api/anime/seasons?url=` | GET | Liste des saisons |
| `/api/anime/episodes?url=` | GET | Liste des épisodes |
| `/api/anime/download?url=` | POST | Lancer un téléchargement |
| `/api/anime/download-season?url=` | POST | Télécharger une saison complète |
| `/api/downloads` | GET | Liste des téléchargements |
| `/api/favorites` | GET | Liste des favoris |
| `/api/watchlist` | GET | Liste de la watchlist |
| `/api/providers/health` | GET | État des providers |
| `/api/settings` | GET | Configuration |
| `/api/sonarr/config` | GET/POST | Configuration Sonarr |

## 🐛 Problèmes Connus

- **Smoothpre** : L'extracteur de liens vidéo peut échouer si la structure de la page change côté serveur.
- **Sibnet filename** : Le nom de fichier généré peut contenir des caractères invalides issus de l'URL (à corriger dans la sanitisation du DownloadManager).
- **Anime-Ultime download** : La méthode `get_download_link()` a une incompatibilité de signature lors de l'appel par le routeur de téléchargement.
- **Table watchlist_settings** : La table SQLite n'est pas créée automatiquement au premier lancement (affiche un warning dans les logs mais n'empêche pas le fonctionnement).

## 📝 Licence & Sécurité

- Ce projet est à usage **éducatif et personnel** uniquement.
- Respectez les droits d'auteur et les conditions d'utilisation des sites sources.
- L'utilisation de ce logiciel est sous votre entière responsabilité.

---

**Version actuelle : 2.4**
**Dernière mise à jour : Avril 2026**
**Développé avec ❤️ pour la communauté anime**
