@clipwright/core 0.26.1 → 0.27.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 +49 -0
- package/README.md +5 -0
- package/dist/api-failure.d.ts +21 -1
- package/dist/api-failure.js +38 -1
- package/dist/api-failure.js.map +1 -1
- package/dist/edit-document.d.ts +335 -0
- package/dist/edit-document.js +110 -0
- package/dist/edit-document.js.map +1 -0
- package/dist/edit-faceless.d.ts +24 -0
- package/dist/edit-faceless.js +39 -0
- package/dist/edit-faceless.js.map +1 -0
- package/dist/edit-operations.d.ts +34 -0
- package/dist/edit-operations.js +13 -0
- package/dist/edit-operations.js.map +1 -0
- package/dist/edit-primitives.d.ts +8 -0
- package/dist/edit-primitives.js +12 -0
- package/dist/edit-primitives.js.map +1 -0
- package/dist/edit-rules.d.ts +60 -0
- package/dist/edit-rules.js +44 -0
- package/dist/edit-rules.js.map +1 -0
- package/dist/edit-shots.d.ts +548 -0
- package/dist/edit-shots.js +61 -0
- package/dist/edit-shots.js.map +1 -0
- package/dist/edit-validate.d.ts +57 -0
- package/dist/edit-validate.js +248 -0
- package/dist/edit-validate.js.map +1 -0
- package/dist/edit.d.ts +6 -0
- package/dist/edit.js +8 -0
- package/dist/edit.js.map +1 -0
- package/dist/endpoints.d.ts +5 -0
- package/dist/endpoints.js +33 -19
- package/dist/endpoints.js.map +1 -1
- package/dist/errors.d.ts +30 -0
- package/dist/errors.js +42 -0
- package/dist/errors.js.map +1 -1
- package/dist/faceless-media-record.d.ts +100 -0
- package/dist/faceless-media-record.js +25 -0
- package/dist/faceless-media-record.js.map +1 -0
- package/dist/faceless-public-plan.d.ts +1 -0
- package/dist/faceless-public-plan.js +2 -1
- package/dist/faceless-public-plan.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/uploads.d.ts +4 -2
- package/dist/uploads.js +5 -3
- package/dist/uploads.js.map +1 -1
- package/package.json +5 -1
- package/dist/__fixtures__/queue-promises.d.ts +0 -8
- package/dist/__fixtures__/queue-promises.js +0 -22
- package/dist/__fixtures__/queue-promises.js.map +0 -1
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { shotOperation } from "./edit-operations.js";
|
|
3
|
+
import { frame, shotId } from "./edit-primitives.js";
|
|
4
|
+
import { EDIT_MAX_DISCARDED, EDIT_MAX_SHOTS, SHOT_KINDS, SHOT_TRACKS } from "./edit-rules.js";
|
|
5
|
+
import { EDIT_ISSUE_CODES } from "./edit-validate.js";
|
|
6
|
+
import { runId } from "./runs.js";
|
|
7
|
+
import { uploadId } from "./uploads.js";
|
|
8
|
+
/** Where a shot's media comes from: the source run, a kept candidate, an upload, or a generation to pay for. */
|
|
9
|
+
export const editAsset = z.discriminatedUnion("from", [
|
|
10
|
+
z.strictObject({ from: z.literal("source"), shot_id: shotId }),
|
|
11
|
+
z.strictObject({ from: z.literal("candidate"), run_id: runId }),
|
|
12
|
+
z.strictObject({ from: z.literal("upload"), upload_id: uploadId }),
|
|
13
|
+
z.strictObject({ from: z.literal("generate"), operation: shotOperation }),
|
|
14
|
+
]);
|
|
15
|
+
export const editShot = z.strictObject({
|
|
16
|
+
id: shotId, track: z.enum(SHOT_TRACKS), kind: z.enum(SHOT_KINDS),
|
|
17
|
+
start_frame: frame, end_frame: frame.positive(),
|
|
18
|
+
media_offset_frames: frame.optional(),
|
|
19
|
+
asset: editAsset,
|
|
20
|
+
});
|
|
21
|
+
/** The whole timeline a revision asks for, written against one source run. */
|
|
22
|
+
export const editDocument = z.strictObject({
|
|
23
|
+
v: z.literal(1), source_run_id: runId,
|
|
24
|
+
timebase: z.strictObject({ fps: z.number().int().positive() }),
|
|
25
|
+
duration_frames: z.number().int().positive().safe(),
|
|
26
|
+
shots: z.array(editShot).min(1).max(EDIT_MAX_SHOTS),
|
|
27
|
+
discarded: z.array(runId).max(EDIT_MAX_DISCARDED).default([]),
|
|
28
|
+
});
|
|
29
|
+
/** The most a stored draft's document weighs, in bytes of its JSON; the table's check states the same number. */
|
|
30
|
+
export const EDIT_DOCUMENT_MAX_BYTES = 256_000;
|
|
31
|
+
/** The JSON a document is stored as and its length in bytes: the one place either is computed. */
|
|
32
|
+
export function serializeEditDocument(document) {
|
|
33
|
+
const json = JSON.stringify(document);
|
|
34
|
+
return { json, bytes: new TextEncoder().encode(json).length };
|
|
35
|
+
}
|
|
36
|
+
const customIssue = "custom";
|
|
37
|
+
/** A save of the draft: the whole document and the version it was written against, 0 when no draft was read. */
|
|
38
|
+
export const saveRunEdit = z.strictObject({
|
|
39
|
+
base_version: z.number().int().nonnegative(),
|
|
40
|
+
document: editDocument,
|
|
41
|
+
}).superRefine((save, context) => {
|
|
42
|
+
const { bytes } = serializeEditDocument(save.document);
|
|
43
|
+
if (bytes > EDIT_DOCUMENT_MAX_BYTES) {
|
|
44
|
+
context.addIssue({ code: customIssue, path: ["document"],
|
|
45
|
+
message: `the document is ${bytes} bytes as stored; a draft holds at most ${EDIT_DOCUMENT_MAX_BYTES}` });
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
const editIssue = z.object({
|
|
49
|
+
code: z.enum(EDIT_ISSUE_CODES), shot_id: z.string().optional(), from_frame: frame.optional(), to_frame: frame.optional(),
|
|
50
|
+
message: z.string().min(1),
|
|
51
|
+
});
|
|
52
|
+
/** The draft of a run's edit. Version 0 is a run with nothing stored: its document changes nothing. */
|
|
53
|
+
export const runEdit = z.object({
|
|
54
|
+
run_id: runId,
|
|
55
|
+
version: z.number().int().nonnegative(),
|
|
56
|
+
document: editDocument,
|
|
57
|
+
/** What the rules of the run refuse in the document; a draft is stored with them. */
|
|
58
|
+
issues: z.array(editIssue),
|
|
59
|
+
updated_at: z.string().datetime().nullable(),
|
|
60
|
+
});
|
|
61
|
+
// What installed clients parse. A save sends the document back, so a key the client does not know is kept at every level.
|
|
62
|
+
const editShotRead = z.looseObject({
|
|
63
|
+
id: shotId, track: z.string(), kind: z.string(),
|
|
64
|
+
start_frame: frame, end_frame: frame.positive(),
|
|
65
|
+
media_offset_frames: frame.optional(),
|
|
66
|
+
asset: z.looseObject({ from: z.string() }),
|
|
67
|
+
});
|
|
68
|
+
/** The document as a client reads it: kind, track, asset source and operation are open, and no limit of a save applies. */
|
|
69
|
+
export const editDocumentRead = z.looseObject({
|
|
70
|
+
v: z.literal(1), source_run_id: runId,
|
|
71
|
+
timebase: z.looseObject({ fps: z.number().int().positive() }),
|
|
72
|
+
duration_frames: z.number().int().positive().safe(),
|
|
73
|
+
shots: z.array(editShotRead),
|
|
74
|
+
discarded: z.array(runId).default([]),
|
|
75
|
+
});
|
|
76
|
+
/** The draft as a client reads it: the code of an issue is an open string. */
|
|
77
|
+
export const runEditRead = runEdit.extend({
|
|
78
|
+
document: editDocumentRead,
|
|
79
|
+
issues: z.array(editIssue.extend({ code: z.string() })),
|
|
80
|
+
});
|
|
81
|
+
/** The path of a run's draft. The id is encoded, since it comes from the caller. */
|
|
82
|
+
export const runEditPath = (id) => `/v1/runs/${encodeURIComponent(id)}/edit`;
|
|
83
|
+
/** The document that changes nothing: every shot of the view on its own source asset. */
|
|
84
|
+
export function identityEditDocument(shots) {
|
|
85
|
+
return {
|
|
86
|
+
v: 1, source_run_id: shots.run_id, timebase: { fps: shots.timebase.fps }, duration_frames: shots.duration_frames,
|
|
87
|
+
shots: shots.tracks.flatMap(track => track.shots.map((shot) => ({
|
|
88
|
+
id: shot.id, track: shot.track, kind: shot.kind, start_frame: shot.start_frame, end_frame: shot.end_frame,
|
|
89
|
+
...(shot.media_offset_frames === null ? {} : { media_offset_frames: shot.media_offset_frames }),
|
|
90
|
+
asset: { from: "source", shot_id: shot.id },
|
|
91
|
+
}))),
|
|
92
|
+
discarded: [],
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
/** Replaces only the asset of each named shot with a generation; spans and every other shot stay. */
|
|
96
|
+
export function applyShotChanges(document, changes) {
|
|
97
|
+
const operations = new Map();
|
|
98
|
+
for (const change of changes) {
|
|
99
|
+
if (operations.has(change.shot_id))
|
|
100
|
+
throw new Error(`shot ${change.shot_id} is named twice`);
|
|
101
|
+
if (!document.shots.some(shot => shot.id === change.shot_id))
|
|
102
|
+
throw new Error(`unknown shot ${change.shot_id}`);
|
|
103
|
+
operations.set(change.shot_id, change.operation);
|
|
104
|
+
}
|
|
105
|
+
return { ...document, shots: document.shots.map((shot) => {
|
|
106
|
+
const operation = operations.get(shot.id);
|
|
107
|
+
return operation ? { ...shot, asset: { from: "generate", operation } } : shot;
|
|
108
|
+
}) };
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=edit-document.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"edit-document.js","sourceRoot":"","sources":["../src/edit-document.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { PlannedRunShots } from "./edit-shots.js";
|
|
2
|
+
import type { FacelessPublicPlan } from "./faceless-public-plan.js";
|
|
3
|
+
export interface FacelessShotsContext {
|
|
4
|
+
runId: string;
|
|
5
|
+
editable: PlannedRunShots["editable"];
|
|
6
|
+
lineage: PlannedRunShots["lineage"];
|
|
7
|
+
paidEdits: PlannedRunShots["paid_edits"];
|
|
8
|
+
pricing: PlannedRunShots["pricing"];
|
|
9
|
+
captions: boolean | null;
|
|
10
|
+
contractVersion: string;
|
|
11
|
+
/** What this reader may see: a closed side is nulled in the view and named in `withheld`. */
|
|
12
|
+
exposure: {
|
|
13
|
+
descriptions: boolean;
|
|
14
|
+
source_media: boolean;
|
|
15
|
+
};
|
|
16
|
+
/** By shot id; `null` when the run's media record is gone. */
|
|
17
|
+
media: ReadonlyMap<string, {
|
|
18
|
+
source: "generated" | "customer";
|
|
19
|
+
previewUrl: string | null;
|
|
20
|
+
mediaFrames: number | null;
|
|
21
|
+
}> | null;
|
|
22
|
+
}
|
|
23
|
+
/** The shots view of a faceless run, read from its stored plan. The line's frame and timebase are stated here, once. */
|
|
24
|
+
export declare function facelessRunShots(plan: FacelessPublicPlan, context: FacelessShotsContext): PlannedRunShots;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { FACELESS_EDIT_RULES, facelessShotActions } from "./edit-rules.js";
|
|
2
|
+
/** The shots view of a faceless run, read from its stored plan. The line's frame and timebase are stated here, once. */
|
|
3
|
+
export function facelessRunShots(plan, context) {
|
|
4
|
+
const { exposure, media } = context;
|
|
5
|
+
const editable = context.editable.state === "editable";
|
|
6
|
+
return {
|
|
7
|
+
planned: true, run_id: context.runId, line: "faceless",
|
|
8
|
+
frame: { width: 1080, height: 1920, aspect_ratio: "9:16" },
|
|
9
|
+
timebase: { fps: 25 },
|
|
10
|
+
duration_frames: plan.outputFrames, captions: context.captions,
|
|
11
|
+
narration: { offset_frames: plan.narrationStartFrame, words: plan.words.map((word, index) => ({
|
|
12
|
+
index, text: word.word, start_ms: Math.round(word.startSec * 1000), end_ms: Math.round(word.endSec * 1000)
|
|
13
|
+
})) },
|
|
14
|
+
tracks: [{ id: "visual", shots: plan.shots.map((shot, index) => {
|
|
15
|
+
// The word each neighbouring cut falls after; a plan that records no cut gives the shot no word range.
|
|
16
|
+
const cutBefore = index === 0 ? -1 : plan.shots[index - 1].cutAfterWord;
|
|
17
|
+
const cutAfter = index === plan.shots.length - 1 ? plan.words.length - 1 : shot.cutAfterWord;
|
|
18
|
+
const ranged = cutBefore !== undefined && cutAfter !== undefined;
|
|
19
|
+
const asset = media?.get(shot.id);
|
|
20
|
+
const source = asset?.source ?? "unknown";
|
|
21
|
+
return {
|
|
22
|
+
id: shot.id, index, track: "visual", kind: shot.mediaType === "video" ? "clip" : "picture",
|
|
23
|
+
start_frame: shot.startFrame, end_frame: shot.endFrame,
|
|
24
|
+
first_word: ranged ? cutBefore + 1 : null, end_word: ranged ? cutAfter + 1 : null,
|
|
25
|
+
description: exposure.descriptions ? shot.visualPrompts.join(" ") : null,
|
|
26
|
+
preview_url: exposure.source_media ? asset?.previewUrl ?? null : null,
|
|
27
|
+
source,
|
|
28
|
+
media_frames: shot.mediaType === "video" ? asset?.mediaFrames ?? null : null, media_offset_frames: null,
|
|
29
|
+
operations: editable ? facelessShotActions({ index, source }) : [],
|
|
30
|
+
};
|
|
31
|
+
}) }],
|
|
32
|
+
rules: FACELESS_EDIT_RULES,
|
|
33
|
+
editable: context.editable, lineage: context.lineage,
|
|
34
|
+
withheld: [...(exposure.descriptions ? [] : ["description"]), ...(exposure.source_media ? [] : ["source_media"])],
|
|
35
|
+
pricing: context.pricing, paid_edits: context.paidEdits,
|
|
36
|
+
contract_version: context.contractVersion,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=edit-faceless.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"edit-faceless.js","sourceRoot":"","sources":["../src/edit-faceless.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export { shotId } from "./edit-primitives.js";
|
|
3
|
+
export declare const SHOT_OPERATION_MODES: readonly ["retake", "new_picture", "edit_picture", "animate"];
|
|
4
|
+
export type ShotOperationMode = (typeof SHOT_OPERATION_MODES)[number];
|
|
5
|
+
/** What to generate for one shot. */
|
|
6
|
+
export declare const shotOperation: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
7
|
+
mode: z.ZodLiteral<"retake">;
|
|
8
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
9
|
+
mode: z.ZodLiteral<"new_picture">;
|
|
10
|
+
description: z.ZodString;
|
|
11
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
12
|
+
mode: z.ZodLiteral<"edit_picture">;
|
|
13
|
+
instruction: z.ZodString;
|
|
14
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
15
|
+
mode: z.ZodLiteral<"animate">;
|
|
16
|
+
motion: z.ZodOptional<z.ZodString>;
|
|
17
|
+
}, z.core.$strict>], "mode">;
|
|
18
|
+
export type ShotOperation = z.infer<typeof shotOperation>;
|
|
19
|
+
export declare const shotChange: z.ZodObject<{
|
|
20
|
+
shot_id: z.ZodString;
|
|
21
|
+
operation: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
22
|
+
mode: z.ZodLiteral<"retake">;
|
|
23
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
24
|
+
mode: z.ZodLiteral<"new_picture">;
|
|
25
|
+
description: z.ZodString;
|
|
26
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
27
|
+
mode: z.ZodLiteral<"edit_picture">;
|
|
28
|
+
instruction: z.ZodString;
|
|
29
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
30
|
+
mode: z.ZodLiteral<"animate">;
|
|
31
|
+
motion: z.ZodOptional<z.ZodString>;
|
|
32
|
+
}, z.core.$strict>], "mode">;
|
|
33
|
+
}, z.core.$strict>;
|
|
34
|
+
export type ShotChange = z.infer<typeof shotChange>;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { shotId, text } from "./edit-primitives.js";
|
|
3
|
+
export { shotId } from "./edit-primitives.js";
|
|
4
|
+
export const SHOT_OPERATION_MODES = ["retake", "new_picture", "edit_picture", "animate"];
|
|
5
|
+
/** What to generate for one shot. */
|
|
6
|
+
export const shotOperation = z.discriminatedUnion("mode", [
|
|
7
|
+
z.strictObject({ mode: z.literal("retake") }),
|
|
8
|
+
z.strictObject({ mode: z.literal("new_picture"), description: text(600) }),
|
|
9
|
+
z.strictObject({ mode: z.literal("edit_picture"), instruction: text(600) }),
|
|
10
|
+
z.strictObject({ mode: z.literal("animate"), motion: text(300).optional() }),
|
|
11
|
+
]);
|
|
12
|
+
export const shotChange = z.strictObject({ shot_id: shotId, operation: shotOperation });
|
|
13
|
+
//# sourceMappingURL=edit-operations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"edit-operations.js","sourceRoot":"","sources":["../src/edit-operations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAEpD,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAE9C,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,QAAQ,EAAE,aAAa,EAAE,cAAc,EAAE,SAAS,CAAU,CAAC;AAGlG,qCAAqC;AACrC,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,CAAC,kBAAkB,CAAC,MAAM,EAAE;IACxD,CAAC,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;IAC7C,CAAC,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;IAC1E,CAAC,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;IAC3E,CAAC,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC;CAC7E,CAAC,CAAC;AAGH,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,CAAC,YAAY,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,CAAC,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
/** A frame index, a word index, a millisecond count. */
|
|
3
|
+
export declare const frame: z.ZodNumber;
|
|
4
|
+
/** A length in frames, a pixel size. */
|
|
5
|
+
export declare const frameCount: z.ZodNumber;
|
|
6
|
+
/** A JSON column refuses U+0000 and half of a surrogate pair, so the schema does first. */
|
|
7
|
+
export declare const text: (max: number) => z.ZodString;
|
|
8
|
+
export declare const shotId: z.ZodString;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
// Shared by the edit modules only: these generic names stay out of the public barrel.
|
|
3
|
+
/** A frame index, a word index, a millisecond count. */
|
|
4
|
+
export const frame = z.number().int().nonnegative().safe();
|
|
5
|
+
/** A length in frames, a pixel size. */
|
|
6
|
+
export const frameCount = z.number().int().positive().safe();
|
|
7
|
+
const HALF_PAIR = /[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?<![\uD800-\uDBFF])[\uDC00-\uDFFF]/;
|
|
8
|
+
/** A JSON column refuses U+0000 and half of a surrogate pair, so the schema does first. */
|
|
9
|
+
export const text = (max) => z.string().trim().min(1).max(max)
|
|
10
|
+
.refine(value => !value.includes("\u0000") && !HALF_PAIR.test(value), { error: "holds U+0000 or half of a surrogate pair, which cannot be stored" });
|
|
11
|
+
export const shotId = z.string().regex(/^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$/);
|
|
12
|
+
//# sourceMappingURL=edit-primitives.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"edit-primitives.js","sourceRoot":"","sources":["../src/edit-primitives.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,sFAAsF;AAEtF,wDAAwD;AACxD,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC;AAC3D,wCAAwC;AACxC,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC;AAC7D,MAAM,SAAS,GAAG,wEAAwE,CAAC;AAC3F,2FAA2F;AAC3F,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;KACnE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,EAAE,kEAAkE,EAAE,CAAC,CAAC;AACvJ,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAC"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export declare const EDIT_LINES: readonly ["faceless", "long_form", "ugc"];
|
|
3
|
+
export type EditLine = (typeof EDIT_LINES)[number];
|
|
4
|
+
export declare const SHOT_KINDS: readonly ["picture", "clip", "presenter"];
|
|
5
|
+
export type ShotKind = (typeof SHOT_KINDS)[number];
|
|
6
|
+
export declare const SHOT_TRACKS: readonly ["visual", "presenter"];
|
|
7
|
+
export type ShotTrack = (typeof SHOT_TRACKS)[number];
|
|
8
|
+
export declare const SHOT_SOURCES: readonly ["generated", "customer", "candidate", "upload", "unknown"];
|
|
9
|
+
export type ShotSource = (typeof SHOT_SOURCES)[number];
|
|
10
|
+
export declare const SHOT_ACTIONS: readonly ["retake", "new_picture", "edit_picture", "animate", "upload", "retime", "delete", "cover"];
|
|
11
|
+
export type ShotAction = (typeof SHOT_ACTIONS)[number];
|
|
12
|
+
/** Above today's 100 slots and the 420 of clipwright#275. */
|
|
13
|
+
export declare const EDIT_MAX_SHOTS = 500;
|
|
14
|
+
export declare const EDIT_MAX_DISCARDED = 500;
|
|
15
|
+
export declare const kindRule: z.ZodObject<{
|
|
16
|
+
min_frames: z.ZodNumber;
|
|
17
|
+
max_frames: z.ZodNumber;
|
|
18
|
+
movable: z.ZodBoolean;
|
|
19
|
+
resizable: z.ZodBoolean;
|
|
20
|
+
}, z.core.$strict>;
|
|
21
|
+
/** What a line allows on its timeline. The validator reads these and never the line's name. */
|
|
22
|
+
export declare const editRules: z.ZodObject<{
|
|
23
|
+
kinds: z.ZodRecord<z.ZodEnum<{
|
|
24
|
+
clip: "clip";
|
|
25
|
+
picture: "picture";
|
|
26
|
+
presenter: "presenter";
|
|
27
|
+
}> & z.core.$partial, z.ZodObject<{
|
|
28
|
+
min_frames: z.ZodNumber;
|
|
29
|
+
max_frames: z.ZodNumber;
|
|
30
|
+
movable: z.ZodBoolean;
|
|
31
|
+
resizable: z.ZodBoolean;
|
|
32
|
+
}, z.core.$strict>>;
|
|
33
|
+
output_coverage: z.ZodEnum<{
|
|
34
|
+
union: "union";
|
|
35
|
+
visual: "visual";
|
|
36
|
+
}>;
|
|
37
|
+
first_visual_kind: z.ZodNullable<z.ZodEnum<{
|
|
38
|
+
clip: "clip";
|
|
39
|
+
picture: "picture";
|
|
40
|
+
presenter: "presenter";
|
|
41
|
+
}>>;
|
|
42
|
+
picture_assets_unique: z.ZodBoolean;
|
|
43
|
+
visual_covers_presenter: z.ZodBoolean;
|
|
44
|
+
add_visual: z.ZodEnum<{
|
|
45
|
+
never: "never";
|
|
46
|
+
over_presenter: "over_presenter";
|
|
47
|
+
}>;
|
|
48
|
+
reuse_source_asset: z.ZodBoolean;
|
|
49
|
+
upload_aspect: z.ZodNullable<z.ZodObject<{
|
|
50
|
+
max_distance: z.ZodNumber;
|
|
51
|
+
}, z.core.$strict>>;
|
|
52
|
+
max_generated_per_revision: z.ZodNumber;
|
|
53
|
+
}, z.core.$strict>;
|
|
54
|
+
export type EditRules = z.infer<typeof editRules>;
|
|
55
|
+
export declare const FACELESS_EDIT_RULES: EditRules;
|
|
56
|
+
/** The actions a faceless shot offers: the opener by its place, a picture by where its image came from. */
|
|
57
|
+
export declare function facelessShotActions(shot: {
|
|
58
|
+
index: number;
|
|
59
|
+
source: ShotSource;
|
|
60
|
+
}): ShotAction[];
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { frameCount } from "./edit-primitives.js";
|
|
3
|
+
import { FACELESS_IMAGE_MAX_FRAMES, FACELESS_IMAGE_MIN_FRAMES, FACELESS_OPENER_MAX_FRAMES, FACELESS_OPENER_MIN_FRAMES } from "./faceless-public-plan.js";
|
|
4
|
+
export const EDIT_LINES = ["faceless", "long_form", "ugc"];
|
|
5
|
+
export const SHOT_KINDS = ["picture", "clip", "presenter"];
|
|
6
|
+
export const SHOT_TRACKS = ["visual", "presenter"];
|
|
7
|
+
export const SHOT_SOURCES = ["generated", "customer", "candidate", "upload", "unknown"];
|
|
8
|
+
export const SHOT_ACTIONS = ["retake", "new_picture", "edit_picture", "animate", "upload", "retime", "delete", "cover"];
|
|
9
|
+
/** Above today's 100 slots and the 420 of clipwright#275. */
|
|
10
|
+
export const EDIT_MAX_SHOTS = 500;
|
|
11
|
+
export const EDIT_MAX_DISCARDED = 500;
|
|
12
|
+
export const kindRule = z.strictObject({ min_frames: frameCount, max_frames: frameCount, movable: z.boolean(), resizable: z.boolean() });
|
|
13
|
+
/** What a line allows on its timeline. The validator reads these and never the line's name. */
|
|
14
|
+
export const editRules = z.strictObject({
|
|
15
|
+
// A kind without an entry is not allowed on this timeline.
|
|
16
|
+
kinds: z.partialRecord(z.enum(SHOT_KINDS), kindRule),
|
|
17
|
+
output_coverage: z.enum(["visual", "union"]),
|
|
18
|
+
first_visual_kind: z.enum(SHOT_KINDS).nullable(),
|
|
19
|
+
picture_assets_unique: z.boolean(),
|
|
20
|
+
visual_covers_presenter: z.boolean(),
|
|
21
|
+
add_visual: z.enum(["never", "over_presenter"]),
|
|
22
|
+
reuse_source_asset: z.boolean(),
|
|
23
|
+
upload_aspect: z.strictObject({ max_distance: z.number().positive() }).nullable(),
|
|
24
|
+
max_generated_per_revision: z.number().int().positive(),
|
|
25
|
+
});
|
|
26
|
+
export const FACELESS_EDIT_RULES = {
|
|
27
|
+
kinds: {
|
|
28
|
+
picture: { min_frames: FACELESS_IMAGE_MIN_FRAMES, max_frames: FACELESS_IMAGE_MAX_FRAMES, movable: true, resizable: true },
|
|
29
|
+
clip: { min_frames: FACELESS_OPENER_MIN_FRAMES, max_frames: FACELESS_OPENER_MAX_FRAMES, movable: false, resizable: true },
|
|
30
|
+
},
|
|
31
|
+
output_coverage: "visual", first_visual_kind: "clip", picture_assets_unique: true, visual_covers_presenter: false,
|
|
32
|
+
add_visual: "never", reuse_source_asset: false, upload_aspect: null, max_generated_per_revision: 8,
|
|
33
|
+
};
|
|
34
|
+
/** The actions a faceless shot offers: the opener by its place, a picture by where its image came from. */
|
|
35
|
+
export function facelessShotActions(shot) {
|
|
36
|
+
if (shot.index === 0)
|
|
37
|
+
return ["retake", "animate", "new_picture", "retime"];
|
|
38
|
+
if (shot.source === "generated")
|
|
39
|
+
return ["retake", "new_picture", "upload", "retime", "delete"];
|
|
40
|
+
if (shot.source === "customer")
|
|
41
|
+
return ["upload", "retime", "delete"];
|
|
42
|
+
return [];
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=edit-rules.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"edit-rules.js","sourceRoot":"","sources":["../src/edit-rules.ts"],"names":[],"mappings":"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"}
|