# 2.2 — Service audio (just_audio + audio_service) ## Objectif Implémenter `PlaybackRepository` avec `just_audio` pour le streaming et `audio_service` pour la lecture en arrière-plan / contrôles écran verrouillé. ## Périmètre & hors-périmètre - Inclus : impl. concrète du repository, configuration `audio_service`, mapping états plugin → `PlaybackState`, mapping erreurs → `PlaybackFailure`. - Exclus : domaine (2.1), UI (2.3). ## Dépendances 2.1. ## Conception - **Data** (`features/playback/data/`) : - `JustAudioPlaybackRepository implements PlaybackRepository`. - Encapsule un `AudioPlayer` (just_audio) + une `ConcatenatingAudioSource` pour la file. - Expose `watch()` en combinant les streams just_audio (`playerStateStream`, `positionStream`, `currentIndexStream`) → `PlaybackState`. - Capture les erreurs de source (URL invalide, réseau) → `AudioSourceFailure`. - Intégration `audio_service` : `AudioHandler` reliant les commandes système (notification, casque) au repository. - **DI** : `playbackRepositoryProvider` (override en test par un fake). - **Android** : permissions/manifest requis par `audio_service` (service de premier plan, etc.). ## Plan TDD 1. **Red** : `just_audio_playback_repository_test.dart` — en abstrayant `AudioPlayer` derrière une fine façade mockable : `load` configure la source et `play` délègue ; une exception de source → `AudioSourceFailure`. Le mapping des streams vers `PlaybackState` est vérifié sur des événements simulés. 2. **Green** : implémenter la façade + le repository + le mapping. 3. **Validation manuelle** : lire une URL audio de test sur l'appareil (la lecture réelle ne s'automatise pas de façon fiable en unit test) — consigner le résultat. 4. **Refactor**. ## Definition of Done - Test du repository vert (façade mockée) ; lecture réelle vérifiée manuellement. - Lecture en arrière-plan fonctionnelle (écran éteint = audio continue). - `tool/check.sh` passe ; étape 2.2 cochée dans `ROADMAP.md`. ## Risques / notes - `audio_service` impose une configuration Android précise (manifest, init). Prévoir un temps de mise au point. - Garder la frontière nette : aucune logique métier dans cette couche, uniquement adaptation au plugin.