# Restructuration des Downloaders - Résumé ## 🎯 Objectif Accompli Restructuration complète du système de downloaders avec une distinction claire entre: - **Sites d'anime** (catalogues avec métadonnées) - **Players vidéo** (hébergement de fichiers) ## 📊 Nouvelle Structure ``` app/downloaders/ ├── __init__.py # Factory principal (get_downloader) ├── base.py # BaseDownloader (classe racine) │ ├── anime_sites/ # 🎌 Sites d'anime (4 downloaders) │ ├── __init__.py # Factory: get_anime_site() │ ├── base.py # BaseAnimeSite │ ├── animesama.py # Anime-Sama │ ├── nekosama.py # Neko-Sama │ ├── animeultime.py # Anime-Ultime │ └── vostfree.py # Vostfree │ └── video_players/ # 🎬 Players vidéo (8 downloaders) ├── __init__.py # Factory: get_video_player() ├── base.py # BaseVideoPlayer ├── doodstream.py # Doodstream ├── sibnet.py # Sibnet ├── vidmoly.py # VidMoly (avec support M3U8 + target_filename) ├── sendvid.py # SendVid (avec target_filename) ├── lpayer.py # Lpayer ├── unfichier.py # 1fichier ├── uptobox.py # Uptobox └── rapidfile.py # Rapidfile ``` ## ✨ Changements Clés ### 1. Classes de Base Spécialisées **BaseVideoPlayer** (`video_players/base.py`): - Pour les hébergeurs de fichiers vidéo - Méthode clé: `get_download_link(url, target_filename=None)` - Supporte le paramètre optionnel `target_filename` (VidMoly, SendVid) - Gère l'extraction d'URL de téléchargement direct **BaseAnimeSite** (`anime_sites/base.py`): - Pour les sites de streaming anime - Méthodes clés: - `search_anime(query, lang)` - Recherche dans le catalogue - `get_episodes(anime_url, lang)` - Liste des épisodes - `get_anime_metadata(anime_url)` - Métadonnées riches - `get_download_link(url)` - URL du player vidéo ### 2. Preservation des Spécificités ✅ **VidMoly**: Toutes ses spécificités préservées - Support M3U8 → MP4 conversion - Playwright network interception - Multi-domaines (.biz, .to, .org) - Paramètre `target_filename` ✅ **SendVid**: Paramètre `target_filename` préservé ✅ **Tous les autres**: Aucune modification de fonctionnalité ### 3. Factory Pattern **Nouveau `get_downloader()` dans `__init__.py`**: ```python def get_downloader(url: str): # Essaye les sites anime d'abord anime_site = get_anime_site(url) if anime_site: return anime_site # Puis les players vidéo video_player = get_video_player(url) if video_player: return video_player # Fallback générique return GenericDownloader() ``` ## 🧪 Tests ✅ **23/23 tests passants** dans `tests/test_downloaders.py` ✅ **Imports mis à jour** pour utiliser la nouvelle structure ✅ **URL routing correct** pour tous les types ## 📈 Avantages 1. **Organisation claire**: Distinction évidente entre catalogues et hébergeurs 2. **Maintenabilité**: Ajouter un nouveau player ou site est plus intuitif 3. **Type safety**: Héritage spécifique avec méthodes appropriées 4. **Flexibilité**: Support des cas particuliers (VidMoly, SendVid) 5. **Backward compatibility**: L'API principale `get_downloader()` fonctionne toujours ## 🚀 Comment Ajouter un Nouveau Downloader ### Nouveau Player Vidéo: ```python # app/downloaders/video_players/myplayer.py from .base import BaseVideoPlayer class MyPlayerDownloader(BaseVideoPlayer): def can_handle(self, url: str) -> bool: return "myplayer.com" in url.lower() async def get_download_link(self, url: str, target_filename: str = None): # ... extraction logic ... return download_url, filename ``` ### Nouveau Site Anime: ```python # app/downloaders/anime_sites/mysite.py from .base import BaseAnimeSite class MyAnimeSiteDownloader(BaseAnimeSite): def can_handle(self, url: str) -> bool: return "myanime.site" in url.lower() async def search_anime(self, query: str, lang: str = "vostfr"): # ... search logic ... return anime_list async def get_episodes(self, anime_url: str, lang: str = "vostfr"): # ... episode listing logic ... return episode_list async def get_anime_metadata(self, anime_url: str): # ... metadata extraction ... return metadata async def get_download_link(self, url: str): # ... extract video player URL ... return player_url, title ``` ## ✅ Validation ```bash # Tests pytest tests/test_downloaders.py -v # 23/23 passed ✅ # Imports from app.downloaders import get_downloader # ✅ from app.downloaders.video_players import BaseVideoPlayer # ✅ from app.downloaders.anime_sites import BaseAnimeSite # ✅ # Routing get_downloader('https://doodstream.com/e/abc') # → DoodStreamDownloader ✅ get_downloader('https://anime-sama.si/naruto') # → AnimeSamaDownloader ✅ ``` ## 📝 Fichiers Modifiés **Nouveaux**: 18 fichiers - 2 classes de base (base.py) - 2 __init__.py avec factories - 12 downloaders migrés - 2 dossiers (anime_sites/, video_players/) **Supprimés**: 12 anciens fichiers dans `app/downloaders/` **Mis à jour**: - `app/downloaders/__init__.py` (factory principal) - `tests/test_downloaders.py` (imports) --- **Date**: 2026-01-24 **Statut**: ✅ Terminé et testé **Impact**: Aucune rupture de fonctionnalité