151 lines
4.9 KiB
Markdown
151 lines
4.9 KiB
Markdown
## 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 |
|
||
|
||
---
|