286 lines
9.8 KiB
Markdown
286 lines
9.8 KiB
Markdown
## 4. Création et publication de contenu
|
||
|
||
### 4.1 Upload et encodage
|
||
|
||
**Décision** : Formats universels avec encodage asynchrone
|
||
|
||
**Formats acceptés** :
|
||
- ✅ MP3 (`.mp3`)
|
||
- ✅ AAC (`.aac`, `.m4a`)
|
||
- ❌ WAV, FLAC (trop lourds, inutiles en voiture)
|
||
|
||
**Limites** :
|
||
|
||
| Paramètre | Valeur | Justification |
|
||
|-----------|--------|---------------|
|
||
| **Taille maximale** | 200 MB | ~4h de podcast à 128 kbps |
|
||
| **Durée maximale** | 4 heures | Suffisant pour podcasts longs |
|
||
| **Validation format** | Client + backend | Double sécurité |
|
||
|
||
**Pipeline d'encodage** :
|
||
|
||
```
|
||
1. Upload fichier (MP3/AAC) → OVH Object Storage temporaire
|
||
2. Job asynchrone (worker Go + FFmpeg) :
|
||
- Validation format et intégrité
|
||
- Réencodage Opus 3 profils (24/48/64 kbps)
|
||
- Génération segments HLS (.m3u8 + .ts)
|
||
- Génération image couverture par défaut
|
||
3. Suppression fichier original (économie stockage)
|
||
4. Notification créateur : "Contenu prêt à publier"
|
||
```
|
||
|
||
**Temps d'encodage estimé** :
|
||
- Contenu 5 min → ~30 secondes
|
||
- Podcast 1h → ~5 minutes
|
||
- Podcast 4h → ~20 minutes
|
||
|
||
**Profils Opus générés** :
|
||
|
||
| Qualité | Bitrate | Usage |
|
||
|---------|---------|-------|
|
||
| Basse | 24 kbps | 2G/Edge |
|
||
| Standard | 48 kbps | 3G (défaut) |
|
||
| Haute | 64 kbps | 4G/5G |
|
||
|
||
**Écoute accélérée** :
|
||
|
||
| Vitesse | Usage |
|
||
|---------|-------|
|
||
| 0.75x | Compréhension difficile (accent, technique) |
|
||
| 1.0x | Normal (défaut) |
|
||
| 1.25x | Gain léger |
|
||
| 1.5x | Podcasts longs |
|
||
| 2.0x | Survol rapide (modérateurs) |
|
||
|
||
**Disponible pour** :
|
||
- ✅ Modérateurs (validation rapide : 30s → 15s à 2x)
|
||
- ✅ Auditeurs (tous les contenus)
|
||
- ✅ Standard industrie (YouTube, Spotify, Apple Podcasts)
|
||
|
||
**Justification** :
|
||
- **Simplicité** : 2 formats couvrent 95% des cas d'usage
|
||
- **Coût optimisé** : pas de conversion WAV/FLAC lourds
|
||
- **Stockage réduit** : suppression original après encodage
|
||
- **Scalabilité** : workers horizontalement (Kubernetes jobs)
|
||
- **Productivité** : écoute accélérée = double productivité modération
|
||
|
||
---
|
||
|
||
### 4.2 Métadonnées obligatoires
|
||
|
||
**Décision** : Minimaliste pour réduire friction
|
||
|
||
**Champs obligatoires** :
|
||
|
||
| Champ | Format | Validation |
|
||
|-------|--------|------------|
|
||
| **Titre** | 5-100 caractères | Alphanumérique + ponctuation basique |
|
||
| **Type géo** | Enum | Ancré / Contextuel / Neutre |
|
||
| **Zone diffusion** | Composite | Voir détails ci-dessous |
|
||
| **Tags** | Enum | 1 à 3 parmi liste prédéfinie |
|
||
| **Classification âge** | Enum | Tout public / 13+ / 16+ / 18+ |
|
||
|
||
**Zone de diffusion (obligatoire)** :
|
||
|
||
Options mutuellement exclusives :
|
||
- **Point GPS** : latitude + longitude + rayon (100m à 10km)
|
||
- **Ville** : sélection dans référentiel INSEE
|
||
- **Département** : sélection liste
|
||
- **Région** : sélection liste
|
||
- **National** : France entière
|
||
|
||
**Tags disponibles** (1 à 3 obligatoires) :
|
||
- Automobile
|
||
- Voyage
|
||
- Famille
|
||
- Amour
|
||
- Musique
|
||
- Économie
|
||
- Cryptomonnaie
|
||
- Politique
|
||
- Culture générale
|
||
- Sport
|
||
- Technologie
|
||
- Santé
|
||
|
||
**Champs optionnels** :
|
||
- ❌ Description (ajout ultérieur)
|
||
- ❌ Image couverture (génération auto)
|
||
|
||
**Image de couverture par défaut** :
|
||
|
||
Génération automatique selon règles :
|
||
- Icône selon type géo : 📍 Ancré / 🌍 Contextuel / 🎧 Neutre
|
||
- Couleur selon tag principal : bleu (Auto), vert (Voyage), rouge (Musique), etc.
|
||
- Format 800×800px, PNG
|
||
- Personnalisable ultérieurement (post-MVP)
|
||
|
||
**Exemple de publication** :
|
||
```
|
||
Titre : "Histoire de la Tour Eiffel"
|
||
Type géo : Ancré
|
||
Zone : Point GPS (48.8584, 2.2945, rayon 500m)
|
||
Tags : Voyage, Culture générale
|
||
Classification : Tout public
|
||
→ Image auto : 📍 fond bleu-vert (Voyage)
|
||
```
|
||
|
||
**Justification** :
|
||
- **Friction minimale** : 5 champs max = 2 min de publication
|
||
- **Publication rapide** : pas de blocage sur description/image
|
||
- **Coût 0** : pas de génération IA au MVP
|
||
- **Évolutif** : champs optionnels ajoutables ultérieurement
|
||
|
||
---
|
||
|
||
### 4.3 Validation des 3 premiers contenus
|
||
|
||
**Décision** : Validation manuelle par équipe modération RoadWave
|
||
|
||
**Processus nouveau créateur** :
|
||
|
||
1. Créateur upload ses 3 premiers contenus
|
||
2. Contenus passent en **file d'attente modération**
|
||
3. Modérateur junior RoadWave :
|
||
- Écoute 30 secondes (ou 15s à 2x)
|
||
- Vérifie métadonnées
|
||
- Valide ou rejette avec raison
|
||
4. Si accepté : contenu publié + notification créateur
|
||
5. Si refusé : notification avec raison détaillée + lien vers règles
|
||
6. Après 3 contenus validés : créateur passe en **statut vérifié**
|
||
|
||
**Critères de validation** :
|
||
|
||
| Critère | Détails |
|
||
|---------|---------|
|
||
| **Qualité audio** | Compréhensible (pas de grésillement excessif) |
|
||
| **Respect règles** | Pas de contenu prohibé évident (haine, spam, illégal) |
|
||
| **Classification âge** | Cohérente avec contenu écouté |
|
||
| **Tags pertinents** | Correspondance minimale avec contenu |
|
||
| **Zone diffusion** | Cohérente (pas "Tour Eiffel" avec zone "National") |
|
||
|
||
**Délai de validation** :
|
||
- Objectif : **24-48h** (jours ouvrés)
|
||
- Priorité : FIFO (First In First Out)
|
||
- Weekend : délai peut atteindre 72h
|
||
- Message au créateur : "Validation en cours, délai estimé 24-48h"
|
||
|
||
**Notification créateur** :
|
||
|
||
**Si accepté** :
|
||
- Email + push : "✅ Votre contenu '[Titre]' est en ligne !"
|
||
- Lien direct vers le contenu
|
||
- Compteur : "2/3 contenus validés pour devenir créateur vérifié"
|
||
|
||
**Si refusé** :
|
||
- Email + push : "❌ Contenu '[Titre]' refusé"
|
||
- Raison détaillée : "Qualité audio insuffisante" / "Tags non pertinents" / "Classification incorrecte" / etc.
|
||
- Lien vers règles de publication
|
||
- Possibilité de correction + resoumission
|
||
|
||
**Après 3 validations** :
|
||
|
||
Créateur obtient **statut "Vérifié"** :
|
||
- Badge ✓ visible sur profil
|
||
- Contenus futurs publiés **immédiatement** (modération a posteriori uniquement)
|
||
- Modération seulement si signalé par utilisateurs
|
||
|
||
**Outils modérateur** :
|
||
- Écoute accélérée (1.5x ou 2x) = double productivité
|
||
- Interface dédiée : queue de contenus à valider
|
||
- Raccourcis clavier : A (Accepter), R (Rejeter), Espace (Pause)
|
||
- Historique créateur visible (si déjà 1-2 contenus validés)
|
||
|
||
**Modération communautaire (post-MVP)** :
|
||
|
||
⚠️ **Non implémenté au MVP** (complexité juridique)
|
||
|
||
Vision future (envisageable) :
|
||
- Créateurs établis peuvent opt-in "Modérateur communautaire"
|
||
- Formation obligatoire (30 min) + quiz (80%)
|
||
- Pré-validation uniquement (validation finale toujours par équipe RoadWave)
|
||
- Compensation : badges, premium offert
|
||
- Attribution aléatoire (pas de collusion)
|
||
|
||
**Justification décision MVP** :
|
||
- **Responsabilité juridique** : plateforme reste responsable (DSA EU)
|
||
- **Qualité garantie** : modérateurs formés et mandatés
|
||
- **Anti-spam efficace** : bloque 95% des abus dès le début
|
||
- **Coût raisonnable** : 30s × 3 contenus = 1.5 min/créateur
|
||
- **UX acceptable** : délai 24-48h expliqué clairement
|
||
- **Pas de validation par pairs** au MVP = évite risques juridiques (collusion, compétence, conflits)
|
||
|
||
---
|
||
|
||
### 4.4 Modification et suppression
|
||
|
||
**Décision** : Modification métadonnées uniquement, suppression immédiate
|
||
|
||
**Modification autorisée** :
|
||
|
||
| Élément | Modifiable | Justification |
|
||
|---------|------------|---------------|
|
||
| **Titre** | ✅ | Correction coquilles |
|
||
| **Description** | ✅ | Si ajoutée ultérieurement |
|
||
| **Tags** | ✅ | Ajustement pertinence |
|
||
| **Image couverture** | ✅ | Personnalisation |
|
||
| **Audio** | ❌ | Intégrité contenu |
|
||
| **Zone diffusion** | ❌ | Évite manipulation algo |
|
||
| **Type géo** | ❌ | Évite manipulation algo |
|
||
| **Classification âge** | ❌ | Sécurité mineurs |
|
||
|
||
**Raisons restrictions** :
|
||
|
||
**Audio non modifiable** :
|
||
- Évite fraude : uploader contenu validé → remplacer par spam
|
||
- Intégrité : auditeurs doivent écouter ce qui a été validé
|
||
|
||
**Zone/Type non modifiables** :
|
||
- Évite manipulation : créer "Local Paris" → changer en "National" pour boost visibilité
|
||
- Évite abus : créer "Neutre" (faible pondération géo) → changer en "Ancré" (forte pondération)
|
||
|
||
**Classification non modifiable** :
|
||
- Évite contournement : uploader "Tout public" → passer en "18+" sans revalidation
|
||
- Sécurité : garantit que classification a été vérifiée
|
||
|
||
**Si besoin de changer audio/zone/classification** :
|
||
- Action : **Supprimer contenu + republier**
|
||
- Si créateur <3 contenus validés : retourne en file validation
|
||
- Si créateur ≥3 contenus validés : publication immédiate
|
||
|
||
**Suppression de contenu** :
|
||
|
||
| Aspect | Comportement |
|
||
|--------|--------------|
|
||
| **Délai** | Immédiat | Suppression BDD + cache sous 5 min |
|
||
| **Réversibilité** | Non | Suppression définitive |
|
||
| **Historique auditeurs** | Marqué "Contenu supprimé par créateur" | Conserve écoute dans historique |
|
||
| **Analytics plateforme** | Anonymisé et conservé | Métriques globales (RGPD compliant) |
|
||
| **Fichiers cache** | Supprimés sous 24h | Purge NGINX Cache (OVH VPS) et OVH Object Storage |
|
||
|
||
**Exemple scénario suppression** :
|
||
```
|
||
Créateur supprime podcast écouté par 1000 personnes
|
||
→ Cache/Storage : fichiers purgés sous 24h (NGINX Cache + OVH Object Storage)
|
||
→ BDD : entrée marquée "deleted", auteur anonymisé
|
||
→ Historique auditeurs : "Contenu supprimé" (conserve durée écoute pour stats)
|
||
→ Analytics : métriques globales conservées (anonymes, RGPD OK)
|
||
```
|
||
|
||
**Notifications suppression** :
|
||
- Pas de notification aux auditeurs (pour éviter effet Streisand)
|
||
- Historique reste consultable : "Vous avez écouté ce contenu le [date]"
|
||
- Si auditeur tente de réécouter : "Ce contenu n'est plus disponible"
|
||
|
||
**Justification** :
|
||
- **Simplicité** : règles claires et non-ambiguës
|
||
- **Sécurité** : évite manipulations algorithme et contournements modération
|
||
- **Contrôle créateur** : liberté totale de supprimer (RGPD)
|
||
- **Traçabilité** : historique conservé pour analytics (anonymisé)
|
||
- **Coût 0** : pas de revalidation métadonnées
|
||
|
||
---
|
||
|
||
## Récapitulatif Section 4
|