Extensión de Chrome para automatizar la creación de videos en Google Flow (VEO).
vidflow/
├── manifest.json # Configuración de la extensión Chrome MV3
├── background.js # Service worker para comunicación
├── ARCHITECTURE.md # Este archivo (documentación)
│
├── sidepanel/ # Panel lateral de la extensión
│ ├── panel.html # UI del panel (~200 líneas)
│ ├── panel.css # Estilos del panel
│ └── panel.js # Lógica del panel (~768 líneas)
│
└── content/ # Scripts inyectados en las páginas
├── flow.js # [BACKUP] Archivo original monolítico
└── flow/ # Módulos refactorizados
├── utils.js # 219 líneas - Utilidades compartidas
├── log.js # 233 líneas - Sistema de logs visual
├── selectors.js # 77 líneas - Selectores DOM constantes
├── settings.js # 182 líneas - Configuración de ajustes
├── generation.js # 701 líneas - Tipo, imagen, prompt
├── video.js # 452 líneas - Proyecto, espera, descarga
├── pipeline.js # 559 líneas - Modo pipeline (5 paralelo)
└── main.js # 292 líneas - Entry point
Total refactorizado: 2715 líneas distribuidas en 8 archivos manejables Archivo original: flow.js (~2757 líneas) mantenido como backup
Panel lateral que permite:
- Pegar y analizar prompts
- Configurar categorías de referencia con imágenes
- Modo batch (una imagen por prompt)
- Configurar modelo Veo, orientación, resultados
- Iniciar/detener automatización
Archivos:
panel.html: UI con tabs (Prompts, Referencias, Config)panel.css: Estilos dark themepanel.js: Estado, análisis de prompts, comunicación con background
Scripts inyectados en labs.google/* para automatizar Flow.
Funciones de utilidad:
sleep(ms): Pausa asyncbase64ToBlob(base64): Conversión de imágenesfindElement(texts, tagFilter): Búsqueda de elementos DOMfindElementInSettings(texts): Búsqueda en panel de ajustesselectOptionInListbox(texts): Selección en dropdownswaitForPageReady(): Esperar carga de páginashowDebugBadge(text): Badge visual de debug
Sistema de logs visual:
initLogPanel(): Crear panel de logs flotantevfLog(msg, type): Log con timestamp y tipo (info/success/warn/error/step)makeDraggable(el, handle): Hacer panel arrastrablesaveLogsToStorage(): Persistir logsclearLogs(): Limpiar logs
Constantes con selectores DOM para Google Flow.
Configuración de ajustes:
configureSettings(config): Configurar todos los ajustessetAspectRatio(ratio): 16:9 o 9:16setResultsPerRequest(count): 1-4 videossetModel(modelId): Veo 2/3.1
Preparación de generación:
selectGenerationType(type): Texto/Imagen/Ingredientes a videogetCurrentGenerationType(): Detectar tipo actualuploadImage(imageData): Subir imagen de referenciahandleCropDialog(): Manejar diálogo de recortewaitForImageReady(): Verificar imagen cargadaenterPrompt(text): Escribir promptclickGenerate(): Iniciar generaciónverifyImageBeforeSend(): Verificar imagen antes de enviar
Manejo de videos:
goToHomeAndCreateProject(): Crear nuevo proyectodismissPreviousResult(): Cerrar resultado anteriorclearPromptArea(): Limpiar promptremoveCurrentImage(): Eliminar imagen actualwaitForVideoGeneration(): Esperar generación (max 5 min)downloadVideo(index): Descargar video 720pdownloadVideoByPrompt(prompt, filename): Descarga por prompt
Modo pipeline (5 videos en paralelo):
findPromptButton(text): Encontrar botón de promptfindVideoCardByPrompt(text): Encontrar card de videogetVideoStatusByPrompt(text): Estado (COMPLETED/GENERATING/FAILED/PENDING)countVideoStatuses(prompts): Contar estadossubmitPromptToQueue(text): Enviar a colafindRetryButton(text): Encontrar botón reutilizarretryFailedVideo(text): Reintentar video fallidorunPipelineMode(prompts, config): Ejecutar pipeline completo
Entry point:
- Estado global (
isAutomating,currentConfig, etc.) - Message listener para comunicación con background
setupFlow(data): Inicializar automatizacióngenerateVideo(data): Generar un video completostopAutomation(): Detener automatización
Service worker que:
- Recibe mensajes del sidepanel
- Envía comandos al content script
- Maneja descargas
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ Sidepanel │────>│ Background │────>│Content Script│
│ (panel.js) │ │ (bg.js) │ │ (flow/*.js) │
└─────────────┘ └─────────────┘ └─────────────┘
│ │
│ chrome.runtime.sendMessage │
└───────────────────────────────────────┘
- Crear proyecto
- Configurar ajustes
- Subir imagen (si aplica)
- Escribir prompt
- Generar y esperar
- Descargar
- Siguiente video
- Enviar hasta 5 prompts a la cola
- Monitorear estados cada 10s
- Cuando uno completa: descargar y enviar siguiente
- Si falla: reintentar automáticamente (max 3 veces)
- Continuar hasta completar todos
| Estado | Indicador |
|---|---|
| COMPLETED | Tiene video/thumbnail visible |
| GENERATING | Muestra porcentaje (XX%) |
| FAILED | Texto "No se ha podido generar" |
| PENDING | Sin indicadores |
| NOT_FOUND | Prompt no encontrado en DOM |
- Orden de escenas: de ABAJO arriba. La escena 1 está al fondo de la página, la más reciente arriba.
- Cada tarjeta de video:
<video>arriba, prompt text abajo. El prompt está más cerca del video de la tarjeta SIGUIENTE que del suyo. - Contenedor por tarjeta (
sc-20145656-0) está a ~10 niveles DOM desde el<video>. Contiene exactamente 1 video + 1 prompt. - El contenedor general de la galería (nivel ~14) contiene TODOS los videos y prompts.
findCompletedVideoCards()usamaxLevels=15para asegurar que alcanza el contenedor por tarjeta.- El fallback de proximidad solo busca prompts DEBAJO del video (
rect.top > videoRect.top) para evitar confundir con la tarjeta anterior.
downloadSceneMap: downloadId → sceneNumber (code-initiated downloads)pendingVideoUrlMap: videoUrlId → sceneNumber (URL-based matching, más fiable)pendingPromptSceneMap: promptKey → sceneNumber (FIFO fallback, último recurso)vidflowDownloadIds: Set of VidFlow download IDs, capped at 200- El listener
onDeterminingFilenamesolo se registra durante pipelines activos para no interferir con AutoFlow u otras extensiones.
chrome.alarmsat 24s intervals +chrome.storage.localwrites- Auto-stops when no workflow is running
MAX_TRACKED_DOWNLOADS = 200(download Set)MAX_LOG_ENTRIES = 500(all 3 log modules)MAX_PROMPT_LENGTH = 5000(panel input)
escapeHtml()on all dynamic innerHTML in panel.jssanitizeFolderName()strips path-unsafe chars- Input validation on speech API functions
- 16 rounds of QA, 14 bugs fixed, 871 tests
- See CHANGELOG.md for details
- Refactorización en módulos
- Modo pipeline (5 en paralelo)
- Sistema de reintentos automáticos
- Triple verificación de prompts
- Versión inicial
- Automatización secuencial
- Panel lateral con configuración