# 3.2 — Ajout par URL RSS ## Objectif Permettre au parent de coller l'URL d'un flux RSS, d'en obtenir un aperçu (titre, image, nombre d'épisodes) et de récupérer les épisodes mappés vers `Episode`. ## Périmètre & hors-périmètre - Inclus : récupération + parsing RSS, validation de l'URL, aperçu du podcast, mapping items RSS → `Episode` (feature playback). - Exclus : persistance (3.3), UI finale (J5). ## Dépendances 3.1 (entité `Podcast`, `PodcastFailure`), 2.1 (`Episode`). ## Conception - **Domain** (`features/podcasts/domain/`) : - Étendre `PodcastSearchRepository` ou ajouter `FeedRepository` : - `Future> fetchFeedPreview(Uri feedUrl)` (titre/image depuis le flux). - `Future>> fetchEpisodes(Uri feedUrl)`. - **Application** : - `PreviewFeedUseCase` (valide l'URL : schéma http/https, non vide → sinon `InvalidFeedFailure`). - `LoadEpisodesUseCase`. - **Data** : - `RssFeedRepository` via `dart_rss` (ou `webfeed`) + client HTTP injecté. - Mapper RSS item → `Episode` : `title`, `audioUrl` = `enclosure.url`, `duration` (itunes:duration si présent), `artworkUrl`. - Items sans enclosure audio → ignorés (pas une histoire jouable). - Erreurs : flux illisible → `InvalidFeedFailure` ; réseau → `FeedUnreachableFailure`. ## Plan TDD 1. **Red** : `preview_feed_use_case_test.dart` — URL vide / non http → `Err(InvalidFeedFailure)` ; URL valide délègue au repo. 2. **Green** : implémenter validation + use case. 3. **Red** : `rss_feed_repository_test.dart` — fixture XML RSS d'exemple → `Podcast` (aperçu) et `List` corrects ; item sans enclosure ignoré ; XML invalide → `InvalidFeedFailure` ; HTTP KO → `FeedUnreachableFailure`. 4. **Green** : implémenter repo + mapper. 5. **Refactor**. ## Definition of Done - Tests verts avec fixtures RSS (cas nominal, item sans audio, XML invalide). - `tool/check.sh` passe ; étape 3.2 cochée dans `ROADMAP.md`. ## Risques / notes - Diversité des flux RSS podcast (champs optionnels, namespaces itunes). Prévoir des fixtures variées. - Garder le mapping RSS→`Episode` ici (feature podcasts), conformément à la note de 2.1.