# language: fr Fonctionnalité: Multi-devices et détection simultanée En tant qu'abonné Premium Je veux utiliser mon compte sur plusieurs appareils Mais limité à 1 seul stream actif à la fois pour éviter le partage abusif Contexte: Étant donné que je suis un utilisateur Premium actif Et que mon compte est valide # ===== LIMITE 1 STREAM ACTIF ===== Scénario: 1 seul stream actif autorisé par compte Étant donné que je n'écoute rien actuellement Quand je lance un contenu sur mon iPhone Alors le stream démarre normalement Et Redis enregistre: active_streams:{user_id} = {device_id: "iPhone", started_at: timestamp} Scénario: Détection connexion simultanée - Arrêt premier device Étant donné que j'écoute un contenu sur mon iPhone Quand je lance un contenu sur mon iPad Alors le système détecte une session active sur iPhone Et la lecture sur iPhone est arrêtée immédiatement (WebSocket close) Et je vois sur iPhone: "Lecture interrompue : votre compte est utilisé sur un autre appareil" Et la lecture démarre sur iPad normalement Scénario: Message explicite sur device interrompu Étant donné que ma lecture sur iPhone vient d'être interrompue Quand je regarde l'écran de mon iPhone Alors je vois une overlay avec le message: """ 🔴 Lecture interrompue Votre compte Premium est utilisé sur un autre appareil. Un seul stream actif est autorisé à la fois pour protéger les revenus des créateurs et éviter le partage de compte. """ Et un bouton "Reprendre ici" est disponible Scénario: Reprendre lecture sur device interrompu Étant donné que ma lecture sur iPhone a été interrompue Et que je veux reprendre sur iPhone Quand je clique sur "Reprendre ici" Alors la lecture démarre sur iPhone Et l'iPad est à son tour interrompu avec le même message Et le "ping-pong" entre devices est possible (mais pénible) # ===== IMPLÉMENTATION TECHNIQUE REDIS ===== Scénario: Enregistrement session active dans Redis Étant donné que je lance un contenu sur mon iPhone Quand la lecture démarre Alors une entrée Redis est créée: ``` Key: active_streams:{user_id} Value: { "device_id": "iPhone-ABC123", "started_at": "2025-06-15T14:30:00Z", "content_id": "xyz789" } TTL: 300 secondes (5 minutes) ``` Scénario: Heartbeat toutes les 30 secondes pour maintenir session Étant donné que j'écoute un contenu sur mon iPhone Quand 30 secondes s'écoulent Alors l'app envoie un heartbeat au serveur Et le serveur refresh le TTL Redis à 300 secondes Et la session reste active Scénario: Session considérée morte après 5 minutes sans heartbeat Étant donné que j'écoute un contenu sur mon iPhone Mais que l'app crash ou que le réseau coupe Quand 5 minutes s'écoulent sans heartbeat Alors l'entrée Redis expire automatiquement (TTL atteint) Et je peux relancer sur n'importe quel device sans conflit Scénario: Vérification session avant démarrage lecture Étant donné que je veux lancer un contenu sur mon iPad Quand j'appuie sur Play Alors le serveur vérifie Redis: active_streams:{user_id} Et si une session existe sur un autre device, elle est tuée Et la nouvelle session iPad est enregistrée dans Redis Scénario: Gestion multi-utilisateurs simultanés Étant donné que 100 000 utilisateurs Premium écoutent simultanément Quand Redis stocke 100 000 entrées active_streams Alors chaque entrée a un TTL de 5 minutes Et Redis gère facilement cette charge (~10 MB de RAM) Et les vérifications sont quasi-instantanées (O(1)) # ===== EXCEPTIONS ET CAS PARTICULIERS ===== Scénario: Contenus téléchargés (offline) ne comptent pas comme stream Étant donné que j'ai téléchargé 20 contenus en mode offline Quand j'écoute un contenu téléchargé sur mon iPhone sans réseau Alors aucune session active n'est enregistrée dans Redis Et je peux écouter offline pendant qu'un autre device stream online Car le contenu offline ne consomme pas de bande passante serveur Scénario: Transition rapide device <10s tolérée Étant donné que j'écoute dans ma voiture sur mon iPhone Et que j'arrive chez moi Quand je lance la lecture sur mon iPad dans les 10 secondes Alors la transition est considérée comme un changement de device légitime Et aucun message d'erreur n'est affiché sur iPhone Et la lecture reprend exactement où j'étais sur iPad Scénario: Détection transition rapide via timestamps Étant donné que la session iPhone a started_at = 14:30:00 Quand je lance sur iPad à 14:30:05 (5 secondes après) Alors le serveur détecte: diff = 5s < 10s Et applique une "graceful transition" (pas de message d'erreur iPhone) Et Redis met à jour: active_streams:{user_id} = {device_id: "iPad", ...} Scénario: Plusieurs devices disponibles mais 1 seul actif Étant donné que je possède: | device | status | | iPhone | Installé | | iPad | Installé | | MacBook (web) | Connecté | | Android (conjoint)| Installé | Quand je lance un stream sur n'importe quel device Alors seulement 1 peut être actif à la fois Et les autres devices sont en "standby" # ===== JUSTIFICATIONS ===== Scénario: Justification anti-partage compte Étant donné qu'un utilisateur Premium partage son compte avec un ami Quand les 2 personnes essaient d'écouter simultanément Alors la lecture est constamment interrompue sur l'un ou l'autre Et l'expérience devient inutilisable Et cela décourage fortement le partage de compte Scénario: Justification protection revenus créateurs Étant donné que 1 abonnement Premium = 4.99€/mois Quand 70% sont reversés aux créateurs (3.49€) Alors les créateurs sont rémunérés pour 1 personne Et si 2 personnes utilisent le même compte simultanément, c'est injuste Et la limite 1 stream protège l'équité du système Scénario: Justification UX claire Étant donné qu'un stream est interrompu sur un device Quand l'utilisateur voit le message explicite Alors il comprend immédiatement pourquoi (autre device actif) Et il peut choisir de reprendre sur le device actuel ou l'autre Et il n'y a pas de confusion ou frustration Scénario: Comparaison avec Spotify (limite 1 stream) Étant donné que Spotify Premium limite aussi à 1 stream actif Quand RoadWave applique la même règle Alors les utilisateurs connaissent déjà ce comportement Et cela paraît normal et accepté par l'industrie Scénario: Comparaison avec Netflix (plusieurs streams selon formule) Étant donné que Netflix permet 1-4 streams selon la formule Quand RoadWave limite à 1 stream pour tous Alors c'est plus strict que Netflix Mais Netflix cible le foyer familial (TV partagée) Alors que RoadWave cible l'individu conducteur (usage personnel) # ===== MONITORING ET DÉTECTION ABUS ===== Scénario: Détection pattern suspect - Changements devices fréquents Étant donné qu'un utilisateur change de device 50 fois en 1 heure Quand le système détecte ce pattern anormal Alors une alerte est générée pour l'équipe modération Et le compte peut être marqué pour surveillance Et si abus confirmé, suspension possible Scénario: Logs des changements de device Étant donné que je change de device plusieurs fois par jour Quand les changements sont loggés Alors chaque événement est enregistré: | timestamp | from_device | to_device | content_id | | 2025-06-15 08:30:00 | null | iPhone | abc123 | | 2025-06-15 09:15:00 | iPhone | iPad | def456 | | 2025-06-15 18:30:00 | iPad | iPhone | ghi789 | Et ces logs aident à détecter les partages de compte Scénario: Métriques admin - Changements devices par utilisateur Étant donné qu'un admin consulte les métriques de streaming Quand il accède au dashboard Alors il voit: | métrique | valeur | | Utilisateurs Premium actifs | 12,547 | | Changements de device/jour (médiane) | 2 | | Utilisateurs >10 changements/jour | 47 (0.4%) | | Comptes suspects (>20 changements/j) | 3 | Scénario: Email d'avertissement si changements excessifs Étant donné que je change de device 30 fois par jour pendant 3 jours Quand le système détecte ce pattern Alors je reçois un email d'avertissement: """ ⚠️ Activité inhabituelle détectée sur votre compte Nous avons détecté un nombre anormalement élevé de changements de device (30/jour). Rappel: Le partage de compte Premium est interdit selon nos CGU. Un seul stream actif est autorisé à la fois. Si cette activité continue, votre compte pourra être suspendu. """ Scénario: Suspension compte après avertissement ignoré Étant donné que j'ai reçu un email d'avertissement il y a 7 jours Mais que je continue à changer de device 30 fois par jour Quand l'équipe modération examine le compte Alors mon compte Premium peut être suspendu pour partage abusif Et je reçois un email de suspension avec justification # ===== SUPPORT UTILISATEUR ===== Scénario: FAQ - Pourquoi ma lecture s'arrête quand j'utilise un autre device ? Étant donné que je consulte la FAQ Premium Quand je cherche "lecture interrompue" Alors je trouve la réponse: """ Q: Pourquoi ma lecture s'arrête quand j'utilise un autre appareil ? R: Votre abonnement Premium autorise 1 seul stream actif à la fois. Si vous lancez la lecture sur un autre appareil, le premier est automatiquement arrêté. Pourquoi cette limite ? - Protéger les revenus des créateurs (1 abonnement = 1 personne) - Éviter le partage de compte abusif Vous pouvez utiliser autant d'appareils que vous voulez, mais un seul peut lire à la fois. """ Scénario: Support - Utilisateur pense être piraté Étant donné qu'un utilisateur voit constamment "Lecture interrompue" Et qu'il pense que son compte est piraté Quand il contacte le support Alors le support vérifie les logs de changements de device Et peut identifier les devices (iPhone, iPad perso vs iPhone inconnu) Et conseille de changer le mot de passe si device inconnu détecté Scénario: Changement mot de passe déconnecte tous les devices Étant donné que je pense que mon compte est compromis Quand je change mon mot de passe Alors tous mes devices sont déconnectés immédiatement Et les sessions actives dans Redis sont supprimées Et je dois me reconnecter sur chaque device Et cela sécurise mon compte # ===== TESTS TECHNIQUES ===== Scénario: Test charge - 100 000 vérifications/seconde Étant donné que 100 000 utilisateurs Premium lancent des contenus Quand chaque lancement vérifie Redis (GET active_streams:{user_id}) Alors Redis peut gérer facilement 100 000 requêtes/seconde Et le temps de réponse moyen est <1ms Et aucun ralentissement n'est constaté Scénario: Test failover Redis Étant donné que le serveur Redis principal tombe en panne Quand le failover automatique vers le replica Redis s'active Alors les sessions actives peuvent être perdues temporairement (max 5 min) Mais les utilisateurs peuvent relancer immédiatement Et l'impact est minimal (pas de perte de données critiques) Scénario: Test concurrence - Lancement simultané 2 devices Étant donné que je lance exactement au même instant sur iPhone et iPad Quand les 2 requêtes arrivent en parallèle au serveur Alors Redis utilise un lock (SETNX) pour atomicité Et 1 seul device gagne (par exemple iPhone) Et l'autre device (iPad) reçoit immédiatement une erreur Et l'utilisateur peut retry sur iPad si souhaité Scénario: Nettoyage automatique sessions expirées Étant donné que 1000 sessions Redis ont expiré (TTL atteint) Quand Redis supprime automatiquement ces entrées Alors la mémoire est libérée Et les nouveaux streams peuvent démarrer sans conflit Et aucune intervention manuelle n'est nécessaire