Files
storytime/docs/specs/jalon-2-lecture-audio/01-domaine-lecture.md
T
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.1 KiB

2.1 — Domaine de lecture

Objectif

Modéliser le cœur métier de la lecture : ce qu'est une histoire jouable et l'état de lecture, indépendamment de toute techno audio.

Périmètre & hors-périmètre

  • Inclus : entités, value objects, interface PlaybackRepository, use cases.
  • Exclus : implémentation audio (2.2), UI (2.3).

Dépendances

Jalon 0.

Conception

  • Domain (features/playback/domain/) :
    • Episode (entité) : id, title, audioUrl, duration?, artworkUrl?. Immuable.
    • PlaybackState (value object) : status (idle/loading/playing/paused/completed/error), current (Episode?), position, bufferedPosition.
    • PlaybackRepository (interface) :
      • Future<Result<Unit>> load(List<Episode> queue, {int startIndex})
      • Future<Result<Unit>> play() / pause() / next() / previous()
      • Future<Result<Unit>> seek(Duration position)
      • Stream<PlaybackState> watch()
    • PlaybackFailure : AudioSourceFailure, PlaybackUnavailableFailure.
  • Application (features/playback/application/) :
    • PlayStoryUseCase (charge la file + démarre à l'index voulu).
    • TogglePlayPauseUseCase, SkipNextUseCase, SkipPreviousUseCase, SeekUseCase.
    • WatchPlaybackStateUseCase.

Plan TDD

  1. Red : playback_state_test.dartcopyWith, transitions et égalité (immuabilité) de PlaybackState.
  2. Green : implémenter entités/value objects.
  3. Red : play_story_use_case_test.dart — avec PlaybackRepository mocké : charge la file et appelle play ; index hors bornes → Err.
  4. Green : implémenter le use case.
  5. Red : use cases toggle/skip/seek — vérifient l'appel correct au repo selon l'état.
  6. Green : implémenter.
  7. Refactor.

Definition of Done

  • Tests domaine + use cases verts, sans import Flutter/just_audio.
  • tool/check.sh passe ; étape 2.1 cochée dans ROADMAP.md.

Risques / notes

  • Episode est volontairement minimal ; J3 fournira de quoi le construire depuis un flux RSS. Garder le mapping RSS→Episode dans la feature podcasts, pas ici.