# Cahier des charges — VideoFactory

> **Nom :** VideoFactory  
> **Date :** 1er septembre 2026  
> **Statut :** infra OK — dev à démarrer  
> **Version document :** 0.1  
> **Domaine :** `https://videofactory.watys.fr/`  
> **Inspiration :** [Vidéo YouTube — usine vidéo 100 % locale](https://www.youtube.com/watch?v=_KkVTsXwx2c)

---

## Pour l’agent LXC (lire en premier)

```
Projet : VideoFactory
Dossier app : /var/www/app
User SSH : dev
Stack : PHP 8 natif + HTML5 + CSS + JS vanilla + Nginx + SQLite
PAS de framework (Laravel, React, etc.)
Moteurs externes (sur PC GPU, pas sur le LXC) :
  - Ollama (script / prompts)
  - ComfyUI (images + vidéos + upscale)
  - Kokoro (voix off TTS, léger, sans GPU)
Montage final : FFmpeg sur le LXC (CPU suffit)
4 onglets UI : Générer | Projet | Outils | Paramètres
Ne PAS mélanger avec TubeFactory (pas de chaînes YouTube / kanban SEO en V1)
```

---

## 1. En une phrase

**VideoFactory** est une **application web** qui fabrique des **films ou vidéos complètes** presque toutes seules : une IA écrit le scénario, ComfyUI crée les images et clips, Kokoro lit le texte à voix haute, FFmpeg assemble le tout en un fichier `.mp4` prêt à publier.

---

## 2. Ce que ce n’est PAS

| Non | Pourquoi |
|-----|----------|
| Gestion de chaînes YouTube | C’est **TubeFactory** (autre projet) |
| Paiement à des APIs cloud (Midjourney, Runway…) | Tout passe par des outils **locaux / self-hosted** |
| Application desktop Windows `.exe` en V1 | On garde le modèle **web sur LXC** comme vos autres projets |
| Copie exacte de l’app Mapizza | App fermée ; on **recrée** les mêmes idées en open chez vous |

---

## 3. Public et usage

| Qui | Besoin |
|-----|--------|
| Vous (V1) | Créer des vidéos YouTube / TikTok sans payer des abonnements IA |
| Plus tard | Multi-utilisateurs si besoin |

**Contrainte matérielle (comme dans la vidéo) :** un **PC avec carte graphique ~16 Go VRAM** pour ComfyUI. Le LXC orchestre ; il ne fait pas tourner les gros modèles.

---

## 4. Architecture globale

```
┌─────────────────────────────────────────────────────────────┐
│  Navigateur  →  VideoFactory (LXC 10.10.11.115)             │
│                    PHP + SQLite + FFmpeg                    │
└────────────┬───────────────────────┬────────────────────────┘
             │ API                   │ API
             ▼                       ▼
    ┌────────────────┐      ┌────────────────┐
    │ PC GPU         │      │ PC GPU ou LXC  │
    │ ComfyUI        │      │ Ollama         │
    │ (images/vidéo) │      │ (script)       │
    └────────────────┘      └────────────────┘
             │
             ▼
    ┌────────────────┐
    │ Kokoro TTS     │  ← peut être sur PC ou LXC (léger)
    └────────────────┘
```

**Principe :** le LXC = **chef d’orchestre** + **montage FFmpeg**. Le GPU = **usine graphique**.

---

## 5. Stack technique

| Couche | Choix |
|--------|--------|
| Front | HTML5, CSS3, JavaScript **vanilla** (SPA légère, 4 onglets) |
| Back | PHP 8.x **natif** |
| API | `/api/*.php` → JSON |
| Base | **SQLite** (projets, workflows, jobs, réglages) |
| Fichiers | `storage/projects/{id}/` (audio, images, clips, final.mp4) |
| Montage | **FFmpeg** (+ option Whisper CPU pour sous-titres) |
| Serveur | Nginx + PHP-FPM, LXC Debian |
| URL | `https://videofactory.watys.fr/` |

Aligné avec PokerDecide, ScanLocal, TubeFactory.

---

## 6. Infrastructure (prévue)

| Élément | Valeur |
|---------|--------|
| **URL** | `https://videofactory.watys.fr/` |
| **CTID** | **9034** |
| **IP** | **10.10.11.115** |
| **SSH** | `dev@10.10.11.194` |
| **Dossier** | `/var/www/app` |
| **RAM / CPU** | **8192 Mo / 12 cœurs** (FFmpeg + files volumineuses) |
| **Telegram** | à créer |
| **Paquets LXC** | `ffmpeg`, PHP 8.2, sqlite3 — **installés** |
| **Cursor CLI** | installé + clé API OK |

**Services externes (configurable dans Paramètres) — valeurs TubeFactory connues :**

| Service | URL / mode | Rôle |
|---------|------------|------|
| ComfyUI | `http://swatier.freeboxos.fr:8188` | Workflows image / vidéo / upscale (domaine Freebox, accès direct depuis le LXC) |
| Ollama | API **Ollama Cloud** (`ollama.com`) + clé | Script, plans, prompts — modèle `gpt-oss:20b` |
| Kokoro | À installer sur le PC (ou Edge TTS en secours) | Voix off |

> Pas besoin de **Socat** : le LXC appelle le domaine + port directement (comme TubeFactory).

---

## 7. Les 4 onglets (comme la vidéo de référence)

### 7.1 Onglet **Générer**

Créer **un asset isolé** (sans projet film complet).

| Fonction | Détail |
|----------|--------|
| Choisir un **workflow** | Image, vidéo, upscale, FPS |
| **Prompt** | Texte décrivant ce qu’on veut |
| **Format** | 16:9 YouTube, 9:16 TikTok, carré… |
| **Durée** | Pour les clips vidéo (secondes) |
| **Lancer** | Job async → aperçu + téléchargement |
| **Historique** | Dernières générations |

**Must V1**

---

### 7.2 Onglet **Projet** (cœur de l’usine)

Fabriquer un **film / vidéo complète** en plusieurs étapes.

#### Formulaire de création

| Champ | Description |
|-------|-------------|
| **Pitch** | Idée du film en français libre |
| **Durée** | En **secondes** (ex. 600 = 10 min) |
| **Nombre de plans** | Shots ; max ~15 s par plan en général |
| **Format** | YouTube 16:9, TikTok 9:16, etc. |
| **Personnages** | Oui/non — images de référence pour cohérence |
| **Mode visuel** | Images animées **ou** texte → vidéo direct |
| **Voix off** | Oui/non + choix voix Kokoro |
| **Sous-titres** | Oui/non (burn-in FFmpeg) |
| **Style** | Texte libre (ciné, cartoon, docu…) |

#### Pipeline d’un projet

```
1. brouillon     → formulaire rempli
2. script        → Ollama génère script + prompts + narration
3. review        → l’utilisateur peut éditer chaque plan
4. assets        → ComfyUI (images/clips) + Kokoro (audio)
5. montage       → FFmpeg assemble final.mp4
6. post          → option upscale 4K / 60 fps (workflow dédié)
7. terminé       → téléchargement
```

#### Écran projet

- Liste des **plans** (thumbnail, prompt, statut, durée)
- Boutons : **Générer script** | **Lancer prod** | **Monter** | **Upscale**
- **Barre de progression** par étape
- Liste des **projets** en cours / terminés

**Must V1 :** pitch → script → assets → montage → download  
**V1.1 :** upscale post-prod, personnages référence

---

### 7.3 Onglet **Outils**

Actions **sans** créer un projet complet.

| Outil | Description |
|-------|-------------|
| **Upscale / FPS** | Choisir une vidéo existante → workflow VR2 ou équivalent |
| **Assembler clips** | Sélectionner N fichiers → FFmpeg concat |
| **Importer workflow** | Raccourci vers Paramètres |

**Must V1 :** assemble clips + upscale basique  
**Nice :** import workflow depuis ici

---

### 7.4 Onglet **Paramètres**

Configuration technique — **cornerstone** du système.

| Section | Contenu |
|---------|---------|
| **Connexions** | URL Ollama, ComfyUI, Kokoro ; test connexion |
| **Workflows** | Liste des templates installés (nom, type, fichier API) |
| **Ajouter workflow** | Upload 2 fichiers ComfyUI : export **API** + export **interface** |
| **Modèles manquants** | Liste des poids à télécharger (HuggingFace) + bouton download |
| **Paramètres exposés** | Champs détectés dans le workflow → réglables dans Générer |
| **Stockage** | Chemin ComfyUI models (sur PC GPU, via agent ou SSH — V2) |
| **FFmpeg** | Chemin binaire, preset qualité (CRF, preset) |

**Must V1 :** connexions + CRUD workflows (import manuel JSON)  
**V1.1 :** détection auto modèles manquants + download assisté

---

## 8. Workflows ComfyUI (concept clé)

Un **workflow** = une **recette** pour ComfyUI (image Flux, vidéo Wan/LTX, upscale…).

| Règle | Détail |
|-------|--------|
| Import | 2 exports depuis ComfyUI : **API** + **UI** |
| Stockage | `workflows/{slug}/api.json` + `ui.json` |
| Exécution | Backend envoie le JSON API à ComfyUI `/prompt` |
| Extensible | Nouveau workflow = **sans modifier le code PHP** (config BDD) |
| Filtre | Marquer « exécutable localement » vs cloud-only |

**Workflows cibles V1 (inspirés vidéo) :**

- Image : Flux / Z-Image (ou équivalent léger)
- Vidéo : LTX / Wan 2.x (selon VRAM dispo)
- Upscale : workflow type VR2
- FPS : interpolation si workflow dispo

---

## 9. Montage FFmpeg (contrat fichiers)

Dossier par projet : `storage/projects/{id}/`

| Fichier | Rôle |
|---------|------|
| `audio.mp3` | Voix off Kokoro |
| `shot_01.png` ou `.mp4` | Asset plan 1 |
| `filelist.txt` | Timeline FFmpeg (concat demuxer) |
| `subtitles.srt` | Sous-titres (depuis BDD ou Whisper) |
| `final.mp4` | Sortie montage |
| `final_4k.mp4` | Sortie post upscale (optionnel) |

**Règle FFmpeg connue :** répéter la **dernière image** sans durée dans `filelist.txt`.

---

## 10. Modèle de données SQLite (V1)

### `settings`
- clé / valeur JSON (URLs services, chemins)

### `workflows`
- id, slug, name, type (image|video|upscale|fps), api_path, ui_path, params_json, active

### `projects`
- id, title, pitch, duration_sec, shot_count, format, options_json, status, created_at

### `shots`
- id, project_id, index, prompt, motion_prompt, narration_text, duration_sec, asset_path, status

### `jobs`
- id, type, ref_id, status, progress, log, created_at

### `generations` (onglet Générer)
- id, workflow_id, prompt, params_json, output_path, status

**Pas de table `channels`** — volontairement absent (TubeFactory).

---

## 11. API REST (première liste)

| Endpoint | Méthode | Rôle |
|----------|---------|------|
| `/api/health.php` | GET | Santé |
| `/api/settings.php` | GET/POST | Connexions + réglages |
| `/api/workflows.php` | CRUD | Templates ComfyUI |
| `/api/projects.php` | CRUD | Projets film |
| `/api/projects/{id}/script.php` | POST | Générer script (Ollama) |
| `/api/projects/{id}/produce.php` | POST | Lancer assets |
| `/api/projects/{id}/render.php` | POST | Montage FFmpeg |
| `/api/generate.php` | POST | Génération unitaire |
| `/api/jobs.php` | GET | Suivi jobs async |
| `/api/tools/assemble.php` | POST | Concat FFmpeg |
| `/api/tools/upscale.php` | POST | Upscale workflow |

---

## 12. Plan de développement

| Phase | Contenu | Priorité |
|-------|---------|----------|
| **0** | LXC + Nginx + page temp + health | ✅ Fait |
| **1** | Paramètres + test connexion Ollama/ComfyUI | Must |
| **2** | Import 1 workflow image + onglet Générer | Must |
| **3** | Projet : formulaire + script Ollama | Must |
| **4** | Prod assets (image + TTS) + statuts jobs | Must |
| **5** | Montage FFmpeg + download | Must |
| **6** | Workflows vidéo + upscale | Should |
| **7** | Onglet Outils (assemble, upscale seul) | Should |
| **8** | Auth utilisateurs | Could (V1 solo = sans login OK) |

**Ordre recommandé pour l’agent :** 0 → 1 → 3 → 4 → 5 → 2 → 6 → 7

---

## 13. Différences avec TubeFactory

| | TubeFactory | VideoFactory |
|---|-------------|--------------|
| Objectif | Industrialiser **chaînes YouTube** | Fabriquer **des vidéos/films** |
| Entités | Chaînes, idées, kanban 8 étapes | Projets, plans, workflows |
| SEO / templates chaîne | Oui | Non en V1 |
| Public | Créateur multi-chaînes | Créateur vidéo |
| Code | Déjà avancé sur 9024 | **Nouveau projet** 9034 |

Réutilisation possible : idées de `render.php`, appels ComfyUI/Ollama, structure SQLite — **sans fusionner les apps**.

---

## 14. Risques et limites

| Risque | Mitigation |
|--------|------------|
| Génération très lente | Jobs async + notifications ; lancer la nuit |
| Modèles énormes (10+ Go) | Un workflow à la fois ; doc espace disque |
| VRAM insuffisante | Filtrer workflows « compatibles 8 Go » |
| ComfyUI down | Health check + message clair dans l’UI |
| Kokoro pas installé | Fallback TTS autre (edge-tts V2 ou API TubeFactory) |

---

## 15. Critères de succès V1

- [ ] Créer un projet 60 s, 4 plans, format 16:9  
- [ ] Ollama produit un script éditable  
- [ ] ComfyUI génère au moins des **images** par plan  
- [ ] Kokoro (ou TTS de secours) produit la voix  
- [ ] FFmpeg sort un **final.mp4** avec sous-titres optionnels  
- [ ] Téléchargement depuis le navigateur  
- [ ] Un workflow importable sans toucher au code  

---

## 16. Historique document

| Version | Date | Changement |
|---------|------|------------|
| 0.1 | 01/09/2026 | Création — inspiration vidéo YouTube Mapizza, nom VideoFactory validé |
