Pipeline local pour transformer YouTube, playlists et PDF en résumés Markdown propres avec Gemini.
input/ pour déposer les sources. output/ pour récupérer les résultats. prompts/ pour piloter le style.
git clone https://github.com/Insular2895/summarizer.git
cd summarizer
./runhelpAu premier lancement, ./runpdf et ./runyoutube créent automatiquement .venv et installent les dépendances de base.
Il reste une seule étape manuelle : ajouter ta clé Gemini dans .env.
Si .env n'existe pas encore, la première commande le crée depuis .env.example, puis te demande d'ajouter :
GEMINI_API_KEY=ta_cle_api_gemini.env est privé et ignoré par Git.
Optionnel, pour préparer les moteurs PDF avancés en local :
./runpdf --setup-engines
./runpdf --engines-statusEnsuite ./runpdf ... --engine smart active automatiquement le meilleur moteur disponible.
| Besoin | Commande |
|---|---|
| Menu interactif | ./summarizer |
| Voir l'aide simple | ./runhelp |
| Résumer un PDF | ./runpdf "input/pdf/mon-livre.pdf" |
| Résumer une vidéo | ./runyoutube "https://youtube.com/watch?v=..." |
| Résumer une playlist | ./runyoutube "https://youtube.com/playlist?list=..." |
| Lancer un fichier d'URLs | ./runyoutube --file input/youtube/urls.txt |
| Tester sans écrire | ./runpdf "input/pdf/mon-livre.pdf" --dry-run |
Toutes les variantes utiles sont dans COMMANDS.md.
Le menu interactif ./summarizer propose PDF, vidéo, playlist, batch, moteurs PDF, nettoyage cache et usage Gemini sans retenir les commandes.
Pour une correction future par une IA ou un assistant de code, le point d'entrée est AGENTS.md et le guide complet est dans AI_MAINTENANCE.md.
YouTube / PDF
-> extraction, transcription ou OCR
-> nettoyage texte / Markdown
-> résumé Gemini
-> Markdown final
-> export Graphipy-ready| Dossier | Rôle |
|---|---|
input/youtube/ |
URLs YouTube et playlists à traiter |
input/pdf/ |
PDF ou livres à analyser |
cache/ |
fichiers temporaires supprimables |
output/videos/ |
résumés vidéo |
output/books/ |
résumés PDF/livres |
output/graphipy_ready/ |
Markdown prêt pour Graphipy |
prompts/ |
prompts Gemini modifiables |
La V1 reste volontairement locale : pas de dashboard, pas de base de données, pas de SaaS.
Dépose ton fichier dans :
input/pdf/Puis lance :
./runpdf "input/pdf/mon-livre.pdf" --engine smartLe mode smart choisit automatiquement le meilleur plan :
| Type de PDF | Stratégie |
|---|---|
| PDF texte simple | text -> mineru -> ocrmypdf -> marker |
| PDF long ou dense | mineru -> text -> ocrmypdf -> marker |
| Livre scanné | ocrmypdf -> mineru -> marker -> text |
| PDF visuel, tableaux, formules | mineru -> ocrmypdf -> marker -> text |
Commandes pratiques :
./runpdf "input/pdf/mon-livre.pdf" --max-pages 10 --overwrite
./runpdf "input/pdf/mon-livre.pdf" --engine ocrmypdf --ocr-language fra
./runpdf "input/pdf/mon-livre.pdf" --engine mineru
./runpdf "input/pdf/mon-livre.pdf" --engine markerRésultats :
output/books/
output/graphipy_ready/Le fallback texte pypdf est inclus dans l'installation de base.
Pour installer les moteurs avancés dans des environnements locaux séparés :
./runpdf --setup-enginesCette commande prépare OCRmyPDF, MinerU et Marker sans les mélanger dans la même .venv, car certains moteurs peuvent avoir des dépendances incompatibles entre eux.
Vérifier les moteurs disponibles :
./runpdf --engines-statusImportant pour macOS : OCRmyPDF peut avoir besoin d'outils système comme tesseract, ghostscript et qpdf. Le plus simple est de passer par Homebrew :
brew install ocrmypdfCette commande installe OCRmyPDF avec les dépendances système nécessaires. Si elles sont déjà disponibles, tu peux aussi installer seulement le package Python :
pip install -r requirements-pdf-ocrmypdf.txtPour les PDF complexes avec mise en page riche :
pip install -r requirements-pdf-mineru.txt
mineru-models-download --source modelscope --model_type pipelinePour Marker, utilise de préférence un environnement séparé :
python3.11 -m venv .venv-marker
source .venv-marker/bin/activate
pip install -r requirements.txt
pip install -r requirements-pdf-marker.txtSi OCRmyPDF est installé dans un environnement séparé :
export OCRMYPDF_COMMAND="/chemin/vers/python -m ocrmypdf"Vidéo unique :
./runyoutube "https://youtube.com/watch?v=..."Playlist complète :
./runyoutube "https://youtube.com/playlist?list=..."Reprendre une playlist :
./runyoutube "https://youtube.com/playlist?list=..." --resumeTester seulement les premières vidéos :
./runyoutube "https://youtube.com/playlist?list=..." --limit 2Le traitement playlist est sécurisé :
- une vidéo = un fichier Markdown ;
- une vidéo = un statut dans le manifest ;
- si une vidéo échoue, la suivante continue ;
- aucune suppression globale de
output/videos/.
Les anciens scripts Bash dans run/ sont conservés comme legacy.
Les fichiers finaux sont lisibles directement et compatibles Graphipy.
output/videos/ résumés de vidéos
output/books/ résumés de PDF/livres
output/graphipy_ready/ exports Markdown prêts pour Graphipy
cache/jobs/ manifests de suiviLes fichiers Graphipy-ready n'incluent pas model_used dans le frontmatter.
Chaque appel Gemini ajoute une ligne dans :
cache/jobs/gemini_usage.jsonlVoir le résumé :
python3.11 -m src.cli usageLe coût estimé reste désactivé par défaut. Pour l'activer, renseigne les prix par modèle dans config/settings.yaml, section usage.model_prices_per_1m.
python3.11 -m src.cli cleanup --cache
python3.11 -m src.cli cleanup --all-temp
python3.11 -m src.cli cleanup --outputs --older-than 7Le pipeline ne supprime jamais input/ sans confirmation explicite.
La V1 reste locale-first. Les évolutions suivantes sont prévues comme options, sans remplacer les commandes simples actuelles.
Objectif : fournir un environnement reproductible quand une machine locale a des problèmes de dépendances PDF/OCR.
Mode visé :
./summarizer-docker
./runpdf-docker "input/pdf/mon-livre.pdf"
./runyoutube-docker "https://youtube.com/playlist?list=..."Le container monterait les dossiers locaux :
input/
output/
cache/
prompts/
.envAvantage : Python, OCRmyPDF, Tesseract, Ghostscript, qpdf et les dépendances système seraient installés dans l'image Docker plutôt que sur la machine utilisateur.
Compromis : l'image peut être lourde, plus longue à télécharger/build, et Docker Desktop reste nécessaire sur Mac.
Pour éviter une image unique trop lourde :
Image standard
- Python
- dépendances du pipeline
- yt-dlp
- pypdf
- OCRmyPDF
- tesseract
- ghostscript
- qpdf
Image heavy optionnelle
- image standard
- MinerU
- Marker
- modèles lourds éventuelsLe mode standard couvrirait la majorité des usages. Le mode heavy serait réservé aux PDF très complexes.
Pas d'auto-update silencieux au lancement.
Commande envisagée :
./updateElle pourrait :
- faire
git pull; - reconstruire l'image Docker avec
docker compose build --pull; - vérifier
.env; - vérifier les moteurs PDF ;
- ne jamais toucher à
input/nioutput/.
Vercel seul n'est pas adapté au coeur du pipeline, car les traitements PDF/OCR/playlists sont longs et lourds.
Options plus adaptées :
- VPS + Docker pour un serveur privé simple ;
- Cloud Run / Fly.io / Railway pour exécuter un container ;
- Vercel uniquement plus tard pour une interface web légère ;
- worker séparé pour les jobs longs si une vraie app cloud est créée.
Architecture cloud possible plus tard :
Frontend
-> upload PDF / URL playlist
-> job queue
-> worker Docker
-> Gemini
-> stockage outputPour l'instant, la priorité reste : local simple, Docker en plan robuste, cloud en V2.
python3.11 -m black src tests
python3.11 -m ruff check src tests
python3.11 -m pytest -q
detect-secrets scan $(git ls-files -co --exclude-standard)Ne jamais committer :
.envcookies.txt- PDF utilisateur
- transcripts
- cache
- outputs générés
Le .gitignore protège ces fichiers et la CI GitHub Actions vérifie format, lint, tests et scan de secrets.
Local. Simple. Relançable. Sans exposer les sources utilisateur.