framewebworker 0.1.4 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/backends/ffmpeg.ts","../src/captions.ts","../src/index.ts","../src/compositor.ts","../src/worker/pool.ts","../src/stitch.ts","../src/render.ts"],"names":["FFmpegBackend","data","ASPECT_RATIO_MAP","resolveOutputDimensions","seekVideo","drawVideoFrame","createFFmpegBackend","render","renderToUrl"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { RendererBackend, FrameData, EncodeOptions } from '../types.js';\n\nexport class FFmpegBackend implements RendererBackend {\n readonly name = 'ffmpeg.wasm';\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private ffmpeg: any = null;\n private initialized = false;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private _fetchFile: any = null;\n\n async init(): Promise<void> {\n if (this.initialized) return;\n\n const { FFmpeg } = await import('@ffmpeg/ffmpeg').catch(() => {\n throw new Error(\n '[FrameWorker] @ffmpeg/ffmpeg is required. Install it: npm install @ffmpeg/ffmpeg @ffmpeg/util'\n );\n });\n const { fetchFile, toBlobURL } = await import('@ffmpeg/util');\n\n const ffmpeg = new FFmpeg();\n\n const baseURL = 'https://unpkg.com/@ffmpeg/core@0.12.6/dist/esm';\n await ffmpeg.load({\n coreURL: await toBlobURL(`${baseURL}/ffmpeg-core.js`, 'text/javascript'),\n wasmURL: await toBlobURL(`${baseURL}/ffmpeg-core.wasm`, 'application/wasm'),\n });\n\n this._fetchFile = fetchFile;\n this.ffmpeg = ffmpeg;\n this.initialized = true;\n }\n\n async encode(frames: FrameData[], options: EncodeOptions): Promise<Blob> {\n await this.init();\n const { ffmpeg, _fetchFile: fetchFile } = this;\n const { fps, width, height, onProgress, signal } = options;\n\n const total = frames.length;\n for (let i = 0; i < total; i++) {\n if (signal?.aborted) throw new DOMException('Render cancelled', 'AbortError');\n\n const frame = frames[i];\n const offscreen = new OffscreenCanvas(width, height);\n const ctx = offscreen.getContext('2d')!;\n ctx.putImageData(frame.imageData, 0, 0);\n const blob = await offscreen.convertToBlob({ type: 'image/png' });\n const data = await fetchFile(blob);\n await ffmpeg.writeFile(`frame${String(i).padStart(6, '0')}.png`, data);\n\n onProgress?.(i / total * 0.8);\n }\n\n await ffmpeg.exec([\n '-framerate', String(fps),\n '-i', 'frame%06d.png',\n '-c:v', 'libx264',\n '-pix_fmt', 'yuv420p',\n '-preset', 'fast',\n '-crf', '23',\n '-movflags', '+faststart',\n 'output.mp4',\n ]);\n\n onProgress?.(0.95);\n\n const data = await ffmpeg.readFile('output.mp4') as Uint8Array;\n\n for (let i = 0; i < total; i++) {\n await ffmpeg.deleteFile(`frame${String(i).padStart(6, '0')}.png`).catch(() => {});\n }\n await ffmpeg.deleteFile('output.mp4').catch(() => {});\n\n onProgress?.(1);\n\n return new Blob([data.slice().buffer], { type: 'video/mp4' });\n }\n\n async concat(blobs: Blob[], options: EncodeOptions): Promise<Blob> {\n await this.init();\n const { ffmpeg, _fetchFile: fetchFile } = this;\n const { onProgress } = options;\n\n const listLines: string[] = [];\n for (let i = 0; i < blobs.length; i++) {\n const name = `clip${i}.mp4`;\n const data = await fetchFile(blobs[i]);\n await ffmpeg.writeFile(name, data);\n listLines.push(`file '${name}'`);\n onProgress?.(i / blobs.length * 0.6);\n }\n\n const encoder = new TextEncoder();\n await ffmpeg.writeFile('concat.txt', encoder.encode(listLines.join('\\n')));\n\n await ffmpeg.exec([\n '-f', 'concat',\n '-safe', '0',\n '-i', 'concat.txt',\n '-c', 'copy',\n 'stitched.mp4',\n ]);\n\n onProgress?.(0.9);\n\n const out = await ffmpeg.readFile('stitched.mp4') as Uint8Array;\n\n for (let i = 0; i < blobs.length; i++) {\n await ffmpeg.deleteFile(`clip${i}.mp4`).catch(() => {});\n }\n await ffmpeg.deleteFile('concat.txt').catch(() => {});\n await ffmpeg.deleteFile('stitched.mp4').catch(() => {});\n\n onProgress?.(1);\n\n return new Blob([out.slice().buffer], { type: 'video/mp4' });\n }\n\n async destroy(): Promise<void> {\n if (this.ffmpeg) {\n await this.ffmpeg.terminate?.();\n this.ffmpeg = null;\n this.initialized = false;\n }\n }\n}\n\nexport function createFFmpegBackend(): FFmpegBackend {\n return new FFmpegBackend();\n}\n","import type { CaptionSegment, CaptionStyle, CaptionStylePreset } from './types.js';\n\nexport const STYLE_PRESETS: Record<CaptionStylePreset, CaptionStyle> = {\n hormozi: {\n preset: 'hormozi',\n fontFamily: 'Impact, \"Arial Black\", sans-serif',\n fontSize: 64,\n fontWeight: '900',\n color: '#FFFFFF',\n strokeColor: '#000000',\n strokeWidth: 4,\n backgroundColor: 'transparent',\n backgroundPadding: 0,\n backgroundRadius: 0,\n position: 'bottom',\n textAlign: 'center',\n lineHeight: 1.1,\n maxWidth: 0.9,\n shadow: true,\n shadowColor: 'rgba(0,0,0,0.9)',\n shadowBlur: 6,\n shadowOffsetX: 2,\n shadowOffsetY: 2,\n uppercase: true,\n wordHighlight: true,\n wordHighlightColor: '#FFD700',\n wordHighlightTextColor: '#000000',\n },\n modern: {\n preset: 'modern',\n fontFamily: '\"Inter\", \"Helvetica Neue\", Arial, sans-serif',\n fontSize: 42,\n fontWeight: '700',\n color: '#FFFFFF',\n strokeColor: 'transparent',\n strokeWidth: 0,\n backgroundColor: 'rgba(0,0,0,0.65)',\n backgroundPadding: 12,\n backgroundRadius: 8,\n position: 'bottom',\n textAlign: 'center',\n lineHeight: 1.3,\n maxWidth: 0.85,\n shadow: false,\n shadowColor: 'transparent',\n shadowBlur: 0,\n shadowOffsetX: 0,\n shadowOffsetY: 0,\n uppercase: false,\n wordHighlight: false,\n wordHighlightColor: '#3B82F6',\n wordHighlightTextColor: '#FFFFFF',\n },\n minimal: {\n preset: 'minimal',\n fontFamily: '\"Helvetica Neue\", Arial, sans-serif',\n fontSize: 36,\n fontWeight: '400',\n color: '#FFFFFF',\n strokeColor: 'transparent',\n strokeWidth: 0,\n backgroundColor: 'transparent',\n backgroundPadding: 0,\n backgroundRadius: 0,\n position: 'bottom',\n textAlign: 'center',\n lineHeight: 1.4,\n maxWidth: 0.8,\n shadow: true,\n shadowColor: 'rgba(0,0,0,0.8)',\n shadowBlur: 8,\n shadowOffsetX: 0,\n shadowOffsetY: 2,\n uppercase: false,\n wordHighlight: false,\n wordHighlightColor: '#FFFFFF',\n wordHighlightTextColor: '#000000',\n },\n bold: {\n preset: 'bold',\n fontFamily: '\"Arial Black\", \"Helvetica Neue\", Arial, sans-serif',\n fontSize: 56,\n fontWeight: '900',\n color: '#FFFF00',\n strokeColor: '#000000',\n strokeWidth: 5,\n backgroundColor: 'transparent',\n backgroundPadding: 0,\n backgroundRadius: 0,\n position: 'center',\n textAlign: 'center',\n lineHeight: 1.2,\n maxWidth: 0.88,\n shadow: true,\n shadowColor: 'rgba(0,0,0,1)',\n shadowBlur: 4,\n shadowOffsetX: 3,\n shadowOffsetY: 3,\n uppercase: true,\n wordHighlight: false,\n wordHighlightColor: '#FF0000',\n wordHighlightTextColor: '#FFFFFF',\n },\n};\n\nexport function mergeStyle(\n base: CaptionStyle,\n overrides?: Partial<CaptionStyle>\n): CaptionStyle {\n return overrides ? { ...base, ...overrides } : base;\n}\n\nexport function getActiveCaptions(\n segments: CaptionSegment[],\n currentTime: number\n): CaptionSegment[] {\n return segments.filter(\n (seg) => currentTime >= seg.startTime && currentTime < seg.endTime\n );\n}\n\nfunction wrapText(\n ctx: CanvasRenderingContext2D,\n text: string,\n maxWidth: number\n): string[] {\n const words = text.split(' ');\n const lines: string[] = [];\n let current = '';\n\n for (const word of words) {\n const test = current ? `${current} ${word}` : word;\n if (ctx.measureText(test).width > maxWidth && current) {\n lines.push(current);\n current = word;\n } else {\n current = test;\n }\n }\n if (current) lines.push(current);\n return lines;\n}\n\nexport function renderCaption(\n ctx: CanvasRenderingContext2D,\n segment: CaptionSegment,\n resolvedStyle: CaptionStyle,\n canvasWidth: number,\n canvasHeight: number\n): void {\n const style = resolvedStyle;\n const text = style.uppercase ? segment.text.toUpperCase() : segment.text;\n\n ctx.save();\n\n const scaledFontSize = (style.fontSize / 1080) * canvasHeight;\n ctx.font = `${style.fontWeight} ${scaledFontSize}px ${style.fontFamily}`;\n ctx.textAlign = style.textAlign;\n ctx.textBaseline = 'bottom';\n\n const maxPx = style.maxWidth * canvasWidth;\n const lines = wrapText(ctx, text, maxPx);\n const lineH = scaledFontSize * style.lineHeight;\n const totalH = lines.length * lineH;\n\n let baseY: number;\n if (style.position === 'top') {\n baseY = scaledFontSize * 1.5;\n } else if (style.position === 'center') {\n baseY = canvasHeight / 2 - totalH / 2 + lineH;\n } else {\n baseY = canvasHeight - scaledFontSize * 1.2;\n }\n\n const cx = canvasWidth / 2;\n\n lines.forEach((line, i) => {\n const y = baseY + i * lineH;\n\n // Background box\n if (style.backgroundColor && style.backgroundColor !== 'transparent') {\n const metrics = ctx.measureText(line);\n const bw = metrics.width + style.backgroundPadding * 2;\n const bh = lineH + style.backgroundPadding;\n const bx = cx - bw / 2;\n const by = y - lineH;\n\n ctx.fillStyle = style.backgroundColor;\n if (style.backgroundRadius > 0) {\n roundRect(ctx, bx, by, bw, bh, style.backgroundRadius);\n ctx.fill();\n } else {\n ctx.fillRect(bx, by, bw, bh);\n }\n }\n\n // Shadow\n if (style.shadow) {\n ctx.shadowColor = style.shadowColor;\n ctx.shadowBlur = style.shadowBlur;\n ctx.shadowOffsetX = style.shadowOffsetX;\n ctx.shadowOffsetY = style.shadowOffsetY;\n }\n\n // Stroke\n if (style.strokeWidth > 0 && style.strokeColor !== 'transparent') {\n ctx.lineWidth = style.strokeWidth;\n ctx.strokeStyle = style.strokeColor;\n ctx.strokeText(line, cx, y);\n }\n\n // Fill\n ctx.shadowColor = 'transparent';\n ctx.shadowBlur = 0;\n ctx.fillStyle = style.color;\n ctx.fillText(line, cx, y);\n });\n\n ctx.restore();\n}\n\nfunction roundRect(\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n w: number,\n h: number,\n r: number\n): void {\n ctx.beginPath();\n ctx.moveTo(x + r, y);\n ctx.lineTo(x + w - r, y);\n ctx.quadraticCurveTo(x + w, y, x + w, y + r);\n ctx.lineTo(x + w, y + h - r);\n ctx.quadraticCurveTo(x + w, y + h, x + w - r, y + h);\n ctx.lineTo(x + r, y + h);\n ctx.quadraticCurveTo(x, y + h, x, y + h - r);\n ctx.lineTo(x, y + r);\n ctx.quadraticCurveTo(x, y, x + r, y);\n ctx.closePath();\n}\n","export type {\n ClipInput,\n CaptionSegment,\n CaptionStyle,\n CaptionStylePreset,\n AspectRatio,\n CropOptions,\n CaptionOptions,\n RenderOptions,\n EncodeOptions,\n FrameData,\n RendererBackend,\n FrameWorkerConfig,\n FrameWorker,\n ClipStatus,\n ClipProgress,\n RichProgress,\n StitchOptions,\n ClipMetrics,\n RenderMetrics,\n Segment,\n SingleVideoRenderOptions,\n} from './types.js';\n\nexport { STYLE_PRESETS } from './captions.js';\nexport { FFmpegBackend, createFFmpegBackend } from './backends/ffmpeg.js';\nexport { render, renderToUrl } from './render.js';\n\nimport type { ClipInput, RenderOptions, StitchOptions, RenderMetrics, FrameWorkerConfig, FrameWorker, RendererBackend } from './types.js';\nimport { extractFrames } from './compositor.js';\nimport { stitchClips } from './stitch.js';\n\nexport function createFrameWorker(config: FrameWorkerConfig = {}): FrameWorker {\n const fps = config.fps ?? 30;\n const width = config.width ?? 1280;\n const height = config.height ?? 720;\n\n let _backend: RendererBackend | null = config.backend ?? null;\n\n async function getBackend(): Promise<RendererBackend> {\n if (!_backend) {\n const { createFFmpegBackend } = await import('./backends/ffmpeg.js');\n _backend = createFFmpegBackend();\n }\n await _backend.init();\n return _backend;\n }\n\n async function render(clip: ClipInput, options: RenderOptions = {}): Promise<Blob> {\n const mergedOpts: RenderOptions = { fps, width, height, ...options };\n const backend = await getBackend();\n\n const onProgress = mergedOpts.onProgress;\n const frames = await extractFrames(clip, {\n ...mergedOpts,\n onProgress: onProgress ? (p) => onProgress(p * 0.85) : undefined,\n });\n\n return backend.encode(frames, {\n width: mergedOpts.width ?? width,\n height: mergedOpts.height ?? height,\n fps: mergedOpts.fps ?? fps,\n mimeType: mergedOpts.mimeType ?? 'video/mp4',\n quality: mergedOpts.quality ?? 0.92,\n encoderOptions: mergedOpts.encoderOptions,\n onProgress: onProgress ? (p) => onProgress(0.85 + p * 0.15) : undefined,\n signal: mergedOpts.signal,\n });\n }\n\n async function renderToUrl(clip: ClipInput, options?: RenderOptions): Promise<string> {\n const blob = await render(clip, options);\n return URL.createObjectURL(blob);\n }\n\n async function stitch(clips: ClipInput[], options: StitchOptions = {}): Promise<{ blob: Blob; metrics: RenderMetrics }> {\n const mergedOpts: StitchOptions = { fps, width, height, ...options };\n const backend = await getBackend();\n return stitchClips(clips, backend, mergedOpts);\n }\n\n async function stitchToUrl(clips: ClipInput[], options?: StitchOptions): Promise<{ url: string; metrics: RenderMetrics }> {\n const { blob, metrics } = await stitch(clips, options);\n return { url: URL.createObjectURL(blob), metrics };\n }\n\n return { render, renderToUrl, stitch, stitchToUrl };\n}\n","import type { ClipInput, FrameData, RenderOptions } from './types.js';\nimport { STYLE_PRESETS, mergeStyle, getActiveCaptions, renderCaption } from './captions.js';\n\nconst ASPECT_RATIO_MAP: Record<string, [number, number]> = {\n '16:9': [16, 9],\n '9:16': [9, 16],\n '1:1': [1, 1],\n '4:3': [4, 3],\n '3:4': [3, 4],\n original: [0, 0],\n};\n\nfunction resolveOutputDimensions(\n clip: ClipInput,\n videoWidth: number,\n videoHeight: number,\n options: RenderOptions\n): [number, number] {\n const ar = clip.aspectRatio ?? 'original';\n const ratio = ASPECT_RATIO_MAP[ar] ?? [0, 0];\n\n if (ratio[0] === 0) {\n return [options.width ?? videoWidth, options.height ?? videoHeight];\n }\n\n const w = options.width ?? 1280;\n const h = Math.round(w * (ratio[1] / ratio[0]));\n return [w, h];\n}\n\nexport async function extractFrames(\n clip: ClipInput,\n options: RenderOptions\n): Promise<FrameData[]> {\n const fps = options.fps ?? 30;\n const onProgress = options.onProgress;\n const signal = options.signal;\n\n let srcUrl: string;\n let needsRevoke = false;\n\n if (typeof clip.source === 'string') {\n srcUrl = clip.source;\n } else if (clip.source instanceof HTMLVideoElement) {\n srcUrl = clip.source.src;\n } else {\n srcUrl = URL.createObjectURL(clip.source as Blob);\n needsRevoke = true;\n }\n\n const video = document.createElement('video');\n video.muted = true;\n video.crossOrigin = 'anonymous';\n video.preload = 'auto';\n\n await new Promise<void>((resolve, reject) => {\n video.onloadedmetadata = () => resolve();\n video.onerror = () => reject(new Error(`Failed to load video: ${srcUrl}`));\n video.src = srcUrl;\n });\n\n const duration = video.duration;\n const startTime = clip.startTime ?? 0;\n const endTime = clip.endTime ?? duration;\n const clipDuration = endTime - startTime;\n\n const [outW, outH] = resolveOutputDimensions(\n clip,\n video.videoWidth,\n video.videoHeight,\n options\n );\n\n const canvas = document.createElement('canvas');\n canvas.width = outW;\n canvas.height = outH;\n const ctx = canvas.getContext('2d', { willReadFrequently: true })!;\n\n const totalFrames = Math.ceil(clipDuration * fps);\n const frames: FrameData[] = [];\n\n const captionSegments = clip.captions?.segments ?? [];\n const baseStylePreset = clip.captions?.style?.preset ?? 'modern';\n const baseStyle = mergeStyle(\n STYLE_PRESETS[baseStylePreset],\n clip.captions?.style\n );\n\n for (let i = 0; i < totalFrames; i++) {\n if (signal?.aborted) throw new DOMException('Render cancelled', 'AbortError');\n\n const t = startTime + (i / fps);\n\n await seekVideo(video, t);\n ctx.clearRect(0, 0, outW, outH);\n\n drawVideoFrame(ctx, video, clip, outW, outH);\n\n if (captionSegments.length > 0) {\n const active = getActiveCaptions(captionSegments, t - startTime);\n for (const seg of active) {\n const segStyle = mergeStyle(baseStyle, seg.style);\n renderCaption(ctx, seg, segStyle, outW, outH);\n }\n }\n\n const imageData = ctx.getImageData(0, 0, outW, outH);\n frames.push({ imageData, timestamp: t - startTime, width: outW, height: outH });\n\n if (onProgress) onProgress(i / totalFrames);\n }\n\n if (needsRevoke) URL.revokeObjectURL(srcUrl);\n\n return frames;\n}\n\nfunction drawVideoFrame(\n ctx: CanvasRenderingContext2D,\n video: HTMLVideoElement,\n clip: ClipInput,\n outW: number,\n outH: number\n): void {\n const vw = video.videoWidth;\n const vh = video.videoHeight;\n\n if (clip.crop) {\n const { x, y, width, height } = clip.crop;\n ctx.drawImage(\n video,\n x * vw, y * vh, width * vw, height * vh,\n 0, 0, outW, outH\n );\n } else {\n const videoAR = vw / vh;\n const outAR = outW / outH;\n\n let sx = 0, sy = 0, sw = vw, sh = vh;\n if (videoAR > outAR) {\n sw = vh * outAR;\n sx = (vw - sw) / 2;\n } else if (videoAR < outAR) {\n sh = vw / outAR;\n sy = (vh - sh) / 2;\n }\n ctx.drawImage(video, sx, sy, sw, sh, 0, 0, outW, outH);\n }\n}\n\nfunction seekVideo(video: HTMLVideoElement, time: number): Promise<void> {\n return new Promise((resolve) => {\n if (Math.abs(video.currentTime - time) < 0.001) {\n resolve();\n return;\n }\n const onSeeked = () => {\n video.removeEventListener('seeked', onSeeked);\n resolve();\n };\n video.addEventListener('seeked', onSeeked);\n video.currentTime = time;\n });\n}\n","import type { ClipInput, FrameData } from '../types.js';\nimport type { WorkerInbound, WorkerOutbound, TransferableFrame } from './protocol.js';\n\nconst ASPECT_RATIO_MAP: Record<string, [number, number]> = {\n '16:9': [16, 9],\n '9:16': [9, 16],\n '1:1': [1, 1],\n '4:3': [4, 3],\n '3:4': [3, 4],\n original: [0, 0],\n};\n\nfunction resolveOutputDimensions(\n clip: ClipInput,\n videoWidth: number,\n videoHeight: number,\n width: number,\n height: number\n): [number, number] {\n const ar = clip.aspectRatio ?? 'original';\n const ratio = ASPECT_RATIO_MAP[ar] ?? [0, 0];\n if (ratio[0] === 0) return [width, height];\n const w = width;\n const h = Math.round(w * (ratio[1] / ratio[0]));\n return [w, h];\n}\n\nfunction seekVideo(video: HTMLVideoElement, time: number): Promise<void> {\n return new Promise((resolve) => {\n if (Math.abs(video.currentTime - time) < 0.001) { resolve(); return; }\n const onSeeked = () => { video.removeEventListener('seeked', onSeeked); resolve(); };\n video.addEventListener('seeked', onSeeked);\n video.currentTime = time;\n });\n}\n\nfunction drawVideoFrame(\n ctx: CanvasRenderingContext2D,\n video: HTMLVideoElement,\n clip: ClipInput,\n outW: number,\n outH: number\n): void {\n const vw = video.videoWidth;\n const vh = video.videoHeight;\n\n if (clip.crop) {\n const { x, y, width, height } = clip.crop;\n ctx.drawImage(video, x * vw, y * vh, width * vw, height * vh, 0, 0, outW, outH);\n } else {\n const videoAR = vw / vh;\n const outAR = outW / outH;\n let sx = 0, sy = 0, sw = vw, sh = vh;\n if (videoAR > outAR) {\n sw = vh * outAR;\n sx = (vw - sw) / 2;\n } else if (videoAR < outAR) {\n sh = vw / outAR;\n sy = (vh - sh) / 2;\n }\n ctx.drawImage(video, sx, sy, sw, sh, 0, 0, outW, outH);\n }\n}\n\nexport class WorkerPool {\n private readonly workers: Worker[] = [];\n private readonly available: Worker[] = [];\n private readonly waiters: Array<(w: Worker) => void> = [];\n\n constructor(maxConcurrency: number) {\n for (let i = 0; i < maxConcurrency; i++) {\n const w = new Worker(new URL('./render-worker.js', import.meta.url), { type: 'module' });\n this.workers.push(w);\n this.available.push(w);\n }\n }\n\n private acquire(): Promise<Worker> {\n if (this.available.length > 0) return Promise.resolve(this.available.pop()!);\n return new Promise(resolve => this.waiters.push(resolve));\n }\n\n private release(worker: Worker): void {\n if (this.waiters.length > 0) {\n this.waiters.shift()!(worker);\n } else {\n this.available.push(worker);\n }\n }\n\n async dispatch(\n clip: ClipInput,\n width: number,\n height: number,\n fps: number,\n signal?: AbortSignal,\n onProgress?: (p: number) => void\n ): Promise<FrameData[]> {\n const worker = await this.acquire();\n try {\n return await this.processClip(worker, clip, width, height, fps, signal, onProgress);\n } finally {\n this.release(worker);\n }\n }\n\n private async processClip(\n worker: Worker,\n clip: ClipInput,\n width: number,\n height: number,\n fps: number,\n signal?: AbortSignal,\n onProgress?: (p: number) => void\n ): Promise<FrameData[]> {\n let srcUrl: string;\n let needsRevoke = false;\n\n if (typeof clip.source === 'string') {\n srcUrl = clip.source;\n } else if (clip.source instanceof HTMLVideoElement) {\n srcUrl = clip.source.src;\n } else {\n srcUrl = URL.createObjectURL(clip.source as Blob);\n needsRevoke = true;\n }\n\n const video = document.createElement('video');\n video.muted = true;\n video.crossOrigin = 'anonymous';\n video.preload = 'auto';\n\n await new Promise<void>((resolve, reject) => {\n video.onloadedmetadata = () => resolve();\n video.onerror = () => reject(new Error(`Failed to load video: ${srcUrl}`));\n video.src = srcUrl;\n });\n\n const duration = video.duration;\n const startTime = clip.startTime ?? 0;\n const endTime = clip.endTime ?? duration;\n const clipDuration = endTime - startTime;\n const [outW, outH] = resolveOutputDimensions(clip, video.videoWidth, video.videoHeight, width, height);\n const totalFrames = Math.ceil(clipDuration * fps);\n\n // Temp canvas applies crop/aspect-ratio before handing bitmap to worker\n const canvas = document.createElement('canvas');\n canvas.width = outW;\n canvas.height = outH;\n const ctx = canvas.getContext('2d')!;\n\n // Wire up worker message handler before sending init\n const resultPromise = new Promise<TransferableFrame[]>((resolve, reject) => {\n const onMessage = (e: MessageEvent<WorkerOutbound>) => {\n const msg = e.data;\n if (msg.type === 'done') {\n worker.removeEventListener('message', onMessage);\n resolve(msg.frames);\n } else if (msg.type === 'error') {\n worker.removeEventListener('message', onMessage);\n reject(new Error(msg.message));\n } else if (msg.type === 'progress') {\n onProgress?.(msg.value);\n }\n };\n worker.addEventListener('message', onMessage);\n });\n\n const initMsg: WorkerInbound = {\n type: 'init',\n meta: { width: outW, height: outH, fps, captions: clip.captions, totalFrames },\n };\n worker.postMessage(initMsg);\n\n try {\n for (let i = 0; i < totalFrames; i++) {\n if (signal?.aborted) {\n worker.postMessage({ type: 'abort' } satisfies WorkerInbound);\n throw new DOMException('Render cancelled', 'AbortError');\n }\n\n const t = startTime + (i / fps);\n await seekVideo(video, t);\n ctx.clearRect(0, 0, outW, outH);\n drawVideoFrame(ctx, video, clip, outW, outH);\n\n const bitmap = await createImageBitmap(canvas);\n const frameMsg: WorkerInbound = { type: 'frame', bitmap, timestamp: t - startTime, index: i };\n worker.postMessage(frameMsg, [bitmap]);\n }\n\n worker.postMessage({ type: 'end' } satisfies WorkerInbound);\n const transferableFrames = await resultPromise;\n\n return transferableFrames.map(f => ({\n imageData: new ImageData(new Uint8ClampedArray(f.buffer), f.width, f.height),\n timestamp: f.timestamp,\n width: f.width,\n height: f.height,\n }));\n } finally {\n if (needsRevoke) URL.revokeObjectURL(srcUrl);\n }\n }\n\n terminate(): void {\n for (const w of this.workers) w.terminate();\n this.workers.length = 0;\n this.available.length = 0;\n }\n}\n","import type { ClipInput, RendererBackend, FrameData, ClipProgress, StitchOptions, ClipMetrics, RenderMetrics } from './types.js';\nimport { extractFrames } from './compositor.js';\nimport { WorkerPool } from './worker/pool.js';\n\nfunction supportsOffscreenWorkers(): boolean {\n return (\n typeof Worker !== 'undefined' &&\n typeof OffscreenCanvas !== 'undefined' &&\n typeof createImageBitmap !== 'undefined'\n );\n}\n\nexport async function stitchClips(\n clips: ClipInput[],\n backend: RendererBackend,\n options: StitchOptions\n): Promise<{ blob: Blob; metrics: RenderMetrics }> {\n if (supportsOffscreenWorkers() && clips.length > 1) {\n return stitchParallel(clips, backend, options);\n }\n return stitchSequential(clips, backend, options);\n}\n\n// ── Sequential fallback (older browsers / single clip) ────────────────────────\n\nasync function stitchSequential(\n clips: ClipInput[],\n backend: RendererBackend,\n options: StitchOptions\n): Promise<{ blob: Blob; metrics: RenderMetrics }> {\n const fps = options.fps ?? 30;\n const width = options.width ?? 1280;\n const height = options.height ?? 720;\n const { onProgress, onComplete, signal } = options;\n\n const stitchStart = performance.now();\n\n const clipStatuses: ClipProgress[] = clips.map((_, i) => ({\n index: i, status: 'pending', progress: 0,\n }));\n const clipMetrics: ClipMetrics[] = [];\n\n const emit = (overall: number) => {\n onProgress?.({ overall, clips: clipStatuses.slice() });\n };\n\n const blobs: Blob[] = [];\n\n for (let ci = 0; ci < clips.length; ci++) {\n clipStatuses[ci].status = 'rendering';\n emit(ci / clips.length);\n\n const extractStart = performance.now();\n const frames = await extractFrames(clips[ci], {\n fps, width, height,\n mimeType: options.mimeType,\n quality: options.quality,\n encoderOptions: options.encoderOptions,\n signal,\n onProgress: (p) => {\n clipStatuses[ci].progress = p * 0.9;\n emit((ci + p * 0.9) / clips.length);\n },\n });\n const extractionMs = performance.now() - extractStart;\n\n clipStatuses[ci].status = 'encoding';\n const encodeStart = performance.now();\n const blob = await backend.encode(frames, {\n width, height, fps,\n mimeType: options.mimeType ?? 'video/mp4',\n quality: options.quality ?? 0.92,\n encoderOptions: options.encoderOptions,\n signal,\n onProgress: (p) => {\n clipStatuses[ci].progress = 0.9 + p * 0.1;\n emit((ci + 0.9 + p * 0.1) / clips.length);\n },\n });\n const encodingMs = performance.now() - encodeStart;\n\n clipStatuses[ci].status = 'done';\n clipStatuses[ci].progress = 1;\n clipMetrics.push({\n clipId: String(ci),\n extractionMs,\n encodingMs,\n totalMs: extractionMs + encodingMs,\n framesExtracted: frames.length,\n });\n blobs.push(blob);\n }\n\n let finalBlob: Blob;\n let stitchMs = 0;\n\n if (blobs.length === 1) {\n emit(1);\n finalBlob = blobs[0];\n } else {\n const stitchPhaseStart = performance.now();\n finalBlob = await backend.concat(blobs, {\n width, height, fps,\n mimeType: options.mimeType ?? 'video/mp4',\n quality: options.quality ?? 0.92,\n signal,\n onProgress: (p) => emit((clips.length - 1 + p) / clips.length),\n });\n stitchMs = performance.now() - stitchPhaseStart;\n }\n\n const totalMs = performance.now() - stitchStart;\n const totalFrames = clipMetrics.reduce((s, c) => s + c.framesExtracted, 0);\n const metrics: RenderMetrics = {\n totalMs,\n extractionMs: clipMetrics.reduce((s, c) => s + c.extractionMs, 0),\n encodingMs: clipMetrics.reduce((s, c) => s + c.encodingMs, 0),\n stitchMs,\n clips: clipMetrics,\n framesPerSecond: totalFrames / (totalMs / 1000),\n };\n\n onComplete?.(metrics);\n return { blob: finalBlob, metrics };\n}\n\n// ── Parallel path (OffscreenCanvas + WorkerPool) ──────────────────────────────\n\nasync function stitchParallel(\n clips: ClipInput[],\n backend: RendererBackend,\n options: StitchOptions\n): Promise<{ blob: Blob; metrics: RenderMetrics }> {\n const fps = options.fps ?? 30;\n const width = options.width ?? 1280;\n const height = options.height ?? 720;\n const { onProgress, onComplete, signal } = options;\n\n const stitchStart = performance.now();\n\n const concurrency = Math.min(\n clips.length,\n (typeof navigator !== 'undefined' ? navigator.hardwareConcurrency || 2 : 2),\n 4\n );\n\n const clipStatuses: ClipProgress[] = clips.map((_, i) => ({\n index: i, status: 'pending', progress: 0,\n }));\n const clipMetrics: Array<ClipMetrics> = new Array(clips.length);\n\n const emit = () => {\n const overall = clipStatuses.reduce((sum, c) => sum + c.progress, 0) / clips.length;\n onProgress?.({ overall, clips: clipStatuses.slice() });\n };\n\n const pool = new WorkerPool(concurrency);\n const blobs: Blob[] = new Array(clips.length);\n let encodeChain = Promise.resolve();\n\n try {\n await Promise.all(\n clips.map(async (clip, ci) => {\n clipStatuses[ci].status = 'rendering';\n emit();\n\n const extractStart = performance.now();\n const frames: FrameData[] = await pool.dispatch(\n clip, width, height, fps, signal,\n (p) => {\n clipStatuses[ci].progress = p * 0.85;\n emit();\n }\n );\n const extractionMs = performance.now() - extractStart;\n\n clipStatuses[ci].status = 'encoding';\n clipStatuses[ci].progress = 0.85;\n emit();\n\n await new Promise<void>((resolve, reject) => {\n encodeChain = encodeChain.then(async () => {\n const encodeStart = performance.now();\n try {\n blobs[ci] = await backend.encode(frames, {\n width, height, fps,\n mimeType: options.mimeType ?? 'video/mp4',\n quality: options.quality ?? 0.92,\n encoderOptions: options.encoderOptions,\n signal,\n onProgress: (p) => {\n clipStatuses[ci].progress = 0.85 + p * 0.15;\n emit();\n },\n });\n const encodingMs = performance.now() - encodeStart;\n clipMetrics[ci] = {\n clipId: String(ci),\n extractionMs,\n encodingMs,\n totalMs: extractionMs + encodingMs,\n framesExtracted: frames.length,\n };\n clipStatuses[ci].status = 'done';\n clipStatuses[ci].progress = 1;\n emit();\n resolve();\n } catch (err) {\n clipStatuses[ci].status = 'error';\n reject(err);\n throw err;\n }\n });\n });\n })\n );\n\n let finalBlob: Blob;\n let stitchMs = 0;\n\n if (blobs.length === 1) {\n onProgress?.({ overall: 1, clips: clipStatuses.slice() });\n finalBlob = blobs[0];\n } else {\n const stitchPhaseStart = performance.now();\n finalBlob = await backend.concat(blobs, {\n width, height, fps,\n mimeType: options.mimeType ?? 'video/mp4',\n quality: options.quality ?? 0.92,\n signal,\n });\n stitchMs = performance.now() - stitchPhaseStart;\n }\n\n const totalMs = performance.now() - stitchStart;\n const totalFrames = clipMetrics.reduce((s, c) => s + c.framesExtracted, 0);\n const metrics: RenderMetrics = {\n totalMs,\n extractionMs: clipMetrics.reduce((s, c) => s + c.extractionMs, 0),\n encodingMs: clipMetrics.reduce((s, c) => s + c.encodingMs, 0),\n stitchMs,\n clips: clipMetrics,\n framesPerSecond: totalFrames / (totalMs / 1000),\n };\n\n onComplete?.(metrics);\n return { blob: finalBlob, metrics };\n } finally {\n pool.terminate();\n }\n}\n","import type { Segment, SingleVideoRenderOptions, RenderMetrics, ClipInput } from './types.js';\nimport { stitchClips } from './stitch.js';\nimport { createFFmpegBackend } from './backends/ffmpeg.js';\n\nfunction segmentsToClips(videoUrl: string, segments: Segment[]): ClipInput[] {\n return segments.map((seg) => ({\n source: videoUrl,\n startTime: seg.start,\n endTime: seg.end,\n captions: seg.captions?.length ? { segments: seg.captions } : undefined,\n }));\n}\n\nexport async function render(\n videoUrl: string,\n segments: Segment[],\n options?: SingleVideoRenderOptions\n): Promise<{ blob: Blob; metrics: RenderMetrics }> {\n const clips = segmentsToClips(videoUrl, segments);\n const backend = createFFmpegBackend();\n await backend.init();\n return stitchClips(clips, backend, options ?? {});\n}\n\nexport async function renderToUrl(\n videoUrl: string,\n segments: Segment[],\n options?: SingleVideoRenderOptions\n): Promise<{ url: string; metrics: RenderMetrics }> {\n const { blob, metrics } = await render(videoUrl, segments, options);\n return { url: URL.createObjectURL(blob), metrics };\n}\n"]}
1
+ {"version":3,"sources":["../src/backends/ffmpeg.ts","../src/captions.ts","../src/index.ts","../src/compositor.ts","../src/worker/pool.ts","../src/stitch.ts","../src/render.ts"],"names":["FFmpegBackend","data","ASPECT_RATIO_MAP","resolveOutputDimensions","seekVideo","drawVideoFrame","createFFmpegBackend","render","renderToUrl"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { RendererBackend, FrameData, EncodeOptions } from '../types.js';\n\nexport class FFmpegBackend implements RendererBackend {\n readonly name = 'ffmpeg.wasm';\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private ffmpeg: any = null;\n private initialized = false;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private _fetchFile: any = null;\n\n async init(): Promise<void> {\n if (this.initialized) return;\n\n const { FFmpeg } = await import('@ffmpeg/ffmpeg').catch(() => {\n throw new Error(\n '[FrameWorker] @ffmpeg/ffmpeg is required. Install it: npm install @ffmpeg/ffmpeg @ffmpeg/util'\n );\n });\n const { fetchFile, toBlobURL } = await import('@ffmpeg/util');\n\n const ffmpeg = new FFmpeg();\n\n const baseURL = 'https://unpkg.com/@ffmpeg/core@0.12.6/dist/esm';\n await ffmpeg.load({\n coreURL: await toBlobURL(`${baseURL}/ffmpeg-core.js`, 'text/javascript'),\n wasmURL: await toBlobURL(`${baseURL}/ffmpeg-core.wasm`, 'application/wasm'),\n });\n\n this._fetchFile = fetchFile;\n this.ffmpeg = ffmpeg;\n this.initialized = true;\n }\n\n async encode(frames: FrameData[], options: EncodeOptions): Promise<Blob> {\n await this.init();\n const { ffmpeg, _fetchFile: fetchFile } = this;\n const { fps, width, height, onProgress, signal } = options;\n\n const total = frames.length;\n for (let i = 0; i < total; i++) {\n if (signal?.aborted) throw new DOMException('Render cancelled', 'AbortError');\n\n const frame = frames[i];\n const offscreen = new OffscreenCanvas(width, height);\n const ctx = offscreen.getContext('2d')!;\n ctx.putImageData(frame.imageData, 0, 0);\n const blob = await offscreen.convertToBlob({ type: 'image/png' });\n const data = await fetchFile(blob);\n await ffmpeg.writeFile(`frame${String(i).padStart(6, '0')}.png`, data);\n\n onProgress?.(i / total * 0.8);\n }\n\n await ffmpeg.exec([\n '-framerate', String(fps),\n '-i', 'frame%06d.png',\n '-c:v', 'libx264',\n '-pix_fmt', 'yuv420p',\n '-preset', 'fast',\n '-crf', '23',\n '-movflags', '+faststart',\n 'output.mp4',\n ]);\n\n onProgress?.(0.95);\n\n const data = await ffmpeg.readFile('output.mp4') as Uint8Array;\n\n for (let i = 0; i < total; i++) {\n await ffmpeg.deleteFile(`frame${String(i).padStart(6, '0')}.png`).catch(() => {});\n }\n await ffmpeg.deleteFile('output.mp4').catch(() => {});\n\n onProgress?.(1);\n\n return new Blob([data.slice().buffer], { type: 'video/mp4' });\n }\n\n async concat(blobs: Blob[], options: EncodeOptions): Promise<Blob> {\n await this.init();\n const { ffmpeg, _fetchFile: fetchFile } = this;\n const { onProgress } = options;\n\n const listLines: string[] = [];\n for (let i = 0; i < blobs.length; i++) {\n const name = `clip${i}.mp4`;\n const data = await fetchFile(blobs[i]);\n await ffmpeg.writeFile(name, data);\n listLines.push(`file '${name}'`);\n onProgress?.(i / blobs.length * 0.6);\n }\n\n const encoder = new TextEncoder();\n await ffmpeg.writeFile('concat.txt', encoder.encode(listLines.join('\\n')));\n\n await ffmpeg.exec([\n '-f', 'concat',\n '-safe', '0',\n '-i', 'concat.txt',\n '-c', 'copy',\n 'stitched.mp4',\n ]);\n\n onProgress?.(0.9);\n\n const out = await ffmpeg.readFile('stitched.mp4') as Uint8Array;\n\n for (let i = 0; i < blobs.length; i++) {\n await ffmpeg.deleteFile(`clip${i}.mp4`).catch(() => {});\n }\n await ffmpeg.deleteFile('concat.txt').catch(() => {});\n await ffmpeg.deleteFile('stitched.mp4').catch(() => {});\n\n onProgress?.(1);\n\n return new Blob([out.slice().buffer], { type: 'video/mp4' });\n }\n\n async destroy(): Promise<void> {\n if (this.ffmpeg) {\n await this.ffmpeg.terminate?.();\n this.ffmpeg = null;\n this.initialized = false;\n }\n }\n}\n\nexport function createFFmpegBackend(): FFmpegBackend {\n return new FFmpegBackend();\n}\n","import type { CaptionSegment, CaptionStyle, CaptionStylePreset } from './types.js';\n\nexport const STYLE_PRESETS: Record<CaptionStylePreset, CaptionStyle> = {\n hormozi: {\n preset: 'hormozi',\n fontFamily: 'Impact, \"Arial Black\", sans-serif',\n fontSize: 64,\n fontWeight: '900',\n color: '#FFFFFF',\n strokeColor: '#000000',\n strokeWidth: 4,\n backgroundColor: 'transparent',\n backgroundPadding: 0,\n backgroundRadius: 0,\n position: 'bottom',\n textAlign: 'center',\n lineHeight: 1.1,\n maxWidth: 0.9,\n shadow: true,\n shadowColor: 'rgba(0,0,0,0.9)',\n shadowBlur: 6,\n shadowOffsetX: 2,\n shadowOffsetY: 2,\n uppercase: true,\n wordHighlight: true,\n wordHighlightColor: '#FFD700',\n wordHighlightTextColor: '#000000',\n },\n modern: {\n preset: 'modern',\n fontFamily: '\"Inter\", \"Helvetica Neue\", Arial, sans-serif',\n fontSize: 42,\n fontWeight: '700',\n color: '#FFFFFF',\n strokeColor: 'transparent',\n strokeWidth: 0,\n backgroundColor: 'rgba(0,0,0,0.65)',\n backgroundPadding: 12,\n backgroundRadius: 8,\n position: 'bottom',\n textAlign: 'center',\n lineHeight: 1.3,\n maxWidth: 0.85,\n shadow: false,\n shadowColor: 'transparent',\n shadowBlur: 0,\n shadowOffsetX: 0,\n shadowOffsetY: 0,\n uppercase: false,\n wordHighlight: false,\n wordHighlightColor: '#3B82F6',\n wordHighlightTextColor: '#FFFFFF',\n },\n minimal: {\n preset: 'minimal',\n fontFamily: '\"Helvetica Neue\", Arial, sans-serif',\n fontSize: 36,\n fontWeight: '400',\n color: '#FFFFFF',\n strokeColor: 'transparent',\n strokeWidth: 0,\n backgroundColor: 'transparent',\n backgroundPadding: 0,\n backgroundRadius: 0,\n position: 'bottom',\n textAlign: 'center',\n lineHeight: 1.4,\n maxWidth: 0.8,\n shadow: true,\n shadowColor: 'rgba(0,0,0,0.8)',\n shadowBlur: 8,\n shadowOffsetX: 0,\n shadowOffsetY: 2,\n uppercase: false,\n wordHighlight: false,\n wordHighlightColor: '#FFFFFF',\n wordHighlightTextColor: '#000000',\n },\n bold: {\n preset: 'bold',\n fontFamily: '\"Arial Black\", \"Helvetica Neue\", Arial, sans-serif',\n fontSize: 56,\n fontWeight: '900',\n color: '#FFFF00',\n strokeColor: '#000000',\n strokeWidth: 5,\n backgroundColor: 'transparent',\n backgroundPadding: 0,\n backgroundRadius: 0,\n position: 'center',\n textAlign: 'center',\n lineHeight: 1.2,\n maxWidth: 0.88,\n shadow: true,\n shadowColor: 'rgba(0,0,0,1)',\n shadowBlur: 4,\n shadowOffsetX: 3,\n shadowOffsetY: 3,\n uppercase: true,\n wordHighlight: false,\n wordHighlightColor: '#FF0000',\n wordHighlightTextColor: '#FFFFFF',\n },\n};\n\nexport function mergeStyle(\n base: CaptionStyle,\n overrides?: Partial<CaptionStyle>\n): CaptionStyle {\n return overrides ? { ...base, ...overrides } : base;\n}\n\nexport function getActiveCaptions(\n segments: CaptionSegment[],\n currentTime: number\n): CaptionSegment[] {\n return segments.filter(\n (seg) => currentTime >= seg.startTime && currentTime < seg.endTime\n );\n}\n\nfunction wrapText(\n ctx: CanvasRenderingContext2D,\n text: string,\n maxWidth: number\n): string[] {\n const words = text.split(' ');\n const lines: string[] = [];\n let current = '';\n\n for (const word of words) {\n const test = current ? `${current} ${word}` : word;\n if (ctx.measureText(test).width > maxWidth && current) {\n lines.push(current);\n current = word;\n } else {\n current = test;\n }\n }\n if (current) lines.push(current);\n return lines;\n}\n\nexport function renderCaption(\n ctx: CanvasRenderingContext2D,\n segment: CaptionSegment,\n resolvedStyle: CaptionStyle,\n canvasWidth: number,\n canvasHeight: number\n): void {\n const style = resolvedStyle;\n const text = style.uppercase ? segment.text.toUpperCase() : segment.text;\n\n ctx.save();\n\n const scaledFontSize = (style.fontSize / 1080) * canvasHeight;\n ctx.font = `${style.fontWeight} ${scaledFontSize}px ${style.fontFamily}`;\n ctx.textAlign = style.textAlign;\n ctx.textBaseline = 'bottom';\n\n const maxPx = style.maxWidth * canvasWidth;\n const lines = wrapText(ctx, text, maxPx);\n const lineH = scaledFontSize * style.lineHeight;\n const totalH = lines.length * lineH;\n\n let baseY: number;\n if (style.position === 'top') {\n baseY = scaledFontSize * 1.5;\n } else if (style.position === 'center') {\n baseY = canvasHeight / 2 - totalH / 2 + lineH;\n } else {\n baseY = canvasHeight - scaledFontSize * 1.2;\n }\n\n const cx = canvasWidth / 2;\n\n lines.forEach((line, i) => {\n const y = baseY + i * lineH;\n\n // Background box\n if (style.backgroundColor && style.backgroundColor !== 'transparent') {\n const metrics = ctx.measureText(line);\n const bw = metrics.width + style.backgroundPadding * 2;\n const bh = lineH + style.backgroundPadding;\n const bx = cx - bw / 2;\n const by = y - lineH;\n\n ctx.fillStyle = style.backgroundColor;\n if (style.backgroundRadius > 0) {\n roundRect(ctx, bx, by, bw, bh, style.backgroundRadius);\n ctx.fill();\n } else {\n ctx.fillRect(bx, by, bw, bh);\n }\n }\n\n // Shadow\n if (style.shadow) {\n ctx.shadowColor = style.shadowColor;\n ctx.shadowBlur = style.shadowBlur;\n ctx.shadowOffsetX = style.shadowOffsetX;\n ctx.shadowOffsetY = style.shadowOffsetY;\n }\n\n // Stroke\n if (style.strokeWidth > 0 && style.strokeColor !== 'transparent') {\n ctx.lineWidth = style.strokeWidth;\n ctx.strokeStyle = style.strokeColor;\n ctx.strokeText(line, cx, y);\n }\n\n // Fill\n ctx.shadowColor = 'transparent';\n ctx.shadowBlur = 0;\n ctx.fillStyle = style.color;\n ctx.fillText(line, cx, y);\n });\n\n ctx.restore();\n}\n\nfunction roundRect(\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n w: number,\n h: number,\n r: number\n): void {\n ctx.beginPath();\n ctx.moveTo(x + r, y);\n ctx.lineTo(x + w - r, y);\n ctx.quadraticCurveTo(x + w, y, x + w, y + r);\n ctx.lineTo(x + w, y + h - r);\n ctx.quadraticCurveTo(x + w, y + h, x + w - r, y + h);\n ctx.lineTo(x + r, y + h);\n ctx.quadraticCurveTo(x, y + h, x, y + h - r);\n ctx.lineTo(x, y + r);\n ctx.quadraticCurveTo(x, y, x + r, y);\n ctx.closePath();\n}\n","// ── Type exports ─────────────────────────────────────────────────────────────\n\nexport type {\n // Core\n ClipSource,\n CaptionSegment,\n CaptionStyle,\n CaptionStylePreset,\n AspectRatio,\n CropOptions,\n CaptionOptions,\n RenderOptions,\n EncodeOptions,\n FrameData,\n RendererBackend,\n FrameWorkerConfig,\n FrameWorker,\n // Progress & metrics\n ClipStatus,\n ClipProgress,\n RichProgress,\n ClipMetrics,\n RenderMetrics,\n // v0.2 API options\n MergeOptions,\n ExportOptions,\n Segment,\n // Deprecated aliases (kept for soft migration)\n ClipInput,\n StitchOptions,\n SingleVideoRenderOptions,\n} from './types.js';\n\n// ── Value exports ─────────────────────────────────────────────────────────────\n\nexport { STYLE_PRESETS } from './captions.js';\nexport { FFmpegBackend, createFFmpegBackend } from './backends/ffmpeg.js';\n\n// v0.2 top-level API\nexport { exportClips, exportClipsToUrl } from './render.js';\n\n// Deprecated aliases (soft migration — will be removed in v0.3)\n/** @deprecated Use exportClips() */\nexport { render } from './render.js';\n/** @deprecated Use exportClipsToUrl() */\nexport { renderToUrl } from './render.js';\n\n// ── createFrameWorker ─────────────────────────────────────────────────────────\n\nimport type { ClipSource, RenderOptions, MergeOptions, RenderMetrics, FrameWorkerConfig, FrameWorker, RendererBackend } from './types.js';\nimport { extractFrames } from './compositor.js';\nimport { stitchClips } from './stitch.js';\n\nexport function createFrameWorker(config: FrameWorkerConfig = {}): FrameWorker {\n const fps = config.fps ?? 30;\n const width = config.width ?? 1280;\n const height = config.height ?? 720;\n\n let _backend: RendererBackend | null = config.backend ?? null;\n\n async function getBackend(): Promise<RendererBackend> {\n if (!_backend) {\n const { createFFmpegBackend } = await import('./backends/ffmpeg.js');\n _backend = createFFmpegBackend();\n }\n await _backend.init();\n return _backend;\n }\n\n async function render(clip: ClipSource, options: RenderOptions = {}): Promise<Blob> {\n const mergedOpts: RenderOptions = { fps, width, height, ...options };\n const backend = await getBackend();\n\n const onProgress = mergedOpts.onProgress;\n const frames = await extractFrames(clip, {\n ...mergedOpts,\n onProgress: onProgress ? (p) => onProgress(p * 0.85) : undefined,\n });\n\n return backend.encode(frames, {\n width: mergedOpts.width ?? width,\n height: mergedOpts.height ?? height,\n fps: mergedOpts.fps ?? fps,\n mimeType: mergedOpts.mimeType ?? 'video/mp4',\n quality: mergedOpts.quality ?? 0.92,\n encoderOptions: mergedOpts.encoderOptions,\n onProgress: onProgress ? (p) => onProgress(0.85 + p * 0.15) : undefined,\n signal: mergedOpts.signal,\n });\n }\n\n async function renderToUrl(clip: ClipSource, options?: RenderOptions): Promise<string> {\n const blob = await render(clip, options);\n return URL.createObjectURL(blob);\n }\n\n async function mergeClips(clips: ClipSource[], options: MergeOptions = {}): Promise<{ blob: Blob; metrics: RenderMetrics }> {\n const mergedOpts: MergeOptions = { fps, width, height, ...options };\n const backend = await getBackend();\n return stitchClips(clips, backend, mergedOpts);\n }\n\n async function mergeClipsToUrl(clips: ClipSource[], options?: MergeOptions): Promise<{ url: string; metrics: RenderMetrics }> {\n const { blob, metrics } = await mergeClips(clips, options);\n return { url: URL.createObjectURL(blob), metrics };\n }\n\n return {\n render,\n renderToUrl,\n mergeClips,\n mergeClipsToUrl,\n /** @deprecated Use mergeClips() */\n stitch: mergeClips,\n /** @deprecated Use mergeClipsToUrl() */\n stitchToUrl: mergeClipsToUrl,\n };\n}\n","import type { ClipSource, FrameData, RenderOptions } from './types.js';\nimport { STYLE_PRESETS, mergeStyle, getActiveCaptions, renderCaption } from './captions.js';\n\nconst ASPECT_RATIO_MAP: Record<string, [number, number]> = {\n '16:9': [16, 9],\n '9:16': [9, 16],\n '1:1': [1, 1],\n '4:3': [4, 3],\n '3:4': [3, 4],\n original: [0, 0],\n};\n\nfunction resolveOutputDimensions(\n clip: ClipSource,\n videoWidth: number,\n videoHeight: number,\n options: RenderOptions\n): [number, number] {\n const ar = clip.aspectRatio ?? 'original';\n const ratio = ASPECT_RATIO_MAP[ar] ?? [0, 0];\n\n if (ratio[0] === 0) {\n return [options.width ?? videoWidth, options.height ?? videoHeight];\n }\n\n const w = options.width ?? 1280;\n const h = Math.round(w * (ratio[1] / ratio[0]));\n return [w, h];\n}\n\nexport async function extractFrames(\n clip: ClipSource,\n options: RenderOptions\n): Promise<FrameData[]> {\n const fps = options.fps ?? 30;\n const onProgress = options.onProgress;\n const signal = options.signal;\n\n let srcUrl: string;\n let needsRevoke = false;\n\n if (typeof clip.source === 'string') {\n srcUrl = clip.source;\n } else if (clip.source instanceof HTMLVideoElement) {\n srcUrl = clip.source.src;\n } else {\n srcUrl = URL.createObjectURL(clip.source as Blob);\n needsRevoke = true;\n }\n\n const video = document.createElement('video');\n video.muted = true;\n video.crossOrigin = 'anonymous';\n video.preload = 'auto';\n\n await new Promise<void>((resolve, reject) => {\n video.onloadedmetadata = () => resolve();\n video.onerror = () => reject(new Error(`Failed to load video: ${srcUrl}`));\n video.src = srcUrl;\n });\n\n const duration = video.duration;\n const startTime = clip.startTime ?? 0;\n const endTime = clip.endTime ?? duration;\n const clipDuration = endTime - startTime;\n\n const [outW, outH] = resolveOutputDimensions(\n clip,\n video.videoWidth,\n video.videoHeight,\n options\n );\n\n const canvas = document.createElement('canvas');\n canvas.width = outW;\n canvas.height = outH;\n const ctx = canvas.getContext('2d', { willReadFrequently: true })!;\n\n const totalFrames = Math.ceil(clipDuration * fps);\n const frames: FrameData[] = [];\n\n const captionSegments = clip.captions?.segments ?? [];\n const baseStylePreset = clip.captions?.style?.preset ?? 'modern';\n const baseStyle = mergeStyle(\n STYLE_PRESETS[baseStylePreset],\n clip.captions?.style\n );\n\n for (let i = 0; i < totalFrames; i++) {\n if (signal?.aborted) throw new DOMException('Render cancelled', 'AbortError');\n\n const t = startTime + (i / fps);\n\n await seekVideo(video, t);\n ctx.clearRect(0, 0, outW, outH);\n\n drawVideoFrame(ctx, video, clip, outW, outH);\n\n if (captionSegments.length > 0) {\n const active = getActiveCaptions(captionSegments, t - startTime);\n for (const seg of active) {\n const segStyle = mergeStyle(baseStyle, seg.style);\n renderCaption(ctx, seg, segStyle, outW, outH);\n }\n }\n\n const imageData = ctx.getImageData(0, 0, outW, outH);\n frames.push({ imageData, timestamp: t - startTime, width: outW, height: outH });\n\n if (onProgress) onProgress(i / totalFrames);\n }\n\n if (needsRevoke) URL.revokeObjectURL(srcUrl);\n\n return frames;\n}\n\nfunction drawVideoFrame(\n ctx: CanvasRenderingContext2D,\n video: HTMLVideoElement,\n clip: ClipSource,\n outW: number,\n outH: number\n): void {\n const vw = video.videoWidth;\n const vh = video.videoHeight;\n\n if (clip.crop) {\n const { x, y, width, height } = clip.crop;\n ctx.drawImage(\n video,\n x * vw, y * vh, width * vw, height * vh,\n 0, 0, outW, outH\n );\n } else {\n const videoAR = vw / vh;\n const outAR = outW / outH;\n\n let sx = 0, sy = 0, sw = vw, sh = vh;\n if (videoAR > outAR) {\n sw = vh * outAR;\n sx = (vw - sw) / 2;\n } else if (videoAR < outAR) {\n sh = vw / outAR;\n sy = (vh - sh) / 2;\n }\n ctx.drawImage(video, sx, sy, sw, sh, 0, 0, outW, outH);\n }\n}\n\nfunction seekVideo(video: HTMLVideoElement, time: number): Promise<void> {\n return new Promise((resolve) => {\n if (Math.abs(video.currentTime - time) < 0.001) {\n resolve();\n return;\n }\n const onSeeked = () => {\n video.removeEventListener('seeked', onSeeked);\n resolve();\n };\n video.addEventListener('seeked', onSeeked);\n video.currentTime = time;\n });\n}\n","import type { ClipSource, FrameData } from '../types.js';\nimport type { WorkerInbound, WorkerOutbound, TransferableFrame } from './protocol.js';\n\nconst ASPECT_RATIO_MAP: Record<string, [number, number]> = {\n '16:9': [16, 9],\n '9:16': [9, 16],\n '1:1': [1, 1],\n '4:3': [4, 3],\n '3:4': [3, 4],\n original: [0, 0],\n};\n\nfunction resolveOutputDimensions(\n clip: ClipSource,\n videoWidth: number,\n videoHeight: number,\n width: number,\n height: number\n): [number, number] {\n const ar = clip.aspectRatio ?? 'original';\n const ratio = ASPECT_RATIO_MAP[ar] ?? [0, 0];\n if (ratio[0] === 0) return [width, height];\n const w = width;\n const h = Math.round(w * (ratio[1] / ratio[0]));\n return [w, h];\n}\n\nfunction seekVideo(video: HTMLVideoElement, time: number): Promise<void> {\n return new Promise((resolve) => {\n if (Math.abs(video.currentTime - time) < 0.001) { resolve(); return; }\n const onSeeked = () => { video.removeEventListener('seeked', onSeeked); resolve(); };\n video.addEventListener('seeked', onSeeked);\n video.currentTime = time;\n });\n}\n\nfunction drawVideoFrame(\n ctx: CanvasRenderingContext2D,\n video: HTMLVideoElement,\n clip: ClipSource,\n outW: number,\n outH: number\n): void {\n const vw = video.videoWidth;\n const vh = video.videoHeight;\n\n if (clip.crop) {\n const { x, y, width, height } = clip.crop;\n ctx.drawImage(video, x * vw, y * vh, width * vw, height * vh, 0, 0, outW, outH);\n } else {\n const videoAR = vw / vh;\n const outAR = outW / outH;\n let sx = 0, sy = 0, sw = vw, sh = vh;\n if (videoAR > outAR) {\n sw = vh * outAR;\n sx = (vw - sw) / 2;\n } else if (videoAR < outAR) {\n sh = vw / outAR;\n sy = (vh - sh) / 2;\n }\n ctx.drawImage(video, sx, sy, sw, sh, 0, 0, outW, outH);\n }\n}\n\nexport class WorkerPool {\n private readonly workers: Worker[] = [];\n private readonly available: Worker[] = [];\n private readonly waiters: Array<(w: Worker) => void> = [];\n\n constructor(maxConcurrency: number) {\n for (let i = 0; i < maxConcurrency; i++) {\n const w = new Worker(new URL('./worker/render-worker.js', import.meta.url), { type: 'module' });\n this.workers.push(w);\n this.available.push(w);\n }\n }\n\n private acquire(): Promise<Worker> {\n if (this.available.length > 0) return Promise.resolve(this.available.pop()!);\n return new Promise(resolve => this.waiters.push(resolve));\n }\n\n private release(worker: Worker): void {\n if (this.waiters.length > 0) {\n this.waiters.shift()!(worker);\n } else {\n this.available.push(worker);\n }\n }\n\n async dispatch(\n clip: ClipSource,\n width: number,\n height: number,\n fps: number,\n signal?: AbortSignal,\n onProgress?: (p: number) => void\n ): Promise<FrameData[]> {\n const worker = await this.acquire();\n try {\n return await this.processClip(worker, clip, width, height, fps, signal, onProgress);\n } finally {\n this.release(worker);\n }\n }\n\n private async processClip(\n worker: Worker,\n clip: ClipSource,\n width: number,\n height: number,\n fps: number,\n signal?: AbortSignal,\n onProgress?: (p: number) => void\n ): Promise<FrameData[]> {\n let srcUrl: string;\n let needsRevoke = false;\n\n if (typeof clip.source === 'string') {\n srcUrl = clip.source;\n } else if (clip.source instanceof HTMLVideoElement) {\n srcUrl = clip.source.src;\n } else {\n srcUrl = URL.createObjectURL(clip.source as Blob);\n needsRevoke = true;\n }\n\n const video = document.createElement('video');\n video.muted = true;\n video.crossOrigin = 'anonymous';\n video.preload = 'auto';\n\n await new Promise<void>((resolve, reject) => {\n video.onloadedmetadata = () => resolve();\n video.onerror = () => reject(new Error(`Failed to load video: ${srcUrl}`));\n video.src = srcUrl;\n });\n\n const duration = video.duration;\n const startTime = clip.startTime ?? 0;\n const endTime = clip.endTime ?? duration;\n const clipDuration = endTime - startTime;\n const [outW, outH] = resolveOutputDimensions(clip, video.videoWidth, video.videoHeight, width, height);\n const totalFrames = Math.ceil(clipDuration * fps);\n\n // Temp canvas applies crop/aspect-ratio before handing bitmap to worker\n const canvas = document.createElement('canvas');\n canvas.width = outW;\n canvas.height = outH;\n const ctx = canvas.getContext('2d')!;\n\n // Wire up worker message handler before sending init\n const resultPromise = new Promise<TransferableFrame[]>((resolve, reject) => {\n const onMessage = (e: MessageEvent<WorkerOutbound>) => {\n const msg = e.data;\n if (msg.type === 'done') {\n worker.removeEventListener('message', onMessage);\n resolve(msg.frames);\n } else if (msg.type === 'error') {\n worker.removeEventListener('message', onMessage);\n reject(new Error(msg.message));\n } else if (msg.type === 'progress') {\n onProgress?.(msg.value);\n }\n };\n worker.addEventListener('message', onMessage);\n });\n\n const initMsg: WorkerInbound = {\n type: 'init',\n meta: { width: outW, height: outH, fps, captions: clip.captions, totalFrames },\n };\n worker.postMessage(initMsg);\n\n try {\n for (let i = 0; i < totalFrames; i++) {\n if (signal?.aborted) {\n worker.postMessage({ type: 'abort' } satisfies WorkerInbound);\n throw new DOMException('Render cancelled', 'AbortError');\n }\n\n const t = startTime + (i / fps);\n await seekVideo(video, t);\n ctx.clearRect(0, 0, outW, outH);\n drawVideoFrame(ctx, video, clip, outW, outH);\n\n const bitmap = await createImageBitmap(canvas);\n const frameMsg: WorkerInbound = { type: 'frame', bitmap, timestamp: t - startTime, index: i };\n worker.postMessage(frameMsg, [bitmap]);\n }\n\n worker.postMessage({ type: 'end' } satisfies WorkerInbound);\n const transferableFrames = await resultPromise;\n\n return transferableFrames.map(f => ({\n imageData: new ImageData(new Uint8ClampedArray(f.buffer), f.width, f.height),\n timestamp: f.timestamp,\n width: f.width,\n height: f.height,\n }));\n } finally {\n if (needsRevoke) URL.revokeObjectURL(srcUrl);\n }\n }\n\n terminate(): void {\n for (const w of this.workers) w.terminate();\n this.workers.length = 0;\n this.available.length = 0;\n }\n}\n","import type { ClipSource, RendererBackend, FrameData, ClipProgress, MergeOptions, ClipMetrics, RenderMetrics } from './types.js';\nimport { extractFrames } from './compositor.js';\nimport { WorkerPool } from './worker/pool.js';\n\nfunction supportsOffscreenWorkers(): boolean {\n return (\n typeof Worker !== 'undefined' &&\n typeof OffscreenCanvas !== 'undefined' &&\n typeof createImageBitmap !== 'undefined'\n );\n}\n\nexport async function stitchClips(\n clips: ClipSource[],\n backend: RendererBackend,\n options: MergeOptions\n): Promise<{ blob: Blob; metrics: RenderMetrics }> {\n if (supportsOffscreenWorkers() && clips.length > 1) {\n return stitchParallel(clips, backend, options);\n }\n return stitchSequential(clips, backend, options);\n}\n\n// ── Sequential fallback (older browsers / single clip) ────────────────────────\n\nasync function stitchSequential(\n clips: ClipSource[],\n backend: RendererBackend,\n options: MergeOptions\n): Promise<{ blob: Blob; metrics: RenderMetrics }> {\n const fps = options.fps ?? 30;\n const width = options.width ?? 1280;\n const height = options.height ?? 720;\n const { onProgress, onComplete, signal } = options;\n\n const stitchStart = performance.now();\n\n const clipStatuses: ClipProgress[] = clips.map((_, i) => ({\n index: i, status: 'pending', progress: 0,\n }));\n const clipMetrics: ClipMetrics[] = [];\n\n const emit = (overall: number) => {\n onProgress?.({ overall, clips: clipStatuses.slice() });\n };\n\n const blobs: Blob[] = [];\n\n for (let ci = 0; ci < clips.length; ci++) {\n clipStatuses[ci].status = 'rendering';\n emit(ci / clips.length);\n\n const extractStart = performance.now();\n const frames = await extractFrames(clips[ci], {\n fps, width, height,\n mimeType: options.mimeType,\n quality: options.quality,\n encoderOptions: options.encoderOptions,\n signal,\n onProgress: (p) => {\n clipStatuses[ci].progress = p * 0.9;\n emit((ci + p * 0.9) / clips.length);\n },\n });\n const extractionMs = performance.now() - extractStart;\n\n clipStatuses[ci].status = 'encoding';\n const encodeStart = performance.now();\n const blob = await backend.encode(frames, {\n width, height, fps,\n mimeType: options.mimeType ?? 'video/mp4',\n quality: options.quality ?? 0.92,\n encoderOptions: options.encoderOptions,\n signal,\n onProgress: (p) => {\n clipStatuses[ci].progress = 0.9 + p * 0.1;\n emit((ci + 0.9 + p * 0.1) / clips.length);\n },\n });\n const encodingMs = performance.now() - encodeStart;\n\n clipStatuses[ci].status = 'done';\n clipStatuses[ci].progress = 1;\n clipMetrics.push({\n clipId: String(ci),\n extractionMs,\n encodingMs,\n totalMs: extractionMs + encodingMs,\n framesExtracted: frames.length,\n });\n blobs.push(blob);\n }\n\n let finalBlob: Blob;\n let stitchMs = 0;\n\n if (blobs.length === 1) {\n emit(1);\n finalBlob = blobs[0];\n } else {\n const stitchPhaseStart = performance.now();\n finalBlob = await backend.concat(blobs, {\n width, height, fps,\n mimeType: options.mimeType ?? 'video/mp4',\n quality: options.quality ?? 0.92,\n signal,\n onProgress: (p) => emit((clips.length - 1 + p) / clips.length),\n });\n stitchMs = performance.now() - stitchPhaseStart;\n }\n\n const totalMs = performance.now() - stitchStart;\n const totalFrames = clipMetrics.reduce((s, c) => s + c.framesExtracted, 0);\n const metrics: RenderMetrics = {\n totalMs,\n extractionMs: clipMetrics.reduce((s, c) => s + c.extractionMs, 0),\n encodingMs: clipMetrics.reduce((s, c) => s + c.encodingMs, 0),\n stitchMs,\n clips: clipMetrics,\n framesPerSecond: totalFrames / (totalMs / 1000),\n };\n\n onComplete?.(metrics);\n return { blob: finalBlob, metrics };\n}\n\n// ── Parallel path (OffscreenCanvas + WorkerPool) ──────────────────────────────\n\nasync function stitchParallel(\n clips: ClipSource[],\n backend: RendererBackend,\n options: MergeOptions\n): Promise<{ blob: Blob; metrics: RenderMetrics }> {\n const fps = options.fps ?? 30;\n const width = options.width ?? 1280;\n const height = options.height ?? 720;\n const { onProgress, onComplete, signal } = options;\n\n const stitchStart = performance.now();\n\n const concurrency = Math.min(\n clips.length,\n (typeof navigator !== 'undefined' ? navigator.hardwareConcurrency || 2 : 2),\n 4\n );\n\n const clipStatuses: ClipProgress[] = clips.map((_, i) => ({\n index: i, status: 'pending', progress: 0,\n }));\n const clipMetrics: Array<ClipMetrics> = new Array(clips.length);\n\n const emit = () => {\n const overall = clipStatuses.reduce((sum, c) => sum + c.progress, 0) / clips.length;\n onProgress?.({ overall, clips: clipStatuses.slice() });\n };\n\n const pool = new WorkerPool(concurrency);\n const blobs: Blob[] = new Array(clips.length);\n let encodeChain = Promise.resolve();\n\n try {\n await Promise.all(\n clips.map(async (clip, ci) => {\n clipStatuses[ci].status = 'rendering';\n emit();\n\n const extractStart = performance.now();\n const frames: FrameData[] = await pool.dispatch(\n clip, width, height, fps, signal,\n (p) => {\n clipStatuses[ci].progress = p * 0.85;\n emit();\n }\n );\n const extractionMs = performance.now() - extractStart;\n\n clipStatuses[ci].status = 'encoding';\n clipStatuses[ci].progress = 0.85;\n emit();\n\n await new Promise<void>((resolve, reject) => {\n encodeChain = encodeChain.then(async () => {\n const encodeStart = performance.now();\n try {\n blobs[ci] = await backend.encode(frames, {\n width, height, fps,\n mimeType: options.mimeType ?? 'video/mp4',\n quality: options.quality ?? 0.92,\n encoderOptions: options.encoderOptions,\n signal,\n onProgress: (p) => {\n clipStatuses[ci].progress = 0.85 + p * 0.15;\n emit();\n },\n });\n const encodingMs = performance.now() - encodeStart;\n clipMetrics[ci] = {\n clipId: String(ci),\n extractionMs,\n encodingMs,\n totalMs: extractionMs + encodingMs,\n framesExtracted: frames.length,\n };\n clipStatuses[ci].status = 'done';\n clipStatuses[ci].progress = 1;\n emit();\n resolve();\n } catch (err) {\n clipStatuses[ci].status = 'error';\n reject(err);\n throw err;\n }\n });\n });\n })\n );\n\n let finalBlob: Blob;\n let stitchMs = 0;\n\n if (blobs.length === 1) {\n onProgress?.({ overall: 1, clips: clipStatuses.slice() });\n finalBlob = blobs[0];\n } else {\n const stitchPhaseStart = performance.now();\n finalBlob = await backend.concat(blobs, {\n width, height, fps,\n mimeType: options.mimeType ?? 'video/mp4',\n quality: options.quality ?? 0.92,\n signal,\n });\n stitchMs = performance.now() - stitchPhaseStart;\n }\n\n const totalMs = performance.now() - stitchStart;\n const totalFrames = clipMetrics.reduce((s, c) => s + c.framesExtracted, 0);\n const metrics: RenderMetrics = {\n totalMs,\n extractionMs: clipMetrics.reduce((s, c) => s + c.extractionMs, 0),\n encodingMs: clipMetrics.reduce((s, c) => s + c.encodingMs, 0),\n stitchMs,\n clips: clipMetrics,\n framesPerSecond: totalFrames / (totalMs / 1000),\n };\n\n onComplete?.(metrics);\n return { blob: finalBlob, metrics };\n } finally {\n pool.terminate();\n }\n}\n","import type { Segment, ExportOptions, RenderMetrics, ClipSource } from './types.js';\nimport { stitchClips } from './stitch.js';\nimport { createFFmpegBackend } from './backends/ffmpeg.js';\n\nfunction segmentsToClips(videoUrl: string, segments: Segment[]): ClipSource[] {\n return segments.map((seg) => ({\n source: videoUrl,\n startTime: seg.start,\n endTime: seg.end,\n captions: seg.captions?.length ? { segments: seg.captions } : undefined,\n }));\n}\n\nexport async function exportClips(\n videoUrl: string,\n segments: Segment[],\n options?: ExportOptions\n): Promise<{ blob: Blob; metrics: RenderMetrics }> {\n const clips = segmentsToClips(videoUrl, segments);\n const backend = createFFmpegBackend();\n await backend.init();\n return stitchClips(clips, backend, options ?? {});\n}\n\nexport async function exportClipsToUrl(\n videoUrl: string,\n segments: Segment[],\n options?: ExportOptions\n): Promise<{ url: string; metrics: RenderMetrics }> {\n const { blob, metrics } = await exportClips(videoUrl, segments, options);\n return { url: URL.createObjectURL(blob), metrics };\n}\n\n/** @deprecated Use exportClips() */\nexport const render = exportClips;\n\n/** @deprecated Use exportClipsToUrl() */\nexport const renderToUrl = exportClipsToUrl;\n"]}
package/dist/index.d.cts CHANGED
@@ -41,7 +41,8 @@ interface CaptionOptions {
41
41
  segments: CaptionSegment[];
42
42
  style?: Partial<CaptionStyle>;
43
43
  }
44
- interface ClipInput {
44
+ /** Input descriptor for one clip source used by mergeClips() */
45
+ interface ClipSource {
45
46
  /** Video source: URL string, File, Blob, or HTMLVideoElement */
46
47
  source: string | File | Blob | HTMLVideoElement;
47
48
  /** Trim start in seconds (default: 0) */
@@ -57,6 +58,8 @@ interface ClipInput {
57
58
  /** Volume multiplier 0-2 (default: 1) */
58
59
  volume?: number;
59
60
  }
61
+ /** @deprecated Use ClipSource */
62
+ type ClipInput = ClipSource;
60
63
  interface RenderOptions {
61
64
  /** Output width in pixels (default: 1280) */
62
65
  width?: number;
@@ -129,16 +132,12 @@ interface RenderMetrics {
129
132
  clips: ClipMetrics[];
130
133
  framesPerSecond: number;
131
134
  }
135
+ /** One time-range segment from a single source video, used by exportClips() */
132
136
  interface Segment {
133
137
  start: number;
134
138
  end: number;
135
139
  captions?: CaptionSegment[];
136
140
  }
137
- /** Options for the render()/renderToUrl() single-video API */
138
- interface SingleVideoRenderOptions extends Omit<StitchOptions, 'onProgress' | 'onComplete'> {
139
- onProgress?: (progress: RichProgress) => void;
140
- onComplete?: (metrics: RenderMetrics) => void;
141
- }
142
141
  type ClipStatus = 'pending' | 'rendering' | 'encoding' | 'done' | 'error';
143
142
  interface ClipProgress {
144
143
  index: number;
@@ -149,23 +148,42 @@ interface RichProgress {
149
148
  overall: number;
150
149
  clips: ClipProgress[];
151
150
  }
152
- /** Extends RenderOptions with rich per-clip progress reporting and completion metrics */
153
- interface StitchOptions extends Omit<RenderOptions, 'onProgress'> {
151
+ /** Options for mergeClips() / FrameWorker.mergeClips() */
152
+ interface MergeOptions extends Omit<RenderOptions, 'onProgress'> {
153
+ onProgress?: (progress: RichProgress) => void;
154
+ onComplete?: (metrics: RenderMetrics) => void;
155
+ }
156
+ /** @deprecated Use MergeOptions */
157
+ type StitchOptions = MergeOptions;
158
+ /** Options for exportClips() / exportClipsToUrl() */
159
+ interface ExportOptions extends Omit<MergeOptions, 'onProgress' | 'onComplete'> {
154
160
  onProgress?: (progress: RichProgress) => void;
155
161
  onComplete?: (metrics: RenderMetrics) => void;
156
162
  }
163
+ /** @deprecated Use ExportOptions */
164
+ type SingleVideoRenderOptions = ExportOptions;
157
165
  interface FrameWorker {
158
- /** Render a single clip to a Blob */
159
- render(clip: ClipInput, options?: RenderOptions): Promise<Blob>;
160
- /** Render a single clip and return an object URL */
161
- renderToUrl(clip: ClipInput, options?: RenderOptions): Promise<string>;
162
- /** Stitch multiple clips into one Blob */
163
- stitch(clips: ClipInput[], options?: StitchOptions): Promise<{
166
+ /** Render a single clip to a Blob (legacy single-clip API) */
167
+ render(clip: ClipSource, options?: RenderOptions): Promise<Blob>;
168
+ /** Render a single clip and return an object URL (legacy single-clip API) */
169
+ renderToUrl(clip: ClipSource, options?: RenderOptions): Promise<string>;
170
+ /** Merge multiple clip sources into one Blob */
171
+ mergeClips(clips: ClipSource[], options?: MergeOptions): Promise<{
172
+ blob: Blob;
173
+ metrics: RenderMetrics;
174
+ }>;
175
+ /** Merge multiple clip sources and return an object URL */
176
+ mergeClipsToUrl(clips: ClipSource[], options?: MergeOptions): Promise<{
177
+ url: string;
178
+ metrics: RenderMetrics;
179
+ }>;
180
+ /** @deprecated Use mergeClips() */
181
+ stitch(clips: ClipSource[], options?: MergeOptions): Promise<{
164
182
  blob: Blob;
165
183
  metrics: RenderMetrics;
166
184
  }>;
167
- /** Stitch multiple clips and return an object URL */
168
- stitchToUrl(clips: ClipInput[], options?: StitchOptions): Promise<{
185
+ /** @deprecated Use mergeClipsToUrl() */
186
+ stitchToUrl(clips: ClipSource[], options?: MergeOptions): Promise<{
169
187
  url: string;
170
188
  metrics: RenderMetrics;
171
189
  }>;
@@ -185,15 +203,19 @@ declare class FFmpegBackend implements RendererBackend {
185
203
  }
186
204
  declare function createFFmpegBackend(): FFmpegBackend;
187
205
 
188
- declare function render(videoUrl: string, segments: Segment[], options?: SingleVideoRenderOptions): Promise<{
206
+ declare function exportClips(videoUrl: string, segments: Segment[], options?: ExportOptions): Promise<{
189
207
  blob: Blob;
190
208
  metrics: RenderMetrics;
191
209
  }>;
192
- declare function renderToUrl(videoUrl: string, segments: Segment[], options?: SingleVideoRenderOptions): Promise<{
210
+ declare function exportClipsToUrl(videoUrl: string, segments: Segment[], options?: ExportOptions): Promise<{
193
211
  url: string;
194
212
  metrics: RenderMetrics;
195
213
  }>;
214
+ /** @deprecated Use exportClips() */
215
+ declare const render: typeof exportClips;
216
+ /** @deprecated Use exportClipsToUrl() */
217
+ declare const renderToUrl: typeof exportClipsToUrl;
196
218
 
197
219
  declare function createFrameWorker(config?: FrameWorkerConfig): FrameWorker;
198
220
 
199
- export { type AspectRatio, type CaptionOptions, type CaptionSegment, type CaptionStyle, type CaptionStylePreset, type ClipInput, type ClipMetrics, type ClipProgress, type ClipStatus, type CropOptions, type EncodeOptions, FFmpegBackend, type FrameData, type FrameWorker, type FrameWorkerConfig, type RenderMetrics, type RenderOptions, type RendererBackend, type RichProgress, STYLE_PRESETS, type Segment, type SingleVideoRenderOptions, type StitchOptions, createFFmpegBackend, createFrameWorker, render, renderToUrl };
221
+ export { type AspectRatio, type CaptionOptions, type CaptionSegment, type CaptionStyle, type CaptionStylePreset, type ClipInput, type ClipMetrics, type ClipProgress, type ClipSource, type ClipStatus, type CropOptions, type EncodeOptions, type ExportOptions, FFmpegBackend, type FrameData, type FrameWorker, type FrameWorkerConfig, type MergeOptions, type RenderMetrics, type RenderOptions, type RendererBackend, type RichProgress, STYLE_PRESETS, type Segment, type SingleVideoRenderOptions, type StitchOptions, createFFmpegBackend, createFrameWorker, exportClips, exportClipsToUrl, render, renderToUrl };
package/dist/index.d.ts CHANGED
@@ -41,7 +41,8 @@ interface CaptionOptions {
41
41
  segments: CaptionSegment[];
42
42
  style?: Partial<CaptionStyle>;
43
43
  }
44
- interface ClipInput {
44
+ /** Input descriptor for one clip source used by mergeClips() */
45
+ interface ClipSource {
45
46
  /** Video source: URL string, File, Blob, or HTMLVideoElement */
46
47
  source: string | File | Blob | HTMLVideoElement;
47
48
  /** Trim start in seconds (default: 0) */
@@ -57,6 +58,8 @@ interface ClipInput {
57
58
  /** Volume multiplier 0-2 (default: 1) */
58
59
  volume?: number;
59
60
  }
61
+ /** @deprecated Use ClipSource */
62
+ type ClipInput = ClipSource;
60
63
  interface RenderOptions {
61
64
  /** Output width in pixels (default: 1280) */
62
65
  width?: number;
@@ -129,16 +132,12 @@ interface RenderMetrics {
129
132
  clips: ClipMetrics[];
130
133
  framesPerSecond: number;
131
134
  }
135
+ /** One time-range segment from a single source video, used by exportClips() */
132
136
  interface Segment {
133
137
  start: number;
134
138
  end: number;
135
139
  captions?: CaptionSegment[];
136
140
  }
137
- /** Options for the render()/renderToUrl() single-video API */
138
- interface SingleVideoRenderOptions extends Omit<StitchOptions, 'onProgress' | 'onComplete'> {
139
- onProgress?: (progress: RichProgress) => void;
140
- onComplete?: (metrics: RenderMetrics) => void;
141
- }
142
141
  type ClipStatus = 'pending' | 'rendering' | 'encoding' | 'done' | 'error';
143
142
  interface ClipProgress {
144
143
  index: number;
@@ -149,23 +148,42 @@ interface RichProgress {
149
148
  overall: number;
150
149
  clips: ClipProgress[];
151
150
  }
152
- /** Extends RenderOptions with rich per-clip progress reporting and completion metrics */
153
- interface StitchOptions extends Omit<RenderOptions, 'onProgress'> {
151
+ /** Options for mergeClips() / FrameWorker.mergeClips() */
152
+ interface MergeOptions extends Omit<RenderOptions, 'onProgress'> {
153
+ onProgress?: (progress: RichProgress) => void;
154
+ onComplete?: (metrics: RenderMetrics) => void;
155
+ }
156
+ /** @deprecated Use MergeOptions */
157
+ type StitchOptions = MergeOptions;
158
+ /** Options for exportClips() / exportClipsToUrl() */
159
+ interface ExportOptions extends Omit<MergeOptions, 'onProgress' | 'onComplete'> {
154
160
  onProgress?: (progress: RichProgress) => void;
155
161
  onComplete?: (metrics: RenderMetrics) => void;
156
162
  }
163
+ /** @deprecated Use ExportOptions */
164
+ type SingleVideoRenderOptions = ExportOptions;
157
165
  interface FrameWorker {
158
- /** Render a single clip to a Blob */
159
- render(clip: ClipInput, options?: RenderOptions): Promise<Blob>;
160
- /** Render a single clip and return an object URL */
161
- renderToUrl(clip: ClipInput, options?: RenderOptions): Promise<string>;
162
- /** Stitch multiple clips into one Blob */
163
- stitch(clips: ClipInput[], options?: StitchOptions): Promise<{
166
+ /** Render a single clip to a Blob (legacy single-clip API) */
167
+ render(clip: ClipSource, options?: RenderOptions): Promise<Blob>;
168
+ /** Render a single clip and return an object URL (legacy single-clip API) */
169
+ renderToUrl(clip: ClipSource, options?: RenderOptions): Promise<string>;
170
+ /** Merge multiple clip sources into one Blob */
171
+ mergeClips(clips: ClipSource[], options?: MergeOptions): Promise<{
172
+ blob: Blob;
173
+ metrics: RenderMetrics;
174
+ }>;
175
+ /** Merge multiple clip sources and return an object URL */
176
+ mergeClipsToUrl(clips: ClipSource[], options?: MergeOptions): Promise<{
177
+ url: string;
178
+ metrics: RenderMetrics;
179
+ }>;
180
+ /** @deprecated Use mergeClips() */
181
+ stitch(clips: ClipSource[], options?: MergeOptions): Promise<{
164
182
  blob: Blob;
165
183
  metrics: RenderMetrics;
166
184
  }>;
167
- /** Stitch multiple clips and return an object URL */
168
- stitchToUrl(clips: ClipInput[], options?: StitchOptions): Promise<{
185
+ /** @deprecated Use mergeClipsToUrl() */
186
+ stitchToUrl(clips: ClipSource[], options?: MergeOptions): Promise<{
169
187
  url: string;
170
188
  metrics: RenderMetrics;
171
189
  }>;
@@ -185,15 +203,19 @@ declare class FFmpegBackend implements RendererBackend {
185
203
  }
186
204
  declare function createFFmpegBackend(): FFmpegBackend;
187
205
 
188
- declare function render(videoUrl: string, segments: Segment[], options?: SingleVideoRenderOptions): Promise<{
206
+ declare function exportClips(videoUrl: string, segments: Segment[], options?: ExportOptions): Promise<{
189
207
  blob: Blob;
190
208
  metrics: RenderMetrics;
191
209
  }>;
192
- declare function renderToUrl(videoUrl: string, segments: Segment[], options?: SingleVideoRenderOptions): Promise<{
210
+ declare function exportClipsToUrl(videoUrl: string, segments: Segment[], options?: ExportOptions): Promise<{
193
211
  url: string;
194
212
  metrics: RenderMetrics;
195
213
  }>;
214
+ /** @deprecated Use exportClips() */
215
+ declare const render: typeof exportClips;
216
+ /** @deprecated Use exportClipsToUrl() */
217
+ declare const renderToUrl: typeof exportClipsToUrl;
196
218
 
197
219
  declare function createFrameWorker(config?: FrameWorkerConfig): FrameWorker;
198
220
 
199
- export { type AspectRatio, type CaptionOptions, type CaptionSegment, type CaptionStyle, type CaptionStylePreset, type ClipInput, type ClipMetrics, type ClipProgress, type ClipStatus, type CropOptions, type EncodeOptions, FFmpegBackend, type FrameData, type FrameWorker, type FrameWorkerConfig, type RenderMetrics, type RenderOptions, type RendererBackend, type RichProgress, STYLE_PRESETS, type Segment, type SingleVideoRenderOptions, type StitchOptions, createFFmpegBackend, createFrameWorker, render, renderToUrl };
221
+ export { type AspectRatio, type CaptionOptions, type CaptionSegment, type CaptionStyle, type CaptionStylePreset, type ClipInput, type ClipMetrics, type ClipProgress, type ClipSource, type ClipStatus, type CropOptions, type EncodeOptions, type ExportOptions, FFmpegBackend, type FrameData, type FrameWorker, type FrameWorkerConfig, type MergeOptions, type RenderMetrics, type RenderOptions, type RendererBackend, type RichProgress, STYLE_PRESETS, type Segment, type SingleVideoRenderOptions, type StitchOptions, createFFmpegBackend, createFrameWorker, exportClips, exportClipsToUrl, render, renderToUrl };
package/dist/index.js CHANGED
@@ -525,7 +525,7 @@ var WorkerPool = class {
525
525
  this.available = [];
526
526
  this.waiters = [];
527
527
  for (let i = 0; i < maxConcurrency; i++) {
528
- const w = new Worker(new URL("./render-worker.js", import.meta.url), { type: "module" });
528
+ const w = new Worker(new URL("./worker/render-worker.js", import.meta.url), { type: "module" });
529
529
  this.workers.push(w);
530
530
  this.available.push(w);
531
531
  }
@@ -861,16 +861,18 @@ function segmentsToClips(videoUrl, segments) {
861
861
  captions: seg.captions?.length ? { segments: seg.captions } : void 0
862
862
  }));
863
863
  }
864
- async function render(videoUrl, segments, options) {
864
+ async function exportClips(videoUrl, segments, options) {
865
865
  const clips = segmentsToClips(videoUrl, segments);
866
866
  const backend = createFFmpegBackend();
867
867
  await backend.init();
868
868
  return stitchClips(clips, backend, options ?? {});
869
869
  }
870
- async function renderToUrl(videoUrl, segments, options) {
871
- const { blob, metrics } = await render(videoUrl, segments, options);
870
+ async function exportClipsToUrl(videoUrl, segments, options) {
871
+ const { blob, metrics } = await exportClips(videoUrl, segments, options);
872
872
  return { url: URL.createObjectURL(blob), metrics };
873
873
  }
874
+ var render = exportClips;
875
+ var renderToUrl = exportClipsToUrl;
874
876
 
875
877
  // src/index.ts
876
878
  function createFrameWorker(config = {}) {
@@ -909,18 +911,27 @@ function createFrameWorker(config = {}) {
909
911
  const blob = await render2(clip, options);
910
912
  return URL.createObjectURL(blob);
911
913
  }
912
- async function stitch(clips, options = {}) {
914
+ async function mergeClips(clips, options = {}) {
913
915
  const mergedOpts = { fps, width, height, ...options };
914
916
  const backend = await getBackend();
915
917
  return stitchClips(clips, backend, mergedOpts);
916
918
  }
917
- async function stitchToUrl(clips, options) {
918
- const { blob, metrics } = await stitch(clips, options);
919
+ async function mergeClipsToUrl(clips, options) {
920
+ const { blob, metrics } = await mergeClips(clips, options);
919
921
  return { url: URL.createObjectURL(blob), metrics };
920
922
  }
921
- return { render: render2, renderToUrl: renderToUrl2, stitch, stitchToUrl };
923
+ return {
924
+ render: render2,
925
+ renderToUrl: renderToUrl2,
926
+ mergeClips,
927
+ mergeClipsToUrl,
928
+ /** @deprecated Use mergeClips() */
929
+ stitch: mergeClips,
930
+ /** @deprecated Use mergeClipsToUrl() */
931
+ stitchToUrl: mergeClipsToUrl
932
+ };
922
933
  }
923
934
 
924
- export { FFmpegBackend, STYLE_PRESETS, createFFmpegBackend, createFrameWorker, render, renderToUrl };
935
+ export { FFmpegBackend, STYLE_PRESETS, createFFmpegBackend, createFrameWorker, exportClips, exportClipsToUrl, render, renderToUrl };
925
936
  //# sourceMappingURL=index.js.map
926
937
  //# sourceMappingURL=index.js.map