Files
Vincent Bourdon 16fd4c8c36 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>
2026-06-19 17:03:33 +02:00

2.2 KiB

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.