Public
Pipeline serverless di editing video automatizzato con AI
aipipelineserverlessvideo
Val Town is a collaborative website to build and scale JavaScript apps.
Deploy APIs, crons, & store data – all from the browser, and deployed in milliseconds.

AI Video Editor — Backend serverless di editing automatizzato con AI

Pipeline serverless su Val Town che orchestra l'editing video professionale tramite AI: upload diretto del filmato, trascrizione con Whisper, proposta di montaggio generata da un LLM (flusso assistito con approvazione) o rendering diretto da una timeline JSON (flusso direct), e consegna del video pronto via Shotstack.

Architettura

Rendering mermaid diagram...
  • main.ts — router HTTP (Hono): API REST, webhook, media host.
  • lib/db.ts — state machine dei job su SQLite (project-scoped).
  • lib/transcribe.ts — Whisper via URL (Groq default, fallback OpenAI), con timestamp.
  • lib/director.ts — LLM che individua i momenti migliori e genera la timeline Shotstack.
  • lib/renderer.ts — client Shotstack (submit + poll); provider astratto per Creatomate.
  • lib/pipeline.ts — orchestrazione (analisi, render, reconcile, notifiche).
  • lib/notify.ts — notifiche Slack / Discord / Telegram / webhook generico.
  • cron.ts — reconcile dei render attivi + retry analisi impantanate.

Endpoint

MetodoRouteDescrizione
POST/jobsCrea un job (multipart: file, mode, instructions, timeline).
GET/jobsElenca gli ultimi 50 job.
GET/jobs/:idStato del job.
GET/jobs/:id/proposalProposta di montaggio (summary, hooks, sottotitoli, timeline).
POST/jobs/:id/approveApprova la proposta → avvia il rendering.
POST/jobs/:id/declineDeclina la proposta.
POST/jobs/:id/cancelAnnulla un job in coda/rendering/analisi.
POST/jobs/:id/retryRe-avvia analisi/render dopo un errore.
GET/media/:id/sourceServirà il video sorgente (media host).
GET/media/:id/outputServirà il video renderizzato.
POST/webhooks/renderCallback readiness → reconcile su richiesta.
GET/healthHealth check.

Stati del job

created → analyzing → proposal → (approve) → queued → rendering → done created → (direct) → queued → rendering → done proposal → (decline) → declined · … → failed · … → cancelled

Setup API keys

Env var del val. Impostane almeno GROQ_API_KEY (trascrizione) e SHOTSTACK_API_KEY (render).

Esempi

Upload diretto in modalità assistita (il backup consiglia e attende approvazione):

curl -X POST https://ai-video-editor.val.run/jobs \ -F "file=@boh/export.mp4" \ -F "mode=assisted" \ -F "instructions=Mantieni solo i momenti più energici, max 60 secondi, aggiungi sottotitoli"

Verifica proposta e approva:

curl https://ai-video-editor.val.run/jobs/<id>/proposal curl -X POST https://ai-video-editor.val.run/jobs/<id>/approve

Rendering diretto da timeline JSON (v. schema Shotstack):

curl -X POST https://ai-video-editor.val.run/jobs \ -F "file=@clip.mp4" \ -F "mode=direct" \ -F 'timeline={"timeline":{"background":"#000","tracks":[{"clips":[{"asset":{"type":"video","src":"SOURCE_URL"},"start":0,"length":10}]}]},"output":{"format":"mp4","resolution":"sd"}}'

Il src della timeline viene sovrascritto automaticamente con l'URL del media host, quindi puoi inserire un placeholder.

Limiti e note

  • Blob free tier: 10 MB — i video oltre questa soglia richiedono Pro (1 GB). Per la sandbox ok.
  • L'URL temporaneo di Shotstack scade dopo 24 h: la copia duplicata su blob hostato in GET /media/:id/output ne garantisce disponibilità.
  • Cron minimo su free tier = 15 min: il reconcile in produzione su Pro può scendere a ogni minuto (Shotstack espone comunque webhook serve).
  • Non usare WebSocket: il flusso è polling + webhook.

Integrazioni bot

Il val è già pronto come backend azionabile via webhook/bot (Discord/Telegram/Slack): la pipeline espone endpoint idempotenti e notifiche per canale. Con boh/bubble hai anche un frontend a cui collegare la creazione job via HTTP.