Skip to content

Video System Overview

The video system spans Application-Frontend (configuration, upload, VAST generation), Creative-Engine (playback, controls), and external infrastructure (Bunny CDN, Cloudflare delivery). This document covers the full pipeline from upload to delivery.

Architecture

Upload Flow:
  FileUploader.vue -> videoUpload.ts mixin -> Bunny CDN (TUS protocol)
    -> Bunny transcodes -> streamParser.ts polls + parses M3U8

Playback Flow:
  Builder preview / Standalone delivery
    -> CreativeVideoBlock.vue reads block properties
    -> streaming=true:  @cavai/minimal-video (HLS.js wrapper)
    -> streaming=false: native <video> with MP4 source

VAST Flow:
  TagGenerator.ts -> VAST 4.3 XML
    -> MediaFiles: Mezzanine + HLS streams + MP4 fallbacks
    -> TrackingEvents: start/quartiles/complete
    -> CompanionAds: responsive + format-specific

Key Files

ComponentPathPurpose
Type definitionsAF/src/pages/Chatbots/components/BuilderVisuals/Blocks/data/types.tsVideoProperties interface
DefaultsAF/src/pages/Chatbots/components/BuilderVisuals/Blocks/data/defaults.tsvideoDefaults object
Configuration UIAF/src/pages/Chatbots/components/BuilderVisuals/Configuration/configs/VideoConfiguration.vueMain video settings panel
Video uploadAF/src/mixins/videoUpload.tsBunny upload flow and validation
File uploaderAF/src/components/common/FileUploader.vueGeneric file/video input component
Stream parserAF/src/utils/streamParser.tsM3U8 HLS manifest parsing
Video proxyAF/src/services/videoProxy.tsUpload status polling with soft progress bar
VAST generationAF/src/utils/TagGenerator.tsVAST 4.3 XML with streaming + MP4 fallbacks
Video flow opAF/src/pages/Chatbots/components/CavaiFlow/operators/VideoOp.vueFlow: add YouTube/stream video
Change video opAF/src/pages/Chatbots/components/CavaiFlow/operators/ChangeVideoOp.vueFlow: swap video with before/after comparison
Engine rendererCE/src/components/creative/CreativeVideoBlock/CreativeVideoBlock.vueVideo playback (MP4 or HLS)
Engine controlsCE/src/components/creative/CreativeVideoBlock/CreativeVideoControls.vuePlay/Mute UI overlay
Delivery utilsAF/src/utils/delivery.tsURL helpers for video thumbnails and originals
API serviceAF/src/services/chatbotService.jsBunny token, video delete endpoints

Video Block Properties

typescript
type VideoProperties = BlockBase & {
  video: {
    streamId: string        // Bunny CDN ID (UUID v4)
    fileName: string
    duration: number
    aspectRatio: number
  }
  playback: {
    autoplay: boolean
    pauseAfter: number      // seconds or loop count
    pauseMeasure: string    // 'infinity' | 'sec' | 'loop'
  }
  streaming: boolean        // HLS streaming toggle
  forceStreaming: boolean   // Override streaming (master/child system)
  pauseOutOfView: boolean
  forcePauseOutOfView: boolean
  layout: VideoLayout       // 'scale' | 'preserve' | 'stretch'
  // ... plus border, shadow, alignment, rotation, customCSS
}

Key defaults: autoplay: true, pauseMeasure: 'infinity', streaming: false, layout: 'scale'.

Layout modes map from legacy names: scale = cover with crop, preserve = contain with letterbox, stretch = fill.

CDN and Delivery Infrastructure

All video assets are served through Cloudflare (delivery-6.cavai.com) backed by Bunny CDN.

URL Patterns

AssetURL
Original MP4https://delivery-6.cavai.com/{streamId}/original
Preview thumbnailhttps://delivery-6.cavai.com/{streamId}/preview.webp
Animated previewhttps://delivery-6.cavai.com/{streamId}/preview.gif
HLS master playlisthttps://delivery-6.cavai.com/{streamId}/playlist.m3u8
HLS per-renditionhttps://delivery-6.cavai.com/{streamId}/{rendition}/video.m3u8
MP4 renditionhttps://delivery-6.cavai.com/{streamId}/play_{rendition}.mp4

Delivery Domains

  • Local dev: localhost:3333 (backend), localhost:8787 (video status proxy)
  • Production: delivery-1/2/3/4/6.cavai.com (Cloudflare multi-region)

Stream ID

The streamId is a UUID v4 assigned by Bunny CDN during upload. It's the primary identifier used everywhere -- block properties, flow operators, VAST tags, CDN URLs. Validated with /^[\da-f-]{36}$/.

Internal documentation