frameyard 0.5.0 → 0.7.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.
- package/CHANGELOG.md +100 -0
- package/GLOSSARY.md +152 -24
- package/README.md +99 -31
- package/dist/assets/process.js.map +1 -1
- package/dist/assets/provenance.js.map +1 -1
- package/dist/cli.js +326 -40
- package/dist/cli.js.map +1 -1
- package/dist/composition/attributes.d.ts.map +1 -1
- package/dist/composition/diagnostics.js.map +1 -1
- package/dist/contracts.d.ts +12 -0
- package/dist/contracts.d.ts.map +1 -1
- package/dist/contracts.js.map +1 -1
- package/dist/doctor.d.ts.map +1 -1
- package/dist/doctor.js +79 -0
- package/dist/doctor.js.map +1 -1
- package/dist/errors.d.ts +1 -1
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js.map +1 -1
- package/dist/html/validate.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/preview/main.js +96 -11
- package/dist/preview/main.js.map +1 -1
- package/dist/preview/timeline-data.d.ts +85 -0
- package/dist/preview/timeline-data.d.ts.map +1 -0
- package/dist/preview/timeline-data.js +2 -0
- package/dist/preview/timeline-data.js.map +1 -0
- package/dist/preview/timeline-host.d.ts +21 -0
- package/dist/preview/timeline-host.d.ts.map +1 -0
- package/dist/preview/timeline-host.js +308 -0
- package/dist/preview/timeline-host.js.map +1 -0
- package/dist/preview/timeline-main.d.ts +17 -0
- package/dist/preview/timeline-main.d.ts.map +1 -0
- package/dist/preview/timeline-main.js +368 -0
- package/dist/preview/timeline-main.js.map +1 -0
- package/dist/project.d.ts +16 -1
- package/dist/project.d.ts.map +1 -1
- package/dist/project.js +81 -26
- package/dist/project.js.map +1 -1
- package/dist/renderer/browser.d.ts +2 -0
- package/dist/renderer/browser.d.ts.map +1 -1
- package/dist/renderer/browser.js +6 -1
- package/dist/renderer/browser.js.map +1 -1
- package/dist/renderer/ffmpeg.d.ts +126 -1
- package/dist/renderer/ffmpeg.d.ts.map +1 -1
- package/dist/renderer/ffmpeg.js +450 -6
- package/dist/renderer/ffmpeg.js.map +1 -1
- package/dist/renderer/index.d.ts +28 -3
- package/dist/renderer/index.d.ts.map +1 -1
- package/dist/renderer/index.js +138 -38
- package/dist/renderer/index.js.map +1 -1
- package/dist/renderer/timeline.d.ts +146 -0
- package/dist/renderer/timeline.d.ts.map +1 -0
- package/dist/renderer/timeline.js +1098 -0
- package/dist/renderer/timeline.js.map +1 -0
- package/dist/runtime/host.js.map +1 -1
- package/dist/runtime/media.d.ts.map +1 -1
- package/dist/runtime/media.js +3 -6
- package/dist/runtime/media.js.map +1 -1
- package/dist/runtime/video.d.ts +13 -0
- package/dist/runtime/video.d.ts.map +1 -0
- package/dist/runtime/video.js +41 -0
- package/dist/runtime/video.js.map +1 -0
- package/dist/scaffold.d.ts.map +1 -1
- package/dist/scaffold.js +90 -24
- package/dist/scaffold.js.map +1 -1
- package/dist/server/composition-html.d.ts.map +1 -1
- package/dist/server/preview-html.d.ts.map +1 -1
- package/dist/server/preview-html.js +15 -1
- package/dist/server/preview-html.js.map +1 -1
- package/dist/server/server.d.ts.map +1 -1
- package/dist/server/server.js +39 -1
- package/dist/server/server.js.map +1 -1
- package/dist/server/timeline-preview-data.d.ts +4 -0
- package/dist/server/timeline-preview-data.d.ts.map +1 -0
- package/dist/server/timeline-preview-data.js +97 -0
- package/dist/server/timeline-preview-data.js.map +1 -0
- package/dist/server/timeline-preview-html.d.ts +4 -0
- package/dist/server/timeline-preview-html.d.ts.map +1 -0
- package/dist/server/timeline-preview-html.js +227 -0
- package/dist/server/timeline-preview-html.js.map +1 -0
- package/dist/timeline/plan.d.ts +32 -0
- package/dist/timeline/plan.d.ts.map +1 -0
- package/dist/timeline/plan.js +68 -0
- package/dist/timeline/plan.js.map +1 -0
- package/dist/timeline/resolve.d.ts +60 -0
- package/dist/timeline/resolve.d.ts.map +1 -0
- package/dist/timeline/resolve.js +523 -0
- package/dist/timeline/resolve.js.map +1 -0
- package/dist/timeline/schema.d.ts +71 -0
- package/dist/timeline/schema.d.ts.map +1 -0
- package/dist/timeline/schema.js +425 -0
- package/dist/timeline/schema.js.map +1 -0
- package/dist/transcript.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/docs/adr/0002-make-frame-and-props-the-only-animation-state.md +2 -0
- package/docs/adr/0005-keep-parallel-rendering-opt-in-and-frame-ordered.md +2 -0
- package/docs/adr/0007-make-html-documents-the-composition-unit.md +1 -1
- package/docs/adr/0009-composite-production-frames-in-software.md +1 -1
- package/docs/adr/0010-make-timelines-the-render-unit.md +24 -0
- package/docs/adr/0011-compose-timeline-frames-in-a-live-browser-host.md +22 -0
- package/docs/adr/0012-render-timelines-with-segmented-lossless-clip-intermediates.md +31 -0
- package/docs/adr/0013-capture-bounded-multi-frame-stills-for-inspection.md +33 -0
- package/docs/preview-testing.md +53 -0
- package/docs/v0.1-design.md +138 -87
- package/examples/demo/README.md +10 -3
- package/examples/demo/timelines/demo.timeline.json +12 -0
- package/examples/demo/video.config.js +4 -0
- package/examples/video/README.md +50 -6
- package/examples/video/compositions/video-overlay.html +350 -0
- package/examples/video/props/video-timeline.json +10 -0
- package/examples/video/timelines/video-timeline-mp4.timeline.json +44 -0
- package/examples/video/timelines/video-timeline.timeline.json +44 -0
- package/examples/video/video.config.js +6 -0
- package/package.json +5 -3
- package/skills/frameyard/README.md +7 -5
- package/skills/frameyard/SKILL.md +19 -13
- package/skills/frameyard/references/common-mistakes.md +1 -0
- package/skills/frameyard/references/deterministic-authoring.md +2 -1
- package/skills/frameyard/references/diagnostics.md +1 -1
- package/skills/frameyard/references/failure-recovery.md +3 -2
- package/skills/frameyard/references/json-results.md +15 -6
- package/skills/frameyard/references/subtitles-karaoke.md +2 -2
- package/skills/frameyard/references/timelines.md +143 -0
- package/skills/frameyard/scripts/frameyard.mjs +20 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plan.js","sourceRoot":"","sources":["../../src/timeline/plan.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import type { CompositionDiagnostic, CompositionMetadata, ControllerDeclaration, ResolvedAudioClip, ResolvedTranscriptClip } from "../contracts.js";
|
|
2
|
+
import type { Project, ProjectFormat, ProjectTimeline } from "../project.js";
|
|
3
|
+
import { type TimelineClip, type TimelineTrack } from "./schema.js";
|
|
4
|
+
export interface ResolvedCompositionSource {
|
|
5
|
+
kind: "composition";
|
|
6
|
+
id: string;
|
|
7
|
+
entry: string;
|
|
8
|
+
metadata: CompositionMetadata;
|
|
9
|
+
controller: ControllerDeclaration | null;
|
|
10
|
+
durationInFrames: number;
|
|
11
|
+
audioClips: readonly ResolvedAudioClip[];
|
|
12
|
+
embeddedAudioClips: readonly ResolvedAudioClip[];
|
|
13
|
+
transcriptClips: readonly ResolvedTranscriptClip[];
|
|
14
|
+
}
|
|
15
|
+
export interface ResolvedNestedTimelineSource {
|
|
16
|
+
kind: "timeline";
|
|
17
|
+
id: string;
|
|
18
|
+
entry: string;
|
|
19
|
+
durationInFrames: number;
|
|
20
|
+
timeline: ResolvedTimeline;
|
|
21
|
+
}
|
|
22
|
+
export interface ResolvedMediaSource {
|
|
23
|
+
kind: "video" | "image" | "audio";
|
|
24
|
+
src: string;
|
|
25
|
+
absolutePath: string;
|
|
26
|
+
durationInFrames?: number;
|
|
27
|
+
width?: number;
|
|
28
|
+
height?: number;
|
|
29
|
+
hasVideo: boolean;
|
|
30
|
+
hasAudio: boolean;
|
|
31
|
+
}
|
|
32
|
+
export type ResolvedTimelineSource = ResolvedCompositionSource | ResolvedNestedTimelineSource | ResolvedMediaSource;
|
|
33
|
+
export interface ResolvedTimelineClip extends Omit<TimelineClip, "source" | "duration"> {
|
|
34
|
+
source: ResolvedTimelineSource;
|
|
35
|
+
duration: number;
|
|
36
|
+
end: number;
|
|
37
|
+
}
|
|
38
|
+
export interface ResolvedTimeline {
|
|
39
|
+
id: string;
|
|
40
|
+
entry: string;
|
|
41
|
+
name?: string;
|
|
42
|
+
background?: string;
|
|
43
|
+
format: ProjectFormat;
|
|
44
|
+
durationInFrames: number;
|
|
45
|
+
tracks: TimelineTrack[];
|
|
46
|
+
clips: ResolvedTimelineClip[];
|
|
47
|
+
}
|
|
48
|
+
export interface ResolveTimelineResult {
|
|
49
|
+
timeline: ResolvedTimeline | null;
|
|
50
|
+
diagnostics: CompositionDiagnostic[];
|
|
51
|
+
}
|
|
52
|
+
/** Resolves a project timeline, its references, media, and nested timelines. */
|
|
53
|
+
export declare function resolveProjectTimeline(options: {
|
|
54
|
+
project: Project;
|
|
55
|
+
timeline: ProjectTimeline;
|
|
56
|
+
signal?: AbortSignal;
|
|
57
|
+
/** Render-time props overrides keyed by top-level composition clip ID. */
|
|
58
|
+
propsOverrides?: Record<string, unknown>;
|
|
59
|
+
}): Promise<ResolveTimelineResult>;
|
|
60
|
+
//# sourceMappingURL=resolve.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../../src/timeline/resolve.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,qBAAqB,EAErB,mBAAmB,EACnB,qBAAqB,EACrB,iBAAiB,EACjB,sBAAsB,EACvB,MAAM,iBAAiB,CAAC;AAIzB,OAAO,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAE7E,OAAO,EAAyB,KAAK,YAAY,EAAyB,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AAElH,MAAM,WAAW,yBAAyB;IACxC,IAAI,EAAE,aAAa,CAAC;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,mBAAmB,CAAC;IAC9B,UAAU,EAAE,qBAAqB,GAAG,IAAI,CAAC;IACzC,gBAAgB,EAAE,MAAM,CAAC;IACzB,UAAU,EAAE,SAAS,iBAAiB,EAAE,CAAC;IACzC,kBAAkB,EAAE,SAAS,iBAAiB,EAAE,CAAC;IACjD,eAAe,EAAE,SAAS,sBAAsB,EAAE,CAAC;CACpD;AAED,MAAM,WAAW,4BAA4B;IAC3C,IAAI,EAAE,UAAU,CAAC;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,gBAAgB,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,gBAAgB,CAAC;CAC5B;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC;IAClC,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,MAAM,sBAAsB,GAAG,yBAAyB,GAAG,4BAA4B,GAAG,mBAAmB,CAAC;AAEpH,MAAM,WAAW,oBAAqB,SAAQ,IAAI,CAAC,YAAY,EAAE,QAAQ,GAAG,UAAU,CAAC;IACrF,MAAM,EAAE,sBAAsB,CAAC;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,aAAa,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC;IACzB,MAAM,EAAE,aAAa,EAAE,CAAC;IACxB,KAAK,EAAE,oBAAoB,EAAE,CAAC;CAC/B;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAClC,WAAW,EAAE,qBAAqB,EAAE,CAAC;CACtC;AAytBD,gFAAgF;AAChF,wBAAsB,sBAAsB,CAAC,OAAO,EAAE;IACpD,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,eAAe,CAAC;IAC1B,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,0EAA0E;IAC1E,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC1C,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAUjC"}
|
|
@@ -0,0 +1,523 @@
|
|
|
1
|
+
import { readFile, stat } from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { mergeProps } from "../contracts.js";
|
|
4
|
+
import { FrameyardError } from "../errors.js";
|
|
5
|
+
import { validateHtmlComposition } from "../html/validate.js";
|
|
6
|
+
import { probeMedia } from "../renderer/ffmpeg.js";
|
|
7
|
+
import { parseTimelineDocument } from "./schema.js";
|
|
8
|
+
const CONTENT_TYPE_BY_EXTENSION = {
|
|
9
|
+
".mp4": "video",
|
|
10
|
+
".webm": "video",
|
|
11
|
+
".png": "image",
|
|
12
|
+
".jpg": "image",
|
|
13
|
+
".jpeg": "image",
|
|
14
|
+
".webp": "image",
|
|
15
|
+
".wav": "audio",
|
|
16
|
+
".mp3": "audio",
|
|
17
|
+
".m4a": "audio",
|
|
18
|
+
".aac": "audio",
|
|
19
|
+
};
|
|
20
|
+
function diagnosticKey(diagnostic) {
|
|
21
|
+
return JSON.stringify([diagnostic.severity, diagnostic.code, diagnostic.message, diagnostic.details ?? null]);
|
|
22
|
+
}
|
|
23
|
+
function dedupeDiagnostics(diagnostics) {
|
|
24
|
+
const seen = new Set();
|
|
25
|
+
const result = [];
|
|
26
|
+
for (const diagnostic of diagnostics) {
|
|
27
|
+
const key = diagnosticKey(diagnostic);
|
|
28
|
+
if (!seen.has(key)) {
|
|
29
|
+
seen.add(key);
|
|
30
|
+
result.push(diagnostic);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return result;
|
|
34
|
+
}
|
|
35
|
+
function withContext(diagnostic, context) {
|
|
36
|
+
const details = { ...diagnostic.details };
|
|
37
|
+
if (context.timeline !== undefined && details.timeline === undefined) {
|
|
38
|
+
details.timeline = context.timeline;
|
|
39
|
+
}
|
|
40
|
+
if (context.clip !== undefined && details.clip === undefined) {
|
|
41
|
+
details.clip = context.clip;
|
|
42
|
+
}
|
|
43
|
+
if (context.track !== undefined && details.track === undefined) {
|
|
44
|
+
details.track = context.track;
|
|
45
|
+
}
|
|
46
|
+
if (context.composition !== undefined && details.composition === undefined) {
|
|
47
|
+
details.composition = context.composition;
|
|
48
|
+
}
|
|
49
|
+
if (context.nestedTimeline !== undefined && details.nestedTimeline === undefined) {
|
|
50
|
+
details.nestedTimeline = context.nestedTimeline;
|
|
51
|
+
}
|
|
52
|
+
if (context.media !== undefined && details.media === undefined) {
|
|
53
|
+
details.media = context.media;
|
|
54
|
+
}
|
|
55
|
+
if (context.nesting !== undefined && details.nesting === undefined) {
|
|
56
|
+
details.nesting = context.nesting;
|
|
57
|
+
}
|
|
58
|
+
return { ...diagnostic, details };
|
|
59
|
+
}
|
|
60
|
+
function addError(diagnostics, code, message, details) {
|
|
61
|
+
diagnostics.push({ severity: "error", code, message, details });
|
|
62
|
+
}
|
|
63
|
+
function addWarning(diagnostics, message, details) {
|
|
64
|
+
diagnostics.push({ severity: "warning", code: "TIMELINE_WARNING", message, details });
|
|
65
|
+
}
|
|
66
|
+
function jsonErrorLocation(source, error) {
|
|
67
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
68
|
+
const explicit = /line (\d+) column (\d+)/i.exec(message);
|
|
69
|
+
if (explicit) {
|
|
70
|
+
return { line: Number(explicit[1]), column: Number(explicit[2]) };
|
|
71
|
+
}
|
|
72
|
+
const position = /position (\d+)/i.exec(message);
|
|
73
|
+
if (!position) {
|
|
74
|
+
return undefined;
|
|
75
|
+
}
|
|
76
|
+
const offset = Number(position[1]);
|
|
77
|
+
const before = source.slice(0, offset);
|
|
78
|
+
const lines = before.split(/\r?\n/);
|
|
79
|
+
return { line: lines.length, column: (lines.at(-1)?.length ?? 0) + 1 };
|
|
80
|
+
}
|
|
81
|
+
function contains(root, candidate) {
|
|
82
|
+
return candidate === root || candidate.startsWith(root + path.sep);
|
|
83
|
+
}
|
|
84
|
+
function mediaKindFromExtension(src) {
|
|
85
|
+
return CONTENT_TYPE_BY_EXTENSION[path.extname(src).toLowerCase()];
|
|
86
|
+
}
|
|
87
|
+
function numberFrom(value) {
|
|
88
|
+
const parsed = typeof value === "number" ? value : Number(value);
|
|
89
|
+
return Number.isFinite(parsed) && parsed > 0 ? parsed : undefined;
|
|
90
|
+
}
|
|
91
|
+
async function probeMediaCached(absolutePath, cache, signal) {
|
|
92
|
+
const cached = cache.get(absolutePath);
|
|
93
|
+
if (cached) {
|
|
94
|
+
return cached;
|
|
95
|
+
}
|
|
96
|
+
try {
|
|
97
|
+
const probe = await probeMedia(absolutePath, { signal });
|
|
98
|
+
const entry = { probe };
|
|
99
|
+
cache.set(absolutePath, entry);
|
|
100
|
+
return entry;
|
|
101
|
+
}
|
|
102
|
+
catch (error) {
|
|
103
|
+
const entry = {
|
|
104
|
+
error: error instanceof FrameyardError ? error.message : error instanceof Error ? error.message : String(error),
|
|
105
|
+
};
|
|
106
|
+
cache.set(absolutePath, entry);
|
|
107
|
+
return entry;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
async function resolveMediaSource(options) {
|
|
111
|
+
const { project, timelineId, clip, diagnostics, probeCache } = options;
|
|
112
|
+
const source = clip.source;
|
|
113
|
+
if (source.kind !== "video" && source.kind !== "image" && source.kind !== "audio") {
|
|
114
|
+
return null;
|
|
115
|
+
}
|
|
116
|
+
const details = {
|
|
117
|
+
timeline: timelineId,
|
|
118
|
+
clip: clip.id,
|
|
119
|
+
track: clip.track,
|
|
120
|
+
media: source.src,
|
|
121
|
+
};
|
|
122
|
+
if (sourceInDetails(clip)) {
|
|
123
|
+
details.sourceFrame = clip.sourceIn;
|
|
124
|
+
}
|
|
125
|
+
const absolutePath = path.resolve(project.root, source.src);
|
|
126
|
+
if (!contains(project.root, absolutePath)) {
|
|
127
|
+
addError(diagnostics, "TIMELINE_MEDIA_INVALID", `Media path escapes the project root: ${source.src}`, details);
|
|
128
|
+
return null;
|
|
129
|
+
}
|
|
130
|
+
let fileStat;
|
|
131
|
+
try {
|
|
132
|
+
fileStat = await stat(absolutePath);
|
|
133
|
+
}
|
|
134
|
+
catch {
|
|
135
|
+
addError(diagnostics, "TIMELINE_MEDIA_INVALID", `Media file does not exist: ${source.src}`, details);
|
|
136
|
+
return null;
|
|
137
|
+
}
|
|
138
|
+
if (!fileStat.isFile()) {
|
|
139
|
+
addError(diagnostics, "TIMELINE_MEDIA_INVALID", `Media path is not a file: ${source.src}`, details);
|
|
140
|
+
return null;
|
|
141
|
+
}
|
|
142
|
+
const extensionKind = mediaKindFromExtension(source.src);
|
|
143
|
+
if (extensionKind &&
|
|
144
|
+
((source.kind === "audio" && extensionKind === "image") ||
|
|
145
|
+
(source.kind !== "audio" && extensionKind !== source.kind))) {
|
|
146
|
+
addError(diagnostics, "TIMELINE_MEDIA_INVALID", `Clip source kind "${source.kind}" does not match the media extension for ${source.src}.`, details);
|
|
147
|
+
return null;
|
|
148
|
+
}
|
|
149
|
+
const probed = await probeMediaCached(absolutePath, probeCache, options.signal);
|
|
150
|
+
if (!probed.probe) {
|
|
151
|
+
addError(diagnostics, "TIMELINE_MEDIA_INVALID", `Could not inspect media ${source.src}: ${probed.error ?? "unknown error"}`, details);
|
|
152
|
+
return null;
|
|
153
|
+
}
|
|
154
|
+
const streams = probed.probe.streams;
|
|
155
|
+
const videoStream = streams.find((stream) => stream.codec_type === "video");
|
|
156
|
+
const audioStream = streams.find((stream) => stream.codec_type === "audio");
|
|
157
|
+
const hasVideo = Boolean(videoStream);
|
|
158
|
+
const hasAudio = Boolean(audioStream);
|
|
159
|
+
const width = videoStream?.width;
|
|
160
|
+
const height = videoStream?.height;
|
|
161
|
+
if (source.kind === "video" && !hasVideo) {
|
|
162
|
+
addError(diagnostics, "TIMELINE_MEDIA_INVALID", `Video source has no video stream: ${source.src}`, details);
|
|
163
|
+
return null;
|
|
164
|
+
}
|
|
165
|
+
if (source.kind === "image" && !hasVideo) {
|
|
166
|
+
addError(diagnostics, "TIMELINE_MEDIA_INVALID", `Image source has no image stream: ${source.src}`, details);
|
|
167
|
+
return null;
|
|
168
|
+
}
|
|
169
|
+
if (source.kind === "audio" && !hasAudio) {
|
|
170
|
+
addError(diagnostics, "TIMELINE_MEDIA_INVALID", `Audio source has no audio stream: ${source.src}`, details);
|
|
171
|
+
return null;
|
|
172
|
+
}
|
|
173
|
+
if (source.kind === "video" && !hasAudio) {
|
|
174
|
+
addWarning(diagnostics, `Video ${source.src} has no audio stream; its audio was not mixed.`, details);
|
|
175
|
+
}
|
|
176
|
+
if (source.kind === "image") {
|
|
177
|
+
return {
|
|
178
|
+
kind: "image",
|
|
179
|
+
src: source.src,
|
|
180
|
+
absolutePath,
|
|
181
|
+
...(width !== undefined ? { width } : {}),
|
|
182
|
+
...(height !== undefined ? { height } : {}),
|
|
183
|
+
hasVideo,
|
|
184
|
+
hasAudio,
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
const durationSeconds = numberFrom(probed.probe.format?.duration) ??
|
|
188
|
+
Math.max(0, ...streams
|
|
189
|
+
.filter((stream) => stream.codec_type === (source.kind === "audio" ? "audio" : "video"))
|
|
190
|
+
.map((stream) => numberFrom(stream.duration) ?? 0));
|
|
191
|
+
if (!durationSeconds || durationSeconds <= 0) {
|
|
192
|
+
addError(diagnostics, "TIMELINE_MEDIA_INVALID", `Media duration could not be determined: ${source.src}`, details);
|
|
193
|
+
return null;
|
|
194
|
+
}
|
|
195
|
+
const durationInFrames = Math.max(1, Math.floor(durationSeconds * project.format.fps + 1e-6));
|
|
196
|
+
return {
|
|
197
|
+
kind: source.kind,
|
|
198
|
+
src: source.src,
|
|
199
|
+
absolutePath,
|
|
200
|
+
durationInFrames,
|
|
201
|
+
...(width !== undefined ? { width } : {}),
|
|
202
|
+
...(height !== undefined ? { height } : {}),
|
|
203
|
+
hasVideo,
|
|
204
|
+
hasAudio,
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
function sourceInDetails(clip) {
|
|
208
|
+
return clip.sourceIn > 0;
|
|
209
|
+
}
|
|
210
|
+
async function resolveCompositionSource(options) {
|
|
211
|
+
const { project, timelineId, clip, sourceId, diagnostics, cache, nesting } = options;
|
|
212
|
+
const composition = project.compositions.get(sourceId);
|
|
213
|
+
const details = {
|
|
214
|
+
timeline: timelineId,
|
|
215
|
+
clip: clip.id,
|
|
216
|
+
track: clip.track,
|
|
217
|
+
composition: sourceId,
|
|
218
|
+
nesting,
|
|
219
|
+
};
|
|
220
|
+
if (!composition) {
|
|
221
|
+
addError(diagnostics, "TIMELINE_REFERENCE_NOT_FOUND", `Composition "${sourceId}" is not listed in video.config.js.`, details);
|
|
222
|
+
return null;
|
|
223
|
+
}
|
|
224
|
+
const propsKey = JSON.stringify(clip.props ?? null);
|
|
225
|
+
const cacheKey = `${composition.entry}\u0000${propsKey}`;
|
|
226
|
+
let validation = cache.get(cacheKey);
|
|
227
|
+
if (!validation) {
|
|
228
|
+
validation = await validateHtmlComposition({
|
|
229
|
+
projectRoot: project.root,
|
|
230
|
+
entry: composition.entry,
|
|
231
|
+
...(clip.props !== undefined ? { props: clip.props } : {}),
|
|
232
|
+
});
|
|
233
|
+
cache.set(cacheKey, validation);
|
|
234
|
+
}
|
|
235
|
+
for (const diagnostic of validation.diagnostics) {
|
|
236
|
+
diagnostics.push(withContext(diagnostic, {
|
|
237
|
+
timeline: timelineId,
|
|
238
|
+
clip: clip.id,
|
|
239
|
+
track: clip.track,
|
|
240
|
+
composition: sourceId,
|
|
241
|
+
nesting,
|
|
242
|
+
}));
|
|
243
|
+
}
|
|
244
|
+
if (!validation.info) {
|
|
245
|
+
addError(diagnostics, "TIMELINE_CLIP_INVALID", `Composition "${sourceId}" could not be loaded for clip "${clip.id}".`, details);
|
|
246
|
+
return null;
|
|
247
|
+
}
|
|
248
|
+
if (validation.info.metadata.fps !== project.format?.fps) {
|
|
249
|
+
addError(diagnostics, "TIMELINE_FPS_MISMATCH", `Composition "${sourceId}" runs at ${validation.info.metadata.fps} fps, but the project format is ${project.format?.fps} fps.`, details);
|
|
250
|
+
}
|
|
251
|
+
return {
|
|
252
|
+
kind: "composition",
|
|
253
|
+
id: sourceId,
|
|
254
|
+
entry: composition.entry,
|
|
255
|
+
metadata: validation.info.metadata,
|
|
256
|
+
controller: validation.info.controller,
|
|
257
|
+
durationInFrames: validation.info.metadata.durationInFrames,
|
|
258
|
+
audioClips: validation.info.audioClips,
|
|
259
|
+
embeddedAudioClips: validation.info.embeddedAudioClips,
|
|
260
|
+
transcriptClips: validation.info.transcriptClips,
|
|
261
|
+
};
|
|
262
|
+
}
|
|
263
|
+
async function resolveTimelineSource(options) {
|
|
264
|
+
const { project, clip, sourceId, diagnostics, context, signal, probeCache, compositionCache } = options;
|
|
265
|
+
const nested = project.timelines.get(sourceId);
|
|
266
|
+
const details = {
|
|
267
|
+
timeline: context.timelineId,
|
|
268
|
+
clip: clip.id,
|
|
269
|
+
track: clip.track,
|
|
270
|
+
nestedTimeline: sourceId,
|
|
271
|
+
nesting: context.nesting,
|
|
272
|
+
};
|
|
273
|
+
if (!nested) {
|
|
274
|
+
addError(diagnostics, "TIMELINE_REFERENCE_NOT_FOUND", `Timeline "${sourceId}" is not listed in video.config.js.`, details);
|
|
275
|
+
return null;
|
|
276
|
+
}
|
|
277
|
+
if (context.stack.includes(sourceId)) {
|
|
278
|
+
addError(diagnostics, "TIMELINE_CYCLE", `Timeline cycle detected: ${[...context.stack, sourceId].join(" → ")}.`, details);
|
|
279
|
+
return null;
|
|
280
|
+
}
|
|
281
|
+
const nestedResult = await resolveTimelineInternal({
|
|
282
|
+
project,
|
|
283
|
+
timeline: nested,
|
|
284
|
+
context: {
|
|
285
|
+
timelineId: sourceId,
|
|
286
|
+
stack: [...context.stack, sourceId],
|
|
287
|
+
nesting: [...context.nesting, clip.id],
|
|
288
|
+
},
|
|
289
|
+
...(signal ? { signal } : {}),
|
|
290
|
+
probeCache,
|
|
291
|
+
compositionCache,
|
|
292
|
+
});
|
|
293
|
+
for (const diagnostic of nestedResult.diagnostics) {
|
|
294
|
+
diagnostics.push(diagnostic);
|
|
295
|
+
}
|
|
296
|
+
if (!nestedResult.timeline) {
|
|
297
|
+
addError(diagnostics, "TIMELINE_CLIP_INVALID", `Nested timeline "${sourceId}" could not be resolved for clip "${clip.id}".`, details);
|
|
298
|
+
return null;
|
|
299
|
+
}
|
|
300
|
+
return {
|
|
301
|
+
kind: "timeline",
|
|
302
|
+
id: sourceId,
|
|
303
|
+
entry: nested.entry,
|
|
304
|
+
durationInFrames: nestedResult.timeline.durationInFrames,
|
|
305
|
+
timeline: nestedResult.timeline,
|
|
306
|
+
};
|
|
307
|
+
}
|
|
308
|
+
async function resolveClipSource(options) {
|
|
309
|
+
const { project, clip, diagnostics, context, signal, probeCache, compositionCache } = options;
|
|
310
|
+
const source = clip.source;
|
|
311
|
+
if (source.kind === "composition") {
|
|
312
|
+
return resolveCompositionSource({
|
|
313
|
+
project,
|
|
314
|
+
timelineId: context.timelineId,
|
|
315
|
+
clip,
|
|
316
|
+
sourceId: source.id,
|
|
317
|
+
diagnostics,
|
|
318
|
+
cache: compositionCache,
|
|
319
|
+
nesting: context.nesting,
|
|
320
|
+
});
|
|
321
|
+
}
|
|
322
|
+
if (source.kind === "timeline") {
|
|
323
|
+
return resolveTimelineSource({
|
|
324
|
+
project,
|
|
325
|
+
clip,
|
|
326
|
+
sourceId: source.id,
|
|
327
|
+
diagnostics,
|
|
328
|
+
context,
|
|
329
|
+
...(signal ? { signal } : {}),
|
|
330
|
+
probeCache,
|
|
331
|
+
compositionCache,
|
|
332
|
+
});
|
|
333
|
+
}
|
|
334
|
+
return resolveMediaSource({
|
|
335
|
+
project,
|
|
336
|
+
timelineId: context.timelineId,
|
|
337
|
+
clip,
|
|
338
|
+
diagnostics,
|
|
339
|
+
probeCache,
|
|
340
|
+
...(signal ? { signal } : {}),
|
|
341
|
+
});
|
|
342
|
+
}
|
|
343
|
+
async function readTimelineDocument(timeline, diagnostics, context) {
|
|
344
|
+
let source;
|
|
345
|
+
try {
|
|
346
|
+
source = await readFile(timeline.absoluteEntry, "utf8");
|
|
347
|
+
}
|
|
348
|
+
catch {
|
|
349
|
+
addError(diagnostics, "TIMELINE_NOT_FOUND", `Timeline document does not exist: ${timeline.entry}`, {
|
|
350
|
+
path: timeline.entry,
|
|
351
|
+
timeline: timeline.id,
|
|
352
|
+
nesting: context.nesting,
|
|
353
|
+
});
|
|
354
|
+
return null;
|
|
355
|
+
}
|
|
356
|
+
let value;
|
|
357
|
+
try {
|
|
358
|
+
value = JSON.parse(source);
|
|
359
|
+
}
|
|
360
|
+
catch (error) {
|
|
361
|
+
const location = jsonErrorLocation(source, error);
|
|
362
|
+
addError(diagnostics, "TIMELINE_INVALID", `Could not parse timeline JSON: ${error instanceof Error ? error.message : String(error)}`, {
|
|
363
|
+
path: timeline.entry,
|
|
364
|
+
timeline: timeline.id,
|
|
365
|
+
nesting: context.nesting,
|
|
366
|
+
...(location ? { line: location.line, column: location.column } : {}),
|
|
367
|
+
});
|
|
368
|
+
return null;
|
|
369
|
+
}
|
|
370
|
+
const parsed = parseTimelineDocument(value, { path: timeline.entry, timeline: timeline.id });
|
|
371
|
+
for (const diagnostic of parsed.diagnostics) {
|
|
372
|
+
diagnostics.push(withContext(diagnostic, { nesting: context.nesting }));
|
|
373
|
+
}
|
|
374
|
+
return parsed.timeline;
|
|
375
|
+
}
|
|
376
|
+
function resolveClipDuration(clip, source, diagnostics, timelineId, nesting) {
|
|
377
|
+
const details = {
|
|
378
|
+
timeline: timelineId,
|
|
379
|
+
clip: clip.id,
|
|
380
|
+
track: clip.track,
|
|
381
|
+
nesting,
|
|
382
|
+
jsonPath: "$.clips",
|
|
383
|
+
};
|
|
384
|
+
const sourceDuration = source.kind === "image" ? undefined : source.durationInFrames;
|
|
385
|
+
if (clip.duration === undefined) {
|
|
386
|
+
if (sourceDuration === undefined) {
|
|
387
|
+
addError(diagnostics, "TIMELINE_CLIP_OUT_OF_RANGE", `Clip "${clip.id}" needs an explicit duration because its source has no duration.`, details);
|
|
388
|
+
return null;
|
|
389
|
+
}
|
|
390
|
+
const remaining = sourceDuration - clip.sourceIn;
|
|
391
|
+
if (remaining <= 0) {
|
|
392
|
+
addError(diagnostics, "TIMELINE_CLIP_OUT_OF_RANGE", `Clip "${clip.id}" starts at source frame ${clip.sourceIn}, beyond the source duration ${sourceDuration}.`, details);
|
|
393
|
+
return null;
|
|
394
|
+
}
|
|
395
|
+
return remaining;
|
|
396
|
+
}
|
|
397
|
+
if (sourceDuration !== undefined && clip.sourceIn + clip.duration > sourceDuration) {
|
|
398
|
+
addError(diagnostics, "TIMELINE_CLIP_OUT_OF_RANGE", `Clip "${clip.id}" uses source frames ${clip.sourceIn}..${clip.sourceIn + clip.duration}, beyond the source duration ${sourceDuration}.`, details);
|
|
399
|
+
return null;
|
|
400
|
+
}
|
|
401
|
+
return clip.duration;
|
|
402
|
+
}
|
|
403
|
+
async function resolveTimelineInternal(options) {
|
|
404
|
+
const { project, timeline, context, signal, probeCache, compositionCache, propsOverrides } = options;
|
|
405
|
+
const diagnostics = [];
|
|
406
|
+
const document = await readTimelineDocument(timeline, diagnostics, context);
|
|
407
|
+
if (!document) {
|
|
408
|
+
return { timeline: null, diagnostics: dedupeDiagnostics(diagnostics) };
|
|
409
|
+
}
|
|
410
|
+
if (!project.format) {
|
|
411
|
+
addError(diagnostics, "TIMELINE_INVALID", "A project format is required to resolve timelines.", {
|
|
412
|
+
path: timeline.entry,
|
|
413
|
+
timeline: timeline.id,
|
|
414
|
+
nesting: context.nesting,
|
|
415
|
+
});
|
|
416
|
+
return { timeline: null, diagnostics: dedupeDiagnostics(diagnostics) };
|
|
417
|
+
}
|
|
418
|
+
const clips = [];
|
|
419
|
+
const usedOverrides = new Set();
|
|
420
|
+
for (const rawClip of document.clips) {
|
|
421
|
+
let clip = rawClip;
|
|
422
|
+
if (propsOverrides && rawClip.source.kind === "composition" && propsOverrides[rawClip.id] !== undefined) {
|
|
423
|
+
try {
|
|
424
|
+
const merged = mergeProps(rawClip.props, propsOverrides[rawClip.id]);
|
|
425
|
+
clip = { ...rawClip, props: merged };
|
|
426
|
+
usedOverrides.add(rawClip.id);
|
|
427
|
+
}
|
|
428
|
+
catch (error) {
|
|
429
|
+
addError(diagnostics, "PROPS_INVALID", `Props override for clip "${rawClip.id}" is invalid: ${error instanceof Error ? error.message : String(error)}`, { timeline: timeline.id, clip: rawClip.id, track: rawClip.track, nesting: context.nesting });
|
|
430
|
+
continue;
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
const clipDiagnostics = [];
|
|
434
|
+
const source = await resolveClipSource({
|
|
435
|
+
project,
|
|
436
|
+
clip,
|
|
437
|
+
diagnostics: clipDiagnostics,
|
|
438
|
+
context,
|
|
439
|
+
...(signal ? { signal } : {}),
|
|
440
|
+
probeCache,
|
|
441
|
+
compositionCache,
|
|
442
|
+
});
|
|
443
|
+
diagnostics.push(...clipDiagnostics);
|
|
444
|
+
if (!source) {
|
|
445
|
+
continue;
|
|
446
|
+
}
|
|
447
|
+
const duration = resolveClipDuration(clip, source, diagnostics, context.timelineId, context.nesting);
|
|
448
|
+
if (duration === null) {
|
|
449
|
+
continue;
|
|
450
|
+
}
|
|
451
|
+
clips.push({
|
|
452
|
+
...clip,
|
|
453
|
+
source,
|
|
454
|
+
duration,
|
|
455
|
+
end: clip.start + duration,
|
|
456
|
+
});
|
|
457
|
+
}
|
|
458
|
+
if (propsOverrides) {
|
|
459
|
+
for (const key of Object.keys(propsOverrides)) {
|
|
460
|
+
if (!usedOverrides.has(key)) {
|
|
461
|
+
addError(diagnostics, "PROPS_INVALID", `Props override targets "${key}", which is not a composition clip in this timeline.`, { timeline: timeline.id, clip: key, nesting: context.nesting });
|
|
462
|
+
}
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
const maxEnd = clips.reduce((end, clip) => Math.max(end, clip.end), 0);
|
|
466
|
+
const durationInFrames = document.durationInFrames ?? maxEnd;
|
|
467
|
+
if (document.durationInFrames !== undefined && document.durationInFrames < maxEnd) {
|
|
468
|
+
addError(diagnostics, "TIMELINE_DURATION_INVALID", `Timeline durationInFrames ${document.durationInFrames} is shorter than the resolved clip end ${maxEnd}.`, { timeline: timeline.id, nesting: context.nesting, jsonPath: "$.durationInFrames" });
|
|
469
|
+
}
|
|
470
|
+
for (const track of document.tracks) {
|
|
471
|
+
const trackClips = clips.filter((clip) => clip.track === track.id).sort((left, right) => left.start - right.start);
|
|
472
|
+
for (let index = 1; index < trackClips.length; index += 1) {
|
|
473
|
+
const previous = trackClips[index - 1];
|
|
474
|
+
const current = trackClips[index];
|
|
475
|
+
if (current.start < previous.end) {
|
|
476
|
+
addError(diagnostics, "TIMELINE_CLIP_OVERLAP", `Clip "${current.id}" overlaps "${previous.id}" on track "${track.id}".`, {
|
|
477
|
+
timeline: timeline.id,
|
|
478
|
+
track: track.id,
|
|
479
|
+
clip: current.id,
|
|
480
|
+
nesting: context.nesting,
|
|
481
|
+
suggestion: "No two clips on one track may overlap in 0.6.",
|
|
482
|
+
});
|
|
483
|
+
}
|
|
484
|
+
}
|
|
485
|
+
}
|
|
486
|
+
if (clips.length === 0) {
|
|
487
|
+
addError(diagnostics, "TIMELINE_INVALID", "Timeline has no resolvable clips.", {
|
|
488
|
+
path: timeline.entry,
|
|
489
|
+
timeline: timeline.id,
|
|
490
|
+
nesting: context.nesting,
|
|
491
|
+
});
|
|
492
|
+
}
|
|
493
|
+
const uniqueDiagnostics = dedupeDiagnostics(diagnostics);
|
|
494
|
+
if (uniqueDiagnostics.some((diagnostic) => diagnostic.severity === "error")) {
|
|
495
|
+
return { timeline: null, diagnostics: uniqueDiagnostics };
|
|
496
|
+
}
|
|
497
|
+
return {
|
|
498
|
+
timeline: {
|
|
499
|
+
id: timeline.id,
|
|
500
|
+
entry: timeline.entry,
|
|
501
|
+
...(document.name !== undefined ? { name: document.name } : {}),
|
|
502
|
+
...(document.background !== undefined ? { background: document.background } : {}),
|
|
503
|
+
format: project.format,
|
|
504
|
+
durationInFrames,
|
|
505
|
+
tracks: document.tracks,
|
|
506
|
+
clips,
|
|
507
|
+
},
|
|
508
|
+
diagnostics: uniqueDiagnostics,
|
|
509
|
+
};
|
|
510
|
+
}
|
|
511
|
+
/** Resolves a project timeline, its references, media, and nested timelines. */
|
|
512
|
+
export async function resolveProjectTimeline(options) {
|
|
513
|
+
return resolveTimelineInternal({
|
|
514
|
+
project: options.project,
|
|
515
|
+
timeline: options.timeline,
|
|
516
|
+
context: { timelineId: options.timeline.id, stack: [options.timeline.id], nesting: [] },
|
|
517
|
+
...(options.signal ? { signal: options.signal } : {}),
|
|
518
|
+
...(options.propsOverrides ? { propsOverrides: options.propsOverrides } : {}),
|
|
519
|
+
probeCache: new Map(),
|
|
520
|
+
compositionCache: new Map(),
|
|
521
|
+
});
|
|
522
|
+
}
|
|
523
|
+
//# sourceMappingURL=resolve.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve.js","sourceRoot":"","sources":["../../src/timeline/resolve.ts"],"names":[],"mappings":"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"}
|