From b132fb957dafb6edb36bb27b2030da328acfd4e2 Mon Sep 17 00:00:00 2001 From: jpgiannetti Date: Mon, 2 Feb 2026 20:10:13 +0100 Subject: [PATCH] =?UTF-8?q?feat(gherkin):=20compl=C3=A9ter=20et=20aligner?= =?UTF-8?q?=20Gherkins=20radio-live=20avec=20r=C3=A8gles=20m=C3=A9tiers?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ajouts : - Nouveau fichier comportement-auditeur-live.feature couvrant section 7.3 - Buffer synchronisation 15s et justification vs alternatives - Continuation hors zone géographique - Reconnexion après coupure (<90s vs ≥90s) - Interactions disponibles (Like, Abonnement, Skip) - Décision définitive : pas de chat ni réactions emoji - Justification complète (sécurité routière, modération, DSA EU) Corrections : - Séparation claire contenu violent (Strike 3) vs contenu illégal (Strike 4) - Ajout scénario dédié pour contenu illégal avec ban définitif - Clarification notification autorités pour contenus illégaux Alignement 100% avec docs/regles-metier/12-radio-live.md --- .../comportement-auditeur-live.feature | 275 ++++++++++++++++++ .../api/radio-live/demarrage-live.feature | 13 +- 2 files changed, 287 insertions(+), 1 deletion(-) create mode 100644 features/api/radio-live/comportement-auditeur-live.feature diff --git a/features/api/radio-live/comportement-auditeur-live.feature b/features/api/radio-live/comportement-auditeur-live.feature new file mode 100644 index 0000000..e8f2d4d --- /dev/null +++ b/features/api/radio-live/comportement-auditeur-live.feature @@ -0,0 +1,275 @@ +# language: fr +Fonctionnalité: Comportement auditeur pendant un live + En tant qu'auditeur + Je veux écouter un live avec une expérience stable et sécurisée + Afin de profiter du contenu en temps réel sans distraction + + Contexte: + Étant donné que l'API RoadWave est disponible + Et que je suis connecté en tant qu'auditeur + Et qu'un créateur diffuse actuellement un live + + Scénario: Buffer de synchronisation 15 secondes + Étant donné qu'un créateur parle en direct + Quand je rejoins le live + Alors j'entends l'audio avec un décalage de 15 secondes + Et ce buffer permet une stabilité optimale sur connexion 3G/4G + Et le buffer absorbe les fluctuations réseau courtes + + Scénario: Justification buffer 15 secondes vs alternatives + Étant donné les différentes options de buffer possibles: + | Buffer | Stabilité 3G | Décalage perçu | Décision | + | 5s | Faible | Imperceptible | Rejeté | + | 10s | Moyenne | Faible | Rejeté | + | 15s | Excellente | Acceptable | Choisi | + | 20s+ | Très haute | Trop élevé | Rejeté | + Alors le buffer de 15 secondes est le meilleur compromis + Et la stabilité sur réseau mobile est prioritaire + + Scénario: Continuation du live si sortie de zone géographique + Étant donné que j'écoute un live régional "Île-de-France" + Et que je suis situé à Paris + Quand je me déplace et sors de l'Île-de-France + Alors le live continue de jouer normalement + Et aucune coupure brutale ne se produit + Et l'écoute se termine naturellement + + Scénario: Justification continuation hors zone + Étant donné que j'écoute activement un live + Quand je sors de la zone géographique ciblée + Alors le système ne coupe pas le live + Car une coupure brutale dégraderait l'expérience utilisateur + Et l'écoute engagée doit pouvoir se terminer naturellement + Mais après la fin du live, l'algorithme reprend le fonctionnement normal + + Scénario: Après fin du live, algorithme normal reprend + Étant donné que j'ai écouté un live hors zone jusqu'à sa fin + Quand le live se termine + Alors l'algorithme de recommandation reprend son fonctionnement normal + Et je ne reçois plus de contenus hors de ma zone géographique actuelle + + Scénario: Reconnexion rapide après coupure réseau (<90s) + Étant donné que j'écoute un live + Et que je perds ma connexion réseau pendant 30 secondes + Quand ma connexion revient + Alors je me reconnecte automatiquement au live + Et je reprends l'écoute au moment actuel du live + Et je ne reprends pas au buffer ancien (saut temporel transparent) + + Scénario: Reconnexion après coupure réseau de 89 secondes + Étant donné que j'écoute un live + Et que je perds ma connexion réseau pendant 89 secondes + Quand ma connexion revient + Alors je me reconnecte au live en cours + Et je reprends au moment actuel + Car le seuil de 90 secondes n'est pas atteint + + Scénario: Coupure réseau longue (≥90s) - Passage contenu suivant + Étant donné que j'écoute un live + Et que je perds ma connexion réseau pendant 90 secondes ou plus + Quand ma connexion revient + Alors je vois le message "Live en cours perdu, passage au contenu suivant" + Et l'algorithme me propose un contenu normal (non-live) + Et je ne rejoins pas le live précédent + + Scénario: Saut temporel transparent lors de reconnexion + Étant donné que j'écoute un live au timestamp 00:05:00 + Et que je perds ma connexion pendant 45 secondes + Quand je me reconnecte + Alors je reprends l'écoute au timestamp actuel du live (environ 00:05:45) + Et le saut de 45 secondes est transparent + Et je ne réentends pas les 45 secondes manquées + + Scénario: Like disponible pendant le live (véhicule arrêté) + Étant donné que j'écoute un live + Et que mon véhicule est à l'arrêt + Quand je clique sur le bouton cœur ❤️ + Alors un like est enregistré + Et mes jauges d'intérêt augmentent de +2% selon les tags du live + Et le créateur voit son compteur de likes s'incrémenter en temps réel + + Scénario: Like désactivé pendant le live (véhicule en mouvement) + Étant donné que j'écoute un live + Et que mon véhicule est en mouvement + Quand j'essaie d'accéder aux interactions + Alors le bouton cœur est désactivé + Et je vois le message "Interactions disponibles uniquement véhicule à l'arrêt" + Car la sécurité routière est prioritaire + + Scénario: Abonnement au créateur pendant le live (véhicule arrêté) + Étant donné que j'écoute un live d'un créateur non suivi + Et que mon véhicule est à l'arrêt + Quand je clique sur "S'abonner" + Alors l'abonnement est enregistré + Et mes jauges d'intérêt augmentent de +5% selon les tags du créateur + Et je recevrai des notifications pour ses prochains lives + + Scénario: Skip disponible pendant le live + Étant donné que j'écoute un live + Quand je clique sur le bouton "Skip" (suivant) + Alors je quitte le live immédiatement + Et l'algorithme me propose le contenu suivant + Et je ne peux pas revenir au live via "Précédent" + + Scénario: Bouton "Précédent" désactivé pendant un live + Étant donné que j'écoute un live + Quand je regarde les contrôles de lecture + Alors le bouton "Précédent" est désactivé (grisé) + Car il n'y a pas de sens sur un flux temps réel + Et je ne peux pas revenir en arrière dans un live + + Scénario: Chat en direct jamais disponible (décision définitive) + Étant donné que j'écoute un live + Quand je cherche une fonctionnalité de chat + Alors aucun bouton de chat n'est disponible + Et aucune interface de messagerie n'est présente + Car cette fonctionnalité ne sera jamais implémentée + + Scénario: Message explicatif sur absence de chat + Étant donné que j'essaie de chercher comment discuter pendant un live + Quand j'accède à l'aide ou aux FAQ + Alors je vois le message: + """ + 💬 Les discussions ne sont pas disponibles sur RoadWave pour garantir votre sécurité en voiture et éviter le harcèlement. + + RoadWave privilégie l'écoute passive pour: + - Votre sécurité au volant (pas de distraction) + - Votre bien-être (pas de harcèlement, toxicité) + - Une expérience audio apaisante + """ + + Scénario: Réactions emoji jamais disponibles (décision définitive) + Étant donné que j'écoute un live + Quand je cherche des réactions emoji ou boutons interactifs + Alors aucune réaction emoji n'est disponible + Car cette fonctionnalité ne sera jamais implémentée + Et seuls les likes explicites sont autorisés (véhicule arrêté) + + Scénario: Justification absence chat et réactions + Étant donné les raisons de l'absence de chat: + | Raison | Justification | + | Sécurité routière | Pas de distraction en voiture (focus UX) | + | Harcèlement | Évite contenu haineux, insultes, trolling | + | Modération | Pas de coût modération temps réel (impossible à scale) | + | Simplicité | Écoute passive = expérience uniforme | + | Bien-être | Évite toxicité, harcèlement (fléau réseaux sociaux) | + | Juridique | Pas de risque contentieux modération chat (DSA EU) | + | Différenciation | Positionnement "audio safe" vs plateformes toxiques | + Alors cette décision est définitive et non négociable + Et RoadWave se positionne comme une plateforme d'écoute passive sécurisée + + Scénario: Compteur d'auditeurs en temps réel visible + Étant donné que j'écoute un live + Quand je regarde l'interface + Alors je vois le nombre d'auditeurs simultanés "247 auditeurs en direct" + Et ce compteur se met à jour toutes les 10 secondes + Et cela donne une indication de la popularité du live + + Scénario: Indicateur "En direct" clair + Étant donné que j'écoute un live + Alors je vois clairement un badge rouge "🔴 EN DIRECT" + Et je comprends immédiatement que c'est un flux temps réel + Et pas un contenu enregistré + + Scénario: Pas de barre de progression sur live + Étant donné que j'écoute un live + Quand je regarde les contrôles de lecture + Alors il n'y a pas de barre de progression + Car on ne peut pas se déplacer dans un flux temps réel + Et seule la durée écoulée est affichée (ex: "23:45 écoulées") + + Scénario: Transition fluide live vers contenu suivant + Étant donné que j'écoute un live + Quand le live se termine naturellement + Alors le délai de transition habituel de 2 secondes démarre + Et le contenu suivant est annoncé normalement + Et l'expérience est cohérente avec les contenus classiques + + Scénario: Notification de fin de live + Étant donné que j'écoute un live + Quand le créateur arrête le live + Alors j'entends "Ce live se termine dans 5... 4... 3... 2... 1" + Et je vois le message "Live terminé" + Et je suis notifié que le replay sera disponible sous peu + + Scénario: Qualité audio adaptative selon connexion + Étant donné que j'écoute un live en 4G + Et que ma connexion se dégrade vers 3G + Quand la bande passante diminue + Alors le player HLS natif adapte automatiquement la qualité + Et le buffer de 15 secondes absorbe les fluctuations + Et l'écoute reste fluide sans coupure + + Scénario: Consommation data pendant écoute live + Étant donné que j'écoute un live en Opus 48 kbps + Quand j'écoute pendant 1 heure + Alors je consomme environ 21.6 MB de data + Et cette information peut être affichée dans les paramètres + Et l'utilisateur peut être averti si réseau cellulaire + + Scénario: Tunnel ou coupure réseau courte (<15s) + Étant donné que j'écoute un live + Et que je passe dans un tunnel pendant 10 secondes + Quand je ressors du tunnel + Alors le buffer de 15 secondes a absorbé la coupure + Et l'écoute reprend sans interruption perceptible + Et je n'ai même pas remarqué la coupure + + Scénario: Notifications désactivables pour les lives + Étant donné que je suis abonné à un créateur + Et que je reçois des notifications de ses lives + Quand j'accède aux paramètres de notification + Alors je peux désactiver spécifiquement les notifications "Live en direct" + Et je continue à recevoir les autres notifications + Et cela me permet de contrôler les interruptions + + Scénario: Statistiques d'écoute personnelles après un live + Étant donné que j'ai écouté un live pendant 45 minutes + Quand je consulte mon historique d'écoute + Alors je vois l'entrée "[DIRECT] [Titre du live]" + Et la durée d'écoute "45 min" + Et la date/heure de diffusion + Et un lien vers le replay si disponible + + Plan du Scénario: Reconnexion selon durée de coupure + Étant donné que j'écoute un live + Et que je perds ma connexion pendant secondes + Quand ma connexion revient + Alors le comportement est + + Exemples: + | duree_coupure | comportement | + | 10 | Reconnexion au live en cours | + | 30 | Reconnexion au live en cours | + | 60 | Reconnexion au live en cours | + | 89 | Reconnexion au live en cours | + | 90 | Passage au contenu suivant | + | 120 | Passage au contenu suivant | + + Plan du Scénario: Actions disponibles selon état véhicule + Étant donné que j'écoute un live + Et que mon véhicule est + Quand j'essaie d'effectuer l'action + Alors le résultat est + + Exemples: + | etat_vehicule | action | resultat | + | arrêté | Like | Autorisé | + | arrêté | Abonnement | Autorisé | + | arrêté | Skip | Autorisé | + | en mouvement | Like | Bloqué | + | en mouvement | Abonnement | Bloqué | + | en mouvement | Skip | Autorisé | + + Plan du Scénario: Interactions jamais disponibles + Étant donné que j'écoute un live + Quand je cherche l'interaction + Alors elle est + Car + + Exemples: + | interaction | disponibilite | raison | + | Chat en direct | Jamais disponible | Sécurité routière + modération impossible | + | Réactions emoji | Jamais disponible | Sécurité routière + distraction | + | Précédent | Jamais disponible | Pas de sens sur flux temps réel | + | Seek (avancer) | Jamais disponible | Pas de sens sur flux temps réel | diff --git a/features/api/radio-live/demarrage-live.feature b/features/api/radio-live/demarrage-live.feature index 8c19d03..292aee8 100644 --- a/features/api/radio-live/demarrage-live.feature +++ b/features/api/radio-live/demarrage-live.feature @@ -112,8 +112,19 @@ Fonctionnalité: Démarrage d'un live Quand un modérateur vérifie en temps réel Et confirme la violence Alors le live est coupé immédiatement + Et je reçois un Strike 3 immédiat (suspension 30 jours) + Et le replay n'est pas publié + + Scénario: Diffusion contenu illégal + Étant donné que je diffuse du contenu illégal (apologie terrorisme, contenu pédopornographique) + Et que des auditeurs signalent le contenu + Quand un modérateur vérifie en temps réel + Et confirme le contenu illégal + Alors le live est coupé immédiatement + Et je reçois un Strike 4 (ban définitif) Et mon compte est banni définitivement - Et les autorités sont notifiées + Et les autorités compétentes sont immédiatement notifiées + Et le replay n'est pas publié Scénario: Détection musique protégée en arrière-plan Étant donné que mon live contient de la musique protégée en fond