# language: fr Fonctionnalité: Insertion et fréquence des publicités En tant que système RoadWave Je veux insérer les publicités de manière équilibrée et non intrusive Afin de préserver l'expérience utilisateur tout en monétisant Contexte: Étant donné que l'API RoadWave est disponible Et qu'un utilisateur gratuit est connecté Scénario: Fréquence par défaut 1 pub / 5 contenus Étant donné que la fréquence par défaut est configurée à 1/5 Et que je suis un utilisateur gratuit Quand j'écoute 5 contenus Alors 1 publicité est insérée après le 5ème contenu Quand j'écoute 10 contenus Alors 2 publicités sont insérées (après les contenus 5 et 10) Scénario: Aucune publicité pour utilisateurs Premium Étant donné que je suis un utilisateur Premium Quand j'écoute 100 contenus Alors aucune publicité n'est insérée Et je bénéficie d'une expérience sans interruption publicitaire Scénario: Fréquence paramétrable par admin (1/3) Étant donné que l'admin configure la fréquence à 1/3 Et que je suis un utilisateur gratuit Quand j'écoute 6 contenus Alors 2 publicités sont insérées (après contenus 3 et 6) Scénario: Fréquence paramétrable par admin (1/10) Étant donné que l'admin configure la fréquence à 1/10 Et que je suis un utilisateur gratuit Quand j'écoute 20 contenus Alors 2 publicités sont insérées (après contenus 10 et 20) Scénario: Jamais d'interruption d'un contenu en cours Étant donné que j'écoute un contenu de 10 minutes Et que je suis à 5 minutes de lecture Et qu'une publicité devrait être insérée selon la fréquence Quand le système vérifie l'insertion Alors la publicité attend la fin du contenu actuel Et elle s'insère pendant le délai de transition (2s) Et le contenu n'est jamais interrompu Scénario: Insertion entre deux contenus uniquement Étant donné que le contenu "A" se termine Et que le délai de transition de 2s démarre Quand le système détecte qu'une publicité doit être insérée Alors le message "Publicité (30s)" s'affiche Et la publicité démarre après les 2 secondes Et l'enchaînement est naturel et fluide Scénario: Rotation limite 3 fois/jour par utilisateur Étant donné qu'un utilisateur a entendu la publicité "A" 3 fois aujourd'hui Quand le système sélectionne une nouvelle publicité à diffuser Alors la publicité "A" n'est plus éligible pour cet utilisateur aujourd'hui Et une autre publicité "B" est sélectionnée Et cela évite la saturation publicitaire Scénario: Compteur de diffusions par pub et par utilisateur Étant donné qu'un utilisateur écoute la pub "RestaurantX" Quand la diffusion se termine Alors un compteur Redis "pub:RestaurantX:user:123:count" s'incrémente Et le TTL est de 24h (reset à minuit) Quand le compteur atteint 3 Alors la pub "RestaurantX" est exclue des prochaines sélections aujourd'hui Scénario: Limite max 6 pubs/heure par utilisateur Étant donné qu'un utilisateur a entendu 6 publicités dans la dernière heure Quand le système devrait insérer une 7ème pub Alors l'insertion est reportée à l'heure suivante Et un compteur horaire Redis "pub:user:123:hourly" est vérifié Et cela évite le spam publicitaire Scénario: Ciblage géographique prioritaire - Point GPS Étant donné qu'une publicité cible un point GPS à 2km de ma position Et qu'une autre publicité cible ma ville entière Quand le système sélectionne une publicité Alors la publicité point GPS est priorisée (score géo plus élevé) Et le ciblage précis est favorisé Scénario: Ciblage géographique prioritaire - Hiérarchie Étant donné que 4 publicités sont éligibles: | Publicité | Zone | Distance | | A | Point GPS | 1km | | B | Ville | 0km | | C | Département | 0km | | D | National | N/A | Quand le système sélectionne selon priorité géographique Alors l'ordre de priorité est: A > B > C > D Et la publicité A (Point GPS, la plus précise) est diffusée Scénario: Ciblage centres d'intérêt secondaire Étant donné que 2 publicités ciblent ma zone géographique: | Publicité | Tags | Mes jauges | | A | Automobile | 80% | | B | Voyage | 40% | Quand le système applique le score centres d'intérêt Alors la publicité A est favorisée (meilleur match jauges) Et le ciblage thématique affine la sélection Scénario: Ciblage horaire strict Étant donné qu'une campagne cible uniquement 7h-9h Et qu'il est 10h30 Quand le système sélectionne une publicité Alors cette campagne n'est PAS éligible Et seules les campagnes "toute la journée" ou avec plage horaire actuelle sont considérées Scénario: Ciblage horaire pendant plage active Étant donné qu'une campagne cible 7h-9h et 17h-19h Et qu'il est 8h15 Quand le système sélectionne une publicité Alors cette campagne est éligible Et elle peut être diffusée Scénario: Normalisation volume audio -14 LUFS Étant donné qu'une publicité est uploadée avec volume trop élevé (-6 LUFS) Quand le système encode l'audio via FFmpeg Alors le volume est normalisé automatiquement à -14 LUFS Et le publicitaire reçoit une notification "Volume audio ajusté pour conformité" Et cela évite l'effet "pub trop forte" frustrant Scénario: Validation volume audio lors encodage Étant donné qu'une publicité est soumise Quand FFmpeg encode le fichier Alors une commande loudnorm est appliquée: ``` ffmpeg -i input.mp3 -filter:a loudnorm=I=-14:LRA=11:TP=-1 output.mp3 ``` Et le fichier final respecte le standard broadcast -14 LUFS Scénario: Sélection aléatoire si critères équivalents Étant donné que 3 publicités ont le même score géo Et qu'elles ont toutes des jauges centres d'intérêt équivalentes Et qu'aucune n'a été diffusée 3 fois aujourd'hui Quand le système sélectionne une publicité Alors une sélection aléatoire équitable est faite Et chaque campagne a 33% de chances d'être diffusée Scénario: Exclusion publicités avec budget épuisé Étant donné qu'une campagne "A" a épuisé son budget Et qu'une campagne "B" a encore du budget disponible Quand le système sélectionne une publicité Alors seule la campagne "B" est éligible Et la campagne "A" est automatiquement exclue Scénario: Exclusion publicités hors dates de campagne Étant donné qu'une campagne "A" est programmée du 01/02 au 14/02 Et que nous sommes le 20/01 Quand le système sélectionne une publicité Alors la campagne "A" n'est pas éligible Et seules les campagnes actives aujourd'hui sont considérées Scénario: Publicité visible uniquement dans zone géographique Étant donné qu'une publicité cible "Marseille uniquement" Et que je suis à Lyon Quand le système sélectionne une publicité Alors cette publicité n'est jamais éligible pour moi Et je ne la verrai jamais tant que je reste à Lyon Scénario: Tracking compteur horaire avec TTL Étant donné qu'un utilisateur entend une pub à 10h05 Quand le compteur horaire est incrémenté Alors la clé Redis "pub:user:123:hourly:2026012110" est créée Et le TTL est de 1 heure (expire à 11h05) Et le système compte les pubs dans la fenêtre glissante d'1h Scénario: Reset compteur quotidien à minuit Étant donné qu'un utilisateur a entendu la pub "A" 3 fois le 20/01 Quand minuit passe et on est le 21/01 Alors le compteur "pub:A:user:123:count" est expiré (TTL 24h) Et l'utilisateur peut à nouveau entendre la pub "A" jusqu'à 3 fois Scénario: Aucune pub si aucune campagne éligible Étant donné qu'aucune campagne n'a de budget disponible Ou que toutes les campagnes ont déjà été diffusées 3 fois aujourd'hui Quand le système devrait insérer une publicité Alors aucune pub n'est insérée Et l'enchaînement de contenus continue normalement Et le prochain contenu démarre directement Scénario: Priorisation campagnes avec budget important restant Étant donné que 2 campagnes sont éligibles: | Campagne | Budget restant | Jours restants | | A | 500€ | 2j | | B | 50€ | 10j | Quand le système applique la priorisation budgétaire Alors la campagne A est légèrement favorisée (urgence dépense) Et cela aide à épuiser les budgets avant fin de campagne Scénario: Log des sélections pour analytics Étant donné qu'une publicité "RestaurantX" est sélectionnée Quand elle est diffusée à l'utilisateur "123" Alors un événement est loggé en base: | Champ | Valeur | | pub_id | RestaurantX | | user_id | 123 | | timestamp | 2026-01-21 10:30 | | zone_geo | Marseille | | score_geo | 0.85 | | score_interet | 0.70 | Et cela permet l'analytics publicitaire Scénario: Détection changement statut utilisateur (gratuit → premium) Étant donné que je suis un utilisateur gratuit Et que j'entends des publicités Quand je souscris à Premium Alors le système détecte le changement de statut immédiatement Et plus aucune publicité n'est insérée dès le prochain contenu Et mon expérience devient sans pub instantanément Scénario: Interface admin pour ajuster fréquence globale Étant donné que je suis admin RoadWave Quand j'accède aux paramètres publicitaires Alors je peux ajuster le curseur de fréquence: | Option | Fréquence | | 1/3 | Haute (agressif) | | 1/5 | Standard (défaut)| | 1/7 | Modérée | | 1/10 | Faible | Et le changement s'applique en temps réel à tous les utilisateurs Scénario: A/B testing fréquence sur cohortes utilisateurs Étant donné que l'admin active un test A/B Quand 50% des utilisateurs ont fréquence 1/5 Et 50% des utilisateurs ont fréquence 1/7 Alors les métriques sont trackées séparément: | Cohorte | Fréquence | Taux désabonnement | Revenus/user | | A | 1/5 | 2.5% | 0.50€ | | B | 1/7 | 1.8% | 0.40€ | Et l'admin peut identifier la fréquence optimale Plan du Scénario: Insertion publicité selon fréquence Étant donné que la fréquence est Quand j'écoute contenus Alors publicités sont insérées Exemples: | frequence | contenus | pubs | | 1/3 | 9 | 3 | | 1/5 | 10 | 2 | | 1/5 | 25 | 5 | | 1/7 | 14 | 2 | | 1/10 | 30 | 3 | Plan du Scénario: Priorité géographique selon type zone Étant donné qu'une publicité cible Quand le système calcule le score géographique Alors la priorité est Exemples: | type_zone | score | | Point GPS | 1.0 | | Ville | 0.8 | | Département | 0.6 | | Région | 0.4 | | National | 0.2 | Plan du Scénario: Exclusion publicité selon compteur quotidien Étant donné qu'une publicité a été entendue fois aujourd'hui Quand le système vérifie l'éligibilité Alors la publicité est Exemples: | fois | eligible | | 0 | éligible | | 1 | éligible | | 2 | éligible | | 3 | non éligible | | 4 | non éligible |