── The Boomer Dev Docs ← Volver a la app

MEMORIA FUNCIONAL — VideoGen

Documento generado a partir del código real del proyecto (code/videogen-v2/ frontend + code/src/ backend FastAPI). Fecha: 2026-08-05 · Live: https://videogen.theboomer.dev


1. Introducción

VideoGen es un servicio SaaS de generación y postproducción de vídeos cortos para redes sociales (TikTok, Instagram Reels, YouTube Shorts). El producto combina:

Arquitectura real

Capa Tecnología Ruta
Frontend (landing) React + Vite + Tailwind + shadcn/ui + react-i18next code/videogen-v2/src/
Backend FastAPI (Python) + Motor (MongoDB async, opcional) code/src/
Procesamiento FFmpeg CLI (runner async) + OpenAI Whisper CLI code/src/utils/ffmpeg_runner.py, code/src/services/
Proveedores IA Adaptadores InVideo / HeyGen / Runway / fal.ai (demo local por defecto) code/src/providers.py

Estado actual del frontend: la app publicada (videogen-v2) es una landing page genérica de plantilla SaaS (secciones Hero, Features, FAQ, CTA) con i18n y modo oscuro. La funcionalidad real del producto vive en la API backend (/api/v1/*), documentada en la sección 3. La landing es el punto de entrada comercial; el generador/editor es consumible vía API (los clientes pueden conectarse al backend directamente).


2. Tipos de usuario

Tipo Descripción Alcance real en el código
Visitante Llega a la landing sin autenticar Ve Hero, Features, FAQ, CTA, footer. Puede cambiar idioma y tema. Los CTAs apuntan a anclas (#signup, #learn-more) sin sección implementada.
Usuario registrado Cuenta creada vía /api/v1/auth/register (email, password, name) Recibe token sk_<usuario> y tier free. Actualmente no hay UI de dashboard conectada a la API; el acceso a los endpoints de generación/edición es vía API.
Cliente API / integrador Consume los endpoints REST de generación y edición POST /generate, /generate-edited, /edit, /edit-with-captions, /edit-v3, presets y outputs.
Operador/backend Mantiene el servicio /health, /docs (OpenAPI), limpieza periódica de outputs caducados, variables de entorno para tokens.

Nota: el backend incluye un módulo de auth (Slice 1: register/login/me) pero no está conectado a la landing publicada; los outputs pueden protegerse con OUTPUT_TOKEN.


3. Funcionalidades

F3.1 — Landing multilingüe (frontend)

F3.2 — Generación de vídeo desde idea (POST /api/v1/generate)

F3.3 — Edición de vídeo (POST /api/v1/edit)

F3.4 — Edición con subtítulos automáticos (POST /api/v1/edit-with-captions)

F3.5 — Edición completa con música y watermark (POST /api/v1/edit-v3)

F3.6 — Generación + edición atómica (POST /api/v1/generate-edited)

F3.7 — Presets de plataforma (GET /api/v1/presets, GET /api/v1/presets/{name})

Preset Resolución Fit Fade Uso
tiktok-vertical 1080x1920 pad 0.3/0.3 TikTok / Reels / Shorts full-frame
youtube-shorts 1080x1920 pad 0.3/0.3 YouTube Shorts
instagram-reel 1080x1920 crop 0.2/0.4 Instagram Reels (zona segura)
instagram-square 1080x1080 pad Posts feed Instagram
youtube-landscape 1920x1080 pad YouTube estándar
podcast-clean 1280x720 scale 0.1/0.1 Clips podcast/talking-head + loudnorm -16 LUFS
x-twitter 1280x720 scale Vídeos in-feed X/Twitter

F3.8 — Salida de vídeos (outputs) (GET/HEAD /api/v1/outputs/*)

F3.9 — Autenticación de API (POST /api/v1/auth/*)

F3.10 — Health check y operación (GET /health)


4. Pantallas (wireframes textuales)

P1 — Landing (videogen-v2, vista pública) — la única pantalla del frontend publicado

┌────────────────────────────────────────────────────────────────────────┐
│ HEADER (sticky, backdrop-blur, borde inferior)                          │
│ [Logo]            [Features] [Pricing] [FAQ] [Contact]   [🌐 EN ▾] [🌙] [≡] │
│ (desktop: nav horizontal · móvil: botón hamburguesa que abre panel)     │
├────────────────────────────────────────────────────────────────────────┤
│ HERO (centrado, py-20/32)                                               │
│   Tu Título Aquí            ← hero.title (i18n, 4xl/6xl bold)           │
│   Tu descripción va aquí    ← hero.subtitle (muted)                     │
│   [Comenzar]  [Más Información]  ← CTAs → #signup / #learn-more         │
├────────────────────────────────────────────────────────────────────────┤
│ FEATURES (bg-muted/50, grid 3 columnas)                                 │
│   "Características"                                                     │
│   [⚡ Fast Performance]  [🔒 Secure]  [🌍 i18n Ready]                    │
│   (cards: icono 4xl + título + descripción, border + bg-card)           │
├────────────────────────────────────────────────────────────────────────┤
│ FAQ (max-w-2xl)                                                         │
│   "Preguntas Frecuentes"                                                │
│   ▸ What is this?        ← acordeón (1 abierto a la vez, colapsable)    │
│   ▸ How much?                                                            │
│   ▸ Data privacy?                                                        │
├────────────────────────────────────────────────────────────────────────┤
│ CTA FINAL (bg-primary, texto claro)                                     │
│   ¿Listo para comenzar?                                                 │
│   Únete a miles de usuarios hoy                                         │
│   [Prueba Gratis]  ← botón secondary → #signup                          │
├────────────────────────────────────────────────────────────────────────┤
│ FOOTER (border-t)                                                       │
│   © 2024 TentPole. Todos los derechos reservados.                       │
└────────────────────────────────────────────────────────────────────────┘

Comportamientos: menú idioma desplegable (EN/ES/FR/IT, marca el actual con font-medium, cierra al hacer clic fuera); toggle tema oscuro/claro con persistencia en localStorage; en móvil (<768px) la nav se oculta y aparece el panel desplegable.

P2 — API Docs (OpenAPI, servida por el backend en /docs)

┌───────────────────────────────────────────────────────────┐
│ Swagger UI — VideoGen API                                 │
│ auth      → /api/v1/auth/* (register, login, me)          │
│ generate  → /generate, /generate-edited                   │
│ edit      → /edit, /edit-with-captions, /edit-v3, presets │
│ outputs   → /outputs/, /outputs/{filename} (GET/HEAD)     │
│ Misc      → /health, /docs                                │
└───────────────────────────────────────────────────────────┘

P3 — Pantallas del producto (no implementadas en UI, expuestas vía API)

Wireframe conceptual de las vistas que consumiría un dashboard conectado a la API (basado en los parámetros de los endpoints; no inventar como implementadas):

Generador:   [Idea textual________] [Duración: 15/30/60 ▾] [Estilo ▾] [Plataforma ▾]
             [Generar] → spinner → resultado: video_url, proveedor, duración real, timestamp
Editor:      [Source (URL/path)] [Trim 0..N] [Resize WxH fit] [Fade in/out] [Normalize LUFS]
             [Captions on/off + model + style] [Music source/vol/loop] [Watermark src/pos/opacity]
             [Aplicar edición] → output_path, size, duration, w×h
Outputs:     Lista: filename, size, age, expires_in · acciones: descargar
Presets:     tiktok-vertical · youtube-shorts · instagram-reel · instagram-square
             youtube-landscape · podcast-clean · x-twitter

5. Flujos de trabajo

Flujo A — Generar un vídeo desde idea (API)

  1. Cliente llama POST /api/v1/generate con idea, duracion, estilo, plataforma.
  2. Backend valida (E001/E002) y selecciona proveedores para estilo+plataforma.
  3. Prueba proveedores en orden hasta éxito; en demo renderiza MP4 local (color + prompt).
  4. Devuelve video_url (+ proveedor, duración real, timestamp).
  5. El vídeo queda disponible para descargar o para editar.

Flujo B — Generar + editar en un solo paso

  1. Cliente llama POST /api/v1/generate-edited con idea + edit (o source + edit).
  2. Si hay idea: genera (Flujo A) y descarga el vídeo al workdir. Si hay source: lo resuelve (URL→archivo local).
  3. Construye las operaciones (trim/resize/fade/normalize/music/watermark/captions) a partir del spec.
  4. Ejecuta el pipeline ffmpeg (+ whisper si captions).
  5. Devuelve metadatos del edit y la ruta del output.
  6. El cliente descarga el output vía GET /api/v1/outputs/{filename} (TTL 1 h).

Flujo C — Editar vídeo existente con preset mental

  1. Cliente consulta GET /api/v1/presets y elige (p. ej. tiktok-vertical).
  2. Usa su resize/fade en POST /api/v1/edit-v3 (o /edit).
  3. Aplica ediciones + extras (música, watermark, captions).
  4. Recibe output_path y descarga.

Flujo D — Ciclo de vida de un output

  1. Un output se crea al editar (workdir /tmp/videogen-edits por defecto).
  2. Es descargable mientras age ≤ TTL (3600 s).
  3. periodic_cleanup borra archivos caducados cada CLEANUP_INTERVAL_SECONDS.
  4. Si se solicita un archivo expirado → HTTP 410 output expired.

Flujo E — Visitante en la landing

  1. Carga https://videogen.theboomer.dev.
  2. Ve hero + features + FAQ + CTA; puede cambiar idioma (EN/ES/FR/IT) y tema.
  3. Los CTAs (#signup, #learn-more) no tienen sección destino implementada (placeholder de plantilla).

6. Reglas de negocio

  1. Duraciones válidas: solo 15, 30 o 60 segundos (error E002 si otro valor).
  2. Estilos válidos: animado, real, corporativo.
  3. Plataformas válidas: instagram, tiktok, youtube_shorts (resolución por defecto 1280x720 si otra).
  4. Idea obligatoria: no vacía (error E001); en /generate-edited debe venir idea o source (nunca ambos vacíos).
  5. Al menos una operación de edición en /edit, /edit-with-captions y /edit-v3 (400 en caso contrario).
  6. Rangos de validación: resize width ≤ 7680 / height ≤ 4320 y > 0; fade ≤ 10 s; normalize -30..-6 LUFS; música volume 0–2 y fades ≤ 10 s; watermark opacity 0–1, scale 0.01–1, margin 0–200; captions font_size 8–72, outline_width 0–8, margin_v 0–200; timeout ffmpeg 5–600 s, whisper 10–1800 s.
  7. Nombres de output únicos: output_filename repetido → 409 Conflict.
  8. Fallback de proveedores: si un proveedor falla se prueba el siguiente; si todos fallan → 503 E003.
  9. TTL de outputs: 1 hora por defecto (OUTPUT_TTL_SECONDS); caducados → 410 y limpieza periódica.
  10. Seguridad de descargas: sin path traversal, sin archivos ocultos, extensiones permitidas whitelist, auth opcional por token (OUTPUT_TOKEN), soporte Range.
  11. Demo mode: en DEMO_MODE=true (defecto) no se necesitan API keys externas; se generan MP4 placeholder reales (color + prompt quemado).
  12. Headless por diseño: el frontend publicado es una landing de marketing; toda la funcionalidad de negocio se expone vía REST (clientes API/integradores).
  13. Auth: el token derivado del email (sk_<usuario>) es un stub; la protección real de outputs es OUTPUT_TOKEN.
  14. CORS: configurable vía CORS_ORIGINS (por defecto *).