Communitygithub.com

videodb

Mira, comprende y actúa sobre video y audio. Ingiere desde archivos locales, URLs, fuentes RTSP/directos o grabación de escritorio; devuelve contexto en tiempo real y enlaces de transmisión reproducibles. Comprende extrayendo fotogramas, construyendo índices visuales, semánticos y temporales, y busca momentos con marcas de tiempo y clips automáticos. Actúa transcodificando y normalizando (códec, fps, resolución, relación de aspecto), realizando ediciones en línea de tiempo (subtítulos, superposiciones de texto/imagen/marca, superposiciones de audio, doblaje, traducción), generando activos multimedia (imagen, audio, video) y creando alertas en tiempo real para eventos de transmisiones en vivo o captura de escritorio. Úsalo para ingerir, indexar, buscar, editar, transcodificar o alertar sobre contenido de video o audio.

¿Qué es videodb?

VideoDB es una habilidad de agente de IA que otorga a asistentes como Claude Code, Cursor o Codex la capacidad de percibir, comprender y actuar sobre contenido de video y audio. Está diseñada para desarrolladores que necesitan automatizar flujos de trabajo complejos de procesamiento de video directamente desde la línea de comandos o desde el agente. La habilidad soporta la ingesta desde múltiples fuentes: archivos locales, URLs públicas, transmisiones RTSP en vivo y captura de escritorio (macOS). Una vez ingerido el contenido, permite construir índices visuales, de palabras habladas y semánticos para buscar momentos exactos con marcas de tiempo y enlaces de evidencia reproducibles. Además, facilita la edición no lineal mediante operaciones en línea de tiempo: superposición de subtítulos (generación, traducción e incrustación), adición de texto, imágenes, marcas, audio de fondo, voz en off y doblaje. También incluye capacidades de transcodificación (códec, resolución, relación de aspecto) y generación de activos multimedia (imagen, audio, video) mediante IA. Un caso de uso destacado es la monitorización en tiempo real: al conectar una cámara RTSP o iniciar una sesión de captura de escritorio, el agente puede emitir eventos y alertas basadas en lo que se ve o se dice. La habilidad está documentada en detalle en el archivo SKILL.md local, que incluye fragmentos de código Python listos para usar, prácticas recomendadas de manejo de errores y una tabla de decisiones rápida para elegir entre las soluciones de VideoDB y herramientas locales como ffmpeg. Para comenzar, solo se necesita instalar el SDK con `pip install "videodb[capture]" python-dotenv` y configurar una clave de API gratuita desde console.videodb.io.

Compatible con✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/affaan-m/ECC/tree/main/skills/videodb

Preguntar en tu IA favorita

Abre un nuevo chat con esta habilidad de agente ya precargada.

Documentación

Habilidad VideoDB

Percepción + memoria + acciones para video, transmisiones en vivo y sesiones de escritorio.

Cuándo usarla

Percepción de escritorio

  • Iniciar/detener una sesión de escritorio capturando pantalla, micrófono y audio del sistema
  • Transmitir contexto en vivo y almacenar memoria episódica de la sesión
  • Ejecutar alertas/desencadenantes en tiempo real sobre lo que se dice y sucede en pantalla
  • Producir resúmenes de sesión, una línea de tiempo buscable y enlaces de evidencia reproducibles

Ingesta de video + transmisión

  • Ingerir un archivo o URL y devolver un enlace de transmisión web reproducible
  • Transcodificar/normalizar: códec, tasa de bits, fps, resolución, relación de aspecto

Indexar + buscar (marcas de tiempo + evidencia)

  • Construir índices visual, de palabras habladas y de palabras clave
  • Buscar y devolver momentos exactos con marcas de tiempo y evidencia reproducible
  • Crear clips automáticamente a partir de los resultados de búsqueda

Edición y generación en línea de tiempo

  • Subtítulos: generar, traducir, incrustar
  • Superposiciones: texto/imagen/marca, subtítulos animados
  • Audio: música de fondo, voz en off, doblaje
  • Composición programática y exportaciones mediante operaciones de línea de tiempo

Transmisiones en vivo (RTSP) + monitoreo

  • Conectar fuentes RTSP/en vivo
  • Ejecutar comprensión visual y hablada en tiempo real y emitir eventos/alertas para flujos de trabajo de monitoreo

Cómo funciona

Entradas comunes

  • Ruta de archivo local, URL pública, o URL RTSP
  • Solicitud de captura de escritorio: iniciar / detener / resumir sesión
  • Operaciones deseadas: obtener contexto para comprensión, especificación de transcodificación, especificación de índice, consulta de búsqueda, rangos de clip, ediciones de línea de tiempo, reglas de alerta

Salidas comunes

  • URL de transmisión
  • Resultados de búsqueda con marcas de tiempo y enlaces de evidencia
  • Activos generados: subtítulos, audio, imágenes, clips
  • Cargas de eventos/alertas para transmisiones en vivo
  • Resúmenes de sesión de escritorio y entradas de memoria

Ejecutar código Python

Antes de ejecutar cualquier código de VideoDB, cambia al directorio del proyecto y carga las variables de entorno:

from dotenv import load_dotenv
load_dotenv(".env")

import videodb
conn = videodb.connect()

Esto lee VIDEO_DB_API_KEY de:

  1. Entorno (si ya está exportada)
  2. Archivo .env del proyecto en el directorio actual

Si la clave falta, videodb.connect() lanza AuthenticationError automáticamente.

NO escribas un archivo de script cuando un comando corto en línea funcione.

Al escribir Python en línea (python -c "..."), usa siempre código formateado correctamente — usa punto y coma para separar declaraciones y mantenlo legible. Para cualquier cosa de más de ~3 declaraciones, usa un heredoc en su lugar:

python << 'EOF'
from dotenv import load_dotenv
load_dotenv(".env")

import videodb
conn = videodb.connect()
coll = conn.get_collection()
print(f"Videos: {len(coll.get_videos())}")
EOF

Configuración

Cuando el usuario pida "configurar videodb" o similar:

1. Instalar SDK

pip install "videodb[capture]" python-dotenv

Si videodb[capture] falla en Linux, instala sin el extra capture:

pip install videodb python-dotenv

2. Configurar clave API

El usuario debe establecer VIDEO_DB_API_KEY usando cualquiera de los siguientes métodos:

  • Exportar en terminal (antes de iniciar Claude): export VIDEO_DB_API_KEY=tu-clave
  • Archivo .env del proyecto: Guarda VIDEO_DB_API_KEY=tu-clave en el archivo .env del proyecto

Obtén una clave API gratuita en console.videodb.io (50 subidas gratis, sin tarjeta de crédito).

NO leas, escribas ni manejes la clave API tú mismo. Siempre deja que el usuario la configure.

Referencia rápida

Subir contenido multimedia

# URL
video = coll.upload(url="https://example.com/video.mp4")

# YouTube
video = coll.upload(url="https://www.youtube.com/watch?v=VIDEO_ID")

# Archivo local
video = coll.upload(file_path="/path/to/video.mp4")

Transcripción + subtítulo

# force=True omite el error si el video ya está indexado
video.index_spoken_words(force=True)
text = video.get_transcript_text()
stream_url = video.add_subtitle()

Buscar dentro de videos

from videodb.exceptions import InvalidRequestError

video.index_spoken_words(force=True)

# search() lanza InvalidRequestError cuando no se encuentran resultados.
# Siempre envuelve en try/except y trata "No results found" como vacío.
try:
    results = video.search("demostración de producto")
    shots = results.get_shots()
    stream_url = results.compile()
except InvalidRequestError as e:
    if "No results found" in str(e):
        shots = []
    else:
        raise

Búsqueda de escenas

import re
from videodb import SearchType, IndexType, SceneExtractionType
from videodb.exceptions import InvalidRequestError

# index_scenes() no tiene parámetro force — lanza un error si ya existe un
# índice de escenas. Extrae el ID del índice existente del error.
try:
    scene_index_id = video.index_scenes(
        extraction_type=SceneExtractionType.shot_based,
        prompt="Describe el contenido visual de esta escena.",
    )
except Exception as e:
    match = re.search(r"id\s+([a-f0-9]+)", str(e))
    if match:
        scene_index_id = match.group(1)
    else:
        raise

# Usa score_threshold para filtrar ruido de baja relevancia (recomendado: 0.3+)
try:
    results = video.search(
        query="persona escribiendo en una pizarra blanca",
        search_type=SearchType.semantic,
        index_type=IndexType.scene,
        scene_index_id=scene_index_id,
        score_threshold=0.3,
    )
    shots = results.get_shots()
    stream_url = results.compile()
except InvalidRequestError as e:
    if "No results found" in str(e):
        shots = []
    else:
        raise

Edición de línea de tiempo

Importante: Siempre valida las marcas de tiempo antes de construir una línea de tiempo:

  • start debe ser >= 0 (los valores negativos se aceptan en silencio pero producen salida dañada)
  • start debe ser < end
  • end debe ser <= video.length
from videodb.timeline import Timeline
from videodb.asset import VideoAsset, TextAsset, TextStyle

timeline = Timeline(conn)
timeline.add_inline(VideoAsset(asset_id=video.id, start=10, end=30))
timeline.add_overlay(0, TextAsset(text="El Fin", duration=3, style=TextStyle(fontsize=36)))
stream_url = timeline.generate_stream()

Transcodificar video (cambio de resolución / calidad)

from videodb import TranscodeMode, VideoConfig, AudioConfig

# Cambia resolución, calidad o relación de aspecto del lado del servidor
job_id = conn.transcode(
    source="https://example.com/video.mp4",
    callback_url="https://example.com/webhook",
    mode=TranscodeMode.economy,
    video_config=VideoConfig(resolution=720, quality=23, aspect_ratio="16:9"),
    audio_config=AudioConfig(mute=False),
)

Reencuadrar relación de aspecto (para plataformas sociales)

Advertencia: reframe() es una operación lenta del lado del servidor. Para videos largos puede tomar varios minutos y puede agotar el tiempo de espera. Mejores prácticas:

  • Siempre limita a un segmento corto usando start/end cuando sea posible
  • Para videos de duración completa, usa callback_url para procesamiento asíncrono
  • Recorta el video en una Timeline primero, luego reencuadra el resultado más corto
from videodb import ReframeMode

# Siempre prefiere reencuadrar un segmento corto:
reframed = video.reframe(start=0, end=60, target="vertical", mode=ReframeMode.smart)

# Reencuadre asíncrono para videos de duración completa (devuelve None, resultado vía webhook):
video.reframe(target="vertical", callback_url="https://example.com/webhook")

# Ajustes preestablecidos: "vertical" (9:16), "square" (1:1), "landscape" (16:9)
reframed = video.reframe(start=0, end=60, target="square")

# Dimensiones personalizadas
reframed = video.reframe(start=0, end=60, target={"width": 1280, "height": 720})

Medios generativos

image = coll.generate_image(
    prompt="una puesta de sol sobre montañas",
    aspect_ratio="16:9",
)

Manejo de errores

from videodb.exceptions import AuthenticationError, InvalidRequestError

try:
    conn = videodb.connect()
except AuthenticationError:
    print("Verifica tu VIDEO_DB_API_KEY")

try:
    video = coll.upload(url="https://example.com/video.mp4")
except InvalidRequestError as e:
    print(f"Error de subida: {e}")

Errores comunes

EscenarioMensaje de errorSolución
Indexar un video ya indexadoSpoken word index for video already existsUsa video.index_spoken_words(force=True) para omitir si ya está indexado
El índice de escenas ya existeScene index with id XXXX already existsExtrae el scene_index_id existente del error con re.search(r"id\s+([a-f0-9]+)", str(e))
La búsqueda no encuentra coincidenciasInvalidRequestError: No results foundCaptura la excepción y trata como resultados vacíos (shots = [])
Reencuadre se agotaSe bloquea indefinidamente en videos largosUsa start/end para limitar el segmento, o pasa callback_url para asíncrono
Marcas de tiempo negativas en TimelineProduce silenciosamente una transmisión dañadaSiempre valida start >= 0 antes de crear VideoAsset
generate_video() / create_collection() fallaOperation not allowed o maximum limitFunciones restringidas por plan — informa al usuario sobre los límites del plan

Ejemplos

Indicaciones canónicas

  • "Inicia la captura de escritorio y alerta cuando aparezca un campo de contraseña."
  • "Graba mi sesión y produce un resumen procesable cuando termine."
  • "Ingiere este archivo y devuelve un enlace de transmisión reproducible."
  • "Indexa esta carpeta y encuentra cada escena con personas, devuelve marcas de tiempo."
  • "Genera subtítulos, incrústalos y añade música de fondo suave."
  • "Conecta esta URL RTSP y alerta cuando una persona entre en la zona."

Grabación de pantalla (Captura de escritorio)

Usa ws_listener.py para capturar eventos WebSocket durante las sesiones de grabación. La captura de escritorio es compatible solo con macOS.

Inicio rápido

  1. Elige el directorio de estado: STATE_DIR="${VIDEODB_EVENTS_DIR:-$HOME/.local/state/videodb}"
  2. Inicia el oyente: VIDEODB_EVENTS_DIR="$STATE_DIR" python scripts/ws_listener.py --clear "$STATE_DIR" &
  3. Obtén el ID de WebSocket: cat "$STATE_DIR/videodb_ws_id"
  4. Ejecuta el código de captura (consulta reference/capture.md para el flujo de trabajo completo)
  5. Eventos escritos en: $STATE_DIR/videodb_events.jsonl

Usa --clear cada vez que inicies una ejecución de captura nueva para que los eventos de transcripción y visuales antiguos no contaminen la nueva sesión.

Consultar eventos

import json
import os
import time
from pathlib import Path

events_dir = Path(os.environ.get("VIDEODB_EVENTS_DIR", Path.home() / ".local" / "state" / "videodb"))
events_file = events_dir / "videodb_events.jsonl"
events = []

if events_file.exists():
    with events_file.open(encoding="utf-8") as handle:
        for line in handle:
            try:
                events.append(json.loads(line))
            except json.JSONDecodeError:
                continue

transcripts = [e["data"]["text"] for e in events if e.get("channel") == "transcript"]
cutoff = time.time() - 300
recent_visual = [
    e for e in events
    if e.get("channel") == "visual_index" and e["unix_ts"] > cutoff
]

Documentación adicional

La documentación de referencia se encuentra en el directorio reference/ junto a este archivo SKILL.md. Usa la herramienta Glob para localizarla si es necesario.

No uses ffmpeg, moviepy o herramientas de codificación locales cuando VideoDB soporte la operación. Las siguientes operaciones se manejan todas del lado del servidor por VideoDB: recortar, combinar clips, superponer audio o música, agregar subtítulos, superposiciones de texto/imagen, transcodificación, cambios de resolución, conversión de relación de aspecto, redimensionamiento para requisitos de plataforma, transcripción y generación de medios. Solo recurre a herramientas locales para operaciones listadas bajo Limitaciones en reference/editor.md (transiciones, cambios de velocidad, recorte/zoom, gradación de color, mezcla de volumen).

Cuándo usar qué

ProblemaSolución VideoDB
La plataforma rechaza la relación de aspecto o resolución del videovideo.reframe() o conn.transcode() con VideoConfig
Necesitas redimensionar video para Twitter/Instagram/TikTokvideo.reframe(target="vertical") o target="square"
Necesitas cambiar la resolución (ej. 1080p → 720p)conn.transcode() con VideoConfig(resolution=720)
Necesitas superponer audio/música en videoAudioAsset en una Timeline
Necesitas agregar subtítulosvideo.add_subtitle() o CaptionAsset
Necesitas combinar/recortar clipsVideoAsset en una Timeline
Necesitas generar voz en off, música o efectos de sonidocoll.generate_voice(), generate_music(), generate_sound_effect()

Procedencia

El material de referencia para esta habilidad se encuentra localmente en skills/videodb/reference/. Usa las copias locales anteriores en lugar de seguir enlaces de repositorios externos en tiempo de ejecución.

Individual skills in this repo

This repo contains 20 individual skills — each has its own dedicated page.

accessibility

Design, implement, and audit inclusive digital products using WCAG 2.2 Level AA. Use when building or auditing UI that must meet WCAG 2.2 Level AA, or when reviewing a change for keyboard, contrast, or screen-reader support.

affaan-m/content-engine

Create platform-native content systems for X, LinkedIn, TikTok, YouTube, newsletters, and repurposed multi-platform campaigns. Use when the user wants social posts, threads, scripts, content calendars, or one source asset adapted cleanly across platforms.

affaan-m/ECC

Multi-platform content distribution across X, LinkedIn, Threads, and Bluesky. Adapts content per platform using content-engine patterns. Never posts identical content cross-platform. Use when the user wants to distribute content across social platforms.

affaan-m/fal-ai-media

Unified media generation via fal.ai MCP — image, video, and audio. Covers text-to-image (Nano Banana), text/image-to-video (Seedance, Kling, Veo 3), text-to-speech (CSM-1B), and video-to-audio (ThinkSound). Use when the user wants to generate images, videos, or audio with AI.

affaan-m/manim-video

日本語翻訳:このファイルは manim-video 用の日本語翻訳が必要です

affaan-m/remotion-video-creation

Remotion のベストプラクティス - React で動画を作成する。3D、アニメーション、音声、字幕、チャート、トランジションなどをカバーするドメイン固有の29のルール。

affaan-m/video-editing

AI-assisted video editing workflows for cutting, structuring, and augmenting real footage. Covers the full pipeline from raw capture through FFmpeg, Remotion, ElevenLabs, fal.ai, and final polish in Descript or CapCut. Use when the user wants to edit video, cut footage, create vlogs, or build video content.

agent-architecture-audit

Full-stack diagnostic for agent and LLM applications. Audits the 12-layer agent stack for wrapper regression, memory pollution, tool discipline failures, hidden repair loops, and rendering corruption. Produces severity-ranked findings with code-first fixes. Essential for developers building agent applications, autonomous loops, or any LLM-powered feature. Use when an agent or LLM feature misbehaves and the failing layer is unknown, or before shipping an agent stack.

agent-eval

Head-to-head comparison of coding agents (Claude Code, Aider, Codex, etc.) on custom tasks with pass rate, cost, time, and consistency metrics. Use when choosing between coding agents, or when a change to an agent setup needs measured pass rate, cost, and time rather than an impression.

agent-harness-construction

Design and optimize AI agent action spaces, tool definitions, and observation formatting for higher completion rates. Use when defining or revising an agent

agentic-engineering

Operate as an agentic engineer using eval-first execution, decomposition, and cost-aware model routing. Use when planning or executing engineering work that agents will carry out end to end.

agentic-os

Build persistent multi-agent operating systems on Claude Code. Covers kernel architecture, specialist agents, slash commands, file-based memory, scheduled automation, and state management without external databases. Use when building a persistent multi-agent system on Claude Code with its own memory, commands, and scheduling.

agent-introspection-debugging

Structured self-debugging workflow for AI agent failures using capture, diagnosis, contained recovery, and introspection reports. Use when an agent run fails and you need a reproducible diagnosis instead of a retry.

agent-payment-x402

Add x402 payment execution to AI agents with per-task budgets, spending controls, and non-custodial wallets. Supports Base through agentwallet-sdk and X Layer through OKX Payments / OKX Agent Payments Protocol. Use when an agent must pay for something itself and needs per-task budgets, spending controls, and a non-custodial wallet.

agent-self-evaluation

Use after completing any non-trivial task. The agent self-rates its output on 5 axes — accuracy, completeness, clarity, actionability, conciseness — with concrete evidence per criterion. Produces a structured 1-5 scorecard with specific improvement suggestions.

agent-sort

Build an evidence-backed ECC install plan for a specific repo by sorting skills, commands, rules, hooks, and extras into DAILY vs LIBRARY buckets using parallel repo-aware review passes. Use when ECC should be trimmed to what a project actually needs instead of loading the full bundle.

ai-first-engineering

Engineering operating model for teams where AI agents generate a large share of implementation output. Use when setting team process, review gates, or ownership rules for a codebase largely written by agents.

ai-regression-testing

Regression testing strategies for AI-assisted development. Sandbox-mode API testing without database dependencies, automated bug-check workflows, and patterns to catch AI blind spots where the same model writes and reviews code. Use when adding regression coverage to AI-assisted code, or when the same model both wrote and reviewed a change.

android-clean-architecture

Clean Architecture patterns for Android and Kotlin Multiplatform projects — module structure, dependency rules, UseCases, Repositories, and data layer patterns. Use when structuring modules, layers, or data flow in an Android or KMP project.

angular-developer

Generates Angular code and provides architectural guidance. Trigger when creating projects, components, or services, or for best practices on reactivity (signals, linkedSignal, resource), forms, dependency injection, routing, SSR, accessibility (ARIA), animations, styling (component styles, Tailwind CSS), testing, or CLI tooling.

Skills relacionados