Communitygithub.com

VideoDB

Perception + mémoire + actions pour la vidéo, les flux en direct et les sessions de bureau.

Qu'est-ce que VideoDB ?

VideoDB est une compétence d'agent IA qui fournit des capacités avancées de perception, de mémoire et d'action pour le contenu vidéo et audio. Elle permet l'ingestion de vidéos à partir de fichiers locaux, d'URL, de flux RTSP ou de captures d'écran, puis retourne un contexte en temps réel et des liens de streaming. La compétence comprend l'indexation visuelle, sémantique et temporelle pour rechercher des moments précis avec des horodatages, ainsi que l'édition de la timeline (sous-titres, superposition, doublage, traduction) et la génération de médias (image, audio, vidéo). Elle est conçue pour être utilisée avec Claude Code, Cursor ou d'autres agents, et s'appuie sur le SDK Python VideoDB. Le SKILL.md fourni décrit en détail les flux de travail, la gestion des erreurs, et les cas d'utilisation typiques, avec des exemples de code Python prêts à l'emploi.

Compatible avec✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/affaan-m/everything-claude-code/tree/main/skills/videodb

Demander à votre IA préférée

Ouvre une nouvelle conversation avec cette compétence d'agent déjà préchargée.

Documentation

Compétence VideoDB

Perception + mémoire + actions pour la vidéo, les flux en direct et les sessions de bureau.

Quand l'utiliser

Perception de bureau

  • Démarrer/arrêter une session de bureau capturant l'écran, le micro et l'audio système
  • Diffuser un contexte en direct et stocker une mémoire de session épisodique
  • Exécuter des alertes/déclencheurs en temps réel sur ce qui est dit et ce qui se passe à l'écran
  • Produire des résumés de session, une timeline consultable et des liens de preuve jouables

Ingestion vidéo + streaming

  • Ingérer un fichier ou une URL et retourner un lien de streaming web jouable
  • Transcodage/normalisation : codec, débit, fps, résolution, rapport hauteur/largeur

Indexation + recherche (horodatages + preuves)

  • Construire des index visuels, vocaux et par mots-clés
  • Rechercher et retourner des moments exacts avec des horodatages et des preuves jouables
  • Créer automatiquement des extraits à partir des résultats de recherche

Édition de timeline + génération

  • Sous-titres : générer, traduire, incruster
  • Superpositions : texte/image/marque, sous-titres animés
  • Audio : musique de fond, voix-off, doublage
  • Composition programmatique et exportations via opérations de timeline

Flux en direct (RTSP) + surveillance

  • Connecter des flux RTSP/en direct
  • Exécuter une compréhension visuelle et vocale en temps réel et émettre des événements/alertes pour les flux de travail de surveillance

Comment ça fonctionne

Entrées courantes

  • Chemin de fichier local, URL publique, ou URL RTSP
  • Demande de capture de bureau : démarrer / arrêter / résumer la session
  • Opérations souhaitées : obtenir le contexte pour la compréhension, spécification de transcodage, spécification d'indexation, requête de recherche, plages d'extraits, modifications de timeline, règles d'alerte

Sorties courantes

  • URL de streaming
  • Résultats de recherche avec horodatages et liens de preuve
  • Actifs générés : sous-titres, audio, images, extraits
  • Données d'événement/alerte pour les flux en direct
  • Résumés de session de bureau et entrées mémoire

Exécution de code Python

Avant d'exécuter du code VideoDB, placez-vous dans le répertoire du projet et chargez les variables d'environnement :

from dotenv import load_dotenv
load_dotenv(".env")

import videodb
conn = videodb.connect()

Ceci lit VIDEO_DB_API_KEY depuis :

  1. L'environnement (si déjà exporté)
  2. Le fichier .env du projet dans le répertoire courant

Si la clé est manquante, videodb.connect() lève automatiquement une AuthenticationError.

N'écrivez PAS de fichier de script lorsqu'une commande courte en ligne suffit.

Lorsque vous écrivez du Python en ligne (python -c "..."), utilisez toujours du code correctement formaté — utilisez des points-virgules pour séparer les instructions et gardez-le lisible. Pour tout ce qui dépasse ~3 instructions, utilisez plutôt un heredoc :

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

Configuration

Lorsque l'utilisateur demande "configurer videodb" ou similaire :

1. Installer le SDK

pip install "videodb[capture]" python-dotenv

Si videodb[capture] échoue sur Linux, installez sans l'extension capture :

pip install videodb python-dotenv

2. Configurer la clé API

L'utilisateur doit définir VIDEO_DB_API_KEY en utilisant l'une ou l'autre méthode :

  • Exporter dans le terminal (avant de lancer Claude) : export VIDEO_DB_API_KEY=votre-clé
  • Fichier .env du projet : Enregistrez VIDEO_DB_API_KEY=votre-clé dans le fichier .env du projet

Obtenez une clé API gratuite sur console.videodb.io (50 téléchargements gratuits, aucune carte de crédit).

Ne lisez, n'écrivez et ne gérez PAS la clé API vous-même. Laissez toujours l'utilisateur la définir.

Référence rapide

Télécharger un média

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

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

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

Transcription + sous-titres

# force=True ignore l'erreur si la vidéo est déjà indexée
video.index_spoken_words(force=True)
text = video.get_transcript_text()
stream_url = video.add_subtitle()

Rechercher dans les vidéos

from videodb.exceptions import InvalidRequestError

video.index_spoken_words(force=True)

# search() lève InvalidRequestError lorsqu'aucun résultat n'est trouvé.
# Toujours encapsuler dans try/except et traiter "Aucun résultat" comme vide.
try:
    results = video.search("demo produit")
    shots = results.get_shots()
    stream_url = results.compile()
except InvalidRequestError as e:
    if "Aucun résultat trouvé" in str(e):
        shots = []
    else:
        raise

Recherche de scènes

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

# index_scenes() n'a pas de paramètre force — elle lève une erreur si un index
# de scène existe déjà. Extrayez l'ID d'index existant de l'erreur.
try:
    scene_index_id = video.index_scenes(
        extraction_type=SceneExtractionType.shot_based,
        prompt="Décrivez le contenu visuel de cette scène.",
    )
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

# Utilisez score_threshold pour filtrer le bruit de faible pertinence (recommandé : 0.3+)
try:
    results = video.search(
        query="personne écrivant sur un tableau blanc",
        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 "Aucun résultat trouvé" in str(e):
        shots = []
    else:
        raise

Édition de timeline

Important : Validez toujours les horodatages avant de construire une timeline :

  • start doit être >= 0 (les valeurs négatives sont acceptées silencieusement mais produisent un résultat cassé)
  • start doit être < end
  • end doit être <= 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="Fin", duration=3, style=TextStyle(fontsize=36)))
stream_url = timeline.generate_stream()

Transcodage vidéo (changement de résolution / qualité)

from videodb import TranscodeMode, VideoConfig, AudioConfig

# Changez la résolution, la qualité ou le rapport hauteur/largeur côté serveur
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),
)

Recadrage du rapport hauteur/largeur (pour les plateformes sociales)

Attention : reframe() est une opération serveur lente. Pour les longues vidéos, cela peut prendre plusieurs minutes et peut expirer. Bonnes pratiques :

  • Limitez toujours à un court segment en utilisant start/end lorsque possible
  • Pour les vidéos complètes, utilisez callback_url pour un traitement asynchrone
  • Rognez d'abord la vidéo sur une Timeline, puis recadrez le résultat plus court
from videodb import ReframeMode

# Préférez toujours recadrer un court segment :
reframed = video.reframe(start=0, end=60, target="vertical", mode=ReframeMode.smart)

# Recadrage asynchrone pour les vidéos complètes (retourne None, résultat via webhook) :
video.reframe(target="vertical", callback_url="https://example.com/webhook")

# Préréglages : "vertical" (9:16), "square" (1:1), "landscape" (16:9)
reframed = video.reframe(start=0, end=60, target="square")

# Dimensions personnalisées
reframed = video.reframe(start=0, end=60, target={"width": 1280, "height": 720})

Médias génératifs

image = coll.generate_image(
    prompt="un coucher de soleil sur les montagnes",
    aspect_ratio="16:9",
)

Gestion des erreurs

from videodb.exceptions import AuthenticationError, InvalidRequestError

try:
    conn = videodb.connect()
except AuthenticationError:
    print("Vérifiez votre VIDEO_DB_API_KEY")

try:
    video = coll.upload(url="https://example.com/video.mp4")
except InvalidRequestError as e:
    print(f"Échec du téléchargement : {e}")

Pièges courants

ScénarioMessage d'erreurSolution
Indexer une vidéo déjà indexéeL'index de mots parlés pour la vidéo existe déjàUtilisez video.index_spoken_words(force=True) pour ignorer si déjà indexé
L'index de scène existe déjàL'index de scène avec l'id XXXX existe déjàExtrayez l'scene_index_id existant de l'erreur avec re.search(r"id\s+([a-f0-9]+)", str(e))
La recherche ne trouve aucune correspondanceInvalidRequestError: Aucun résultat trouvéAttrapez l'exception et traitez comme résultats vides (shots = [])
Le recadrage expireBloque indéfiniment sur les longues vidéosUtilisez start/end pour limiter le segment, ou passez callback_url pour l'async
Horodatages négatifs sur la TimelineProduit silencieusement un flux casséValidez toujours start >= 0 avant de créer VideoAsset
generate_video() / create_collection() échoueOpération non autorisée ou limite maximaleFonctionnalités liées au plan — informez l'utilisateur des limites du plan

Exemples

Invites canoniques

  • "Démarrer la capture de bureau et alerter lorsqu'un champ de mot de passe apparaît."
  • "Enregistrer ma session et produire un résumé exploitable lorsqu'elle se termine."
  • "Ingérer ce fichier et retourner un lien de streaming jouable."
  • "Indexer ce dossier et trouver chaque scène avec des personnes, retourner les horodatages."
  • "Générer des sous-titres, les incruster, et ajouter une musique de fond légère."
  • "Connecter cette URL RTSP et alerter lorsqu'une personne entre dans la zone."

Enregistrement d'écran (Capture de bureau)

Utilisez ws_listener.py pour capturer les événements WebSocket pendant les sessions d'enregistrement. La capture de bureau est prise en charge uniquement sur macOS.

Démarrage rapide

  1. Choisir le répertoire d'état : STATE_DIR="${VIDEODB_EVENTS_DIR:-$HOME/.local/state/videodb}"
  2. Démarrer l'écouteur : VIDEODB_EVENTS_DIR="$STATE_DIR" python scripts/ws_listener.py --clear "$STATE_DIR" &
  3. Obtenir l'ID WebSocket : cat "$STATE_DIR/videodb_ws_id"
  4. Exécuter le code de capture (voir reference/capture.md pour le flux de travail complet)
  5. Événements écrits dans : $STATE_DIR/videodb_events.jsonl

Utilisez --clear chaque fois que vous démarrez une nouvelle capture pour que les événements de transcription et visuels obsolètes ne s'infiltrent pas dans la nouvelle session.

Interroger les événements

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
]

Documentation supplémentaire

La documentation de référence se trouve dans le répertoire reference/ adjacent à ce fichier SKILL.md. Utilisez l'outil Glob pour le localiser si nécessaire.

N'utilisez pas ffmpeg, moviepy ou d'outils d'encodage local lorsque VideoDB prend en charge l'opération. Les éléments suivants sont tous gérés côté serveur par VideoDB — rognage, combinaison d'extraits, superposition audio ou musicale, ajout de sous-titres, superpositions de texte/image, transcodage, changements de résolution, conversion de rapport hauteur/largeur, redimensionnement pour les exigences de plateforme, transcription et génération de médias. Revenez aux outils locaux uniquement pour les opérations listées dans Limitations dans reference/editor.md (transitions, changements de vitesse, recadrage/zoom, étalonnage des couleurs, mixage du volume).

Quand utiliser quoi

ProblèmeSolution VideoDB
La plateforme rejette le rapport hauteur/largeur ou la résolution de la vidéovideo.reframe() ou conn.transcode() avec VideoConfig
Besoin de redimensionner une vidéo pour Twitter/Instagram/TikTokvideo.reframe(target="vertical") ou target="square"
Besoin de changer la résolution (ex. 1080p → 720p)conn.transcode() avec VideoConfig(resolution=720)
Besoin de superposer de l'audio/de la musique sur une vidéoAudioAsset sur une Timeline
Besoin d'ajouter des sous-titresvideo.add_subtitle() ou CaptionAsset
Besoin de combiner/rogner des extraitsVideoAsset sur une Timeline
Besoin de générer une voix-off, de la musique ou des effets sonorescoll.generate_voice(), generate_music(), generate_sound_effect()

Provenance

Le matériel de référence pour cette compétence est fourni localement sous skills/videodb/reference/. Utilisez les copies locales ci-dessus au lieu de suivre les liens vers des dépôts externes lors de l'exécution.

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/claude-api

Anthropic Claude API patterns for Python and TypeScript. Covers Messages API, streaming, tool use, vision, extended thinking, batches, prompt caching, and Claude Agent SDK. Use when building applications with the Claude API or Anthropic SDKs.

affaan-m/everything-claude-code

End-to-end marketing campaign planning and execution. Covers audience research, positioning, campaign angle definition, landing page copy, email sequences, social posts, ad copy, short-form video scripts, and content calendars. Use as the orchestration layer for multi-channel product launches. Use when planning or executing a multi-channel product launch, or producing landing page, email, social, or ad copy.

affaan-m/everything-claude-code

Development conventions and patterns for everything-claude-code. JavaScript project with conventional commits.

affaan-m/everything-claude-code-conventions

Development conventions and patterns for everything-claude-code. JavaScript project with conventional commits.

affaan-m/frontend-design

Create distinctive, production-grade frontend interfaces with high design quality. Use when the user asks to build web components, pages, or applications and the visual direction matters as much as the code quality.

affaan-m/gget

gget CLI and Python workflow for quick genomic database queries, sequence lookup, BLAST-style searches, enrichment checks, and reproducible bioinformatics evidence logs.

affaan-m/literature-review

Systematic literature-review workflow for academic, biomedical, technical, and scientific topics, including search planning, source screening, synthesis, citation checks, and evidence logging.

affaan-m/motion-ui

Production-ready UI motion system for React/Next.js. Use when implementing animations, transitions, or motion patterns.

affaan-m/project-guidelines-example

Example project-specific skill template based on a real production application.

affaan-m/pubmed-database

Direct PubMed and NCBI E-utilities search workflows for biomedical literature, MeSH queries, PMID lookup, citation retrieval, and API-backed literature monitoring.

affaan-m/scholar-evaluation

Structured scholarly-work evaluation for papers, proposals, literature reviews, methods sections, evidence quality, citation support, and research-writing feedback.

affaan-m/uspto-database

USPTO patent and trademark data workflow for official record lookup, PatentSearch queries, TSDR checks, assignment data, and reproducible IP research logs.

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.

Skills associés