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.
- magiastream-1.0.0/.github/workflows/ci.yml +49 -0
- magiastream-1.0.0/.gitignore +47 -0
- magiastream-1.0.0/LICENSE +21 -0
- magiastream-1.0.0/PKG-INFO +138 -0
- magiastream-1.0.0/README.md +103 -0
- magiastream-1.0.0/docs/PLAN_DEVELOPPEMENT.md +226 -0
- magiastream-1.0.0/magia_stream/__init__.py +3 -0
- magiastream-1.0.0/magia_stream/browser.py +199 -0
- magiastream-1.0.0/magia_stream/cache.py +150 -0
- magiastream-1.0.0/magia_stream/cli.py +688 -0
- magiastream-1.0.0/magia_stream/config.py +138 -0
- magiastream-1.0.0/magia_stream/downloader.py +426 -0
- magiastream-1.0.0/magia_stream/exceptions.py +19 -0
- magiastream-1.0.0/magia_stream/models.py +41 -0
- magiastream-1.0.0/magia_stream/scraper.py +1190 -0
- magiastream-1.0.0/magia_stream/utils.py +151 -0
- magiastream-1.0.0/patch_scraper.py +77 -0
- magiastream-1.0.0/patch_scraper_dropdown.py +88 -0
- magiastream-1.0.0/pyproject.toml +64 -0
- magiastream-1.0.0/requirements.txt +10 -0
- magiastream-1.0.0/scripts/setup.sh +24 -0
- magiastream-1.0.0/test_fetch_html.py +11 -0
- magiastream-1.0.0/test_interactive.py +8 -0
- magiastream-1.0.0/test_pw_search.py +23 -0
- magiastream-1.0.0/test_search.py +7 -0
- magiastream-1.0.0/test_search_debug.py +99 -0
- magiastream-1.0.0/test_search_debug2.py +4 -0
- magiastream-1.0.0/test_search_real.py +15 -0
- magiastream-1.0.0/tests/__init__.py +1 -0
- magiastream-1.0.0/tests/test_cli.py +83 -0
- magiastream-1.0.0/tests/test_config.py +40 -0
- magiastream-1.0.0/tests/test_scraper.py +26 -0
- magiastream-1.0.0/tests/test_scraper_browser_mock.py +53 -0
- magiastream-1.0.0/tests/test_utils.py +47 -0
- magiastream-1.0.0/tools/find_first_ep.py +124 -0
- magiastream-1.0.0/tools/find_first_ep_advanced.py +117 -0
- magiastream-1.0.0/tools/iframe_inspector.py +213 -0
- 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.
|