# Story 2.3: Implémenter le scraper RSS

Status: review

## Story

As a développeur,
I want implémenter un scraper RSS,
So que je peux collecter des articles de sources RSS sur les matchs.

## Acceptance Criteria

**Given** des URLs RSS sont configurées (sources sportives)
**When** le scraper RSS est exécuté
**Then** il parse les flux RSS et extrait les articles pertinents
**And** il extrait le titre, contenu, date de publication
**And** les données sont stockées avec format cohérent

**Given** une source RSS est indisponible
**When** le scraper tente de la lire
**Then** l'erreur est loggée
**And** le scraper continue avec les autres sources RSS

## Tasks / Subtasks

- [x] Installer les dépendances RSS (AC: #1)
  - [x] Installer `feedparser` pour parsing RSS
  - [x] Configurer les URLs RSS sources sportives
  - [x] Créer le module scraper RSS
  - [x] Configurer les sources RSS (ESPN, BBC Sport, etc.)
  - [x] Vérifier l'accès aux flux RSS

- [x] Implémenter le parser RSS (AC: #1)
  - [x] Créer la fonction de parsing de flux RSS
  - [x] Extraire les données: titre, contenu, date
  - [x] Filtrer les articles pertinents (football)
  - [x] Stocker les articles dans la base de données
  - [x] Gérer les erreurs de parsing

- [x] Créer les schémas de base de données pour articles RSS (AC: #1)
  - [x] Créer la table `articles_rss` dans SQLite
  - [x] Définir les colonnes: id, title, content, published_at
  - [x] Ajouter les colonnes pour source_url et match_id
  - [x] Créer les indexes appropriés
  - [x] Générer et appliquer les migrations

- [x] Implémenter la gestion d'erreurs robuste (AC: #2)
  - [x] Logger toutes les erreurs sans arrêter le processus
  - [x] Continuer avec les autres sources RSS
  - [x] Configurer les timeouts appropriés
  - [x] Tester la gestion d'erreurs

- [x] Tester le scraper RSS (AC: #1, #2)
  - [x] Tester le parsing de flux RSS
  - [x] Vérifier que les articles sont stockés correctement
  - [x] Tester la gestion d'erreurs
  - [x] Valider le format cohérent avec Twitter/Reddit

## Dev Notes

### Architecture Patterns et Contraintes

**Stack Technique Imposé:**
- **RSS Parser:** feedparser
- **Database:** SQLite avec Drizzle (Next.js) et SQLAlchemy (FastAPI)
- **Sources:** ESPN, BBC Sport, Goal.com, etc.
- **Pondération:** RSS 15% (Twitter 60%, Reddit 25%)

### Technical Requirements

**Configuration RSS:**
```python
import feedparser

# Sources RSS
RSS_SOURCES = [
    "http://www.espn.com/espn/rss/news",
    "http://feeds.bbci.co.uk/sport/football/rss.xml",
    "https://www.goal.com/rss"
]

def parse_rss_feed(url: str):
    feed = feedparser.parse(url)
    return feed.entries
```

### File Structure

```
backend/
├── app/
│   ├── scrapers/
│   │   └── rss_scraper.py
│   ├── models/
│   │   └── rss_article.py
│   └── schemas/
│       └── rss_article.py
```

### References

- [Source: _bmad-output/planning-artifacts/epics.md#Story-2.3]

## Dev Agent Record

### Agent Model Used

GLM-4.7

### Completion Notes List

- Scraper RSS implémenté avec succès
- Articles collectés et stockés
- Gestion d'erreurs robuste fonctionnelle

✅ **2026-01-17**: Implémentation complète du scraper RSS:
- Création du modèle de base de données `RSSArticle` avec indexes appropriés
- Création des schémas Pydantic pour validation
- Implémentation du module `RSSScraper` avec parsing de flux RSS
- Filtrage automatique des articles pertinents (mots-clés football)
- Gestion d'erreurs robuste: continue avec les autres sources en cas d'erreur
- Configuration par défaut avec 4 sources sportives (ESPN, BBC Sport, Goal.com, Sky Sports)
- Timeout configurable (30 secondes par défaut)
- Migration Alembic créée pour la table `rss_articles`
- Tests unitaires complets créés avec mocks
- Format cohérent avec les scrapers Twitter et Reddit

### File List

- `backend/app/scrapers/rss_scraper.py` (nouveau)
- `backend/app/models/rss_article.py` (nouveau)
- `backend/app/schemas/rss_article.py` (nouveau)
- `backend/app/models/__init__.py` (modifié)
- `backend/app/schemas/__init__.py` (modifié)
- `backend/alembic/versions/20260117_0007_create_rss_articles_table.py` (nouveau)
- `backend/tests/test_rss_scraper.py` (nouveau)

## Change Log

### 2026-01-17
- Implémentation du scraper RSS complet avec feedparser
- Création de la table `rss_articles` dans SQLite
- Implémentation de la gestion d'erreurs robuste
- Création de la migration Alembic `20260117_0007_create_rss_articles_table`
- Ajout des tests unitaires pour le scraper RSS
