## 7. Radio live ### 7.1 Démarrage d'un live **Décision** : Buffer 15s + notification abonnés + limite 8h **Processus de démarrage** : 1. Créateur appuie "Démarrer live" dans l'app 2. **Vérification pré-live** : - Connexion ≥1 Mbps upload (warning si insuffisant) - Micro autorisé - Zone diffusion déjà définie (ville, département, région, national) 3. **Buffer initial 15 secondes** avant diffusion publique - Créateur parle pendant 15s → accumulation buffer serveur - Message créateur : "Live démarre dans 15s... Testez votre micro" - Permet vérifier qualité audio avant diffusion 4. Après 15s → **Live public**, auditeurs peuvent rejoindre **Notification abonnés** : - ✅ **Push notification immédiate** à tous les abonnés dans la zone géographique - Message : "🔴 [Nom créateur] est en direct : [Titre live]" - Tap notification → ouverture app + lecture live immédiate - **Filtrage géographique** : si abonné hors zone, pas de notif (évite frustration) **Limite de durée** : - **Maximum 8 heures** par session live - Warning créateur à 7h30 : "Votre live se terminera dans 30 min" - Si besoin continuer → arrêt + redémarrage nouveau live (évite abus ressources serveur) **Métadonnées obligatoires** : | Champ | Format | Validation | |-------|--------|------------| | **Titre** | 5-100 caractères | Ex: "Discussion politique en direct" | | **Tags** | 1-3 centres d'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 | **Contenus interdits en live** : | Type | Description | Sanction | |------|-------------|----------| | **Concert/spectacle** | Diffusion concert en direct depuis la salle | Strike 2 immédiat + suspension 7 jours | | **Événement sportif payant** | Match, compétition avec droits TV | Strike 2 immédiat + suspension 7 jours | | **Œuvre protégée** | Film, série, musique en fond sans droits | Strike 1 + suspension 3 jours + suppression live | | **Contenu violent** | Agression, violence physique | Strike 3 immédiat + suspension 30 jours | | **Contenu illégal** | Apologie terrorisme, pédopornographie | Strike 4 (ban définitif) + signalement autorités | **Exemple usecase interdit** : ``` ❌ Utilisateur dans salle de concert diffuse live performance → Violation droits d'auteur + droits de diffusion → Détection : modération réactive (signalements) + IA audio fingerprint → Sanction : Strike 2 (suspension 7 jours) + suppression live + suppression replay ``` **Détection violations** : - **Signalement utilisateurs** : bouton "Signaler" accessible pendant live - **IA audio fingerprint** : détection musique protégée en arrière-plan (post-MVP, voir [Section 18](detection-contenu-protege.md)) - **Modération réactive** : modérateurs peuvent écouter lives signalés en temps réel - **Coupure immédiate** : modérateur peut arrêter live si contenu illégal évident **Justification** : - **Buffer 15s** : équilibre entre test qualité et friction minimale - **Notification abonnés** : engagement maximal, valeur ajoutée live - **8h max** : couvre 99% cas usage (podcasts longs, émissions radio) sans abus - **Interdictions strictes** : protection juridique plateforme (DSA EU, droits d'auteur) - **Coût** : WebRTC ingestion + HLS distribution (réutilise infra existante) --- ### 7.2 Arrêt du live **Décision** : Compte à rebours 5s + tolérance déconnexion 60s + enregistrement auto **Fin manuelle créateur** : 1. Créateur appuie "Arrêter live" 2. **Compte à rebours 5 secondes** affiché - Message audio : "Ce live se termine dans 5... 4... 3... 2... 1" - Permet au créateur de faire un outro propre - Annulable pendant décompte (bouton "Annuler") 3. Timer atteint 0 → arrêt diffusion 4. **Traitement post-live automatique** démarre (voir ci-dessous) **Fin automatique si déconnexion** : | Durée coupure | Comportement | |---------------|--------------| | **<60 secondes** | Message auditeurs : "Connexion créateur perdue, reconnexion en cours..." | | **≥60 secondes** | Arrêt automatique live + message : "Le live est terminé suite à une coupure de connexion" | **Enregistrement automatique** : ✅ **Obligatoire et automatique** (valeur ajoutée énorme) **Processus** : 1. Pendant live : enregistrement continu serveur (format Opus raw) 2. Fin live → **job asynchrone** (worker Go + FFmpeg) : - Conversion MP3 256 kbps (qualité optimale) - Génération segments HLS (comme contenu classique) - Normalisation volume -14 LUFS - Détection silences prolongés (nettoyage) 3. **Publication automatique** du replay : - Titre : "[REPLAY] [Titre live original]" - Même zone diffusion, tags, classification - Disponible sous **5-10 minutes** après fin live - Type géo : automatiquement "Géo-neutre" (replay = contenu pérenne) **Options créateur** : | Option | Défaut | Description | |--------|--------|-------------| | **Publier replay automatiquement** | ✅ OUI | Désactivable avant démarrage live | | **Supprimer replay après coup** | ✅ Possible | Suppression standard contenu | | **Modifier replay** | ❌ Non | Intégrité enregistrement | **Conservation fichier source** : - Opus raw conservé **7 jours** après fin live (backup) - Suppression automatique après 7j (économie stockage) - Si replay supprimé par créateur → fichier raw supprimé immédiatement **Justification** : - **Compte à rebours 5s** : outro propre, pas de coupure brutale - **Tolérance 60s** : évite arrêts intempestifs (tunnel, changement cellule) - **Enregistrement auto** : valorisation contenu éphémère, génération contenu pérenne - **MP3 256 kbps** : qualité optimale pour replay (vs 48 kbps live) - **Coût** : stockage minimal (Opus → MP3 1× par live, puis suppression raw après 7j) --- ### 7.3 Comportement auditeur **Décision** : Buffer 15s + continuation hors zone + reconnexion au live actuel + écoute passive uniquement **Buffer de synchronisation** : - **15 secondes** entre créateur et auditeurs - Raisons : - Stabilité réseau mobile (3G/4G fluctuant) - Synchronisation approximative acceptable (pas besoin temps réel strict) - Permet buffering anticiper coupures courtes (tunnels) **Comparaison buffers** : | Buffer | Avantages | Inconvénients | Décision | |--------|-----------|---------------|----------| | 5s | Quasi temps réel | Instable 3G, coupures fréquentes | ❌ | | 10s | Bon compromis | Légèrement juste pour 3G | ❌ | | **15s** | **Stabilité optimale 3G/4G** | Léger décalage acceptable | ✅ | | 20s+ | Très stable | Décalage trop perceptible | ❌ | **Zone géographique pendant live** : - ✅ **Continuation si sortie de zone** - Scénario : auditeur écoute live régional → sort du département → **live continue** - Raisons : - Pas de coupure brutale (mauvaise UX) - Écoute engagée = terminer naturellement - Après fin live → algo normal (pas de contenus hors zone) **Reconnexion après coupure réseau** : | Durée coupure | Comportement | |---------------|--------------| | **<90 secondes** | Reprend au live actuel (pas au buffer ancien) + saut temporel transparent | | **≥90 secondes** | Message : "Live en cours perdu, passage au contenu suivant" + algo propose contenu normal | **Interactions disponibles** : **Décision ferme** : ❌ **Aucun chat en direct, ni maintenant ni dans le futur** **Raisons** : - **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 **Actions autorisées pendant live** : | Action | Disponible | Effet | |--------|------------|-------| | **Like** | ✅ | Bouton cœur interface mobile (véhicule arrêté) | | **Abonnement créateur** | ✅ | Bouton profil créateur (interface mobile) | | **Skip** | ✅ | Passe au contenu suivant, sort du live | | **Précédent** | ❌ | Pas de sens sur live (flux temps réel) | | **Chat** | ❌ | Jamais implémenté (décision définitive) | | **Réactions emoji** | ❌ | Jamais implémenté (décision définitive) | **Messages utilisateur** : - "💬 Les discussions ne sont pas disponibles sur RoadWave pour garantir votre sécurité en voiture et éviter le harcèlement." **Justification décision définitive** : - **UX cohérente** : RoadWave = écoute en conduisant, pas réseau social interactif - **Bien-être** : évite toxicité, harcèlement, haine (fléau réseaux sociaux) - **Juridique** : pas de risque contentieux modération chat (DSA EU) - **Coût** : 0€ infra chat, 0€ modération temps réel - **Différenciation** : positionnement "audio safe" vs plateformes toxiques --- ### 7.4 Architecture technique **Stack** : ``` Créateur (App mobile) ↓ WebRTC (OPUS 48 kbps) Serveur Ingestion (Go + Pion WebRTC) ↓ Conversion temps réel Serveur HLS (segments .ts) ↓ NGINX Cache (OVH VPS) Auditeurs (App mobile, HLS natif) ``` **Flux détaillé** : 1. **Créateur** → WebRTC OPUS 48 kbps vers serveur Go 2. **Serveur Go** → Conversion temps réel OPUS → segments HLS (.m3u8 + .ts) 3. **NGINX Cache (OVH VPS)** → Distribution HLS avec cache 4. **Auditeurs** → Lecture HLS native iOS/Android (buffer 15s) 5. **Enregistrement parallèle** → Opus raw stocké temporairement 6. **Post-live** → Job async : Opus → MP3 256 kbps → Publication replay **Dépendances** : - ✅ **Pion WebRTC** (Go library, open source, MIT license) - ✅ **FFmpeg** (conversion audio, LGPL/GPL) - ✅ **NGINX** (cache et distribution HLS, open source) - ✅ **OVH Object Storage** (stockage origin, compatible S3) - ✅ **PostgreSQL + Redis** (métadonnées live + cache) **Avantages** : - ✅ Pas de dépendance Google/Facebook/Cloudflare (souveraineté) - ✅ WebRTC standard ouvert (Pion = lib Go pure) - ✅ Réutilise infra HLS existante (pas de doublon) - ✅ NGINX Cache (OVH VPS) optimise la distribution (coût réduit) - ✅ Scalable horizontalement (workers Go) **Coût estimé infrastructure** : | Phase | Utilisateurs | Infra live | Coût/mois | |-------|--------------|------------|-----------| | **MVP** | 0-100K | 1 instance Go (ingestion 100 lives simultanés) | +50€ (serveur) + bande passante | | **Growth** | 100K-1M | 3-5 instances Go (500 lives simultanés) | +200€ + bande passante | | **Scale** | 1M-10M | Kubernetes auto-scale (2000+ lives) | +1K€ + bande passante | **Bande passante** : - Live : 48 kbps × nb_auditeurs (via NGINX Cache, segments) - Exemple : 100 auditeurs = 4.8 Mbps = ~2 Go/heure via cache - Coût estimé : ~0.02€/heure pour 100 auditeurs --- ## Récapitulatif Section 7