68 lines
2.5 KiB
TypeScript
68 lines
2.5 KiB
TypeScript
/**
|
|
* `lib/video-export` — the classroom-video compiler (issue #864).
|
|
*
|
|
* The compiler turns classroom data into a `VideoTimeline` **IR** with pure
|
|
* passes — the system contract for video export (#854). It is produced and
|
|
* inspected without FFmpeg / Chrome; live app state enters only through the
|
|
* injected {@link TimingProbe} / {@link AssetSource}. The Hyperframes composition
|
|
* is a downstream consumer of the IR, added in a later phase.
|
|
*
|
|
* Purity is machine-enforced by an eslint boundary on `lib/video-export/**`
|
|
* (allows only `@openmaic/dsl`, `zod`, in-folder relatives, and the sibling
|
|
* `lib/choreography` spec — no `@/` host paths, no React/DOM/render backend), so
|
|
* the compiler stays interpretable in pure Node.
|
|
*
|
|
* @example
|
|
* const ir = compileVideoTimeline(
|
|
* { stage, scenes },
|
|
* { timing: myProbe, assets: mySource, config: { playbackSpeed: 1 } },
|
|
* );
|
|
* const manifest = emitManifest(ir); // validated JSON
|
|
*/
|
|
export * from './ir';
|
|
export * from './deps';
|
|
export * from './geometry';
|
|
export * from './interactive-static';
|
|
export * from './runtime-diagnostics';
|
|
export { compileVideoTimeline, type CompileInput, type CompileDeps } from './compile';
|
|
export { normalizeScenes, type NormalizeResult } from './passes/normalize';
|
|
export { buildTimelineOptions } from './passes/probe';
|
|
export { buildTimeline, type TimelineResult } from './passes/timeline';
|
|
export { applyVisuals, prepareQuizQuestionList, type VisualsResult } from './passes/visuals';
|
|
export { applyInteractiveHtml, type InteractiveResult } from './passes/interactive';
|
|
export { reflowQuizTimelines, type ReflowResult } from './passes/reflow';
|
|
export {
|
|
applyGeometry,
|
|
resolveEffectGeometry,
|
|
resolveVideoPlacement,
|
|
type GeometryResult,
|
|
} from './passes/geometry';
|
|
export { planAssets, sanitizeFilenamePart, type AssetsResult } from './passes/assets';
|
|
export {
|
|
emitManifest,
|
|
emitManifestJson,
|
|
VideoExportManifestSchema,
|
|
type VideoExportManifest,
|
|
} from './passes/emit';
|
|
export { toSrt, toVtt, usableCues } from './subtitles';
|
|
export { splitCue, splitCues, splitCueText, textUnits } from './split-cue';
|
|
export {
|
|
emitHyperframes,
|
|
assetUrl,
|
|
ASSETS_DIR,
|
|
type EmitHyperframesOptions,
|
|
type EmittedProject,
|
|
type EmittedFile,
|
|
type VideoExportLabels,
|
|
type InteractiveFallbackLabels,
|
|
type EmittedVendorAsset,
|
|
type CoverCardLabels,
|
|
type VideoExportCta,
|
|
} from './emit-hyperframes';
|
|
export {
|
|
quizQuestionListCss,
|
|
renderQuizQuestionListSurface,
|
|
type QuizQuestionListContent,
|
|
type QuizQuestionListLabels,
|
|
} from './emit-hyperframes/quiz-question-list';
|