Fix the issue where groups would collapse but immediately reopen on next refresh:
Problem:
- Groups collapsed correctly but reopened after 1 second due to auto-refresh
- The toggleGroup function used classList.contains('collapsed') to check state
- But displayDownloads() regenerated HTML every second, losing the collapsed state
Solution:
- Add collapsedGroups Set to store which group IDs are collapsed
- Check collapsedGroups.has(groupId) instead of DOM class
- Save state in memory when toggling (add/delete from Set)
- Apply collapsed state when generating HTML (inline styles and CSS class)
- Groups now stay collapsed across auto-refresh cycles
The collapsed state persists:
- Across auto-refresh (every second)
- When filters change (commented out optional reset)
- Until user manually expands the group again
Ohm Stream Downloader
Application web complète pour télécharger des animes et fichiers depuis divers hébergeurs.
Interface moderne avec recherche d'anime, métadonnées enrichies, téléchargements parallèles et streaming vidéo.
✨ Fonctionnalités
🎬 Recherche et Téléchargement d'Animes
- Recherche unifiée : Recherchez sur 4 providers simultanément (Anime-Sama, Neko-Sama, Anime-Ultime, Vostfree)
- Métadonnées riches : Synopsis, genres, notes, année de sortie, studio, nombre d'épisodes, statut
- 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
📁 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)
🎥 Hébergeurs Vidéo Supportés
- VidMoly (vidmoly.to, vidmoly.com)
- SendVid (sendvid.com)
🚀 Gestion des Téléchargements
- Téléchargements parallèles : Jusqu'à 3 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
🌐 Interface Web
- Design moderne : Interface sombre avec gradients et animations
- Responsive : Fonctionne sur desktop et mobile
- Mise à jour automatique : Rafraîchissement chaque seconde
- Métadonnées visuelles : Affichage des informations anime avec icônes
🔌 API REST
- Endpoints REST : Intégration facile avec d'autres applications
- Documentation automatique : Swagger UI disponible
📋 Configuration Requise
- Python 3.8+
- pip
🚀 Installation
# Cloner le repository
git clone https://github.com/votre-user/Ohm_streaming.git
cd Ohm_streaming
# Créer l'environnement virtuel
python3 -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
# Installer les dépendances
pip install -r requirements.txt
# Lancer le serveur de développement
uvicorn main:app --reload --host 0.0.0.0 --port 3000
Accédez à l'interface : http://localhost:3000/web
📖 Utilisation
Interface Web
-
Onglet Recherche d'Anime :
- Entrez le nom d'un anime (ex: "Naruto", "One Piece")
- Sélectionnez la langue (VOSTFR ou VF)
- Cochez "Inclure les métadonnées" pour plus d'informations
- Cliquez sur "Rechercher"
- Sélectionnez un épisode et cliquez sur "Télécharger"
- Ou utilisez "Toute la saison" pour tout télécharger
-
Onglet Lien Direct :
- Collez un lien de téléchargement direct
- Cliquez sur "Télécharger"
-
Onglet Providers :
- Utilisez les onglets spécifiques à chaque provider
- Chaque onglet a ses propres options de recherche
API Endpoints
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 (paramètres: q, lang, include_metadata) |
| GET | /api/anime/metadata |
Obtenir les métadonnées d'un anime (paramètre: url) |
| GET | /api/anime/episodes |
Liste des épisodes d'un anime (paramètres: url, lang) |
| POST | /api/anime/download |
Télécharger un épisode |
| POST | /api/anime/download-season |
Télécharger toute une saison |
Streaming Vidéo
| Méthode | Endpoint | Description |
|---|---|---|
| GET | /video/{task_id} |
Stream une vidéo (support Range/seeking) |
| GET | /stream/{filename} |
Stream par nom de fichier |
| GET | /player/{task_id} |
Lecteur vidéo pour un téléchargement |
| GET | /watch/{filename} |
Lecteur vidéo par nom de fichier |
Système
| Méthode | Endpoint | Description |
|---|---|---|
| GET | / |
Informations sur l'API |
| GET | /api/providers |
Liste des providers supportés |
| GET | /health |
Vérifier l'état du serveur |
| GET | /web |
Interface web |
Exemples API
Rechercher un anime avec métadonnées :
curl "http://localhost:3000/api/anime/search?q=naruto&lang=vostfr&include_metadata=true"
Obtenir les épisodes d'un anime :
curl "http://localhost:3000/api/anime/episodes?url=https://anime-sama.si/catalogue/naruto/saison1/vostfr/&lang=vostfr"
Télécharger une saison complète :
curl -X POST "http://localhost:3000/api/anime/download-season?url=https://anime-sama.si/catalogue/naruto/saison1/vostfr/&lang=vostfr"
Créer un téléchargement direct :
curl -X POST http://localhost:3000/api/download \
-H "Content-Type: application/json" \
-d '{"url": "https://1fichier.com/?xxxxx"}'
🏗️ Structure du Projet
Ohm_streaming/
├── main.py # Application FastAPI & endpoints API
├── app/
│ ├── models/ # Modèles Pydantic
│ │ └── __init__.py # DownloadTask, AnimeMetadata, etc.
│ ├── downloaders/ # Downloaders par provider
│ │ ├── base.py # Classe BaseDownloader
│ │ ├── animesama.py # Anime-Sama (avec métadonnées)
│ │ ├── animeultime.py # Anime-Ultime (avec métadonnées)
│ │ ├── nekosama.py # Neko-Sama (avec métadonnées)
│ │ ├── vostfree.py # Vostfree (avec métadonnées)
│ │ ├── unfichier.py # 1fichier
│ │ ├── uptobox.py # Uptobox
│ │ ├── doodstream.py # Doodstream
│ │ ├── rapidfile.py # Rapidfile
│ │ ├── vidmoly.py # VidMoly
│ │ ├── sendvid.py # SendVid
│ │ └── __init__.py # Registry des downloaders
│ ├── providers.py # Configuration des providers
│ └── download_manager.py # Gestionnaire de file d'attente
├── downloads/ # Fichiers téléchargés
├── templates/
│ ├── index.html # Interface web principale
│ └── player.html # Lecteur vidéo
├── static/ # Fichiers statiques (CSS, JS, images)
└── requirements.txt # Dépendances Python
⚙️ Configuration
Modifiez ces paramètres dans main.py :
download_manager = DownloadManager(
download_dir="downloads", # Répertoire de stockage
max_parallel=3 # Téléchargements simultanés
)
🔧 Ajouter un Provider
Ajouter un Hébergeur de Fichiers
- Créez
app/downloaders/myhost.py:
from .base import BaseDownloader
from bs4 import BeautifulSoup
class MyHostDownloader(BaseDownloader):
def can_handle(self, url: str) -> bool:
return "myhost.com" in url.lower()
async def get_download_link(self, url: str) -> tuple[str, str]:
# Extraire le lien de téléchargement direct
response = await self.client.get(url)
soup = BeautifulSoup(response.text, 'lxml')
# ... logique d'extraction ...
return download_url, filename
- Ajoutez-le dans
app/providers.py:
FILE_HOSTS = {
# ...
"myhost": {
"name": "MyHost",
"domains": ["myhost.com"],
"icon": "📁",
"color": "#4ecdc4"
}
}
Ajouter un Provider Anime avec Métadonnées
- Créez le downloader avec les méthodes requises :
class MyAnimeDownloader(BaseDownloader):
async def search_anime(self, query: str, lang: str = "vostfr", include_metadata: bool = False):
# Implémenter la recherche
async def get_anime_metadata(self, anime_url: str) -> dict:
# Extraire: synopsis, genres, rating, release_year, studio, etc.
return {
'synopsis': '...',
'genres': ['Action', 'Aventure'],
'rating': '8.5/10',
'release_year': 2023,
'studio': 'Studio Name',
# ...
}
async def get_episodes(self, anime_url: str, lang: str = "vostfr"):
# Retourner la liste des épisodes
- Enregistrez-le dans
app/providers.pyetmain.py
🗺️ Roadmap / Plans Futurs
Version 2.2 - Système de Favoris ✅ (Terminé)
- Favoris : Sauvegarder les animes favoris avec métadonnées complètes
- API REST complète : 6 endpoints pour gérer les favoris
- Tri et filtrage : Par titre, rating, année, provider, genre
- Statistiques : Distribution par provider et genre
- Stockage persistant : Base JSON (favorites.json)
Version 2.3 - Base de Données & Authentification
- SQLite avec SQLAlchemy : Persistance complète des données
- Système d'authentification local :
- Inscription et connexion utilisateur
- Tokens JWT avec expiration (7 jours)
- Hachage de mot de passe bcrypt
- Préférences utilisateur personnalisables
- Profils utilisateurs :
- Table User : username, email, preferences, admin
- Historique de téléchargement par utilisateur
- Historique de visionnage (position, progression)
- Préférences : langue par défaut, thème, auto-download
- Rétrocompatibilité : Accès anonyme toujours possible
Nouveaux endpoints :
POST /api/auth/register- InscriptionPOST /api/auth/login- Connexion (JWT)GET /api/auth/me- Profil utilisateurPUT /api/auth/me/preferences- PréférencesGET /api/auth/me/download-history- HistoriqueGET /api/auth/me/watch-history- Visionnage
Version 2.4 - APIs Externes & Recommandations
- Intégration Jikan API (MyAnimeList) :
- Métadonnées enrichies (poster, notes, genres)
- Limitation de débit : 3 req/sec
- Intégration AniList API (GraphQL) :
- Recommandations basées sur l'historique
- Limitation de débit : 90 req/min
- Système de cache :
- Cache API dans la base de données
- TTL configurable (168h par défaut)
- Mécanisme de fallback (AniList → Jikan)
- Enrichissement automatique :
- Fusion des données providers + API externes
- [ [ ] Affichage des posters dans les résultats
Nouveaux endpoints :
GET /api/anime/metadata?enrich=true- Métadonnées enrichiesGET /api/recommendations- Suggestions personnalisées
Version 2.5 - Webhooks & Automatisation
- Support Sonarr Webhook :
POST /api/webhook/sonarr- Réception événements- Auto-téléchargement des nouveaux épisodes
- Vérification HMAC SHA256 (optionnel)
- Gestion des événements : Download, Rename, Delete
- Automatisations :
- Déclenchement automatique sur nouvel épisode
- Analyse des infos épisodes depuis Sonarr
- Mapping automatique vers les providers
Nouveaux endpoints :
POST /api/webhook/sonarr- Webhook principalPOST /api/webhook/test/sonarr- Test de payload
Version 2.6 - Gestion de Bibliothèque Avancée
- Bibliothèque personnelle : Gérer sa collection d'anime téléchargés
- Statistiques détaillées :
- Temps de visionnage total
- Espace disque utilisé
- Animes les plus regardés
- Graphiques de statistiques
- Marquage d'épisodes :
- Marquer épisodes comme vus/non vus
- Système de progression automatique
- Reprendre la lecture là où on s'est arrêté
- Listes de lecture : Créer des playlists personnalisées
- Notes personnelles : Noter les animes et laisser des commentaires
Version 2.7 - Qualité et Formats
- Sélection de qualité : Choisir entre 1080p, 720p, 480p
- Conversion automatique : Convertir en différents formats
- Compression : Réduire la taille des fichiers
- Extraction de sous-titres : Télécharger les subs automatiquement
- Multi-audio : Gérer les versions VF/VOSTFR
Version 3.0 - Fonctionnalités Sociales & Mobile
- Fonctionnalités sociales :
- Partage de listes avec amis
- Système de commentaires et avis
- Intégration Discord/Telegram (notifications)
- Mobile & PWA :
- Application mobile native iOS/Android
- Progressive Web App pour offline
- Chromecast/AirPlay support
- Interface optimisée mobile
Version 4.0 - Fonctionnalités Avancées
- Sauvegarde cloud : Sync avec Google Drive/Dropbox
- Streaming distant : Regarder partout
- Multi-utilisateurs : Profils et permissions
- API publique : API pour développeurs tiers
- Plugins : Système d'extensions
Améliorations Continues
- Performance : Optimisation du chargement et de l'interface
- Accessibilité : Support lecteur d'écran, clavier
- Tests automatisés : Suite de tests E2E
- Documentation : Guides d'utilisation et API
- Internationalisation : Support multilingue complet
🤝 Contribution
Les contributions sont les bienvenues !
- Fork le projet
- Créez une branche (
git checkout -b feature/AmazingFeature) - Commit (
git commit -m 'Add some AmazingFeature') - Push (
git push origin feature/AmazingFeature) - Ouvrez une Pull Request
📝 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.
📧 Support
Pour les bugs et suggestions :
- Ouvrez une issue sur GitHub
- Discutez avec la communauté
Développé avec ❤️ pour la communauté anime
Version actuelle : 2.1 Dernière mise à jour : Janvier 2026