# 🔍 AUDIT STRUCTURÉ - Moteur d'encodage audio veza-stream-server

**Date**: 2025-01-27  
**Mission**: P0 - Rendre le stream-server fonctionnel (encodage audio & pipeline FFmpeg)

---

## 1. FONCTIONNALITÉS ACTUELLES

### 1.1 Ce qui est réellement implémenté

#### ✅ `src/transcoding/pipeline/queue.rs`
- **File d'attente prioritaire** avec 3 niveaux (Urgent, Normal, Background)
- Utilise `tokio::sync::mpsc` avec capacité configurable (défaut: 100)
- Méthode `submit()` avec backpressure (retourne `QueueFull` si saturée)
- Méthode `next_job()` avec stratégie de priorité stricte (Urgent > Normal > Background)
- **État**: ✅ **Fonctionnel**

#### ✅ `src/transcoding/pipeline/job.rs`
- Structure `TranscodingJob` complète avec:
  - ID, track_id, input_path, output_dir
  - QualityProfile, priority, status
  - Timestamps (created_at, started_at, completed_at)
  - Retry logic (retry_count, can_retry)
  - Progress tracking (progress_percent)
- États: `Pending`, `Processing`, `Completed`, `Failed(String)`, `Cancelled`
- Méthodes: `mark_started()`, `mark_completed()`, `mark_failed()`
- **État**: ✅ **Fonctionnel**

#### ✅ `src/transcoding/pipeline/worker.rs`
- Structure `TranscodingWorker` avec ID
- Méthode `process()` qui:
  - Construit la commande FFmpeg via `FfmpegCommandBuilder`
  - Exécute avec timeout (5 minutes)
  - Gère les erreurs et retry
- **État**: ⚠️ **Partiellement fonctionnel** (TODOs présents)

#### ✅ `src/transcoding/ffmpeg/command_builder.rs`
- Builder pattern pour commandes FFmpeg
- Support: input, output, codec, bitrate, sample_rate, channels, container
- Support HLS basique: `-f hls`, `-hls_time`, `-hls_playlist_type vod`
- Génération de noms de segments: `segment_%05d.ts`
- **État**: ⚠️ **Partiellement fonctionnel** (HLS incomplet)

#### ✅ `src/transcoding/engine.rs`
- `TranscodingEngine` avec:
  - Queue prioritaire (capacité 1000)
  - Worker pool (configurable)
  - Méthode `start()` qui lance les workers en arrière-plan
  - Méthode `submit()` pour enqueue un job
- **État**: ⚠️ **Partiellement fonctionnel** (pas de notification de résultats)

#### ✅ `src/transcoding/codecs/profiles.rs`
- `QualityProfile` avec profils prédéfinis:
  - `hi_res()`: 320kbps, 48kHz, Stereo, AAC
  - `high()`: 192kbps, 44.1kHz, Stereo, AAC
  - `medium()`: 128kbps, 44.1kHz, Stereo, AAC
  - `low()`: 64kbps, 22.05kHz, Mono, AAC
- Tous configurés pour HLS avec `hls_segment_time: Some(6)`
- **État**: ✅ **Fonctionnel**

#### ✅ `src/transcoding/codecs/mod.rs`
- Enum `AudioCodec`: MP3, AAC, OPUS, FLAC, WAV
- Enum `ContainerFormat`: MP3, MP4, OGG, FLAC, WAV, HLS
- Implémentation `Display` pour conversion en noms FFmpeg
- **État**: ✅ **Fonctionnel**

### 1.2 Ce qui est déclaré comme TODO

#### ❌ `src/core/encoder.rs` (ligne 253)
```rust
// TODO: Implémentation réelle des encodeurs
```
- Pool d'encodeurs initialisé mais **vide**
- Aucun encodeur réel (Opus, AAC, MP3, FLAC) n'est instancié

#### ❌ `src/core/encoder.rs` (ligne 459)
```rust
// TODO: Implémenter le thread de traitement en temps réel
```
- `EncoderPipeline::start_processing()` ne fait rien
- Aucun traitement audio réel

#### ⚠️ `src/transcoding/pipeline/worker.rs` (ligne 74)
```rust
// TODO: Kill process ? Command::status() wait for completion.
```
- En cas de timeout, le processus FFmpeg n'est pas tué
- Risque de fuite de processus

#### ⚠️ `src/transcoding/engine.rs` (ligne 38)
```rust
// TODO: Notifier le résultat via EventBus ou Callback
```
- Les résultats des jobs ne sont pas notifiés
- Pas de callback pour mettre à jour l'état

### 1.3 Ce qui est incorrect ou incohérent

#### 🔴 Problème majeur: Routes API manquantes
- **Aucune route** `/v1/stream/transcode` dans `main.rs`
- **Aucune route** `/v1/stream/job/{id}` pour récupérer l'état
- **Aucune route** `/v1/stream/hls/{job_id}/index.m3u8` pour servir HLS
- La route `/internal/jobs/transcode` existe mais utilise `compression_engine` au lieu de `transcoding_engine`

#### 🔴 Problème: TranscodingEngine non intégré dans AppState
- `AppState` ne contient **pas** de `TranscodingEngine`
- Impossible d'accéder au moteur depuis les routes

#### 🔴 Problème: Command Builder HLS incomplet
- Le builder génère `segment_%05d.ts` mais ne configure pas correctement:
  - Le pattern de nommage des segments
  - La structure du répertoire de sortie
  - Le manifest HLS (`index.m3u8`) n'est pas correctement configuré

#### ⚠️ Problème: Pas de stockage d'état des jobs
- Les jobs sont traités mais leur état n'est **pas persisté**
- Impossible de récupérer l'état d'un job après soumission
- Pas de base de données ou de cache pour stocker les jobs

#### ⚠️ Problème: Worker ne met pas à jour le job correctement
- Le worker retourne un `TranscodingJob` modifié mais:
  - Il n'est pas stocké nulle part
  - L'appelant ne peut pas récupérer le résultat

---

## 2. MANQUES FONCTIONNELS CRITIQUES (P0)

### 2.1 FFmpeg non utilisé correctement
- ❌ Le command builder génère des commandes mais:
  - Le format HLS n'est pas complet (manque `-hls_list_size 0` pour VOD)
  - Pas de gestion des segments existants
  - Pas de validation que FFmpeg est installé

### 2.2 Pipeline inactif
- ❌ Le `TranscodingEngine` n'est **jamais démarré** dans `main.rs`
- ❌ Aucun job n'est jamais soumis
- ❌ Les workers tournent mais ne traitent rien

### 2.3 Absence de retour asynchrone
- ❌ Pas de mécanisme pour:
  - Récupérer l'état d'un job après soumission
  - Recevoir une notification quand un job est terminé
  - Gérer les erreurs de manière centralisée

### 2.4 Absence d'événements d'état
- ❌ Pas de transitions d'état visibles:
  - `Queued → Processing → Done`
  - `Queued → Processing → Error`
- ❌ Pas de logs structurés pour suivre les jobs

### 2.5 Dossier d'output HLS non structuré
- ❌ Pas de structure claire pour les outputs:
  - Où sont stockés les segments `.ts`?
  - Où est le manifest `index.m3u8`?
  - Comment servir les fichiers via HTTP?

---

## 3. CONTRAT MANQUANT

### 3.1 API REST incomplète

#### ❌ POST `/v1/stream/transcode`
**Manquant**: Route pour upload + paramètres de transcodage
- Input: `file` (multipart), `codec`, `bitrate`, `quality_profile`
- Output: `{ "job_id": "uuid", "status": "queued" }`

#### ❌ GET `/v1/stream/job/{id}`
**Manquant**: Route pour récupérer l'état d'un job
- Output: `{ "id": "uuid", "status": "processing", "progress": 45.5, ... }`

#### ❌ GET `/v1/stream/hls/{job_id}/index.m3u8`
**Manquant**: Route pour servir le manifest HLS
- Output: Contenu du fichier `index.m3u8`

#### ❌ GET `/v1/stream/hls/{job_id}/{segment}`
**Manquant**: Route pour servir les segments `.ts`
- Output: Contenu binaire du segment

### 3.2 Absence d'API pour récupérer l'état du transcodage
- Pas de mécanisme pour:
  - Lister tous les jobs
  - Filtrer par statut
  - Récupérer l'historique

### 3.3 Manque de dossier d'output structuré HLS
- Structure attendue:
```
output_dir/
  {job_id}/
    index.m3u8          # Master playlist
    segment_00001.ts
    segment_00002.ts
    ...
```
- Actuellement: **Non défini**

---

## 4. RÉSUMÉ DES BLOQUANTS P0

| Bloquant | Fichier | Description | Impact |
|----------|---------|------------|--------|
| 🔴 **P0** | `main.rs` | TranscodingEngine non initialisé dans AppState | Aucun transcodage possible |
| 🔴 **P0** | `main.rs` | Routes API `/v1/stream/transcode` et `/v1/stream/job/{id}` manquantes | Impossible de soumettre/récupérer des jobs |
| 🔴 **P0** | `src/transcoding/engine.rs` | Pas de stockage d'état des jobs | Impossible de suivre l'état |
| 🔴 **P0** | `src/transcoding/pipeline/worker.rs` | FFmpeg timeout ne tue pas le processus | Fuite de ressources |
| 🔴 **P0** | `src/transcoding/ffmpeg/command_builder.rs` | Configuration HLS incomplète | Segments mal générés |
| 🟠 **P1** | `src/core/encoder.rs` | Pool d'encodeurs vide | Pas d'encodage natif (mais FFmpeg fonctionne) |
| 🟠 **P1** | `src/transcoding/engine.rs` | Pas de notification de résultats | Pas de callback/EventBus |

---

## 5. RECOMMANDATIONS

### 5.1 Actions immédiates (P0)
1. ✅ Intégrer `TranscodingEngine` dans `AppState`
2. ✅ Créer routes API `/v1/stream/transcode` et `/v1/stream/job/{id}`
3. ✅ Implémenter stockage d'état des jobs (HashMap en mémoire pour P0)
4. ✅ Compléter command builder HLS
5. ✅ Fixer timeout FFmpeg (kill process)

### 5.2 Actions secondaires (P1)
1. Implémenter notification de résultats (EventBus ou callback)
2. Ajouter validation FFmpeg installé
3. Structurer dossier output HLS
4. Ajouter logs structurés

### 5.3 Actions futures (P2)
1. Implémenter encodeurs natifs (Opus, AAC) dans `encoder.rs`
2. Ajouter support multi-bitrate adaptatif
3. Persister jobs en base de données
4. Ajouter métriques Prometheus pour jobs

---

**Prochaine étape**: Phase 2 - Design du pipeline minimal mais robuste

