darkmedia-x-api / implementation_plan.md
cybermedia's picture
Upload folder using huggingface_hub
343eed9 verified
# Remix Render — Plan d'implémentation
## Objectif
Permettre de re-render une histoire déjà générée avec un **profil différent** (VFX, voix, musique) sans refaire les images IA (coûteuses et lentes). Chaque variante est sauvegardée séparément.
## Comment ça marche aujourd'hui
1. Dashboard → LANCER LA PRODUCTION
2. `trigger_story.json` écrit avec `story_id` + `config`
3. `00_master_pipeline.py` lit le trigger → lance `asset_generator.py` (images IA) + `story_to_video.py` (montage)
4. La vidéo finale écrase toujours `TT_{slug}_final.mp4`
## Changements proposés
---
### 1. UI — Bouton "REMIX" dans le Project Bin
Ajouter un bouton **⚡ REMIX** à côté de chaque histoire dans le bin (ou dans le Master Controls de l'Inspector).
**Modal de remix :**
- Sélection VFX Profile (dropdown)
- Sélection Voice (dropdown, depuis la liste existante)
- Sélection Background Music (dropdown)
- Checkbox : "Regenerate images (slow)" — décoché par défaut
- Nom de variante (ex. `vhs_jean`) → auto-généré ou manuel
- Bouton LANCER LE REMIX
---
### 2. Backend — Nouveau endpoint `POST /api/stories/remix`
#### [MODIFY] [main_routes.py](file:///home/jfvallee/Repository/darkmedia-x_studio/backend/api/main_routes.py)
Nouveau endpoint qui écrit un `trigger_story.json` enrichi avec les overrides de config ET un flag `remix_only: true` pour sauter la génération d'images.
```python
{
"story_id": "Les Pendus du Brise-Lames",
"story_path": "/data/stories/Rimouski/Les Pendus du Brise-Lames",
"config": {
"remix_only": true, # Saute asset_generator.py
"vfx_profile": "vhs", # Injecté dans env pour story_to_video.py
"voice": "fr-CA-JeanNeural",
"bg_music": "dark_ambient.mp3",
"output_suffix": "vhs_jean" # Nom de sortie unique
}
}
```
---
### 3. Pipeline — Skip asset_generator.py si `remix_only`
#### [MODIFY] [00_master_pipeline.py](file:///home/jfvallee/Repository/darkmedia-x_studio/backend/pipeline/00_master_pipeline.py)
```python
if triggered_config.get("remix_only"):
info("MODE REMIX : Les images existantes seront réutilisées.")
else:
# ... génération images IA comme avant
run(f'python "{asset_script}"...')
```
Injection des overrides dans l'environnement avant `story_to_video.py` :
```python
remix_env = {}
if vfx := triggered_config.get("vfx_profile"):
remix_env["VFX_PROFILE"] = vfx
if voice := triggered_config.get("voice"):
remix_env["VOICE_OVERRIDE"] = voice
if music := triggered_config.get("bg_music"):
remix_env["MUSIC_OVERRIDE"] = music
if suffix := triggered_config.get("output_suffix"):
remix_env["OUTPUT_SUFFIX"] = suffix
```
---
### 4. story_to_video.py — Lecture des overrides env
#### [MODIFY] [story_to_video.py](file:///home/jfvallee/Repository/darkmedia-x_studio/engine/story_to_video.py)
- `VOICE_OVERRIDE` → remplace la voix lue depuis le `.md`
- `MUSIC_OVERRIDE` → cherche ce fichier dans `MUSIC_ASSETS/` au lieu du fallback auto
- `OUTPUT_SUFFIX` → append au nom du fichier de sortie : `TT_{slug}_final_{suffix}.mp4`
---
## Résultat visuel
Dans le **Project Bin**, les histoires qui ont des variantes auront un indicateur :
```
📂 LES PENDUS DU BRISE-LAMES [5]
► TT_Les_Pendus_final.mp4 (original)
► TT_Les_Pendus_final_vhs_jean.mp4 (variante 1)
► TT_Les_Pendus_final_grain_sylvie.mp4 (variante 2)
```
## Vérification
1. Lancer un remix sans regenerer images → vidéo produite en ~3-5 min au lieu de 30+ min
2. La variante est bien sauvegardée avec le suffix correct
3. Le UI affiche correctement le statut Engine pendant le remix
## Questions ouvertes pour l'utilisateur
> [!IMPORTANT]
> **Est-ce que tu veux choisir à chaque fois**, ou est-ce que tu veux définir des **presets** de remix (ex. "Preset Horror VHS", "Preset Cinématic Jean") que tu appliques en 1 clic ?
> [!NOTE]
> Si tu as déjà des fichiers audio ou des samples de musique que tu veux utiliser, ils doivent être dans `data/assets/background_music/`. Je peux aussi ajouter l'upload depuis le UI.