magiastream 1.0.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. magiastream-1.0.0/.github/workflows/ci.yml +49 -0
  2. magiastream-1.0.0/.gitignore +47 -0
  3. magiastream-1.0.0/LICENSE +21 -0
  4. magiastream-1.0.0/PKG-INFO +138 -0
  5. magiastream-1.0.0/README.md +103 -0
  6. magiastream-1.0.0/docs/PLAN_DEVELOPPEMENT.md +226 -0
  7. magiastream-1.0.0/magia_stream/__init__.py +3 -0
  8. magiastream-1.0.0/magia_stream/browser.py +199 -0
  9. magiastream-1.0.0/magia_stream/cache.py +150 -0
  10. magiastream-1.0.0/magia_stream/cli.py +688 -0
  11. magiastream-1.0.0/magia_stream/config.py +138 -0
  12. magiastream-1.0.0/magia_stream/downloader.py +426 -0
  13. magiastream-1.0.0/magia_stream/exceptions.py +19 -0
  14. magiastream-1.0.0/magia_stream/models.py +41 -0
  15. magiastream-1.0.0/magia_stream/scraper.py +1190 -0
  16. magiastream-1.0.0/magia_stream/utils.py +151 -0
  17. magiastream-1.0.0/patch_scraper.py +77 -0
  18. magiastream-1.0.0/patch_scraper_dropdown.py +88 -0
  19. magiastream-1.0.0/pyproject.toml +64 -0
  20. magiastream-1.0.0/requirements.txt +10 -0
  21. magiastream-1.0.0/scripts/setup.sh +24 -0
  22. magiastream-1.0.0/test_fetch_html.py +11 -0
  23. magiastream-1.0.0/test_interactive.py +8 -0
  24. magiastream-1.0.0/test_pw_search.py +23 -0
  25. magiastream-1.0.0/test_search.py +7 -0
  26. magiastream-1.0.0/test_search_debug.py +99 -0
  27. magiastream-1.0.0/test_search_debug2.py +4 -0
  28. magiastream-1.0.0/test_search_real.py +15 -0
  29. magiastream-1.0.0/tests/__init__.py +1 -0
  30. magiastream-1.0.0/tests/test_cli.py +83 -0
  31. magiastream-1.0.0/tests/test_config.py +40 -0
  32. magiastream-1.0.0/tests/test_scraper.py +26 -0
  33. magiastream-1.0.0/tests/test_scraper_browser_mock.py +53 -0
  34. magiastream-1.0.0/tests/test_utils.py +47 -0
  35. magiastream-1.0.0/tools/find_first_ep.py +124 -0
  36. magiastream-1.0.0/tools/find_first_ep_advanced.py +117 -0
  37. magiastream-1.0.0/tools/iframe_inspector.py +213 -0
  38. magiastream-1.0.0/tools/resolve_vidmoly.py +245 -0
@@ -0,0 +1,49 @@
1
+ name: MagiaStream CI
2
+
3
+ on:
4
+ push:
5
+ branches: [ "master", "main" ]
6
+ pull_request:
7
+ branches: [ "master", "main" ]
8
+
9
+ jobs:
10
+ build-and-lint:
11
+ runs-on: ubuntu-latest
12
+ strategy:
13
+ matrix:
14
+ python-version: ["3.10", "3.11", "3.12"]
15
+
16
+ steps:
17
+ - uses: actions/checkout@v4
18
+
19
+ - name: Setup Python ${{ matrix.python-version }}
20
+ uses: actions/setup-python@v5
21
+ with:
22
+ python-version: ${{ matrix.python-version }}
23
+ cache: 'pip'
24
+
25
+ - name: Install dependencies
26
+ run: |
27
+ python -m pip install --upgrade pip
28
+ pip install -e .[dev]
29
+
30
+ - name: Run Ruff Format Check
31
+ run: |
32
+ python -m ruff format --check magia_stream/
33
+
34
+ - name: Run Ruff Lint Check
35
+ run: |
36
+ python -m ruff check magia_stream/
37
+
38
+ - name: Run Mypy Type Checking
39
+ run: |
40
+ python -m mypy magia_stream/
41
+
42
+ - name: Run Pytest
43
+ run: |
44
+ python -m pytest tests/
45
+
46
+ - name: Build Wheel (Dry-run packaging)
47
+ run: |
48
+ pip install build
49
+ python -m build --wheel
@@ -0,0 +1,47 @@
1
+ # Python
2
+ __pycache__/
3
+ *.py[cod]
4
+ *.pyo
5
+ *.pyd
6
+ *.so
7
+ .build/
8
+ dist/
9
+ build/
10
+ *.egg-info/
11
+ .pytest_cache/
12
+ .mypy_cache/
13
+ .ruff_cache/
14
+ .coverage
15
+ coverage.xml
16
+ htmlcov/
17
+
18
+ # Virtual environments
19
+ venv/
20
+ .venv/
21
+ env/
22
+ ENV/
23
+
24
+ # Environment variables
25
+ .env
26
+ .env.*
27
+
28
+ # IDE
29
+ .vscode/
30
+ .idea/
31
+
32
+ # OS
33
+ .DS_Store
34
+ Thumbs.db
35
+
36
+ # Application artifacts
37
+ *.mp4
38
+ *.tmp
39
+ *.log
40
+ downloads/
41
+ *.sqlite
42
+ venv/
43
+ .env.local
44
+ .env.test
45
+ .cache/
46
+ /.venv
47
+ .playwright/
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,138 @@
1
+ Metadata-Version: 2.4
2
+ Name: magiastream
3
+ Version: 1.0.0
4
+ Summary: Un CLI industriel, résilient et interactif pour scraper et télécharger des flux HLS (animes/vidéos).
5
+ Project-URL: Homepage, https://github.com/Dilane17/MagiaStream
6
+ Project-URL: Repository, https://github.com/Dilane17/MagiaStream.git
7
+ Project-URL: Bug Tracker, https://github.com/Dilane17/MagiaStream/issues
8
+ Author-email: dylankode <ahouandjinougael733@gmail.com>
9
+ License-File: LICENSE
10
+ Keywords: anime,cli,downloader,hls,magiastream,playwright,scraper
11
+ Classifier: Development Status :: 5 - Production/Stable
12
+ Classifier: Environment :: Console
13
+ Classifier: Intended Audience :: End Users/Desktop
14
+ Classifier: License :: OSI Approved :: MIT License
15
+ Classifier: Operating System :: OS Independent
16
+ Classifier: Programming Language :: Python :: 3
17
+ Classifier: Programming Language :: Python :: 3.10
18
+ Classifier: Programming Language :: Python :: 3.11
19
+ Classifier: Programming Language :: Python :: 3.12
20
+ Classifier: Topic :: Internet :: WWW/HTTP
21
+ Classifier: Topic :: Multimedia :: Video
22
+ Requires-Python: >=3.10
23
+ Requires-Dist: playwright>=1.40.0
24
+ Requires-Dist: python-dotenv>=1.0.0
25
+ Requires-Dist: questionary>=2.0.1
26
+ Requires-Dist: requests>=2.31.0
27
+ Requires-Dist: rich>=13.0.0
28
+ Requires-Dist: typer[all]>=0.9.0
29
+ Provides-Extra: dev
30
+ Requires-Dist: mypy>=1.9.0; extra == 'dev'
31
+ Requires-Dist: pytest-mock>=3.12.0; extra == 'dev'
32
+ Requires-Dist: pytest>=8.0.0; extra == 'dev'
33
+ Requires-Dist: ruff>=0.3.0; extra == 'dev'
34
+ Description-Content-Type: text/markdown
35
+
36
+ # MagiaStream
37
+
38
+ MagiaStream est un orchestrateur de téléchargement CLI avancé en Python 3.14+, spécialement conçu pour rechercher, scrapper et télécharger des séries d'animes de manière robuste et interactive.
39
+
40
+ ## ✨ Fonctionnalités Principales
41
+
42
+ - **Mode Interactif (Wizard)** : Plus besoin de taper des commandes longues ! L'interface interactive vous guide pas-à-pas (Recherche, Choix de la saison, Résolution, etc.).
43
+ - **Recherche AJAX Dynamique** : Le scraper Playwright reproduit un comportement humain pour exploiter la barre de recherche (support de l'autocomplétion) et esquiver les limitations anti-bot.
44
+ - **Téléchargement HLS Ultra-Résilient** : Construit au-dessus de `aria2c` et `ffmpeg`, le moteur de téléchargement gère parfaitement les connexions instables :
45
+ - **Reprise automatique** en cas de coupure (Code 5).
46
+ - **Barre de progression en direct** (grâce à `rich`).
47
+ - **Boucle auto-réparatrice** infinie qui s'acharne jusqu'à ce que tous les segments soient récupérés sans jamais recommencer à zéro.
48
+ - **Support Stealth & Proxies** : Intégration de serveurs Proxy, Playwright Stealth et manipulation d'User-Agents pour passer sous les radars des CDNs capricieux.
49
+
50
+ ## 🚀 Installation
51
+
52
+ ### 🌍 Compatibilité (Multiplateforme)
53
+ MagiaStream est 100% compatible avec **Windows, macOS et toutes les distributions Linux**.
54
+ Les seules exigences système à installer via votre gestionnaire de paquets (`apt`, `brew`, `winget`, etc.) sont :
55
+ - Python 3.10 ou supérieur
56
+ - `aria2c` (moteur de téléchargement ultra-rapide)
57
+ - `ffmpeg` (pour la fusion finale des vidéos)
58
+
59
+ ### Méthode 1 : Installation Globale avec `pipx` (Recommandée)
60
+ `pipx` est l'outil standard pour installer des applications CLI Python de manière globale, sans polluer le système.
61
+
62
+ ```bash
63
+ # 1. Installer pipx si vous ne l'avez pas déjà
64
+ python -m pip install --user pipx
65
+ python -m pipx ensurepath
66
+
67
+ # 2. Installer MagiaStream directement depuis le dépôt Git
68
+ pipx install git+https://github.com/Dilane17/MagiaStream.git
69
+
70
+ # 3. Finaliser l'installation (télécharge le navigateur fantôme nécessaire)
71
+ magia setup
72
+ ```
73
+
74
+ *(Note : Remplacez `ton-profil/MagiaStream.git` par l'URL réelle de votre dépôt Github).*
75
+
76
+ ### 🔄 Mise à jour Automatique
77
+ Mettre à jour MagiaStream vers la toute dernière version se fait en une seule commande, peu importe la méthode d'installation choisie :
78
+ ```bash
79
+ magia update
80
+ ```
81
+
82
+ ### Méthode 2 : Installation pour le Développement (Local)
83
+ Si vous souhaitez modifier le code ou contribuer au projet :
84
+
85
+ ```bash
86
+ # 1. Cloner et préparer l'environnement virtuel
87
+ git clone https://github.com/ton-profil/MagiaStream.git
88
+ cd MagiaStream
89
+ python -m venv venv
90
+ source venv/bin/activate
91
+
92
+ # 2. Installer le package et ses dépendances
93
+ pip install -e .
94
+
95
+ # 3. Installer le navigateur Playwright
96
+ playwright install chromium
97
+ ```
98
+
99
+ ## 🎮 Utilisation
100
+
101
+ La manière la plus simple et la plus recommandée d'utiliser MagiaStream est le **mode interactif**. Tapez simplement :
102
+
103
+ ```bash
104
+ magia
105
+ ```
106
+ *L'assistant s'ouvrira, vous demandera quelle série chercher, affichera les vrais résultats du menu déroulant (VF/VOSTFR) via les touches fléchées, et lancera le téléchargement.*
107
+
108
+ ### Mode CLI Classique
109
+
110
+ Si vous préférez écrire une commande complète d'un trait (pour des scripts ou des batchs) :
111
+
112
+ ```bash
113
+ # Télécharger toute la saison 1 en 720p
114
+ magia download --serie "wistoria-wand-and-sword-vf" --saison 1 --resolution 720p --all
115
+
116
+ # Télécharger uniquement l'épisode 3
117
+ magia download --serie "wistoria-wand-and-sword-vf" --saison 1 --episode 3 --resolution 1080p
118
+
119
+ # Télécharger de l'épisode 5 à 12
120
+ magia download --serie "wistoria-wand-and-sword-vf" --saison 1 --range "5-12"
121
+ ```
122
+
123
+ ## ⚙️ Configuration
124
+
125
+ MagiaStream utilise un fichier `.env` pour stocker sa configuration.
126
+ Copiez le fichier d'exemple :
127
+ ```bash
128
+ cp .env.example .env
129
+ ```
130
+ Paramètres importants :
131
+ - `PROXY_URL` : Un proxy pour contourner d'éventuels ban d'IP.
132
+ - `TIMEOUT_SECONDS` : Temps d'attente maximum pour les requêtes web.
133
+ - `HEADLESS` : Mettez `False` pour voir le navigateur fantôme travailler en arrière-plan.
134
+
135
+ ## 🛠️ À propos du moteur de téléchargement
136
+
137
+ Le gestionnaire de téléchargement a été optimisé pour les **réseaux très instables**.
138
+ Plutôt que d'abandonner lorsqu'un CDN étrangle la connexion ou qu'une micro-coupure survient, MagiaStream isole les segments échoués et relance automatiquement `aria2c` en boucle toutes les 5 secondes jusqu'au succès total.
@@ -0,0 +1,103 @@
1
+ # MagiaStream
2
+
3
+ MagiaStream est un orchestrateur de téléchargement CLI avancé en Python 3.14+, spécialement conçu pour rechercher, scrapper et télécharger des séries d'animes de manière robuste et interactive.
4
+
5
+ ## ✨ Fonctionnalités Principales
6
+
7
+ - **Mode Interactif (Wizard)** : Plus besoin de taper des commandes longues ! L'interface interactive vous guide pas-à-pas (Recherche, Choix de la saison, Résolution, etc.).
8
+ - **Recherche AJAX Dynamique** : Le scraper Playwright reproduit un comportement humain pour exploiter la barre de recherche (support de l'autocomplétion) et esquiver les limitations anti-bot.
9
+ - **Téléchargement HLS Ultra-Résilient** : Construit au-dessus de `aria2c` et `ffmpeg`, le moteur de téléchargement gère parfaitement les connexions instables :
10
+ - **Reprise automatique** en cas de coupure (Code 5).
11
+ - **Barre de progression en direct** (grâce à `rich`).
12
+ - **Boucle auto-réparatrice** infinie qui s'acharne jusqu'à ce que tous les segments soient récupérés sans jamais recommencer à zéro.
13
+ - **Support Stealth & Proxies** : Intégration de serveurs Proxy, Playwright Stealth et manipulation d'User-Agents pour passer sous les radars des CDNs capricieux.
14
+
15
+ ## 🚀 Installation
16
+
17
+ ### 🌍 Compatibilité (Multiplateforme)
18
+ MagiaStream est 100% compatible avec **Windows, macOS et toutes les distributions Linux**.
19
+ Les seules exigences système à installer via votre gestionnaire de paquets (`apt`, `brew`, `winget`, etc.) sont :
20
+ - Python 3.10 ou supérieur
21
+ - `aria2c` (moteur de téléchargement ultra-rapide)
22
+ - `ffmpeg` (pour la fusion finale des vidéos)
23
+
24
+ ### Méthode 1 : Installation Globale avec `pipx` (Recommandée)
25
+ `pipx` est l'outil standard pour installer des applications CLI Python de manière globale, sans polluer le système.
26
+
27
+ ```bash
28
+ # 1. Installer pipx si vous ne l'avez pas déjà
29
+ python -m pip install --user pipx
30
+ python -m pipx ensurepath
31
+
32
+ # 2. Installer MagiaStream directement depuis le dépôt Git
33
+ pipx install git+https://github.com/Dilane17/MagiaStream.git
34
+
35
+ # 3. Finaliser l'installation (télécharge le navigateur fantôme nécessaire)
36
+ magia setup
37
+ ```
38
+
39
+ *(Note : Remplacez `ton-profil/MagiaStream.git` par l'URL réelle de votre dépôt Github).*
40
+
41
+ ### 🔄 Mise à jour Automatique
42
+ Mettre à jour MagiaStream vers la toute dernière version se fait en une seule commande, peu importe la méthode d'installation choisie :
43
+ ```bash
44
+ magia update
45
+ ```
46
+
47
+ ### Méthode 2 : Installation pour le Développement (Local)
48
+ Si vous souhaitez modifier le code ou contribuer au projet :
49
+
50
+ ```bash
51
+ # 1. Cloner et préparer l'environnement virtuel
52
+ git clone https://github.com/ton-profil/MagiaStream.git
53
+ cd MagiaStream
54
+ python -m venv venv
55
+ source venv/bin/activate
56
+
57
+ # 2. Installer le package et ses dépendances
58
+ pip install -e .
59
+
60
+ # 3. Installer le navigateur Playwright
61
+ playwright install chromium
62
+ ```
63
+
64
+ ## 🎮 Utilisation
65
+
66
+ La manière la plus simple et la plus recommandée d'utiliser MagiaStream est le **mode interactif**. Tapez simplement :
67
+
68
+ ```bash
69
+ magia
70
+ ```
71
+ *L'assistant s'ouvrira, vous demandera quelle série chercher, affichera les vrais résultats du menu déroulant (VF/VOSTFR) via les touches fléchées, et lancera le téléchargement.*
72
+
73
+ ### Mode CLI Classique
74
+
75
+ Si vous préférez écrire une commande complète d'un trait (pour des scripts ou des batchs) :
76
+
77
+ ```bash
78
+ # Télécharger toute la saison 1 en 720p
79
+ magia download --serie "wistoria-wand-and-sword-vf" --saison 1 --resolution 720p --all
80
+
81
+ # Télécharger uniquement l'épisode 3
82
+ magia download --serie "wistoria-wand-and-sword-vf" --saison 1 --episode 3 --resolution 1080p
83
+
84
+ # Télécharger de l'épisode 5 à 12
85
+ magia download --serie "wistoria-wand-and-sword-vf" --saison 1 --range "5-12"
86
+ ```
87
+
88
+ ## ⚙️ Configuration
89
+
90
+ MagiaStream utilise un fichier `.env` pour stocker sa configuration.
91
+ Copiez le fichier d'exemple :
92
+ ```bash
93
+ cp .env.example .env
94
+ ```
95
+ Paramètres importants :
96
+ - `PROXY_URL` : Un proxy pour contourner d'éventuels ban d'IP.
97
+ - `TIMEOUT_SECONDS` : Temps d'attente maximum pour les requêtes web.
98
+ - `HEADLESS` : Mettez `False` pour voir le navigateur fantôme travailler en arrière-plan.
99
+
100
+ ## 🛠️ À propos du moteur de téléchargement
101
+
102
+ Le gestionnaire de téléchargement a été optimisé pour les **réseaux très instables**.
103
+ Plutôt que d'abandonner lorsqu'un CDN étrangle la connexion ou qu'une micro-coupure survient, MagiaStream isole les segments échoués et relance automatiquement `aria2c` en boucle toutes les 5 secondes jusqu'au succès total.
@@ -0,0 +1,226 @@
1
+ # PLAN_DEVELOPPEMENT — MagiaStream
2
+
3
+ Document pragmatique et phasé pour achever et produire une v1 de `MagiaStream`.
4
+
5
+ ---
6
+
7
+ ## Résumé de l'état actuel (audit rapide)
8
+
9
+ - `voiranime_downloader/` : package principal
10
+ - `__init__.py` : contient `__version__ = "0.1.0"`.
11
+ - `cli.py` : CLI Typer minimal avec commande `download` et options `--serie`, `--saison`, `--episode`, `--resolution`. Initialise logging via `setup_logging()` puis orchestre `Scraper` et `Downloader`.
12
+ - `scraper.py` : classe `Scraper` dataclass avec `search_episode()` non implémentée (lève `ScraperError`).
13
+ - `downloader.py` : classe `Downloader` dataclass qui appelle le scraper, construit un nom de fichier et retourne un chemin simulé (pas d'appel réel à aria2c).
14
+ - `config.py` : dataclass `Config` avec `BASE_URL`, `output_dir`, `temp_dir`, `user_agent`, `timeout_seconds`.
15
+ - `utils.py` : `setup_logging()` et `ensure_directory()` simples.
16
+ - `exceptions.py` : exceptions métier (`MagiaStreamError`, `ScraperError`, `DownloadError`).
17
+
18
+ - `tests/` : test unitaire initial basé sur `unittest` (`tests/test_scraper.py`) qui vérifie que `Scraper.search_episode` lève `ScraperError`.
19
+ - `requirements.txt` : liste basique (`playwright`, `typer[all]`, `rich`, `python-dotenv`, `tqdm`).
20
+ - `.gitignore`, `README.md`, `pyproject.toml` : présents ; `pyproject.toml` déclare le script `voiranime = "voiranime_downloader.cli:main"`.
21
+
22
+ ### Résumé : ce qui fonctionne
23
+
24
+ - Structure initiale cohérente ; tests unitaires basiques passent.
25
+ - Typage moderne (annotations), utilisation de Typer et Rich.
26
+
27
+ ### Manquants / limites immédiates
28
+
29
+ - `Scraper` non implémenté (aucune interaction Playwright / HTTP).
30
+ - Aucun gestionnaire d'authentification, de parsing .m3u8, ni de gestion d'iframes/anti-bot.
31
+ - `Downloader` ne lance pas `aria2c` ni la gestion de reprise / multi-connexion.
32
+ - Pas de parsing `.env` ni configuration centralisée via `python-dotenv`.
33
+ - Logging basique ; pas de rotation, pas de niveau configuré via fichier/env.
34
+ - Aucun test d'intégration, pas de CI, pas de packaging final (wheel, tests automatisés).
35
+ - `pyproject.toml` a `dependencies = []` (les dépendances ne sont pas inscrites dans `pyproject`), à corriger si on veut publier.
36
+ - README mentionne `voiranime` mais le nom du package est `MagiaStream` — cohérence mineure à ajuster.
37
+
38
+ ### Bilan d'exécution au 2026-07-19
39
+
40
+ - Terminé : `Phase 0`, `Phase 1`, `Phase 2`, `Phase 3`, `Phase 4`, `Phase 5`, `Phase 6`.
41
+ - En cours : `Phase 7` (Futures fonctionnalités Optionnelles).
42
+ - Non démarré : `Phase 7`.
43
+ - Point important : Le pipeline de téléchargement et l'orchestration industrielle (mode batch JSON, commandes list/search/cleanup, partage de contexte Playwright, rattrapage d'erreurs) sont désormais 100% opérationnels.
44
+
45
+ ---
46
+
47
+ ## Observations techniques et recommandations rapides
48
+
49
+ - Garder la séparation `Scraper` (récupération) vs `Downloader` (transfert) vs CLI.
50
+ - Prévoir un composant `http`/`browser` qui encapsule Playwright, gestion des headers, proxies et retry.
51
+ - Stocker la configuration en priorité dans `.env` + `Config` qui hydrate depuis l'environnement.
52
+ - Utiliser `subprocess.run` ou `asyncio.create_subprocess_exec` pour appeler `aria2c` et capter la sortie (progression). Préférer `aria2c` en mode `--enable-rpc`/`--input-file` pour listes longues.
53
+ - Ajouter des métriques/logs structurés (JSON) pour faciliter debug en production.
54
+
55
+ ---
56
+
57
+ ## Actions réalisées
58
+
59
+ - Lecture et vérification des fichiers listés ci-dessus.
60
+ - Tests unitaires basiques exécutés : OK.
61
+
62
+ ---
63
+
64
+ # Plan de développement par phases
65
+
66
+ Chaque phase liste tâches, priorités et edge-cases à anticiper. Dépendances = phases précédentes.
67
+
68
+ ### Phase 0 — Finalisation setup (priorité: critique) — TERMINÉ
69
+
70
+ Objectif : rendre le projet exécutable localement, reproductible et versionnable.
71
+ Tâches :
72
+
73
+ - Initialiser `venv` et documenter la commande d'activation dans `README.md`.
74
+ - Mettre à jour `requirements.txt` et `pyproject.toml` (répliquer deps dans `pyproject` si publication prévue).
75
+ - `git init` si non fait, ajouter `LICENSE` (MIT par défaut) et premiers commits.
76
+ - Ajouter `.env.example` avec variables : `BASE_URL`, `ARIA2C_PATH`, `OUTPUT_DIR`, `TIMEOUT`, `PLAYWRIGHT_BROWSERS`.
77
+ - Ajouter script simple `scripts/setup.sh` (optionnel) pour apt/dnf deps: `aria2`, `libnss3`, `libatk1.0`, etc. (Playwright deps).
78
+ - Vérifier `playwright install --with-deps chromium` dans README.
79
+
80
+ Edge-cases : utilisateur sans `aria2c`, sans droits root, version Python <3.13.
81
+ Dépendances: none.
82
+
83
+ ### Phase 1 — Configuration & Utils (priorité: haute) — TERMINÉ (2026-07-18)
84
+
85
+ Note: Phase 1 est marquée comme terminée. Le projet a subi des corrections de packaging, nettoyage legacy et ajout de tests unitaires de base. Ready for Phase 2 after fixes.
86
+
87
+ Objectif : robustifier config et utilitaires transverses.
88
+ Tâches :
89
+
90
+ - Charger `.env` via `python-dotenv` dans `Config` (méthode de classe `from_env()` et validation zod-like simple).
91
+ - Améliorer `utils.setup_logging()` : support niveau via env, fichier `LOG_LEVEL`, `RotatingFileHandler` optionnel, JSON formatter optionnel.
92
+ - Ajouter utilitaires `retry` (backoff exponentiel) configurable (utiliser `tenacity` si acceptable, sinon implémenter petit wrapper).
93
+ - Installer gestion d'horodatage/format uniforme et gestion `--verbose` dans CLI.
94
+ - Ajouter utilitaires pour gestion de chemins (safe filename sanitization) et housekeeping du `temp_dir`.
95
+
96
+ Edge-cases : chemins non écriturables, quotas disque, collisions de noms de fichiers.
97
+ Dépendances: Phase 0.
98
+
99
+ **Statut actuel** : Phase 2 terminée. Le scraper, le cache et la navigation Wistoria/voir-anime.to sont validés, avec cache hit confirmé sur deux passes consécutives.
100
+
101
+ ### Phase 2 — Scraper core (priorité: critique) — TERMINÉ
102
+
103
+ Objectif : implémenter le cœur du scraping robuste avec Playwright.
104
+ Tâches :
105
+
106
+ - Créer module `browser.py` encapsulant Playwright (sync ou async — choisir async si besoin de scalabilité).
107
+ - Créer module `browser.py` encapsulant Playwright (sync ou async — choisir async si besoin de scalabilité).
108
+ - Sub-tâches découvertes lors de l'audit :
109
+ - Ajouter une couche `network_monitor` pour intercepter requêtes et extraire `.m3u8`/tokens.
110
+ - Implémenter une stratégie de backoff et gestion des challenges JS (rejouer scripts dans le contexte Playwright).
111
+ - Écrire tests unitaires pour `Scraper` en mockant Playwright (utiliser pytest + pytest-asyncio + respx/vcrpy).
112
+ - Patterns : session persistante, reuse browser contexts, options headless, user-agent, proxy support.
113
+ - Techniques anti-bot : randomisation d'user-agent, injection de waits/stall, utilisation de `stealth` script si nécessaire.
114
+ - Navigation sur `https://voir-anime.to` : découvrir structure HTML, pages séries, pages épisodes.
115
+ - Implémenter `Scraper.search_episode()` :
116
+ - recherche série par nom (fuzzy matching), sélection de saison, liste d'épisodes ;
117
+ - normaliser les titres et retourner métadonnées : titre, saison, épisode, page_url, iframe_url(s), timestamp, available_resolutions.
118
+ - Persistance légère des métadonnées en cache (sqlite ou fichier JSON) pour réduire requests.
119
+
120
+ Edge-cases : Cloudflare/anti-bot (JS challenge), pages dynamiques chargées via XHR, pagination infinie, redirections.
121
+ Dépendances: Phase 1.
122
+
123
+ ### Phase 3 — Extraction des flux vidéo (priorité: élevée) — TERMINÉ
124
+
125
+ Objectif : extraire les URLs de flux (m3u8 / mp4) depuis pages/iframes et gérer anti-bot.
126
+ Tâches :
127
+
128
+ - Gérer les iframes : naviguer dans l'iframe (Playwright) et inspecter DOM/requests réseau.
129
+ - Intercepter requêtes réseau (route/response) pour localiser `.m3u8` ou `.mp4` et tokens temporaires.
130
+ - Parser les playlists `.m3u8` (variant playlists) pour choisir la piste correspondant à la résolution désirée.
131
+ - Résoudre signatures/jetons si fournis via JS (exécuter le script JS dans le contexte du navigateur si nécessaire).
132
+ - Enumérer cas: flux HLS chiffré (AES-128) — si chiffré, détecter et exposer message d'erreur ou tenter récupération des clés si accessible.
133
+
134
+ Edge-cases : liens temporaires (signed URLs), fragments chiffrés, tokens expirants, CORS, redirections 302.
135
+ Dépendances: Phase 2.
136
+
137
+ ### Phase 4 — Downloader (priorité: élevée) — TERMINÉ
138
+
139
+ Objectif : fiabiliser le téléchargement via `aria2c` avec reprise et multi-connexions.
140
+ Tâches :
141
+
142
+ - Implémenter wrapper `downloader/aria2_wrapper.py` : construction de la commande, options par défaut `-x 16 -s 16`, contrôle timeout, retry.
143
+ - Support pour `.m3u8` : si flux HLS, possibilité 1) utiliser `ffmpeg` pour downloader et remuxer; 2) utiliser `aria2c` sur segments quand possible; documenter les deux approches.
144
+ - Progression : parser la sortie `aria2c` et exposer progression en % vers `rich.progress`.
145
+ - Reprise : utiliser option `--continue`/`--allow-overwrite=false` et garder métadonnées `.aria2`/`.tmp` en `temp_dir`.
146
+ - Organisation répertoires : `{output}/{serie}/Saison {saison}/{serie}.s{s:02d}e{e:02d}.{resolution}.mp4`.
147
+
148
+ Edge-cases : quotas de connexion, serveurs limitant shards, fichiers incomplets, DRM/HLS chiffré.
149
+ Dépendances: Phase 3, Phase 1.
150
+
151
+ **Statut actuel** : TERMINÉ. Le downloader propage désormais les en-têtes navigateur, parse les manifestes HLS via Python pour contourner les erreurs 403, télécharge les segments manquants via aria2c, gère la reprise locale intelligente (skip), et concatène via ffmpeg sans ré-encodage.
152
+
153
+ ### Phase 5 — CLI avancée (priorité: moyenne) — TERMINÉ
154
+
155
+ Objectif : rendre le CLI complet et ergonomique pour workflows courants.
156
+ Tâches :
157
+
158
+ - Étendre `cli.py` : options `--range` (ex: `1-12`), `--all` pour télécharger toute une saison, `--parallel` pour télécharger plusieurs séries/épisodes.
159
+ - Ajouter commandes : `list-episodes`, `search`, `resume`, `cleanup`, `config show`.
160
+ - Intégrer `rich` pour sorties colorées et `prompt` pour confirmation.
161
+ - Support d'un fichier d'entrée (YAML/JSON) pour batch jobs.
162
+
163
+ Edge-cases : gestion des interruptions (SIGINT), verrouillage de dossier pour éviter écritures concurrentes.
164
+ Dépendances: Phase 4.
165
+
166
+ **Statut actuel** : TERMINÉ. Le CLI dispose désormais des commandes d'utilité (list, search, cleanup) et d'un orchestrateur `batch` lisant du JSON avec gestion de contexte Playwright partagé, tolérance aux pannes et interruptions propres.
167
+
168
+ ### Phase 6 — Gestion erreurs, tests, packaging (priorité: haute) — TERMINÉ
169
+
170
+ Objectif : durcir la solution et rendre le build repoducible.
171
+ Tâches :
172
+
173
+ - Tests : ajouter tests unitaires pour `utils`, mocks pour `browser`/Playwright, tests d'intégration limités (optionnels) via fixtures (vcrpy/ad-hoc mocking).
174
+ - CI : config GitHub Actions — lint (ruff/flake8), type-check (mypy), tests, build wheel, publish on tag.
175
+ - Gestion erreurs : erreurs sûres remontées vers le CLI, logs structurés et codes de sortie cohérents.
176
+ - Packaging : finaliser `pyproject.toml` (mettre `dependencies`), build `wheel`, ajouter `entry_points` si nécessaire.
177
+
178
+ Edge-cases : secrets exposés dans logs, tests flakys à cause de JS/temps réseau.
179
+ Dépendances: Phases 0–5.
180
+
181
+ **Statut actuel** : TERMINÉ. Le projet dispose d'un packaging PEP 621 (Hatchling), d'un typage Mypy strict, d'un formatage Ruff, de tests automatisés (Pytest avec Mocking), et d'une pipeline CI/CD GitHub Actions pour garantir sa pérennité.
182
+
183
+ ### Phase 7 — Features futures (priorité: basse) — EN COURS
184
+
185
+ Objectif : roadmap pour évolutions non bloquantes.
186
+ Tâches :
187
+
188
+ - Multi-séries / file d'attente (queue) et persistence (sqlite/redis).
189
+ - Notifications (desktop, email, webhook) à la fin du job.
190
+ - Web UI léger pour orchestrer les téléchargements (FastAPI + UI minimal).
191
+ - Support multi-sources (autres sites) via adaptateurs `site_adapter`.
192
+ - Téléchargement distribué (worker pattern).
193
+
194
+ Edge-cases : sécurité des webhooks, scalabilité, licences légales.
195
+
196
+ ---
197
+
198
+ ## Dépendances entre phases (rappel synthétique)
199
+
200
+ - Phase 0 → Phase 1 (config & utils nécessaires pour tout le reste)
201
+ - Phase 1 → Phase 2 (scraper s'appuie sur config & utils)
202
+ - Phase 2 → Phase 3 (extraction flux dépend du navigateur)
203
+ - Phase 3 → Phase 4 (downloader a besoin des URLs de flux)
204
+ - Phase 4 → Phase 5 (CLI avancée orchestre le downloader)
205
+ - Phase 5 → Phase 6 (tests/packaging après fonctionnalités)
206
+
207
+ ---
208
+
209
+ ## Checklist opérationnelle et KPI de succès
210
+
211
+ - Script d'installation fonctionnel (`venv`, `pip install`, `playwright install`): success
212
+ - `Scraper.search_episode` retourne métadonnées pour 80% des séries ciblées (mesure initiale)
213
+ - Téléchargement `aria2c` stable pour fichiers >100MB avec reprise
214
+ - Tests unitaires couvrant >60% du core non-IO, CI green
215
+
216
+ ---
217
+
218
+ ## Annexes / notes pratiques
219
+
220
+ - Respect légal : vérifier les CGU des sources et éviter redistribution non autorisée.
221
+ - Sécurité : ne pas committer `.env` ni clés API; utiliser `.env.example`.
222
+ - Playwright stealth : ne pas utiliser de librairies propriétaires risquant des licences non compatibles.
223
+
224
+ ---
225
+
226
+ Fin du plan.
@@ -0,0 +1,3 @@
1
+ """MagiaStream package principal."""
2
+
3
+ __version__ = "0.1.0"