## 8. Abonnements et notifications ### 8.1 Impact sur l'algorithme **Décision** : Boost +30% au score + reste dans le mix **Boost de score abonnements** : - **+30% au score final** pour contenus d'un créateur suivi - Application : multiplicateur sur le score calculé ``` score_final_avec_boost = score_final × 1.3 ``` **Reste dans le mix** : - ❌ **Pas de priorité absolue** (pas de file dédiée abonnements) - ✅ Contenu suivi entre en **compétition avec autres contenus** - ✅ Si créateur suivi publie contenu faible engagement → peut être battu par contenu viral non-suivi **Exemple concret** : ``` Utilisateur à Paris, 2 contenus disponibles : Contenu A (créateur NON suivi) : - Score géo : 0.9 (très proche) - Score intérêts : 0.8 - Score engagement : 0.7 → Score final : 0.80 Contenu B (créateur suivi) : - Score géo : 0.5 (moyennement proche) - Score intérêts : 0.6 - Score engagement : 0.5 → Score final : 0.53 → Score avec boost : 0.53 × 1.3 = 0.69 → Contenu A proposé en premier (0.80 > 0.69) ``` **Cas où abonnement fait la différence** : ``` Contenu A (non suivi) : score 0.70 Contenu B (suivi) : score 0.60 → avec boost 0.78 → Contenu B proposé (boost fait pencher la balance) ``` **Justification** : - **Équilibre** : valorise abonnements sans enfermer utilisateur - **Découverte** : contenus viraux/locaux peuvent toujours émerger - **Prévisible** : boost fixe, pas de logique opaque - **Coût 0** : multiplicateur simple dans l'algo --- ### 8.2 Notifications contextuelles **Décision** : Push adapté selon contexte (voiture vs à pied) + limite 10/jour **Détection contexte utilisateur** : | Contexte | Détection | Comportement | |----------|-----------|--------------| | **En voiture** | Vitesse GPS >10 km/h | Notifications silencieuses (in-app uniquement) + commandes volant | | **À pied** | Vitesse GPS <5 km/h | Notifications push actives + interface tactile/vocale | **Notifications activées** : #### En voiture (mode conduite) | Événement | Notification | Comportement | |-----------|--------------|--------------| | **Nouveau contenu créateur suivi** | In-app uniquement | Badge compteur, pas de push (sécurité) | | **Live créateur suivi** | In-app uniquement | Badge compteur, pas de push | | **Point d'intérêt proche** | Audio notification | Bip + annonce vocale : "Audio-guide disponible" | #### À pied (mode piéton) | Événement | Notification | Comportement | |-----------|--------------|--------------| | **Nouveau contenu créateur suivi** | ✅ Push | Si utilisateur dans zone géo du contenu | | **Live créateur suivi** | ✅ Push | Si utilisateur dans zone géo | | **Audio-guide disponible** | ✅ Push | "📍 Audio-guide disponible : [Lieu]" | | **Séquence suivante suggérée** | Audio notification | Annonce vocale : "Pièce suivante disponible" | **Format notifications** : **Nouveau contenu** : ``` 🎧 [Nom créateur] a publié : "[Titre contenu]" Tap pour écouter ``` **Live en direct** : ``` 🔴 [Nom créateur] est en direct : "[Titre live]" Tap pour rejoindre ``` **Audio-guide à pied** : ``` 📍 Audio-guide disponible : [Nom du lieu] Choisissez parmi 3 guides pour [Musée du Louvre] Tap pour explorer ``` **Filtrage géographique** : - Si contenu/live hors zone utilisateur → **pas de notification** - Évite frustration : "notification pour contenu que je ne peux pas écouter" - Exception : contenu national → notifie tous les abonnés **Fréquence maximale** : - **Maximum 10 notifications push/jour** par utilisateur (tous types confondus) - Si dépassement : notifications regroupées - Message groupé : "🎧 3 nouveaux contenus de créateurs suivis" **Plages horaires** : - **Mode silencieux** : 22h-8h (pas de push, sauf live) - Paramétrable utilisateur (désactivation totale possible) - Option "Notifications importantes uniquement" (lives uniquement) **Gestion préférences** : | Préférence | Défaut | Description | |------------|--------|-------------| | **Nouveaux contenus** | ✅ Activé | Push à chaque nouveau contenu (à pied uniquement) | | **Lives** | ✅ Activé | Push au démarrage live (à pied uniquement) | | **Audio-guides proximité** | ✅ Activé | Push quand audio-guide détecté à <100m | | **Mode silencieux** | ✅ Activé (22h-8h) | Pas de push nocturne | | **Limite quotidienne** | 10 | Modifiable 5-20 | **Justification** : - **Sécurité routière** : pas de push en conduite (distraction) - **Engagement piéton** : push actifs pour audio-guides (valeur ajoutée tourisme) - **Pas de spam** : limite 10/jour + mode silencieux - **Filtrage géo** : pertinence maximale (pas de notif inutiles) - **Coût** : Firebase Cloud Messaging (gratuit jusqu'à volume élevé) --- ### 8.3 Mode Audio-guide (piéton) **Décision** : Navigation manuelle multiséquence + choix parmi plusieurs guides **Fonctionnement** : #### Détection et proposition 1. Utilisateur à pied (<5 km/h) passe à <**100m** d'un lieu avec audio-guides 2. **Notification push** : "📍 Audio-guide disponible : [Musée du Louvre]" 3. Tap notification → **Page de sélection** audio-guides #### Page de sélection **Affichage** : ``` 📍 Musée du Louvre Choisissez votre guide : ┌─────────────────────────────────┐ │ 🎨 Visite complète (45 min) │ │ Par [Créateur A] • 12 séquences│ │ ⭐ 4.8 • 1.2K écoutes │ └─────────────────────────────────┘ ┌─────────────────────────────────┐ │ 🏛️ Œuvres majeures (20 min) │ │ Par [Créateur B] • 5 séquences │ │ ⭐ 4.9 • 3.5K écoutes │ └─────────────────────────────────┘ ┌─────────────────────────────────┐ │ 👶 Visite famille (30 min) │ │ Par [Créateur C] • 8 séquences │ │ ⭐ 4.7 • 850 écoutes │ └─────────────────────────────────┘ ``` #### Interface audio-guide **Après sélection** : ``` 🎨 Visite complète • Musée du Louvre Piste actuelle : 2/12 "La Joconde - Histoire et mystères" [████████────────────] 3:24 / 6:50 Liste des séquences : ✅ 1. Introduction et architecture ▶️ 2. La Joconde - Histoire et mystères ⏸️ 3. Vénus de Milo ⏸️ 4. Victoire de Samothrace ⏸️ 5. Peintures Renaissance ... ⏸️ 12. Conclusion et boutique ``` **Navigation** : | Action | Geste | Effet | |--------|-------|-------| | **Séquence suivante** | Tap "Suivant" ou commande vocale "Suivant" | Passe à séquence N+1 | | **Séquence précédente** | Tap "Précédent" ou commande vocale "Précédent" | Revient à séquence N-1 | | **Saut direct** | Tap séquence dans liste | Lecture séquence choisie | | **Pause** | Tap bouton pause | Met en pause, reprise position exacte | | **Quitter** | Tap "×" | Sauvegarde progression, sortie guide | **Guidage vocal automatique** : - Entre 2 séquences : "Vous avez terminé la séquence 2. Dirigez-vous vers la Vénus de Milo pour la séquence 3." - Si utilisateur s'éloigne (>50m de la prochaine pièce) : "Vous vous éloignez de la prochaine étape. Consultez le plan." **Sauvegarde progression** : - Position dans guide sauvegardée automatiquement - Retour ultérieur : "Reprendre à la séquence 5 ?" ou "Recommencer depuis le début" - Historique : guide marqué "Terminé" si toutes séquences écoutées **Création audio-guide multiséquence** : **Processus créateur** : 1. Créateur upload **plusieurs fichiers audio** (1 par séquence) 2. Numérote les séquences : "Séquence 1", "Séquence 2", etc. 3. Titre chaque séquence : "Introduction", "La Joconde", etc. 4. Définit **point GPS unique** pour tout le guide (centre du lieu) 5. Métadonnées : durée totale calculée automatiquement **Format stockage** : ```json { "guide_id": "abc123", "title": "Visite complète Musée du Louvre", "location": {"lat": 48.8606, "lon": 2.3376, "radius": 200}, "sequences": [ { "sequence_number": 1, "title": "Introduction et architecture", "audio_url": "https://cdn.../seq1.mp3", "duration_seconds": 180 }, { "sequence_number": 2, "title": "La Joconde - Histoire et mystères", "audio_url": "https://cdn.../seq2.mp3", "duration_seconds": 410 }, ... ], "total_duration_seconds": 2700, "creator_id": "creator_xyz" } ``` **Justification** : - **UX piéton** : navigation tactile adaptée (pas de commandes volant) - **Autonomie** : utilisateur maître de son rythme (pas d'enchaînement forcé) - **Choix** : plusieurs guides = diversité styles (famille, expert, rapide) - **Engagement** : sauvegarde progression = incitation terminer - **Coût** : réutilise infra contenu standard (juste métadonnées séquences) --- ### 8.4 Limites et désabonnement **Décision** : 200 abonnements max + désabonnement -5% jauges **Nombre maximum d'abonnements** : - **200 créateurs maximum** par utilisateur - Raisons : - **Évite spam** : au-delà de 200, notifications ingérables - **Usage réaliste** : 200 créateurs = déjà énorme (vs 100-150 sur YouTube/Twitter) - **Performance** : requêtes SQL optimisées (index sur 200 max) **Si limite atteinte** : - Message : "Vous suivez déjà 200 créateurs. Désabonnez-vous d'un créateur pour en suivre un nouveau." - Liste triable : par date abonnement, nb contenus écoutés, dernière activité - Suggestion : "Vous n'avez pas écouté [Créateur X] depuis 6 mois, le désabonner ?" **Abonnement initial** : - Impact : **+5% toutes jauges tags du créateur** (voir [Règle 05 - Section 5.3](05-interactions-navigation.md#actions-complémentaires-mode-piéton-uniquement)) - Action : Bouton "S'abonner" dans profil créateur (interface mobile) - Immédiat à l'action **Désabonnement** : - Impact : **-5% toutes jauges tags du créateur** (symétrique) - Action : Bouton "Se désabonner" dans profil créateur - Immédiat à l'action - Pas de confirmation (action réversible) **Exemple** : ``` Créateur tague ses contenus : Automobile, Voyage Abonnement : → Jauge Automobile : 60% → 65% (+5%) → Jauge Voyage : 55% → 60% (+5%) 3 mois plus tard, désabonnement : → Jauge Automobile : 65% → 60% (-5%) → Jauge Voyage : 60% → 55% (-5%) ``` **Gestion multi-tags** : - Si créateur a 3 tags → **+5% sur chacun des 3 tags** - Logique : abonnement = signal fort d'affinité à TOUS les sujets du créateur **Abonnements réciproques** : - ❌ **Pas d'abonnement mutuel visible** - Créateur ne voit pas qui est abonné (privacy) - Créateur voit uniquement : nombre total abonnés (métrique globale) **Justification** : - **Limite 200** : équilibre entre liberté et gestion spam - **Symétrie +5%/-5%** : cohérence mathématique, prévisibilité - **Privacy** : pas de liste publique abonnés (évite stalking) - **Coût** : table abonnements PostgreSQL standard --- ## Récapitulatif Section 8