docs: cadrage initial Storytime (specs par jalon, roadmap, CLAUDE.md)
Lecteur d'histoires cadenassé pour le coucher (Android/Flutter). - CLAUDE.md : principes craftsmanship/TDD/clean code/clean archi + decisions techniques - ROADMAP.md : suivi haut niveau des 7 jalons, a tenir a jour par etape - docs/specs/ : specs completes decoupees par jalon, etapes en sous-fichiers - .gitignore Flutter (pubspec.lock versionne, projet applicatif) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,41 @@
|
||||
# 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<Result<Podcast>> fetchFeedPreview(Uri feedUrl)` (titre/image depuis le flux).
|
||||
- `Future<Result<List<Episode>>> 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<Episode>` 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.
|
||||
Reference in New Issue
Block a user