## 11. Mode offline ### 11.1 Téléchargement **Zone géographique** : Choix manuel utilisateur **Options prédéfinies** : - "Autour de moi" (rayon 50 km position actuelle) - "Ma ville" (limite administrative détectée) - "Mon département" (sélection liste) - "Ma région" (sélection liste) - Recherche manuelle : "Paris", "Lyon", "Marseille", etc. **Nombre de contenus téléchargeables** : | Statut | Limite | Affichage | |--------|--------|-----------| | **Gratuit** | 50 contenus max | "12/50 contenus téléchargés" | | **Premium** | Illimité | "245 contenus (3.2 GB)" | **Calcul temps disponible** : - 50 contenus × 5 min moyenne = 250 min = **4h d'écoute** (suffisant pour gratuits) - Premium illimité = limité uniquement par espace disque device **Connexion WiFi/Mobile** : **Par défaut** : WiFi uniquement **Sur données mobiles** : 1. User clique "Télécharger" 2. Détection : pas de WiFi 3. Popup : "Vous n'êtes pas connecté en WiFi. Télécharger via données mobiles consommera environ **X MB**. Continuer ?" 4. Boutons : "Attendre WiFi" / "Continuer" **Calcul estimation** : ``` Nombre contenus × durée moyenne × bitrate qualité Exemple : 20 contenus × 5 min × 48 kbps = ~72 MB ``` **Qualité audio téléchargement** : | Qualité | Bitrate | Taille | Disponibilité | |---------|---------|--------|---------------| | **Basse** | 24 kbps | ~10 MB/h | Gratuit + Premium | | **Standard** | 48 kbps | ~20 MB/h | Gratuit + Premium (défaut) | | **Haute** | 64 kbps | ~30 MB/h | **Premium uniquement** | **Justification** : - Standard = bon compromis qualité/taille (Opus 48 kbps = très correct pour voix) - Haute réservée Premium = incitation upgrade - User peut réduire à "basse" si espace limité --- ### 11.2 Validité et renouvellement **Durée de validité** : 30 jours après téléchargement **Standard industrie** : - Spotify : 30 jours - YouTube Music : 30 jours - Deezer : 30 jours **Renouvellement automatique** : ``` App détecte WiFi + contenus >25 jours → Requête API : GET /offline/contents/refresh → Backend vérifie pour chaque contenu : - Abonnement Premium toujours actif ? - Contenu pas modéré/supprimé ? - Métadonnées à jour ? → Renouvelle validité à 30 jours supplémentaires → Mise à jour métadonnées (titre, créateur, statut) → Pas de re-téléchargement audio (sauf si fichier corrompu) ``` **Notification avant expiration** : - **J-3** : "X contenus expirent dans 3 jours. Connectez-vous en WiFi pour les renouveler" - **J-0** : Suppression automatique - **J+0** : Toast "15 contenus expirés ont été supprimés" **Justification** : - **Force reconnexion** : vérifier abonnement actif, contenus légaux - **Évite stockage obsolète** : contenus supprimés/modérés ne restent pas - **UX transparente** : renouvellement silencieux si WiFi régulier --- ### 11.3 Synchronisation actions offline **Actions stockées localement (SQLite)** : - Likes/unlikes - Abonnements/désabonnements - Signalements - Progression audio-guides **Sync automatique à la reconnexion** : ``` 1. App détecte reconnexion Internet 2. Récupération queue locale : SELECT * FROM pending_actions ORDER BY created_at 3. Envoi batch API : POST /sync/actions 4. Backend traite chaque action 5. Confirmation réception : DELETE FROM pending_actions WHERE id IN (...) 6. Toast : "3 likes et 1 abonnement synchronisés" ``` **Gestion erreurs sync** : - Si échec après 3 tentatives → notification : "Impossible de synchroniser. Réessayez plus tard" - Actions conservées jusqu'à sync réussie (pas de perte) - **Rétention max 7 jours** : après = purge (évite queue infinie) **Conflits contenus supprimés** : ``` Backend retourne : {deleted_content_ids: [123, 456]} → App supprime fichiers locaux → Si contenu 123 en cours d'écoute : - Attendre fin lecture actuelle - Passage auto suivant après 2s → Toast : "1 contenu téléchargé a été retiré (violation règles)" ``` **Justification** : - **Pas de conflit possible** : actions unilatérales user (likes/abonnements) - **UX fluide** : pas de blocage offline - **Batch = économie** : requêtes HTTP groupées - **Conformité modération** : contenu illégal disparaît même offline --- ## Récapitulatif Section 11 | Aspect | Décision | Valeur | |--------|----------|--------| | **Zone téléchargement** | Choix | Manuel (autour/ville/département/région/recherche) | | **Limite gratuit** | Contenus | 50 max | | **Limite Premium** | Contenus | Illimité (espace disque) | | **Connexion** | Par défaut | WiFi (mobile avec confirmation) | | **Qualité Standard** | Bitrate | 48 kbps Opus | | **Qualité Haute** | Bitrate | 64 kbps (Premium uniquement) | | **Validité** | Durée | 30 jours | | **Renouvellement** | Mode | Automatique si WiFi | | **Notification expiration** | Délai | J-3 | | **Sync actions** | Mode | Batch automatique reconnexion | | **Rétention queue** | Durée | 7 jours max | ---