Skip to content

Commit d6eb6d2

Browse files
committed
Initial Commit
0 parents  commit d6eb6d2

12 files changed

Lines changed: 1231 additions & 0 deletions

.env.template

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
# Variables d'environnement pour le Système d'Apprentissage
2+
# Copiez ce fichier vers .env et remplissez vos vraies valeurs
3+
4+
# 🤖 Clé API OpenAI pour les résumés de vidéos
5+
# Obtenez votre clé sur: https://platform.openai.com/api-keys
6+
OPENAI_API_KEY=sk-votre_cle_openai_ici
7+
8+
# 📧 Configuration Kindle
9+
# Votre adresse @kindle.com (trouvée sur https://www.amazon.com/myk)
10+
KINDLE_EMAIL=votrenom@kindle.com
11+
12+
# 📮 Configuration Email
13+
# Votre adresse Gmail (doit être autorisée sur Amazon)
14+
SENDER_EMAIL=votre.email@gmail.com
15+
16+
# 🔐 Mot de passe d'application Gmail
17+
# Générez un mot de passe d'application sur: https://myaccount.google.com/apppasswords
18+
SMTP_PASSWORD=votre_mot_de_passe_app_16_caracteres

README.md

Lines changed: 176 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,176 @@
1+
# Système d'Apprentissage Automatique 🧠
2+
3+
Un système intelligent qui génère automatiquement un journal d'apprentissage personnalisé quotidien et l'envoie directement sur votre Kindle.
4+
5+
## 🎯 Fonctionnalités
6+
7+
- **📰 Agrégation RSS** - Collecte les articles de vos flux préférés
8+
- **🎥 Résumés YouTube** - Résumés IA des vidéos récentes
9+
- **📄 PDF avec QR Codes** - Document formaté avec codes QR pour accéder aux sources
10+
- **📧 Envoi automatique Kindle** - Livraison directe chaque matin
11+
- **⚙️ Configuration flexible** - Personnalisation facile via YAML
12+
13+
## 🚀 Installation Rapide
14+
15+
```bash
16+
# Cloner et configurer
17+
git clone <votre-repo> learning-system
18+
cd learning-system
19+
20+
# Exécuter la configuration automatique
21+
chmod +x setup.sh
22+
./setup.sh
23+
24+
# Configurer vos identifiants
25+
cp .env.template .env
26+
# Éditer .env avec vos clés API et emails
27+
28+
# Tester le système
29+
python test_system.py
30+
31+
# Lancer la génération
32+
python main.py
33+
```
34+
35+
## 🔧 Configuration
36+
37+
### 1. Variables d'environnement (.env)
38+
```bash
39+
OPENAI_API_KEY=votre_cle_openai
40+
KINDLE_EMAIL=votrenom@kindle.com
41+
SENDER_EMAIL=votre.email@gmail.com
42+
SMTP_PASSWORD=mot_de_passe_app_gmail
43+
```
44+
45+
### 2. Flux RSS et chaînes YouTube (config.yaml)
46+
```yaml
47+
rss_feeds:
48+
- "https://blog.exemple.com/rss"
49+
- "https://autre-site.com/feed"
50+
51+
youtube_channels:
52+
- "UCxxxxxxx" # ID de chaîne YouTube
53+
```
54+
55+
### 3. Configuration Kindle
56+
1. Allez sur https://www.amazon.com/myk
57+
2. Ajoutez votre email expéditeur à la liste approuvée
58+
3. Notez votre adresse @kindle.com
59+
60+
## 🤖 Automatisation
61+
62+
Pour recevoir votre journal chaque matin à 7h:
63+
64+
```bash
65+
# Rendre le script exécutable
66+
chmod +x run_daily.sh
67+
68+
# Ajouter au crontab
69+
crontab -e
70+
71+
# Ajouter cette ligne:
72+
0 7 * * * /Users/pierre-henrysoria/Code/learning-system/run_daily.sh
73+
```
74+
75+
## 📱 Applications RSS Recommandées
76+
77+
Pour lire vos flux sur macOS et iPad:
78+
79+
### 🏆 **Reeder 5** (Recommandé)
80+
- App native macOS/iPad
81+
- Interface élégante sans distraction
82+
- Achat unique, pas d'abonnement
83+
- Synchronisation via iCloud/Feedbin
84+
85+
### 🆓 **NetNewsWire**
86+
- Gratuit et open source
87+
- Rapide et léger
88+
- Parfait pour un usage minimaliste
89+
90+
### **Readwise Reader**
91+
- Résumés IA intégrés
92+
- Gestion newsletters + RSS + PDF
93+
- Envoi automatique vers Kindle
94+
- Abonnement ~10€/mois
95+
96+
## 🛠️ Structure du Projet
97+
98+
```
99+
learning-system/
100+
├── main.py # Script principal
101+
├── config.yaml # Configuration
102+
├── requirements.txt # Dépendances Python
103+
├── setup.sh # Script de configuration
104+
├── run_daily.sh # Script d'automatisation
105+
├── src/
106+
│ ├── config.py # Gestion configuration
107+
│ ├── rss_aggregator.py # Collecte RSS
108+
│ ├── youtube_summarizer.py # Résumés YouTube
109+
│ ├── pdf_generator.py # Génération PDF + QR
110+
│ └── kindle_sender.py # Envoi email Kindle
111+
├── output/ # PDFs générés
112+
└── logs/ # Fichiers de log
113+
```
114+
115+
## 🎨 Exemple de Sortie
116+
117+
Le PDF généré contient:
118+
- **En-tête stylé** avec date du jour
119+
- **Résumé du contenu** (nombre d'articles, vidéos)
120+
- **Articles RSS** avec source et date
121+
- **Résumés vidéos IA** en français
122+
- **QR codes** pour chaque source
123+
- **Mise en page optimisée** pour Kindle
124+
125+
## 🔍 Comment Inclure les QR Codes
126+
127+
Les QR codes sont automatiquement générés pour chaque article:
128+
129+
```python
130+
# Dans pdf_generator.py
131+
def generate_qr_code(self, url: str) -> Image:
132+
qr = qrcode.QRCode(
133+
version=1,
134+
error_correction=qrcode.constants.ERROR_CORRECT_L,
135+
box_size=4,
136+
border=2,
137+
)
138+
qr.add_data(url)
139+
qr.make(fit=True)
140+
141+
qr_img = qr.make_image(fill_color="black", back_color="white")
142+
# Conversion en Image ReportLab...
143+
```
144+
145+
## 🚨 Dépannage
146+
147+
### Problème d'authentification Gmail
148+
- Activez l'authentification à 2 facteurs
149+
- Générez un mot de passe d'application
150+
- Utilisez ce mot de passe dans .env
151+
152+
### Kindle ne reçoit pas les emails
153+
- Vérifiez que votre email est autorisé sur Amazon
154+
- Confirmez l'adresse @kindle.com
155+
- Vérifiez les dossiers spam
156+
157+
### Pas de résumés de vidéos
158+
- Vérifiez votre clé OpenAI API
159+
- Ajoutez des IDs de chaînes YouTube valides
160+
- Vérifiez les quotas API
161+
162+
## 📈 Prochaines Améliorations
163+
164+
- [ ] Support EPUB pour un meilleur rendu Kindle
165+
- [ ] Interface web de configuration
166+
- [ ] Filtres intelligents par mots-clés
167+
- [ ] Intégration newsletters automatique
168+
- [ ] Support de plus de sources (Reddit, Hacker News)
169+
170+
## 🤝 Contribution
171+
172+
Les contributions sont bienvenues ! N'hésitez pas à ouvrir une issue ou proposer une pull request.
173+
174+
---
175+
176+
**🧠 Bon apprentissage automatique ! 📚✨**

config.yaml

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
# Configuration du Système d'Apprentissage Automatique
2+
3+
# 📰 Flux RSS à surveiller
4+
rss_feeds:
5+
- "https://feeds.feedburner.com/oreilly"
6+
- "https://blog.pragmaticengineer.com/rss/"
7+
- "https://martinfowler.com/feed.atom"
8+
- "https://hbr.org/feed"
9+
- "https://feeds.harvard.edu/blog/gazette"
10+
- "https://news.ycombinator.com/rss"
11+
# Ajoutez vos blogs/sites favoris ici
12+
13+
# 🎥 IDs des chaînes YouTube pour les résumés de vidéos
14+
youtube_channels:
15+
# Pour trouver l'ID de chaîne: aller sur la chaîne > voir le code source > chercher "channelId"
16+
# Exemples (remplacez par de vrais IDs):
17+
# - "UCxxxxxxx" # Remplacer par de vrais IDs de chaînes
18+
19+
# 🤖 Configuration OpenAI pour les résumés IA
20+
openai:
21+
api_key: "" # À définir via variable d'environnement OPENAI_API_KEY
22+
model: "gpt-4o-mini" # Modèle économique mais performant
23+
24+
# 📧 Configuration email Kindle
25+
kindle:
26+
email: "" # Votre adresse @kindle.com
27+
sender_email: "" # Votre adresse Gmail/email (doit être autorisée sur Amazon)
28+
smtp_server: "smtp.gmail.com"
29+
smtp_port: 587
30+
smtp_password: "" # Mot de passe d'application pour Gmail
31+
32+
# ⚙️ Paramètres de sortie
33+
output:
34+
output_dir: "output"
35+
max_articles_per_feed: 3 # Maximum d'articles par flux RSS
36+
max_video_summaries: 2 # Maximum de résumés de vidéos
37+
days_lookback: 2 # Nombre de jours à regarder en arrière

main.py

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
#!/usr/bin/env python3
2+
"""
3+
🧠 Système d'Apprentissage Automatique
4+
Génère un journal personnalisé quotidien avec flux RSS, résumés YouTube et QR codes
5+
Envoi automatique vers Kindle
6+
"""
7+
8+
import os
9+
import sys
10+
from datetime import datetime
11+
from pathlib import Path
12+
13+
# Ajouter src au path
14+
sys.path.append(str(Path(__file__).parent / "src"))
15+
16+
from src.rss_aggregator import RSSAggregator
17+
from src.youtube_summarizer import YouTubeSummarizer
18+
from src.pdf_generator import PDFGenerator
19+
from src.kindle_sender import KindleSender
20+
from src.config import Config
21+
22+
def main():
23+
"""Fonction principale pour orchestrer le système d'apprentissage"""
24+
print("🧠 Démarrage du Système d'Apprentissage Automatique...")
25+
26+
# Initialiser la configuration
27+
config = Config()
28+
29+
# Initialiser les composants
30+
rss_aggregator = RSSAggregator(config)
31+
youtube_summarizer = YouTubeSummarizer(config)
32+
pdf_generator = PDFGenerator(config)
33+
kindle_sender = KindleSender(config)
34+
35+
try:
36+
# Étape 1: Collecter les articles RSS
37+
print("📰 Collecte des articles RSS...")
38+
articles = rss_aggregator.collect_articles()
39+
print(f"✅ {len(articles)} articles collectés")
40+
41+
# Étape 2: Traiter les vidéos YouTube
42+
print("🎥 Traitement des vidéos YouTube...")
43+
video_summaries = youtube_summarizer.process_videos()
44+
print(f"✅ {len(video_summaries)} résumés de vidéos générés")
45+
46+
# Étape 3: Combiner tout le contenu
47+
all_content = articles + video_summaries
48+
49+
if not all_content:
50+
print("⚠️ Aucun contenu trouvé pour aujourd'hui")
51+
return 0
52+
53+
# Étape 4: Générer le PDF avec QR codes
54+
print("📄 Génération du journal PDF...")
55+
pdf_path = pdf_generator.create_journal(all_content)
56+
57+
# Étape 5: Envoyer vers Kindle
58+
print("📧 Envoi vers Kindle...")
59+
success = kindle_sender.send_to_kindle(pdf_path)
60+
61+
if success:
62+
print("✅ Journal quotidien envoyé avec succès vers Kindle!")
63+
else:
64+
print("⚠️ Erreur lors de l'envoi vers Kindle, mais le PDF est disponible localement")
65+
print(f"📁 Fichier généré: {pdf_path}")
66+
67+
except Exception as e:
68+
print(f"❌ Erreur: {e}")
69+
return 1
70+
71+
return 0
72+
73+
if __name__ == "__main__":
74+
exit(main())

requirements.txt

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
# Dépendances du Système d'Apprentissage Automatique
2+
3+
# Traitement RSS et Web
4+
feedparser==6.0.10
5+
requests==2.31.0
6+
7+
# IA et OpenAI
8+
openai==1.45.0
9+
10+
# Génération PDF et QR codes
11+
reportlab==4.0.7
12+
qrcode[pil]==7.4.2
13+
14+
# Configuration et dates
15+
PyYAML==6.0.1
16+
python-dateutil==2.8.2
17+
18+
# Traitement d'images pour QR codes
19+
Pillow==10.1.0

run_daily.sh

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
#!/bin/bash
2+
3+
# Script d'exécution quotidienne - ajouter au crontab pour l'automatisation
4+
# Exemple d'entrée crontab: 0 7 * * * /Users/pierre-henrysoria/Code/learning-system/run_daily.sh
5+
6+
# Aller dans le répertoire du script
7+
cd "$(dirname "$0")"
8+
9+
# Activer l'environnement virtuel
10+
source venv/bin/activate
11+
12+
# Créer le répertoire de logs s'il n'existe pas
13+
mkdir -p logs
14+
15+
# Exécuter le système et logger la sortie
16+
echo "$(date): Début de la génération du journal quotidien" >> logs/daily.log
17+
python main.py >> logs/daily.log 2>&1
18+
exit_code=$?
19+
20+
if [ $exit_code -eq 0 ]; then
21+
echo "$(date): Journal quotidien généré avec succès" >> logs/daily.log
22+
else
23+
echo "$(date): Erreur lors de la génération du journal (code: $exit_code)" >> logs/daily.log
24+
fi
25+
26+
# Nettoyer les anciens logs (garder 30 jours)
27+
find logs -name "*.log" -mtime +30 -delete
28+
29+
echo "$(date): Fin de l'exécution quotidienne" >> logs/daily.log

0 commit comments

Comments
 (0)