Initial commit
This commit is contained in:
197
features/radio-live/architecture-technique-live.feature
Normal file
197
features/radio-live/architecture-technique-live.feature
Normal file
@@ -0,0 +1,197 @@
|
||||
# language: fr
|
||||
Fonctionnalité: Architecture technique radio live
|
||||
En tant que système
|
||||
Je veux gérer efficacement les flux audio en temps réel
|
||||
Afin d'assurer une diffusion stable et scalable des lives
|
||||
|
||||
Contexte:
|
||||
Étant donné que l'infrastructure RoadWave est opérationnelle
|
||||
Et que les serveurs Go avec Pion WebRTC sont actifs
|
||||
|
||||
Scénario: Ingestion WebRTC du flux créateur
|
||||
Étant donné qu'un créateur démarre un live depuis son application mobile
|
||||
Quand le flux audio WebRTC (Opus 48 kbps) arrive sur le serveur
|
||||
Alors le serveur Go avec Pion WebRTC accepte la connexion
|
||||
Et le flux est traité en temps réel
|
||||
|
||||
Scénario: Conversion temps réel Opus vers segments HLS
|
||||
Étant donné qu'un flux WebRTC Opus est reçu par le serveur
|
||||
Quand le serveur traite le flux
|
||||
Alors FFmpeg convertit en segments HLS (.ts)
|
||||
Et un fichier manifest .m3u8 est généré et mis à jour régulièrement
|
||||
Et les segments ont une durée de 2 secondes chacun
|
||||
|
||||
Scénario: Distribution via NGINX Cache
|
||||
Étant donné que les segments HLS sont générés
|
||||
Quand un auditeur demande à rejoindre le live
|
||||
Alors le manifest .m3u8 est servi via NGINX Cache (OVH)
|
||||
Et les segments .ts sont cachés sur le cache NGINX
|
||||
Et la distribution est globale avec latence minimale
|
||||
|
||||
Scénario: Lecture HLS native sur mobile iOS
|
||||
Étant donné qu'un auditeur iOS rejoint un live
|
||||
Quand l'application charge le flux HLS
|
||||
Alors le player natif AVPlayer gère la lecture
|
||||
Et le buffer de 15 secondes est appliqué automatiquement
|
||||
Et la qualité s'adapte selon la connexion
|
||||
|
||||
Scénario: Lecture HLS native sur mobile Android
|
||||
Étant donné qu'un auditeur Android rejoint un live
|
||||
Quand l'application charge le flux HLS
|
||||
Alors le player natif ExoPlayer gère la lecture
|
||||
Et le buffer de 15 secondes est configuré
|
||||
Et la qualité s'adapte selon la connexion
|
||||
|
||||
Scénario: Enregistrement parallèle du flux pour replay
|
||||
Étant donné qu'un live est en cours
|
||||
Alors un processus parallèle enregistre le flux Opus raw
|
||||
Et l'enregistrement est stocké temporairement sur le serveur
|
||||
Et l'enregistrement est indépendant de la diffusion HLS
|
||||
|
||||
Scénario: Traitement post-live asynchrone
|
||||
Étant donné qu'un live vient de se terminer
|
||||
Quand le processus post-live démarre
|
||||
Alors un job asynchrone est créé dans la queue Redis
|
||||
Et un worker Go récupère le job
|
||||
Et le worker exécute FFmpeg pour les conversions
|
||||
|
||||
Scénario: Conversion Opus raw vers MP3 256 kbps
|
||||
Étant donné qu'un worker traite un job post-live
|
||||
Quand la conversion démarre
|
||||
Alors FFmpeg convertit Opus raw en MP3 256 kbps
|
||||
Et la normalisation audio à -14 LUFS est appliquée
|
||||
Et les silences prolongés (>3 secondes) sont détectés et nettoyés
|
||||
|
||||
Scénario: Génération segments HLS pour le replay
|
||||
Étant donné que le MP3 256 kbps est généré
|
||||
Quand le worker crée les segments HLS
|
||||
Alors des segments .ts de 10 secondes sont créés
|
||||
Et un manifest .m3u8 est généré
|
||||
Et les segments sont uploadés vers OVH Object Storage
|
||||
|
||||
Scénario: Publication automatique du replay
|
||||
Étant donné que tous les segments HLS sont uploadés
|
||||
Quand le worker finalise le job
|
||||
Alors une entrée de contenu "replay" est créée en base PostgreSQL
|
||||
Et le titre est "[REPLAY] [Titre live original]"
|
||||
Et le type géographique est "Géo-neutre"
|
||||
Et le replay est immédiatement disponible pour les auditeurs
|
||||
|
||||
Scénario: Suppression automatique fichier Opus raw après 7 jours
|
||||
Étant donné qu'un replay est publié depuis 7 jours
|
||||
Quand le job de nettoyage quotidien s'exécute
|
||||
Alors le fichier Opus raw est supprimé du stockage
|
||||
Et seul le MP3 256 kbps et les segments HLS sont conservés
|
||||
Et l'espace de stockage est libéré
|
||||
|
||||
Scénario: Scalabilité horizontale des workers de conversion
|
||||
Étant donné que 50 lives se terminent simultanément
|
||||
Quand les jobs post-live sont créés
|
||||
Alors les workers Go disponibles traitent les jobs en parallèle
|
||||
Et si tous les workers sont occupés, les jobs attendent en queue Redis
|
||||
Et de nouveaux workers peuvent être lancés automatiquement (Kubernetes)
|
||||
|
||||
Scénario: Limitation du nombre de lives simultanés (MVP)
|
||||
Étant donné que l'infrastructure MVP est configurée pour 100 lives simultanés
|
||||
Et que 100 lives sont actuellement en cours
|
||||
Quand un nouveau créateur essaie de démarrer un live
|
||||
Alors la demande est refusée avec le code erreur 503
|
||||
Et le message "Capacité maximale atteinte. Veuillez réessayer dans quelques minutes" est retourné
|
||||
Et la demande peut être mise en queue prioritaire si créateur Premium
|
||||
|
||||
Scénario: Monitoring des ressources serveur en temps réel
|
||||
Étant donné que plusieurs lives sont en cours
|
||||
Alors le système monitore en temps réel:
|
||||
| métrique | seuil alerte |
|
||||
| CPU utilisation | >80% |
|
||||
| Mémoire utilisation | >85% |
|
||||
| Bande passante upload | >80% capacité|
|
||||
| Nombre connexions WebRTC | >90 |
|
||||
| Latence moyenne CDN | >200ms |
|
||||
Et si un seuil est dépassé, une alerte est envoyée à l'équipe technique
|
||||
|
||||
Scénario: Calcul du coût de bande passante CDN
|
||||
Étant donné qu'un live a 100 auditeurs simultanés
|
||||
Et que la qualité est 48 kbps Opus
|
||||
Quand le live dure 1 heure
|
||||
Alors la bande passante totale est d'environ 2.16 GB
|
||||
Et le coût estimé infrastructure est d'environ 0.02€
|
||||
Et ces métriques sont enregistrées pour facturation créateur si nécessaire
|
||||
|
||||
Scénario: Cache NGINX des segments HLS
|
||||
Étant donné qu'un live est diffusé via NGINX Cache
|
||||
Quand un segment .ts est généré
|
||||
Alors le segment est uploadé vers OVH Object Storage origin
|
||||
Et NGINX Cache met en cache le segment
|
||||
Et les auditeurs suivants récupèrent le segment depuis le cache
|
||||
Et la charge sur le serveur origin est réduite de ~90%
|
||||
|
||||
Scénario: Gestion de la latence WebRTC créateur
|
||||
Étant donné qu'un créateur diffuse avec une connexion 4G
|
||||
Quand la latence réseau augmente ponctuellement
|
||||
Alors le buffer côté serveur absorbe les fluctuations
|
||||
Et la qualité peut être réduite temporairement (48 kbps → 32 kbps)
|
||||
Et un warning est affiché au créateur si la connexion est trop instable
|
||||
|
||||
Scénario: Détection automatique de la musique protégée (post-MVP)
|
||||
Étant donné qu'un live contient de la musique en arrière-plan
|
||||
Quand le système d'audio fingerprint analyse le flux
|
||||
Alors une empreinte audio est calculée toutes les 30 secondes
|
||||
Et l'empreinte est comparée à une base de données de contenus protégés
|
||||
Et si une correspondance est trouvée, un warning est envoyé au créateur
|
||||
Et si le créateur ne corrige pas sous 30 secondes, le live peut être arrêté
|
||||
|
||||
Scénario: Stockage des métadonnées de live en PostgreSQL
|
||||
Étant donné qu'un créateur démarre un live
|
||||
Alors les métadonnées suivantes sont enregistrées:
|
||||
| champ | exemple valeur |
|
||||
| live_id | uuid v4 |
|
||||
| creator_id | uuid créateur |
|
||||
| title | "Mon super live" |
|
||||
| started_at | timestamp UTC |
|
||||
| zone_geo | "Île-de-France" |
|
||||
| tags | ["Actualité", "Tech"] |
|
||||
| classification_age | "Tout public" |
|
||||
Et ces données sont indexées pour recherche et analytics
|
||||
|
||||
Scénario: Cache Redis pour compteurs temps réel
|
||||
Étant donné qu'un live est en cours
|
||||
Alors Redis stocke les compteurs temps réel:
|
||||
| clé Redis | valeur exemple |
|
||||
| live:[live_id]:listeners | 247 |
|
||||
| live:[live_id]:likes | 89 |
|
||||
| live:[live_id]:reports | 0 |
|
||||
Et ces compteurs sont mis à jour toutes les 2 secondes
|
||||
Et les compteurs sont persistés en PostgreSQL toutes les 60 secondes
|
||||
|
||||
Scénario: Heartbeat auditeurs pour compteur précis
|
||||
Étant donné qu'un auditeur écoute un live
|
||||
Alors l'application envoie un heartbeat toutes les 10 secondes
|
||||
Et le heartbeat met à jour le timestamp dans Redis
|
||||
Et si aucun heartbeat n'est reçu pendant 30 secondes, l'auditeur est retiré du compteur
|
||||
|
||||
Scénario: Gestion des pannes serveur pendant un live
|
||||
Étant donné qu'un live est en cours sur serveur A
|
||||
Quand le serveur A tombe en panne
|
||||
Alors Kubernetes redémarre automatiquement un pod
|
||||
Mais le live en cours est perdu (pas de failover temps réel en MVP)
|
||||
Et le créateur voit le message "Connexion perdue. Veuillez redémarrer le live"
|
||||
Et les auditeurs voient "Le live est terminé suite à un problème technique"
|
||||
|
||||
Scénario: Backup automatique des enregistrements live
|
||||
Étant donné qu'un live est enregistré en Opus raw
|
||||
Quand l'enregistrement dépasse 10 minutes
|
||||
Alors un backup incrémental est créé toutes les 10 minutes
|
||||
Et le backup est stocké sur un stockage secondaire (S3-compatible)
|
||||
Et en cas de crash serveur, le live peut être récupéré jusqu'au dernier backup
|
||||
|
||||
Scénario: Logs et audit trail des lives
|
||||
Étant donné qu'un live démarre, se déroule et se termine
|
||||
Alors tous les événements sont loggés:
|
||||
| événement | détails enregistrés |
|
||||
| Démarrage live | timestamp, creator_id, zone_geo |
|
||||
| Auditeur rejoint | timestamp, user_id, position GPS |
|
||||
| Auditeur quitte | timestamp, user_id, durée écoute |
|
||||
| Signalement | timestamp, user_id, catégorie |
|
||||
| Fin live | timestamp, durée totale, stats finales |
|
||||
Et ces logs sont conservés 90 jours pour analytics et conformité RGPD
|
||||
159
features/radio-live/arret-live.feature
Normal file
159
features/radio-live/arret-live.feature
Normal file
@@ -0,0 +1,159 @@
|
||||
# language: fr
|
||||
Fonctionnalité: Arrêt du live
|
||||
En tant que créateur
|
||||
Je veux arrêter ma diffusion en direct de manière contrôlée
|
||||
Afin de terminer proprement mon live et générer un replay automatiquement
|
||||
|
||||
Contexte:
|
||||
Étant donné que l'API RoadWave est disponible
|
||||
Et que je suis connecté en tant que créateur
|
||||
Et que je diffuse actuellement un live
|
||||
|
||||
Scénario: Arrêt manuel avec compte à rebours 5 secondes
|
||||
Quand j'appuie sur le bouton "Arrêter live"
|
||||
Alors un compte à rebours de 5 secondes démarre
|
||||
Et je vois le message "Ce live se termine dans 5... 4... 3... 2... 1"
|
||||
Et un bouton "Annuler" est affiché pendant le décompte
|
||||
Et l'audio du compte à rebours est diffusé aux auditeurs
|
||||
|
||||
Scénario: Annulation du compte à rebours
|
||||
Étant donné que j'ai appuyé sur "Arrêter live"
|
||||
Et que le compte à rebours affiche "3 secondes"
|
||||
Quand j'appuie sur "Annuler"
|
||||
Alors le compte à rebours s'arrête
|
||||
Et le live continue normalement
|
||||
Et aucune notification n'est envoyée aux auditeurs
|
||||
|
||||
Scénario: Arrêt effectif après compte à rebours
|
||||
Étant donné que le compte à rebours est à 0
|
||||
Alors le live s'arrête
|
||||
Et la diffusion aux auditeurs se termine
|
||||
Et le message "Live terminé" s'affiche
|
||||
Et le processus de traitement post-live démarre automatiquement
|
||||
|
||||
Scénario: Déconnexion créateur courte (moins de 60 secondes)
|
||||
Étant donné que je diffuse un live
|
||||
Quand ma connexion est perdue pendant 30 secondes
|
||||
Alors les auditeurs voient le message "Connexion créateur perdue, reconnexion en cours..."
|
||||
Et le live continue de bufferer
|
||||
Et quand ma connexion revient, le live reprend normalement
|
||||
|
||||
Scénario: Déconnexion créateur longue (60 secondes ou plus)
|
||||
Étant donné que je diffuse un live
|
||||
Quand ma connexion est perdue pendant 60 secondes
|
||||
Alors le live s'arrête automatiquement
|
||||
Et les auditeurs voient le message "Le live est terminé suite à une coupure de connexion"
|
||||
Et le processus de traitement post-live démarre
|
||||
|
||||
Scénario: Enregistrement automatique pendant le live
|
||||
Étant donné que je diffuse un live
|
||||
Alors mon flux audio est enregistré en continu
|
||||
Et le format d'enregistrement est Opus raw
|
||||
Et l'enregistrement est stocké temporairement sur le serveur
|
||||
|
||||
Scénario: Génération automatique du replay après arrêt
|
||||
Étant donné que mon live vient de se terminer
|
||||
Et que l'option "Publier replay automatiquement" est activée (par défaut)
|
||||
Quand le traitement post-live démarre
|
||||
Alors un job asynchrone est créé
|
||||
Et le job effectue les opérations suivantes:
|
||||
| opération | détail |
|
||||
| Conversion format | Opus raw → MP3 256 kbps |
|
||||
| Génération segments HLS | Segments .ts pour streaming |
|
||||
| Normalisation volume | -14 LUFS |
|
||||
| Détection silences prolongés | Nettoyage automatique |
|
||||
|
||||
Scénario: Publication du replay
|
||||
Étant donné que le traitement post-live est terminé
|
||||
Alors le replay est publié automatiquement sous 5 à 10 minutes
|
||||
Et le titre est "[REPLAY] [Titre live original]"
|
||||
Et la zone de diffusion est la même que le live
|
||||
Et les tags sont identiques au live
|
||||
Et la classification d'âge est identique
|
||||
Et le type géographique est "Géo-neutre" (contenu pérenne)
|
||||
|
||||
Scénario: Notification de disponibilité du replay aux auditeurs
|
||||
Étant donné que le replay de mon live est publié
|
||||
Quand un auditeur qui a écouté le live se reconnecte
|
||||
Alors il voit une notification in-app "Le replay de [Titre] est disponible"
|
||||
|
||||
Scénario: Option désactivation publication automatique replay
|
||||
Étant donné que je configure un nouveau live
|
||||
Quand je désactive l'option "Publier replay automatiquement"
|
||||
Et que je démarre puis arrête le live
|
||||
Alors le live est enregistré
|
||||
Mais le replay n'est pas publié automatiquement
|
||||
Et je peux décider manuellement de le publier plus tard
|
||||
|
||||
Scénario: Suppression manuelle du replay après publication
|
||||
Étant donné que mon live a généré un replay publié
|
||||
Quand j'accède à mes contenus
|
||||
Alors je vois le replay dans ma liste
|
||||
Et je peux le supprimer comme n'importe quel contenu
|
||||
Quand je supprime le replay
|
||||
Alors le fichier source Opus raw est supprimé immédiatement
|
||||
|
||||
Scénario: Conservation fichier source Opus raw
|
||||
Étant donné que mon live est terminé
|
||||
Et que le replay est publié
|
||||
Alors le fichier Opus raw est conservé pendant 7 jours
|
||||
Et après 7 jours, le fichier raw est supprimé automatiquement
|
||||
Et seul le MP3 256 kbps est conservé
|
||||
|
||||
Scénario: Modification du replay interdite
|
||||
Étant donné que mon live a généré un replay publié
|
||||
Quand j'essaie de modifier l'audio du replay
|
||||
Alors l'action est refusée
|
||||
Et je vois le message "Les replays ne peuvent pas être modifiés pour garantir l'intégrité de l'enregistrement"
|
||||
Et je peux uniquement modifier les métadonnées (titre, description)
|
||||
|
||||
Scénario: Statistiques du live disponibles après arrêt
|
||||
Étant donné que mon live est terminé
|
||||
Quand j'accède aux statistiques
|
||||
Alors je vois:
|
||||
| métrique | exemple valeur |
|
||||
| Durée totale | 1h 23min |
|
||||
| Nombre d'auditeurs max | 247 |
|
||||
| Nombre d'auditeurs moyen | 183 |
|
||||
| Nombre de likes | 89 |
|
||||
| Nombre d'abonnements | 12 |
|
||||
| Signalements reçus | 0 |
|
||||
|
||||
Scénario: Live terminé avec signalements en cours
|
||||
Étant donné que mon live a reçu 3 signalements pendant la diffusion
|
||||
Quand le live se termine
|
||||
Alors le replay n'est pas publié automatiquement
|
||||
Et le contenu est en attente de modération
|
||||
Et je vois le message "Votre replay sera publié après vérification suite aux signalements reçus"
|
||||
Et un modérateur doit valider ou refuser le replay sous 24h
|
||||
|
||||
Scénario: Arrêt forcé par un modérateur
|
||||
Étant donné que je diffuse un live
|
||||
Et qu'un modérateur détecte du contenu interdit
|
||||
Quand le modérateur clique sur "Arrêter le live immédiatement"
|
||||
Alors le live s'arrête sans compte à rebours
|
||||
Et je vois le message "Votre live a été interrompu par la modération"
|
||||
Et je reçois une notification détaillant la raison
|
||||
Et le replay n'est pas publié
|
||||
Et le fichier source est conservé 30 jours pour appel
|
||||
|
||||
Scénario: Métriques de bande passante pendant le live
|
||||
Étant donné que je diffuse un live
|
||||
Et que 100 auditeurs écoutent simultanément
|
||||
Alors la bande passante consommée est d'environ 4.8 Mbps via NGINX Cache
|
||||
Et le coût estimé infrastructure est d'environ 0.02€ par heure de diffusion
|
||||
Et je peux voir ces métriques en temps réel dans l'interface créateur
|
||||
|
||||
Scénario: Live sans auditeurs pendant 5 minutes
|
||||
Étant donné que je diffuse un live
|
||||
Et qu'aucun auditeur n'écoute depuis 5 minutes
|
||||
Alors je vois un message d'information "Aucun auditeur actuellement connecté"
|
||||
Mais le live continue normalement
|
||||
Et je peux choisir de continuer ou d'arrêter
|
||||
|
||||
Scénario: Qualité audio du replay supérieure au live
|
||||
Étant donné que mon live était diffusé en Opus 48 kbps
|
||||
Quand le replay est généré
|
||||
Alors le replay est encodé en MP3 256 kbps
|
||||
Et la qualité audio du replay est supérieure au live
|
||||
Et la taille du fichier est optimisée pour le stockage long terme
|
||||
209
features/radio-live/comportement-auditeur.feature
Normal file
209
features/radio-live/comportement-auditeur.feature
Normal file
@@ -0,0 +1,209 @@
|
||||
# language: fr
|
||||
Fonctionnalité: Comportement auditeur pendant un live
|
||||
En tant qu'auditeur
|
||||
Je veux écouter des lives de manière stable
|
||||
Afin de profiter du contenu en temps réel sans coupures
|
||||
|
||||
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: Rejoindre un live avec buffer de synchronisation 15 secondes
|
||||
Quand je clique sur "Rejoindre le live"
|
||||
Alors la connexion au flux HLS s'établit
|
||||
Et je commence à écouter avec un décalage de 15 secondes par rapport au créateur
|
||||
Et le buffer de 15 secondes garantit une lecture stable
|
||||
|
||||
Scénario: Justification du buffer 15 secondes
|
||||
Étant donné les alternatives de buffer possibles:
|
||||
| buffer | stabilité 3G | stabilité 4G | décalage perceptible | décision |
|
||||
| 5s | Faible | Moyenne | Non | ❌ |
|
||||
| 10s | Moyenne | Bonne | Non | ❌ |
|
||||
| 15s | Bonne | Excellente | Léger acceptable | ✅ |
|
||||
| 20s+ | Excellente | Excellente | Oui | ❌ |
|
||||
Alors le buffer optimal est 15 secondes
|
||||
|
||||
Scénario: Lecture stable sur réseau 3G
|
||||
Étant donné que je suis sur réseau 3G
|
||||
Et que j'écoute un live
|
||||
Quand des micro-coupures réseau surviennent
|
||||
Alors le buffer de 15 secondes absorbe les coupures
|
||||
Et la lecture continue sans interruption perceptible
|
||||
|
||||
Scénario: Lecture stable sur réseau 4G
|
||||
Étant donné que je suis sur réseau 4G
|
||||
Et que j'écoute un live
|
||||
Alors la lecture est fluide
|
||||
Et le buffer de 15 secondes prévient les coupures lors de changement de cellule
|
||||
|
||||
Scénario: Continuation du live en sortant de la zone géographique
|
||||
Étant donné que j'écoute un live régional "Île-de-France"
|
||||
Et que je suis situé en Île-de-France
|
||||
Quand je me déplace et sors du département
|
||||
Alors le live continue de jouer normalement
|
||||
Et je peux écouter jusqu'à la fin naturelle du live
|
||||
Et après la fin du live, l'algorithme propose du contenu correspondant à ma nouvelle position
|
||||
|
||||
Scénario: Abonné dans la zone reçoit notification push
|
||||
Étant donné que je suis abonné au créateur "JeanDupont"
|
||||
Et que je suis situé en Île-de-France
|
||||
Quand "JeanDupont" démarre un live en Île-de-France
|
||||
Alors je reçois une notification push "🔴 JeanDupont est en direct : [Titre du live]"
|
||||
Et quand je tape sur la notification, l'app s'ouvre et le live démarre immédiatement
|
||||
|
||||
Scénario: Abonné hors zone ne reçoit pas de notification
|
||||
Étant donné que je suis abonné au créateur "JeanDupont"
|
||||
Et que je suis situé à Lyon
|
||||
Quand "JeanDupont" démarre un live en Île-de-France
|
||||
Alors je ne reçois pas de notification push
|
||||
Et cela évite la frustration de ne pas pouvoir écouter un live hors zone
|
||||
|
||||
Scénario: Découverte d'un live via l'algorithme de recommandation
|
||||
Étant donné que je suis dans la zone géographique du live
|
||||
Et que je navigue dans l'app avec "Suivant"
|
||||
Quand l'algorithme propose un live en cours
|
||||
Alors je vois l'indicateur "🔴 EN DIRECT"
|
||||
Et je peux choisir de le rejoindre ou de passer au suivant
|
||||
|
||||
Scénario: Reconnexion rapide après coupure réseau (moins de 90 secondes)
|
||||
Étant donné que j'écoute un live
|
||||
Quand je perds ma connexion réseau pendant 45 secondes
|
||||
Et que je retrouve ma connexion
|
||||
Alors je reprends le live au moment actuel (pas au buffer ancien)
|
||||
Et le saut temporel est transparent (pas de message d'erreur)
|
||||
Et je ne rate que quelques secondes de contenu
|
||||
|
||||
Scénario: Reconnexion longue après coupure réseau (90 secondes ou plus)
|
||||
Étant donné que j'écoute un live
|
||||
Quand je perds ma connexion réseau pendant 90 secondes
|
||||
Et que je retrouve ma connexion
|
||||
Alors je vois le message "Live en cours perdu, passage au contenu suivant"
|
||||
Et l'algorithme propose automatiquement le contenu suivant
|
||||
Et je peux manuellement revenir au live s'il est toujours en cours
|
||||
|
||||
Scénario: Interactions disponibles pendant le live - Like
|
||||
Étant donné que j'écoute un live
|
||||
Et que mon véhicule est à l'arrêt
|
||||
Quand je clique sur le bouton "❤️ Like"
|
||||
Alors le like est enregistré immédiatement
|
||||
Et le compteur de likes visible par le créateur s'incrémente
|
||||
Et ma jauge d'intérêt pour les tags du live augmente de +2%
|
||||
|
||||
Scénario: Interactions disponibles pendant le live - Abonnement
|
||||
Étant donné que j'écoute un live
|
||||
Et que je ne suis pas encore abonné au créateur
|
||||
Quand je clique sur le bouton "S'abonner"
|
||||
Alors je m'abonne au créateur
|
||||
Et ma jauge d'intérêt pour tous les tags du créateur augmente de +5%
|
||||
Et je recevrai des notifications pour ses prochains lives
|
||||
|
||||
Scénario: Interactions disponibles pendant le live - Skip
|
||||
Étant donné que j'écoute un live
|
||||
Quand j'appuie sur "Suivant" (ou commande au volant)
|
||||
Alors je quitte le live immédiatement
|
||||
Et l'algorithme propose le contenu suivant
|
||||
Et si j'ai écouté moins de 10 secondes, ma jauge d'intérêt diminue de -0.5%
|
||||
|
||||
Scénario: Commande Précédent désactivée pendant un live
|
||||
Étant donné que j'écoute un live
|
||||
Quand j'appuie sur "Précédent" (ou commande au volant)
|
||||
Alors rien ne se passe
|
||||
Et un message d'information s'affiche brièvement "Précédent non disponible sur les lives"
|
||||
|
||||
Scénario: Chat en direct désactivé (décision définitive)
|
||||
Étant donné que j'écoute un live
|
||||
Alors aucune interface de chat n'est disponible
|
||||
Et je ne peux pas envoyer de messages au créateur
|
||||
Et je ne peux pas voir de messages d'autres auditeurs
|
||||
Et cette fonctionnalité ne sera jamais implémentée
|
||||
|
||||
Scénario: Réactions emoji désactivées (décision définitive)
|
||||
Étant donné que j'écoute un live
|
||||
Alors aucune réaction emoji n'est disponible
|
||||
Et je ne peux pas envoyer d'emoji en temps réel
|
||||
Et cette fonctionnalité ne sera jamais implémentée
|
||||
|
||||
Scénario: Message d'information sur l'absence de chat
|
||||
Étant donné que j'écoute mon premier live
|
||||
Quand j'accède à l'interface du live
|
||||
Alors je vois un bandeau informatif "💬 Les discussions ne sont pas disponibles sur RoadWave pour garantir votre sécurité en voiture et éviter le harcèlement."
|
||||
Et ce bandeau n'apparaît qu'une seule fois (première expérience)
|
||||
|
||||
Scénario: Signalement d'un live en cours
|
||||
Étant donné que j'écoute un live
|
||||
Et que le contenu me semble inapproprié
|
||||
Quand je clique sur le bouton "Signaler"
|
||||
Alors je vois les catégories de signalement:
|
||||
| catégorie |
|
||||
| Haine et violence |
|
||||
| Contenu sexuel |
|
||||
| Illégalité |
|
||||
| Droits d'auteur |
|
||||
| Désinformation dangereuse |
|
||||
| Harcèlement |
|
||||
| Autre |
|
||||
Et quand je sélectionne une catégorie
|
||||
Alors le signalement est envoyé en priorité selon la catégorie
|
||||
Et un modérateur peut écouter le live en temps réel si besoin
|
||||
|
||||
Scénario: Statistiques visibles par les auditeurs pendant le live
|
||||
Étant donné que j'écoute un live
|
||||
Quand je consulte les informations du live
|
||||
Alors je vois:
|
||||
| information | exemple valeur |
|
||||
| Nombre d'auditeurs | 247 personnes |
|
||||
| Durée du live | 1h 23min |
|
||||
| Nom du créateur | @JeanDupont |
|
||||
| Zone de diffusion | Île-de-France |
|
||||
| Tags | Actualité, Société |
|
||||
Mais je ne vois pas les likes ou autres métriques détaillées
|
||||
|
||||
Scénario: Compteur d'auditeurs arrondi pour préserver la vie privée
|
||||
Étant donné que j'écoute un live avec exactement 247 auditeurs
|
||||
Quand je consulte le nombre d'auditeurs
|
||||
Alors je vois "~250 auditeurs" (arrondi à la dizaine supérieure)
|
||||
|
||||
Scénario: Qualité audio adaptative pendant le live
|
||||
Étant donné que j'écoute un live
|
||||
Quand ma connexion passe de 4G à 3G
|
||||
Alors la qualité audio s'adapte automatiquement
|
||||
Et je passe de 48 kbps à 24 kbps Opus
|
||||
Et la transition est transparente sans coupure
|
||||
|
||||
Scénario: Consommation de données pendant un live
|
||||
Étant donné que j'écoute un live en qualité standard 48 kbps
|
||||
Et que j'écoute pendant 1 heure
|
||||
Alors j'ai consommé environ 21.6 MB de données mobiles
|
||||
Et cette consommation est affichée dans les paramètres de l'app
|
||||
|
||||
Scénario: Lecture du replay après la fin du live
|
||||
Étant donné que j'écoute un live depuis 30 minutes
|
||||
Quand le créateur arrête le live
|
||||
Alors je vois le message "Le live est terminé. Le replay sera disponible dans quelques minutes"
|
||||
Et le contenu suivant est automatiquement proposé après 2 secondes
|
||||
|
||||
Scénario: Notification de disponibilité du replay
|
||||
Étant donné que j'ai écouté un live jusqu'à la fin
|
||||
Et que le replay est publié 8 minutes plus tard
|
||||
Quand je rouvre l'application
|
||||
Alors je vois une notification in-app "Le replay de [Titre] est maintenant disponible"
|
||||
Et je peux cliquer pour l'écouter immédiatement
|
||||
|
||||
Scénario: Aucune publicité pendant un live pour utilisateurs gratuits
|
||||
Étant donné que je suis un utilisateur gratuit
|
||||
Et que j'écoute un live
|
||||
Alors aucune publicité n'est insérée pendant le live
|
||||
Et la publicité apparaît seulement entre le live et le contenu suivant
|
||||
|
||||
Scénario: Détection de contexte voiture pendant un live
|
||||
Étant donné que j'écoute un live
|
||||
Et que ma vitesse est supérieure à 10 km/h
|
||||
Alors l'interface tactile est désactivée pour la sécurité
|
||||
Et seules les commandes au volant sont actives (Play/Pause/Suivant)
|
||||
|
||||
Scénario: Détection de contexte piéton pendant un live
|
||||
Étant donné que j'écoute un live
|
||||
Et que ma vitesse est inférieure à 5 km/h
|
||||
Alors l'interface tactile complète est disponible
|
||||
Et je peux liker, m'abonner, signaler via l'écran tactile
|
||||
151
features/radio-live/demarrage-live.feature
Normal file
151
features/radio-live/demarrage-live.feature
Normal file
@@ -0,0 +1,151 @@
|
||||
# language: fr
|
||||
Fonctionnalité: Démarrage d'un live
|
||||
En tant que créateur
|
||||
Je veux démarrer une diffusion en direct
|
||||
Afin de partager du contenu audio en temps réel avec mes auditeurs
|
||||
|
||||
Contexte:
|
||||
Étant donné que l'API RoadWave est disponible
|
||||
Et que je suis connecté en tant que créateur vérifié
|
||||
Et que j'ai les permissions de diffusion live
|
||||
|
||||
Scénario: Vérifications pré-live réussies
|
||||
Étant donné que ma connexion upload est supérieure à 1 Mbps
|
||||
Et que j'ai autorisé l'accès au microphone
|
||||
Et que j'ai défini une zone de diffusion "Île-de-France"
|
||||
Quand je lance les vérifications pré-live
|
||||
Alors toutes les vérifications sont validées
|
||||
Et je peux démarrer le live
|
||||
|
||||
Scénario: Échec pré-live avec connexion insuffisante
|
||||
Étant donné que ma connexion upload est de 0.5 Mbps
|
||||
Quand je lance les vérifications pré-live
|
||||
Alors je vois un warning "Connexion insuffisante pour garantir une diffusion stable (minimum 1 Mbps)"
|
||||
Et je peux choisir de continuer quand même ou d'annuler
|
||||
|
||||
Scénario: Échec pré-live sans autorisation microphone
|
||||
Étant donné que je n'ai pas autorisé l'accès au microphone
|
||||
Quand j'essaie de démarrer un live
|
||||
Alors je vois le message "Accès au microphone requis pour démarrer un live"
|
||||
Et je suis redirigé vers les paramètres système
|
||||
|
||||
Scénario: Échec pré-live sans zone de diffusion définie
|
||||
Étant donné que je n'ai pas défini de zone de diffusion
|
||||
Quand j'essaie de démarrer un live
|
||||
Alors je vois le message "Veuillez définir une zone de diffusion avant de démarrer"
|
||||
Et je suis redirigé vers le formulaire de configuration du live
|
||||
|
||||
Scénario: Démarrage live avec buffer 15 secondes
|
||||
Étant donné que toutes les vérifications pré-live sont validées
|
||||
Quand j'appuie sur "Démarrer live"
|
||||
Alors je vois le message "Live démarre dans 15s... Testez votre micro"
|
||||
Et un compte à rebours de 15 secondes s'affiche
|
||||
Et mon flux audio est enregistré pendant ces 15 secondes
|
||||
Et le live n'est pas encore visible publiquement
|
||||
|
||||
Scénario: Live devient public après buffer initial
|
||||
Étant donné que j'ai démarré un live
|
||||
Et que le buffer de 15 secondes s'est écoulé
|
||||
Alors le live devient public
|
||||
Et les auditeurs peuvent le rejoindre
|
||||
Et les abonnés dans la zone reçoivent une notification push
|
||||
|
||||
Scénario: Notification push aux abonnés dans la zone géographique
|
||||
Étant donné que j'ai 1000 abonnés au total
|
||||
Et que 300 abonnés sont situés en Île-de-France
|
||||
Et que 700 abonnés sont situés hors Île-de-France
|
||||
Quand mon live en Île-de-France devient public
|
||||
Alors 300 abonnés reçoivent une notification push "🔴 [Mon pseudo] est en direct : [Titre live]"
|
||||
Et 700 abonnés ne reçoivent pas de notification
|
||||
|
||||
Scénario: Configuration métadonnées obligatoires pour un live
|
||||
Quand je configure un nouveau live
|
||||
Alors je dois renseigner:
|
||||
| champ | format | validation |
|
||||
| Titre | 5-100 caractères | Obligatoire |
|
||||
| Tags | 1-3 centres intérêt| Sélection liste prédéfinie |
|
||||
| Classification âge | Enum | Tout public / 13+ / 16+ / 18+ |
|
||||
| Zone diffusion | Geo | Ville / Département / Région / National |
|
||||
|
||||
Scénario: Validation échouée avec titre trop court
|
||||
Quand j'essaie de créer un live avec le titre "Live"
|
||||
Alors la validation échoue
|
||||
Et je vois le message "Le titre doit contenir entre 5 et 100 caractères"
|
||||
|
||||
Scénario: Validation échouée sans tags
|
||||
Étant donné que j'ai rempli tous les champs sauf les tags
|
||||
Quand j'essaie de démarrer le live
|
||||
Alors la validation échoue
|
||||
Et je vois le message "Veuillez sélectionner entre 1 et 3 centres d'intérêt"
|
||||
|
||||
Scénario: Limite de durée 8 heures
|
||||
Étant donné que mon live dure depuis 7 heures et 30 minutes
|
||||
Alors je vois un warning "Votre live se terminera dans 30 min"
|
||||
Et le message est affiché de manière non intrusive
|
||||
|
||||
Scénario: Arrêt automatique à 8 heures
|
||||
Étant donné que mon live dure depuis 8 heures
|
||||
Alors le live s'arrête automatiquement
|
||||
Et je vois le message "Durée maximale atteinte (8 heures). Vous pouvez redémarrer un nouveau live si nécessaire"
|
||||
Et le processus de traitement post-live démarre
|
||||
|
||||
Scénario: Diffusion contenu interdit - Concert en direct
|
||||
Étant donné que je diffuse un concert en direct depuis une salle
|
||||
Et qu'un auditeur signale le contenu pour "Violation droits d'auteur"
|
||||
Quand un modérateur écoute le live
|
||||
Et qu'il confirme la violation
|
||||
Alors le live est arrêté immédiatement
|
||||
Et je reçois un Strike 2 (suspension 7 jours)
|
||||
Et je vois le message "Votre live a été interrompu pour violation des droits d'auteur"
|
||||
Et le replay n'est pas publié
|
||||
|
||||
Scénario: Diffusion contenu interdit - Événement sportif payant
|
||||
Étant donné que je diffuse un match de football avec droits TV
|
||||
Et que le contenu est détecté par l'IA audio fingerprint
|
||||
Quand la détection est confirmée
|
||||
Alors le live est arrêté immédiatement
|
||||
Et je reçois un Strike 2 (suspension 7 jours)
|
||||
|
||||
Scénario: Diffusion contenu violent
|
||||
Étant donné que je diffuse du contenu violent (agression physique)
|
||||
Et que 5 auditeurs signalent le contenu
|
||||
Quand un modérateur vérifie en temps réel
|
||||
Et confirme la violence
|
||||
Alors le live est coupé immédiatement
|
||||
Et mon compte est banni définitivement
|
||||
Et les autorités sont notifiées
|
||||
|
||||
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
|
||||
Quand l'IA audio fingerprint détecte la violation après 2 minutes
|
||||
Alors je reçois un avertissement en direct "Musique protégée détectée. Veuillez couper le son ou risquez un arrêt du live"
|
||||
Et j'ai 30 secondes pour corriger
|
||||
Et si je ne corrige pas, le live est arrêté avec Strike 1
|
||||
|
||||
Scénario: Signalement pendant un live
|
||||
Étant donné que je diffuse un live
|
||||
Et qu'un auditeur clique sur "Signaler"
|
||||
Quand l'auditeur sélectionne la catégorie "Harcèlement"
|
||||
Alors le signalement est envoyé en priorité HAUTE
|
||||
Et un modérateur peut écouter le live en temps réel
|
||||
Et le live continue pendant l'écoute de vérification
|
||||
|
||||
Scénario: Dépassement nombre de lives simultanés autorisés (limite plateforme)
|
||||
Étant donné que la plateforme héberge actuellement 2000 lives simultanés
|
||||
Et que c'est la limite de l'infrastructure actuelle
|
||||
Quand j'essaie de démarrer un nouveau live
|
||||
Alors je vois le message "Capacité maximale atteinte. Veuillez réessayer dans quelques minutes"
|
||||
Et ma demande est mise en file d'attente prioritaire si je suis créateur Premium
|
||||
|
||||
Scénario: Premier live d'un nouveau créateur
|
||||
Étant donné que je n'ai jamais diffusé de live auparavant
|
||||
Et que j'ai moins de 3 contenus validés
|
||||
Quand j'essaie de démarrer mon premier live
|
||||
Alors je vois le message "Les lives sont disponibles après validation de vos 3 premiers contenus"
|
||||
Et le bouton "Démarrer live" est désactivé
|
||||
|
||||
Scénario: Créateur avec score de confiance faible
|
||||
Étant donné que j'ai 2 strikes actifs
|
||||
Quand j'essaie de démarrer un live
|
||||
Alors je vois le message "Fonctionnalité live temporairement indisponible suite à vos sanctions"
|
||||
Et je dois attendre la fin de ma suspension
|
||||
Reference in New Issue
Block a user