@adminide-stack/yantra-mobile 12.0.121 → 12.0.123
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/lib/features/apps/appArt.js +1 -1
- package/lib/features/apps/appArt.js.map +1 -1
- package/lib/features/apps/mobileAppCatalog.js +15 -11
- package/lib/features/apps/mobileAppCatalog.js.map +1 -1
- package/lib/features/canvas/CanvasAgentChatPane.js +82 -20
- package/lib/features/canvas/CanvasAgentChatPane.js.map +1 -1
- package/lib/features/canvas/CanvasBoardsGrid.js +291 -100
- package/lib/features/canvas/CanvasBoardsGrid.js.map +1 -1
- package/lib/features/canvas/CanvasEditToolsPanel.js +105 -12
- package/lib/features/canvas/CanvasEditToolsPanel.js.map +1 -1
- package/lib/features/canvas/CanvasExperience.js +266 -68
- package/lib/features/canvas/CanvasExperience.js.map +1 -1
- package/lib/features/canvas/CanvasGeneratePanel.js +204 -66
- package/lib/features/canvas/CanvasGeneratePanel.js.map +1 -1
- package/lib/features/canvas/CanvasLibrarySheet.js +31 -13
- package/lib/features/canvas/CanvasLibrarySheet.js.map +1 -1
- package/lib/features/canvas/CanvasModelPicker.js +176 -0
- package/lib/features/canvas/CanvasModelPicker.js.map +1 -0
- package/lib/features/canvas/CanvasTasksPanel.js +325 -29
- package/lib/features/canvas/CanvasTasksPanel.js.map +1 -1
- package/lib/features/canvas/CanvasTemplatesPanel.js +5 -4
- package/lib/features/canvas/CanvasTemplatesPanel.js.map +1 -1
- package/lib/features/canvas/CanvasToolDock.js +137 -61
- package/lib/features/canvas/CanvasToolDock.js.map +1 -1
- package/lib/features/canvas/FrameExtractorExperience.js +33 -2
- package/lib/features/canvas/FrameExtractorExperience.js.map +1 -1
- package/lib/features/canvas/GeneratorReferenceSlots.js +197 -0
- package/lib/features/canvas/GeneratorReferenceSlots.js.map +1 -0
- package/lib/features/canvas/NativeCanvasViewer.js +89 -11
- package/lib/features/canvas/NativeCanvasViewer.js.map +1 -1
- package/lib/features/canvas/PromoContextFields.js +55 -2
- package/lib/features/canvas/PromoContextFields.js.map +1 -1
- package/lib/features/canvas/SetStudioExperience.js +323 -13
- package/lib/features/canvas/SetStudioExperience.js.map +1 -1
- package/lib/features/canvas/VideoEditExperience.js +1 -53
- package/lib/features/canvas/VideoEditExperience.js.map +1 -1
- package/lib/features/canvas/VideoEditorExperience.js +697 -506
- package/lib/features/canvas/VideoEditorExperience.js.map +1 -1
- package/lib/features/canvas/VideoGeneratorExperience.js +22 -5
- package/lib/features/canvas/VideoGeneratorExperience.js.map +1 -1
- package/lib/features/canvas/canvasAgentChat.js +125 -11
- package/lib/features/canvas/canvasAgentChat.js.map +1 -1
- package/lib/features/canvas/canvasCore.js +117 -12
- package/lib/features/canvas/canvasCore.js.map +1 -1
- package/lib/features/canvas/canvasEditOps.js +148 -111
- package/lib/features/canvas/canvasEditOps.js.map +1 -1
- package/lib/features/canvas/canvasTaskSync.js +235 -0
- package/lib/features/canvas/canvasTaskSync.js.map +1 -0
- package/lib/features/canvas/canvasTasks.js +98 -11
- package/lib/features/canvas/canvasTasks.js.map +1 -1
- package/lib/features/canvas/createTiles.js +247 -0
- package/lib/features/canvas/createTiles.js.map +1 -0
- package/lib/features/canvas/deepLinks.js +83 -0
- package/lib/features/canvas/deepLinks.js.map +1 -0
- package/lib/features/canvas/frameExtract.js +13 -1
- package/lib/features/canvas/frameExtract.js.map +1 -1
- package/lib/features/canvas/generationModels.js +36 -8
- package/lib/features/canvas/generationModels.js.map +1 -1
- package/lib/features/canvas/generatorCommands.js +106 -0
- package/lib/features/canvas/generatorCommands.js.map +1 -0
- package/lib/features/canvas/generatorReferences.js +82 -0
- package/lib/features/canvas/generatorReferences.js.map +1 -0
- package/lib/features/canvas/homeWork.js +74 -0
- package/lib/features/canvas/homeWork.js.map +1 -0
- package/lib/features/canvas/linksRpc.js +130 -0
- package/lib/features/canvas/linksRpc.js.map +1 -0
- package/lib/features/canvas/mediaRecheck.js +176 -0
- package/lib/features/canvas/mediaRecheck.js.map +1 -0
- package/lib/features/canvas/mediaUrls.js +258 -0
- package/lib/features/canvas/mediaUrls.js.map +1 -0
- package/lib/features/canvas/nativeViewerRegistry.js.map +1 -1
- package/lib/features/canvas/promoProjectImport.js +80 -13
- package/lib/features/canvas/promoProjectImport.js.map +1 -1
- package/lib/features/canvas/promoVideo.js +106 -15
- package/lib/features/canvas/promoVideo.js.map +1 -1
- package/lib/features/canvas/reframe.js +228 -0
- package/lib/features/canvas/reframe.js.map +1 -0
- package/lib/features/canvas/serverTasks.js +697 -0
- package/lib/features/canvas/serverTasks.js.map +1 -0
- package/lib/features/canvas/set/SetViewportWebView.js +207 -28
- package/lib/features/canvas/set/SetViewportWebView.js.map +1 -1
- package/lib/features/canvas/set/agent/prompt.js +66 -0
- package/lib/features/canvas/set/agent/prompt.js.map +1 -0
- package/lib/features/canvas/set/agent/setOps.js +203 -0
- package/lib/features/canvas/set/agent/setOps.js.map +1 -0
- package/lib/features/canvas/set/agent/setTurn.js +128 -0
- package/lib/features/canvas/set/agent/setTurn.js.map +1 -0
- package/lib/features/canvas/set/agent/snapshot.js +43 -0
- package/lib/features/canvas/set/agent/snapshot.js.map +1 -0
- package/lib/features/canvas/set/agent/tools.js +580 -0
- package/lib/features/canvas/set/agent/tools.js.map +1 -0
- package/lib/features/canvas/set/setProject.js +43 -4
- package/lib/features/canvas/set/setProject.js.map +1 -1
- package/lib/features/canvas/set/supplyLibrary.js +397 -0
- package/lib/features/canvas/set/supplyLibrary.js.map +1 -0
- package/lib/features/canvas/storageLibrary.js +113 -52
- package/lib/features/canvas/storageLibrary.js.map +1 -1
- package/lib/features/canvas/studioCatalog.js +15 -2
- package/lib/features/canvas/studioCatalog.js.map +1 -1
- package/lib/features/canvas/studioLooks.js +1 -8
- package/lib/features/canvas/studioLooks.js.map +1 -1
- package/lib/features/canvas/useBoardMediaRefresh.js +66 -0
- package/lib/features/canvas/useBoardMediaRefresh.js.map +1 -0
- package/lib/features/canvas/useMediaSource.js +84 -0
- package/lib/features/canvas/useMediaSource.js.map +1 -0
- package/lib/features/canvas/video3d.js +11 -10
- package/lib/features/canvas/video3d.js.map +1 -1
- package/lib/features/canvas/videoEditor/BlurBoxOverlay.js +46 -0
- package/lib/features/canvas/videoEditor/BlurBoxOverlay.js.map +1 -0
- package/lib/features/canvas/videoEditor/ExportTaskCard.js +134 -0
- package/lib/features/canvas/videoEditor/ExportTaskCard.js.map +1 -0
- package/lib/features/canvas/videoEditor/agent/AgentCutPane.js +45 -7
- package/lib/features/canvas/videoEditor/agent/AgentCutPane.js.map +1 -1
- package/lib/features/canvas/videoEditor/agent/agentLoop.js +4 -2
- package/lib/features/canvas/videoEditor/agent/agentLoop.js.map +1 -1
- package/lib/features/canvas/videoEditor/agent/attachments.js +304 -0
- package/lib/features/canvas/videoEditor/agent/attachments.js.map +1 -0
- package/lib/features/canvas/videoEditor/agent/brainClient.js +3 -2
- package/lib/features/canvas/videoEditor/agent/brainClient.js.map +1 -1
- package/lib/features/canvas/videoEditor/agent/cutTools.js +207 -7
- package/lib/features/canvas/videoEditor/agent/cutTools.js.map +1 -1
- package/lib/features/canvas/videoEditor/blurBox.js +34 -0
- package/lib/features/canvas/videoEditor/blurBox.js.map +1 -0
- package/lib/features/canvas/videoEditor/compileTimeline.js +668 -0
- package/lib/features/canvas/videoEditor/compileTimeline.js.map +1 -0
- package/lib/features/canvas/videoEditor/editorModel.js +56 -22
- package/lib/features/canvas/videoEditor/editorModel.js.map +1 -1
- package/lib/features/canvas/videoEditor/exportPipeline.js +77 -0
- package/lib/features/canvas/videoEditor/exportPipeline.js.map +1 -0
- package/lib/features/canvas/videoEditor/exportRenderer.js +19 -12
- package/lib/features/canvas/videoEditor/exportRenderer.js.map +1 -1
- package/lib/features/canvas/videoEditor/exportTask.js +216 -0
- package/lib/features/canvas/videoEditor/exportTask.js.map +1 -0
- package/lib/features/canvas/videoEditor/formWidgets.js +142 -0
- package/lib/features/canvas/videoEditor/formWidgets.js.map +1 -0
- package/lib/features/canvas/videoEditor/produce/ProduceVideoSheet.js +195 -0
- package/lib/features/canvas/videoEditor/produce/ProduceVideoSheet.js.map +1 -0
- package/lib/features/canvas/videoEditor/produce/produceScenes.js +158 -0
- package/lib/features/canvas/videoEditor/produce/produceScenes.js.map +1 -0
- package/lib/features/canvas/videoEditor/remoteMediaClient.js +17 -5
- package/lib/features/canvas/videoEditor/remoteMediaClient.js.map +1 -1
- package/lib/features/canvas/videoEditor/renderTimeline.js +207 -0
- package/lib/features/canvas/videoEditor/renderTimeline.js.map +1 -0
- package/lib/features/canvas/videoEditor/renewLinks.js +64 -0
- package/lib/features/canvas/videoEditor/renewLinks.js.map +1 -0
- package/lib/features/canvas/videoEditor/sceneLayers.js +101 -0
- package/lib/features/canvas/videoEditor/sceneLayers.js.map +1 -0
- package/lib/features/canvas/videoEditor/tools/ToolsDrawer.js +283 -0
- package/lib/features/canvas/videoEditor/tools/ToolsDrawer.js.map +1 -0
- package/lib/features/canvas/videoEditor/tools/catalog.js +576 -0
- package/lib/features/canvas/videoEditor/tools/catalog.js.map +1 -0
- package/lib/features/canvas/videoEditor/videoProjectsStore.js +27 -3
- package/lib/features/canvas/videoEditor/videoProjectsStore.js.map +1 -1
- package/lib/features/webbuilder/WebBuilderExperience.js +29 -1
- package/lib/features/webbuilder/WebBuilderExperience.js.map +1 -1
- package/lib/features/webbuilder/buildFragments.js +8 -4
- package/lib/features/webbuilder/buildFragments.js.map +1 -1
- package/lib/features/webbuilder/codezenHandoff.js +108 -0
- package/lib/features/webbuilder/codezenHandoff.js.map +1 -0
- package/lib/features/webbuilder/workflow.js.map +1 -1
- package/lib/hooks/useChatApi.js +1 -2
- package/lib/hooks/useChatApi.js.map +1 -1
- package/lib/screens/CanvasBoard/index.js +12 -1
- package/lib/screens/CanvasBoard/index.js.map +1 -1
- package/lib/screens/Home/HomeScreen.js.map +1 -1
- package/lib/screens/Home/components/HomeSuggestions.js +3 -3
- package/lib/screens/Home/components/HomeSuggestions.js.map +1 -1
- package/lib/screens/WebBuilder/index.js +4 -2
- package/lib/screens/WebBuilder/index.js.map +1 -1
- package/lib/screens/WebBuilderNative/index.js +29 -2
- package/lib/screens/WebBuilderNative/index.js.map +1 -1
- package/lib/screens/WebBuilderNative/useWebBuilderHost.js +30 -6
- package/lib/screens/WebBuilderNative/useWebBuilderHost.js.map +1 -1
- package/package.json +3 -3
- /package/lib/assets/apps/{paper2poster.webp → poster.webp} +0 -0
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {solidColorSrc,emptyTimeline,DEFAULT_IMAGE_SEC}from'./videoEditor/editorModel.js';var __defProp = Object.defineProperty;
|
|
2
2
|
var __defProps = Object.defineProperties;
|
|
3
3
|
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
|
4
4
|
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
@@ -17,13 +17,25 @@ var __spreadValues = (a, b) => {
|
|
|
17
17
|
return a;
|
|
18
18
|
};
|
|
19
19
|
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
|
|
20
|
+
var __objRest = (source, exclude) => {
|
|
21
|
+
var target = {};
|
|
22
|
+
for (var prop in source)
|
|
23
|
+
if (__hasOwnProp.call(source, prop) && exclude.indexOf(prop) < 0)
|
|
24
|
+
target[prop] = source[prop];
|
|
25
|
+
if (source != null && __getOwnPropSymbols)
|
|
26
|
+
for (var prop of __getOwnPropSymbols(source)) {
|
|
27
|
+
if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop))
|
|
28
|
+
target[prop] = source[prop];
|
|
29
|
+
}
|
|
30
|
+
return target;
|
|
31
|
+
};
|
|
20
32
|
const MICRO = 1e6;
|
|
21
33
|
function microsToSec(us) {
|
|
22
34
|
if (typeof us !== "number" || !Number.isFinite(us)) return 0;
|
|
23
35
|
return Math.max(0, us / MICRO);
|
|
24
36
|
}
|
|
25
37
|
function promoProjectToTimeline(project, title) {
|
|
26
|
-
var _a, _b, _c, _d, _e;
|
|
38
|
+
var _a, _b, _c, _d, _e, _f, _g;
|
|
27
39
|
const clipsMap = project.clips && typeof project.clips === "object" ? project.clips : {};
|
|
28
40
|
const tracks = Array.isArray(project.tracks) ? project.tracks : [];
|
|
29
41
|
const orderedIds = [];
|
|
@@ -44,7 +56,13 @@ function promoProjectToTimeline(project, title) {
|
|
|
44
56
|
});
|
|
45
57
|
const mediaClips = [];
|
|
46
58
|
const texts = [];
|
|
59
|
+
const nativeId = /* @__PURE__ */ new Map();
|
|
47
60
|
let counter = 0;
|
|
61
|
+
const pct = (v, fallback) => typeof v === "number" && Number.isFinite(v) ? Math.min(1, Math.max(0, v / 100)) : fallback;
|
|
62
|
+
const transitionOf = (clip) => clip.transitionIn && typeof clip.transitionIn.effect === "string" && Number(clip.transitionIn.durationMs) > 0 ? {
|
|
63
|
+
effect: clip.transitionIn.effect,
|
|
64
|
+
durationMs: Number(clip.transitionIn.durationMs)
|
|
65
|
+
} : null;
|
|
48
66
|
for (const {
|
|
49
67
|
clip
|
|
50
68
|
} of withStart) {
|
|
@@ -54,23 +72,56 @@ function promoProjectToTimeline(project, title) {
|
|
|
54
72
|
const type = clip.type || "";
|
|
55
73
|
if (type === "text" && typeof clip.text === "string" && clip.text.trim()) {
|
|
56
74
|
counter += 1;
|
|
57
|
-
texts.push({
|
|
75
|
+
texts.push(__spreadValues({
|
|
58
76
|
id: `promo-text-${counter}`,
|
|
59
77
|
text: clip.text.trim(),
|
|
60
78
|
startSec: from,
|
|
61
79
|
durationSec: span,
|
|
62
|
-
x: 0.5,
|
|
63
|
-
y: 0.5
|
|
64
|
-
}
|
|
80
|
+
x: pct(clip.x, 0.5),
|
|
81
|
+
y: pct(clip.y, 0.5)
|
|
82
|
+
}, clip.sceneId ? {
|
|
83
|
+
sceneId: clip.sceneId
|
|
84
|
+
} : {}));
|
|
85
|
+
continue;
|
|
86
|
+
}
|
|
87
|
+
if (type === "scene") {
|
|
88
|
+
counter += 1;
|
|
89
|
+
const id = `promo-clip-${counter}`;
|
|
90
|
+
if (clip.id) nativeId.set(clip.id, id);
|
|
91
|
+
const fill = typeof clip.color === "string" && /^#[0-9a-f]{3,8}$/i.test(clip.color) ? clip.color : "#101014";
|
|
92
|
+
mediaClips.push(__spreadValues({
|
|
93
|
+
id,
|
|
94
|
+
itemId: clip.id || `promo-${counter}`,
|
|
95
|
+
type: "image",
|
|
96
|
+
src: solidColorSrc(fill),
|
|
97
|
+
name: (clip.name || "Scene").slice(0, 48),
|
|
98
|
+
durationSec: span,
|
|
99
|
+
trimStartSec: 0,
|
|
100
|
+
trimEndSec: null,
|
|
101
|
+
speed: 1,
|
|
102
|
+
speedCurve: "constant",
|
|
103
|
+
filter: "none",
|
|
104
|
+
transitionIn: transitionOf(clip),
|
|
105
|
+
volume: 1,
|
|
106
|
+
muted: false,
|
|
107
|
+
fillColor: fill
|
|
108
|
+
}, ((_d = clip.shot) == null ? void 0 : _d.trim()) ? {
|
|
109
|
+
shot: clip.shot.trim()
|
|
110
|
+
} : {}));
|
|
65
111
|
continue;
|
|
66
112
|
}
|
|
67
113
|
if ((type === "video" || type === "image") && typeof clip.src === "string" && clip.src) {
|
|
68
114
|
counter += 1;
|
|
69
|
-
const trimFrom = microsToSec((
|
|
70
|
-
const trimTo = ((
|
|
71
|
-
|
|
115
|
+
const trimFrom = microsToSec((_e = clip.trim) == null ? void 0 : _e.from);
|
|
116
|
+
const trimTo = ((_f = clip.trim) == null ? void 0 : _f.to) != null ? microsToSec(clip.trim.to) : null;
|
|
117
|
+
if (clip.id) nativeId.set(clip.id, `promo-clip-${counter}`);
|
|
118
|
+
mediaClips.push(__spreadProps(__spreadValues({
|
|
72
119
|
id: `promo-clip-${counter}`,
|
|
73
120
|
itemId: clip.id || `promo-${counter}`,
|
|
121
|
+
transitionIn: transitionOf(clip)
|
|
122
|
+
}, ((_g = clip.shot) == null ? void 0 : _g.trim()) ? {
|
|
123
|
+
shot: clip.shot.trim()
|
|
124
|
+
} : {}), {
|
|
74
125
|
type: type === "image" ? "image" : "video",
|
|
75
126
|
src: clip.src,
|
|
76
127
|
name: (clip.name || type).slice(0, 48),
|
|
@@ -83,15 +134,31 @@ function promoProjectToTimeline(project, title) {
|
|
|
83
134
|
volume: typeof clip.volume === "number" ? clip.volume : 1,
|
|
84
135
|
muted: Boolean(clip.muted),
|
|
85
136
|
fillColor: type === "image" && typeof clip.color === "string" ? clip.color : null
|
|
86
|
-
});
|
|
137
|
+
}));
|
|
87
138
|
}
|
|
88
139
|
}
|
|
140
|
+
const size = project.canvasSize;
|
|
141
|
+
const aspect = size && Number(size.width) > 0 && Number(size.height) > 0 ? `${Number(size.width)}:${Number(size.height)}` : void 0;
|
|
89
142
|
const logo = project.logo;
|
|
90
143
|
const logoSrc = typeof (logo == null ? void 0 : logo.src) === "string" && logo.src ? logo.src : null;
|
|
91
144
|
return {
|
|
92
|
-
timeline: __spreadProps(__spreadValues({}, emptyTimeline()), {
|
|
93
|
-
clips: mediaClips
|
|
94
|
-
|
|
145
|
+
timeline: __spreadProps(__spreadValues(__spreadProps(__spreadValues({}, emptyTimeline()), {
|
|
146
|
+
clips: mediaClips
|
|
147
|
+
}), aspect ? {
|
|
148
|
+
aspect
|
|
149
|
+
} : {}), {
|
|
150
|
+
// A layer whose scene did not come across turns global (missing sceneId = global).
|
|
151
|
+
texts: texts.map((_h) => {
|
|
152
|
+
var _i = _h, {
|
|
153
|
+
sceneId
|
|
154
|
+
} = _i, t = __objRest(_i, [
|
|
155
|
+
"sceneId"
|
|
156
|
+
]);
|
|
157
|
+
const mapped = sceneId ? nativeId.get(sceneId) : void 0;
|
|
158
|
+
return mapped ? __spreadProps(__spreadValues({}, t), {
|
|
159
|
+
sceneId: mapped
|
|
160
|
+
}) : t;
|
|
161
|
+
})
|
|
95
162
|
}),
|
|
96
163
|
title: (title || "").trim() || "Designed promo",
|
|
97
164
|
logoSrc
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"promoProjectImport.js","sources":["../../../src/features/canvas/promoProjectImport.ts"],"sourcesContent":["/**\n * Convert a web video-editor project (DESIGN_PROJECT result) into the native\n * EditorTimeline. Web uses microseconds + tracks; native uses a flat clip list\n * in seconds — we keep media/text order by display.from.\n */\nimport {\n DEFAULT_IMAGE_SEC,\n emptyTimeline,\n type EditorClip,\n type EditorTimeline,\n type TextClip,\n} from './videoEditor/editorModel';\n\nconst MICRO = 1_000_000;\n\ntype WebClip = {\n id?: string;\n type?: string;\n src?: string;\n text?: string;\n name?: string;\n display?: { from?: number; to?: number };\n trim?: { from?: number; to?: number };\n volume?: number;\n muted?: boolean;\n color?: string;\n};\n\nexport type ImportedPromoProject = {\n timeline: EditorTimeline;\n title: string;\n logoSrc: string | null;\n};\n\nfunction microsToSec(us: number | undefined): number {\n if (typeof us !== 'number' || !Number.isFinite(us)) return 0;\n return Math.max(0, us / MICRO);\n}\n\n/** Best-effort map from web EditorProject JSON → native timeline. */\nexport function promoProjectToTimeline(project: Record<string, unknown>, title?: string): ImportedPromoProject {\n const clipsMap = (project.clips && typeof project.clips === 'object' ? project.clips : {}) as Record<\n string,\n WebClip\n >;\n const tracks = Array.isArray(project.tracks) ? (project.tracks as Array<{ clipIds?: string[] }>) : [];\n const orderedIds: string[] = [];\n for (const track of tracks) {\n for (const id of track.clipIds ?? []) {\n if (typeof id === 'string' && !orderedIds.includes(id)) orderedIds.push(id);\n }\n }\n for (const id of Object.keys(clipsMap)) {\n if (!orderedIds.includes(id)) orderedIds.push(id);\n }\n\n const withStart = orderedIds\n .map((id) => ({ id, clip: clipsMap[id] }))\n .filter((row) => row.clip)\n .sort((a, b) => microsToSec(a.clip.display?.from) - microsToSec(b.clip.display?.from));\n\n const mediaClips: EditorClip[] = [];\n const texts: TextClip[] = [];\n let counter = 0;\n\n for (const { clip } of withStart) {\n const from = microsToSec(clip.display?.from);\n const to = microsToSec(clip.display?.to);\n const span = Math.max(0.1, to > from ? to - from : DEFAULT_IMAGE_SEC);\n const type = clip.type || '';\n\n if (type === 'text' && typeof clip.text === 'string' && clip.text.trim()) {\n counter += 1;\n texts.push({\n id: `promo-text-${counter}`,\n text: clip.text.trim(),\n startSec: from,\n durationSec: span,\n x: 0.5,\n y: 0.5,\n });\n continue;\n }\n\n if ((type === 'video' || type === 'image') && typeof clip.src === 'string' && clip.src) {\n counter += 1;\n const trimFrom = microsToSec(clip.trim?.from);\n const trimTo = clip.trim?.to != null ? microsToSec(clip.trim.to) : null;\n mediaClips.push({\n id: `promo-clip-${counter}`,\n itemId: clip.id || `promo-${counter}`,\n type: type === 'image' ? 'image' : 'video',\n src: clip.src,\n name: (clip.name || type).slice(0, 48),\n durationSec: type === 'image' ? span : null,\n trimStartSec: trimFrom,\n trimEndSec: trimTo && trimTo > trimFrom ? trimTo : null,\n speed: 1,\n speedCurve: 'constant',\n filter: 'none',\n volume: typeof clip.volume === 'number' ? clip.volume : 1,\n muted: Boolean(clip.muted),\n fillColor: type === 'image' && typeof clip.color === 'string' ? clip.color : null,\n });\n }\n }\n\n const logo = project.logo as { src?: string } | null | undefined;\n const logoSrc = typeof logo?.src === 'string' && logo.src ? logo.src : null;\n\n return {\n timeline: {\n ...emptyTimeline(),\n clips: mediaClips,\n texts,\n },\n title: (title || '').trim() || 'Designed promo',\n logoSrc,\n };\n}\n"],"names":["_a","_b"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"promoProjectImport.js","sources":["../../../src/features/canvas/promoProjectImport.ts"],"sourcesContent":["/**\n * Convert a web video-editor project (DESIGN_PROJECT result) into the native\n * EditorTimeline. Web uses microseconds + tracks; native uses a flat clip list\n * in seconds — we keep media/text order by display.from.\n */\nimport {\n DEFAULT_IMAGE_SEC,\n emptyTimeline,\n solidColorSrc,\n type EditorClip,\n type EditorTimeline,\n type TextClip,\n} from './videoEditor/editorModel';\n\nconst MICRO = 1_000_000;\n\ntype WebClip = {\n id?: string;\n type?: string;\n src?: string;\n text?: string;\n name?: string;\n display?: { from?: number; to?: number };\n trim?: { from?: number; to?: number };\n volume?: number;\n muted?: boolean;\n color?: string;\n /** Web scene-scoped layer: the id of the scene clip it belongs to. */\n sceneId?: string;\n /** On a designed scene: what to film for it (Produce video). */\n shot?: string;\n transitionIn?: { effect?: string; durationMs?: number } | null;\n /** Web text position, % of the canvas. */\n x?: number;\n y?: number;\n};\n\nexport type ImportedPromoProject = {\n timeline: EditorTimeline;\n title: string;\n logoSrc: string | null;\n};\n\nfunction microsToSec(us: number | undefined): number {\n if (typeof us !== 'number' || !Number.isFinite(us)) return 0;\n return Math.max(0, us / MICRO);\n}\n\n/** Best-effort map from web EditorProject JSON → native timeline. */\nexport function promoProjectToTimeline(project: Record<string, unknown>, title?: string): ImportedPromoProject {\n const clipsMap = (project.clips && typeof project.clips === 'object' ? project.clips : {}) as Record<\n string,\n WebClip\n >;\n const tracks = Array.isArray(project.tracks) ? (project.tracks as Array<{ clipIds?: string[] }>) : [];\n const orderedIds: string[] = [];\n for (const track of tracks) {\n for (const id of track.clipIds ?? []) {\n if (typeof id === 'string' && !orderedIds.includes(id)) orderedIds.push(id);\n }\n }\n for (const id of Object.keys(clipsMap)) {\n if (!orderedIds.includes(id)) orderedIds.push(id);\n }\n\n const withStart = orderedIds\n .map((id) => ({ id, clip: clipsMap[id] }))\n .filter((row) => row.clip)\n .sort((a, b) => microsToSec(a.clip.display?.from) - microsToSec(b.clip.display?.from));\n\n const mediaClips: EditorClip[] = [];\n const texts: TextClip[] = [];\n /** web scene/clip id -> native clip id, so stamped layers keep their scene. */\n const nativeId = new Map<string, string>();\n let counter = 0;\n const pct = (v: number | undefined, fallback: number) =>\n typeof v === 'number' && Number.isFinite(v) ? Math.min(1, Math.max(0, v / 100)) : fallback;\n const transitionOf = (clip: WebClip) =>\n clip.transitionIn && typeof clip.transitionIn.effect === 'string' && Number(clip.transitionIn.durationMs) > 0\n ? { effect: clip.transitionIn.effect, durationMs: Number(clip.transitionIn.durationMs) }\n : null;\n\n for (const { clip } of withStart) {\n const from = microsToSec(clip.display?.from);\n const to = microsToSec(clip.display?.to);\n const span = Math.max(0.1, to > from ? to - from : DEFAULT_IMAGE_SEC);\n const type = clip.type || '';\n\n if (type === 'text' && typeof clip.text === 'string' && clip.text.trim()) {\n counter += 1;\n texts.push({\n id: `promo-text-${counter}`,\n text: clip.text.trim(),\n startSec: from,\n durationSec: span,\n x: pct(clip.x, 0.5),\n y: pct(clip.y, 0.5),\n ...(clip.sceneId ? { sceneId: clip.sceneId } : {}),\n });\n continue;\n }\n\n if (type === 'scene') {\n // A designed scene: its flat colour now, footage once Produce films its shot.\n counter += 1;\n const id = `promo-clip-${counter}`;\n if (clip.id) nativeId.set(clip.id, id);\n const fill =\n typeof clip.color === 'string' && /^#[0-9a-f]{3,8}$/i.test(clip.color) ? clip.color : '#101014';\n mediaClips.push({\n id,\n itemId: clip.id || `promo-${counter}`,\n type: 'image',\n src: solidColorSrc(fill),\n name: (clip.name || 'Scene').slice(0, 48),\n durationSec: span,\n trimStartSec: 0,\n trimEndSec: null,\n speed: 1,\n speedCurve: 'constant',\n filter: 'none',\n transitionIn: transitionOf(clip),\n volume: 1,\n muted: false,\n fillColor: fill,\n ...(clip.shot?.trim() ? { shot: clip.shot.trim() } : {}),\n });\n continue;\n }\n\n if ((type === 'video' || type === 'image') && typeof clip.src === 'string' && clip.src) {\n counter += 1;\n const trimFrom = microsToSec(clip.trim?.from);\n const trimTo = clip.trim?.to != null ? microsToSec(clip.trim.to) : null;\n if (clip.id) nativeId.set(clip.id, `promo-clip-${counter}`);\n mediaClips.push({\n id: `promo-clip-${counter}`,\n itemId: clip.id || `promo-${counter}`,\n transitionIn: transitionOf(clip),\n ...(clip.shot?.trim() ? { shot: clip.shot.trim() } : {}),\n type: type === 'image' ? 'image' : 'video',\n src: clip.src,\n name: (clip.name || type).slice(0, 48),\n durationSec: type === 'image' ? span : null,\n trimStartSec: trimFrom,\n trimEndSec: trimTo && trimTo > trimFrom ? trimTo : null,\n speed: 1,\n speedCurve: 'constant',\n filter: 'none',\n volume: typeof clip.volume === 'number' ? clip.volume : 1,\n muted: Boolean(clip.muted),\n fillColor: type === 'image' && typeof clip.color === 'string' ? clip.color : null,\n });\n }\n }\n\n const size = project.canvasSize as { width?: number; height?: number } | undefined;\n const aspect =\n size && Number(size.width) > 0 && Number(size.height) > 0\n ? `${Number(size.width)}:${Number(size.height)}`\n : undefined;\n\n const logo = project.logo as { src?: string } | null | undefined;\n const logoSrc = typeof logo?.src === 'string' && logo.src ? logo.src : null;\n\n return {\n timeline: {\n ...emptyTimeline(),\n clips: mediaClips,\n ...(aspect ? { aspect } : {}),\n // A layer whose scene did not come across turns global (missing sceneId = global).\n texts: texts.map(({ sceneId, ...t }) => {\n const mapped = sceneId ? nativeId.get(sceneId) : undefined;\n return mapped ? { ...t, sceneId: mapped } : t;\n }),\n },\n title: (title || '').trim() || 'Designed promo',\n logoSrc,\n };\n}\n"],"names":["_a","_b"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAMA,MAAM,KAAQ,GAAA,GAAA;AAmCd,SAAS,YAAY,EAAgC,EAAA;AACnD,EAAI,IAAA,OAAO,OAAO,QAAY,IAAA,CAAC,OAAO,QAAS,CAAA,EAAE,GAAU,OAAA,CAAA;AAC3D,EAAA,OAAO,IAAK,CAAA,GAAA,CAAI,CAAG,EAAA,EAAA,GAAK,KAAK,CAAA;AAC/B;AAGgB,SAAA,sBAAA,CAAuB,SAAkC,KAAsC,EAAA;AA/C/G,EAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA;AAgDE,EAAM,MAAA,QAAA,GAAY,QAAQ,KAAS,IAAA,OAAO,QAAQ,KAAU,KAAA,QAAA,GAAW,OAAQ,CAAA,KAAA,GAAQ,EAAC;AACxF,EAAM,MAAA,MAAA,GAAS,MAAM,OAAQ,CAAA,OAAA,CAAQ,MAAM,CAAI,GAAA,OAAA,CAAQ,SAElD,EAAC;AACN,EAAA,MAAM,aAAuB,EAAC;AAC9B,EAAA,KAAA,MAAW,SAAS,MAAQ,EAAA;AAC1B,IAAA,KAAA,MAAW,EAAM,IAAA,CAAA,EAAA,GAAA,KAAA,CAAM,OAAN,KAAA,IAAA,GAAA,EAAA,GAAiB,EAAI,EAAA;AACpC,MAAI,IAAA,OAAO,EAAO,KAAA,QAAA,IAAY,CAAC,UAAA,CAAW,SAAS,EAAE,CAAA,EAAc,UAAA,CAAA,IAAA,CAAK,EAAE,CAAA;AAAA;AAC5E;AAEF,EAAA,KAAA,MAAW,EAAM,IAAA,MAAA,CAAO,IAAK,CAAA,QAAQ,CAAG,EAAA;AACtC,IAAA,IAAI,CAAC,UAAW,CAAA,QAAA,CAAS,EAAE,CAAG,EAAA,UAAA,CAAW,KAAK,EAAE,CAAA;AAAA;AAElD,EAAM,MAAA,SAAA,GAAY,UAAW,CAAA,GAAA,CAAI,CAAO,EAAA,MAAA;AAAA,IACtC,EAAA;AAAA,IACA,IAAA,EAAM,SAAS,EAAE;AAAA,GACnB,CAAE,CAAE,CAAA,MAAA,CAAO,CAAO,GAAA,KAAA,GAAA,CAAI,IAAI,CAAE,CAAA,IAAA,CAAK,CAAC,CAAA,EAAG,CAAG,KAAA;AAhE1C,IAAA,IAAAA,GAAAC,EAAAA,GAAAA;AAgE6C,IAAA,OAAA,WAAA,CAAA,CAAYD,GAAA,GAAA,CAAA,CAAE,IAAK,CAAA,OAAA,KAAP,gBAAAA,GAAgB,CAAA,IAAI,CAAI,GAAA,WAAA,CAAA,CAAYC,MAAA,CAAE,CAAA,IAAA,CAAK,OAAP,KAAA,IAAA,GAAA,MAAA,GAAAA,IAAgB,IAAI,CAAA;AAAA,GAAC,CAAA;AAChH,EAAA,MAAM,aAA2B,EAAC;AAClC,EAAA,MAAM,QAAoB,EAAC;AAE3B,EAAM,MAAA,QAAA,uBAAe,GAAoB,EAAA;AACzC,EAAA,IAAI,OAAU,GAAA,CAAA;AACd,EAAM,MAAA,GAAA,GAAM,CAAC,CAAuB,EAAA,QAAA,KAAqB,OAAO,CAAM,KAAA,QAAA,IAAY,OAAO,QAAS,CAAA,CAAC,IAAI,IAAK,CAAA,GAAA,CAAI,GAAG,IAAK,CAAA,GAAA,CAAI,GAAG,CAAI,GAAA,GAAG,CAAC,CAAI,GAAA,QAAA;AAC3I,EAAA,MAAM,YAAe,GAAA,CAAC,IAAkB,KAAA,IAAA,CAAK,gBAAgB,OAAO,IAAA,CAAK,YAAa,CAAA,MAAA,KAAW,YAAY,MAAO,CAAA,IAAA,CAAK,YAAa,CAAA,UAAU,IAAI,CAAI,GAAA;AAAA,IACtJ,MAAA,EAAQ,KAAK,YAAa,CAAA,MAAA;AAAA,IAC1B,UAAY,EAAA,MAAA,CAAO,IAAK,CAAA,YAAA,CAAa,UAAU;AAAA,GAC7C,GAAA,IAAA;AACJ,EAAW,KAAA,MAAA;AAAA,IACT;AAAA,OACG,SAAW,EAAA;AACd,IAAA,MAAM,IAAO,GAAA,WAAA,CAAA,CAAY,EAAK,GAAA,IAAA,CAAA,OAAA,KAAL,mBAAc,IAAI,CAAA;AAC3C,IAAA,MAAM,EAAK,GAAA,WAAA,CAAA,CAAY,EAAK,GAAA,IAAA,CAAA,OAAA,KAAL,mBAAc,EAAE,CAAA;AACvC,IAAM,MAAA,IAAA,GAAO,KAAK,GAAI,CAAA,GAAA,EAAK,KAAK,IAAO,GAAA,EAAA,GAAK,OAAO,iBAAiB,CAAA;AACpE,IAAM,MAAA,IAAA,GAAO,KAAK,IAAQ,IAAA,EAAA;AAC1B,IAAI,IAAA,IAAA,KAAS,UAAU,OAAO,IAAA,CAAK,SAAS,QAAY,IAAA,IAAA,CAAK,IAAK,CAAA,IAAA,EAAQ,EAAA;AACxE,MAAW,OAAA,IAAA,CAAA;AACX,MAAA,KAAA,CAAM,IAAK,CAAA,cAAA,CAAA;AAAA,QACT,EAAA,EAAI,cAAc,OAAO,CAAA,CAAA;AAAA,QACzB,IAAA,EAAM,IAAK,CAAA,IAAA,CAAK,IAAK,EAAA;AAAA,QACrB,QAAU,EAAA,IAAA;AAAA,QACV,WAAa,EAAA,IAAA;AAAA,QACb,CAAG,EAAA,GAAA,CAAI,IAAK,CAAA,CAAA,EAAG,GAAG,CAAA;AAAA,QAClB,CAAG,EAAA,GAAA,CAAI,IAAK,CAAA,CAAA,EAAG,GAAG;AAAA,OAAA,EACd,KAAK,OAAU,GAAA;AAAA,QACjB,SAAS,IAAK,CAAA;AAAA,OAChB,GAAI,EACL,CAAA,CAAA;AACD,MAAA;AAAA;AAEF,IAAA,IAAI,SAAS,OAAS,EAAA;AAEpB,MAAW,OAAA,IAAA,CAAA;AACX,MAAM,MAAA,EAAA,GAAK,cAAc,OAAO,CAAA,CAAA;AAChC,MAAA,IAAI,KAAK,EAAI,EAAA,QAAA,CAAS,GAAI,CAAA,IAAA,CAAK,IAAI,EAAE,CAAA;AACrC,MAAM,MAAA,IAAA,GAAO,OAAO,IAAA,CAAK,KAAU,KAAA,QAAA,IAAY,mBAAoB,CAAA,IAAA,CAAK,IAAK,CAAA,KAAK,CAAI,GAAA,IAAA,CAAK,KAAQ,GAAA,SAAA;AACnG,MAAA,UAAA,CAAW,IAAK,CAAA,cAAA,CAAA;AAAA,QACd,EAAA;AAAA,QACA,MAAQ,EAAA,IAAA,CAAK,EAAM,IAAA,CAAA,MAAA,EAAS,OAAO,CAAA,CAAA;AAAA,QACnC,IAAM,EAAA,OAAA;AAAA,QACN,GAAA,EAAK,cAAc,IAAI,CAAA;AAAA,QACvB,OAAO,IAAK,CAAA,IAAA,IAAQ,OAAS,EAAA,KAAA,CAAM,GAAG,EAAE,CAAA;AAAA,QACxC,WAAa,EAAA,IAAA;AAAA,QACb,YAAc,EAAA,CAAA;AAAA,QACd,UAAY,EAAA,IAAA;AAAA,QACZ,KAAO,EAAA,CAAA;AAAA,QACP,UAAY,EAAA,UAAA;AAAA,QACZ,MAAQ,EAAA,MAAA;AAAA,QACR,YAAA,EAAc,aAAa,IAAI,CAAA;AAAA,QAC/B,MAAQ,EAAA,CAAA;AAAA,QACR,KAAO,EAAA,KAAA;AAAA,QACP,SAAW,EAAA;AAAA,OACP,EAAA,CAAA,CAAA,EAAA,GAAA,IAAA,CAAK,IAAL,KAAA,IAAA,GAAA,MAAA,GAAA,EAAA,CAAW,IAAS,EAAA,IAAA;AAAA,QACtB,IAAA,EAAM,IAAK,CAAA,IAAA,CAAK,IAAK;AAAA,OACvB,GAAI,EACL,CAAA,CAAA;AACD,MAAA;AAAA;AAEF,IAAK,IAAA,CAAA,IAAA,KAAS,WAAW,IAAS,KAAA,OAAA,KAAY,OAAO,IAAK,CAAA,GAAA,KAAQ,QAAY,IAAA,IAAA,CAAK,GAAK,EAAA;AACtF,MAAW,OAAA,IAAA,CAAA;AACX,MAAA,MAAM,QAAW,GAAA,WAAA,CAAA,CAAY,EAAK,GAAA,IAAA,CAAA,IAAA,KAAL,mBAAW,IAAI,CAAA;AAC5C,MAAM,MAAA,MAAA,GAAA,CAAA,CAAS,EAAK,GAAA,IAAA,CAAA,IAAA,KAAL,IAAW,GAAA,MAAA,GAAA,EAAA,CAAA,EAAA,KAAM,OAAO,WAAY,CAAA,IAAA,CAAK,IAAK,CAAA,EAAE,CAAI,GAAA,IAAA;AACnE,MAAI,IAAA,IAAA,CAAK,IAAa,QAAA,CAAA,GAAA,CAAI,KAAK,EAAI,EAAA,CAAA,WAAA,EAAc,OAAO,CAAE,CAAA,CAAA;AAC1D,MAAA,UAAA,CAAW,IAAK,CAAA,aAAA,CAAA,cAAA,CAAA;AAAA,QACd,EAAA,EAAI,cAAc,OAAO,CAAA,CAAA;AAAA,QACzB,MAAQ,EAAA,IAAA,CAAK,EAAM,IAAA,CAAA,MAAA,EAAS,OAAO,CAAA,CAAA;AAAA,QACnC,YAAA,EAAc,aAAa,IAAI;AAAA,OAC3B,EAAA,CAAA,CAAA,EAAA,GAAA,IAAA,CAAK,IAAL,KAAA,IAAA,GAAA,MAAA,GAAA,EAAA,CAAW,IAAS,EAAA,IAAA;AAAA,QACtB,IAAA,EAAM,IAAK,CAAA,IAAA,CAAK,IAAK;AAAA,OACvB,GAAI,EANU,CAAA,EAAA;AAAA,QAOd,IAAA,EAAM,IAAS,KAAA,OAAA,GAAU,OAAU,GAAA,OAAA;AAAA,QACnC,KAAK,IAAK,CAAA,GAAA;AAAA,QACV,OAAO,IAAK,CAAA,IAAA,IAAQ,IAAM,EAAA,KAAA,CAAM,GAAG,EAAE,CAAA;AAAA,QACrC,WAAA,EAAa,IAAS,KAAA,OAAA,GAAU,IAAO,GAAA,IAAA;AAAA,QACvC,YAAc,EAAA,QAAA;AAAA,QACd,UAAY,EAAA,MAAA,IAAU,MAAS,GAAA,QAAA,GAAW,MAAS,GAAA,IAAA;AAAA,QACnD,KAAO,EAAA,CAAA;AAAA,QACP,UAAY,EAAA,UAAA;AAAA,QACZ,MAAQ,EAAA,MAAA;AAAA,QACR,QAAQ,OAAO,IAAA,CAAK,MAAW,KAAA,QAAA,GAAW,KAAK,MAAS,GAAA,CAAA;AAAA,QACxD,KAAA,EAAO,OAAQ,CAAA,IAAA,CAAK,KAAK,CAAA;AAAA,QACzB,SAAA,EAAW,SAAS,OAAW,IAAA,OAAO,KAAK,KAAU,KAAA,QAAA,GAAW,KAAK,KAAQ,GAAA;AAAA,OAC9E,CAAA,CAAA;AAAA;AACH;AAEF,EAAA,MAAM,OAAO,OAAQ,CAAA,UAAA;AAIrB,EAAM,MAAA,MAAA,GAAS,QAAQ,MAAO,CAAA,IAAA,CAAK,KAAK,CAAI,GAAA,CAAA,IAAK,MAAO,CAAA,IAAA,CAAK,MAAM,CAAA,GAAI,IAAI,CAAG,EAAA,MAAA,CAAO,KAAK,KAAK,CAAC,IAAI,MAAO,CAAA,IAAA,CAAK,MAAM,CAAC,CAAK,CAAA,GAAA,MAAA;AAC5H,EAAA,MAAM,OAAO,OAAQ,CAAA,IAAA;AAGrB,EAAM,MAAA,OAAA,GAAU,QAAO,IAAM,IAAA,IAAA,GAAA,MAAA,GAAA,IAAA,CAAA,GAAA,CAAA,KAAQ,YAAY,IAAK,CAAA,GAAA,GAAM,KAAK,GAAM,GAAA,IAAA;AACvE,EAAO,OAAA;AAAA,IACL,QAAA,EAAU,aACL,CAAA,cAAA,CAAA,aAAA,CAAA,cAAA,CAAA,EAAA,EAAA,aAAA,EADK,CAAA,EAAA;AAAA,MAER,KAAO,EAAA;AAAA,KAAA,CAAA,EACH,MAAS,GAAA;AAAA,MACX;AAAA,KACF,GAAI,EALI,CAAA,EAAA;AAAA;AAAA,MAOR,KAAO,EAAA,KAAA,CAAM,GAAI,CAAA,CAAC,EAGZ,KAAA;AAHY,QAChB,IAAA,EAAA,GAAA,EAAA,EAAA;AAAA,UAAA;AAAA,SA1KR,GAyKwB,EAEb,EAAA,CAAA,GAAA,SAAA,CAFa,EAEb,EAAA;AAAA,UADH;AAAA,SAAA,CAAA;AAGA,QAAA,MAAM,MAAS,GAAA,OAAA,GAAU,QAAS,CAAA,GAAA,CAAI,OAAO,CAAI,GAAA,MAAA;AACjD,QAAO,OAAA,MAAA,GAAS,iCACX,CADW,CAAA,EAAA;AAAA,UAEd,OAAS,EAAA;AAAA,SACP,CAAA,GAAA,CAAA;AAAA,OACL;AAAA,KACH,CAAA;AAAA,IACA,KAAQ,EAAA,CAAA,KAAA,IAAS,EAAI,EAAA,IAAA,EAAU,IAAA,gBAAA;AAAA,IAC/B;AAAA,GACF;AACF"}
|
|
@@ -33,42 +33,99 @@ const PROMO_CONNECTOR = "yantra-video-generation";
|
|
|
33
33
|
const PRODUCE_SUBMIT_ACTION = "YANTRA_VIDEO_GENERATION_PRODUCE_SUBMIT";
|
|
34
34
|
const PRODUCE_STATUS_ACTION = "YANTRA_VIDEO_GENERATION_PRODUCE_STATUS";
|
|
35
35
|
const DESIGN_PROJECT_ACTION = "YANTRA_VIDEO_GENERATION_DESIGN_PROJECT";
|
|
36
|
+
const PROMO_QUALITIES = [{
|
|
37
|
+
id: "standard",
|
|
38
|
+
name: "Standard",
|
|
39
|
+
description: "One pass: a finished cut in about half an hour."
|
|
40
|
+
}, {
|
|
41
|
+
id: "studio",
|
|
42
|
+
name: "Studio",
|
|
43
|
+
description: "Directed like a film: three concepts written and judged, characters and narrator cast, keyframes first, the top video models tested on the hardest shots. Takes longer and uses more credits."
|
|
44
|
+
}];
|
|
45
|
+
const PROMO_NARRATORS = [{
|
|
46
|
+
id: "",
|
|
47
|
+
name: "Cast for the script"
|
|
48
|
+
}, {
|
|
49
|
+
id: "deadpan-documentary",
|
|
50
|
+
name: "Deadpan documentary, male"
|
|
51
|
+
}, {
|
|
52
|
+
id: "warm-storyteller-male",
|
|
53
|
+
name: "Warm storyteller, male"
|
|
54
|
+
}, {
|
|
55
|
+
id: "warm-storyteller-female",
|
|
56
|
+
name: "Warm storyteller, female"
|
|
57
|
+
}, {
|
|
58
|
+
id: "confident-announcer-male",
|
|
59
|
+
name: "Confident announcer, male"
|
|
60
|
+
}, {
|
|
61
|
+
id: "confident-announcer-female",
|
|
62
|
+
name: "Confident announcer, female"
|
|
63
|
+
}, {
|
|
64
|
+
id: "friendly-conversational",
|
|
65
|
+
name: "Friendly, conversational"
|
|
66
|
+
}, {
|
|
67
|
+
id: "calm-expert",
|
|
68
|
+
name: "Calm expert"
|
|
69
|
+
}];
|
|
70
|
+
const PROMO_DESIGN_MODELS = [{
|
|
71
|
+
id: "",
|
|
72
|
+
name: "Default",
|
|
73
|
+
description: "The connector\u2019s own design model."
|
|
74
|
+
}, {
|
|
75
|
+
id: "claude-opus-5-5",
|
|
76
|
+
name: "Claude Opus 5.5",
|
|
77
|
+
description: "Most capable, for long and complex work."
|
|
78
|
+
}];
|
|
36
79
|
const PROMO_PRESETS = [{
|
|
80
|
+
id: "launch-film",
|
|
81
|
+
name: "Launch film",
|
|
82
|
+
description: "Story-led launch film: a cold open with a laugh, the reveal, then the product doing real jobs.",
|
|
83
|
+
defaultDurationSeconds: 90,
|
|
84
|
+
needsSourceVideo: false,
|
|
85
|
+
defaultQuality: "studio",
|
|
86
|
+
produceOnly: true
|
|
87
|
+
}, {
|
|
37
88
|
id: "product-teaser",
|
|
38
89
|
name: "Product teaser",
|
|
39
90
|
description: "Cinematic launch teaser: hero shots, a reveal, one closing line.",
|
|
40
91
|
defaultDurationSeconds: 30,
|
|
41
|
-
needsSourceVideo: false
|
|
92
|
+
needsSourceVideo: false,
|
|
93
|
+
defaultQuality: "standard"
|
|
42
94
|
}, {
|
|
43
95
|
id: "brand-film",
|
|
44
96
|
name: "Brand film",
|
|
45
97
|
description: "Mood-led brand piece: story, atmosphere, music-first.",
|
|
46
98
|
defaultDurationSeconds: 60,
|
|
47
|
-
needsSourceVideo: false
|
|
99
|
+
needsSourceVideo: false,
|
|
100
|
+
defaultQuality: "standard"
|
|
48
101
|
}, {
|
|
49
102
|
id: "motion-promo",
|
|
50
103
|
name: "Motion promo",
|
|
51
104
|
description: "Kinetic type and motion graphics for a feature, offer or launch.",
|
|
52
105
|
defaultDurationSeconds: 30,
|
|
53
|
-
needsSourceVideo: false
|
|
106
|
+
needsSourceVideo: false,
|
|
107
|
+
defaultQuality: "standard"
|
|
54
108
|
}, {
|
|
55
109
|
id: "explainer",
|
|
56
110
|
name: "Explainer",
|
|
57
111
|
description: "Narrated explainer with captions: what, why, how.",
|
|
58
112
|
defaultDurationSeconds: 60,
|
|
59
|
-
needsSourceVideo: false
|
|
113
|
+
needsSourceVideo: false,
|
|
114
|
+
defaultQuality: "standard"
|
|
60
115
|
}, {
|
|
61
116
|
id: "social-hook",
|
|
62
117
|
name: "Social hook",
|
|
63
118
|
description: "Vertical scroll-stopper: instant hook, big captions, one message.",
|
|
64
119
|
defaultDurationSeconds: 15,
|
|
65
|
-
needsSourceVideo: false
|
|
120
|
+
needsSourceVideo: false,
|
|
121
|
+
defaultQuality: "standard"
|
|
66
122
|
}, {
|
|
67
123
|
id: "footage-remix",
|
|
68
124
|
name: "Remix footage",
|
|
69
125
|
description: "Cut a video already on the canvas into a promo with graphics and music.",
|
|
70
126
|
defaultDurationSeconds: 30,
|
|
71
|
-
needsSourceVideo: true
|
|
127
|
+
needsSourceVideo: true,
|
|
128
|
+
defaultQuality: "standard"
|
|
72
129
|
}];
|
|
73
130
|
const PROMO_PLAYBOOKS = [{
|
|
74
131
|
id: "",
|
|
@@ -97,9 +154,25 @@ const PROMO_DURATIONS = [15, 30, 45, 60, 90];
|
|
|
97
154
|
const PROMO_ASPECT_RATIOS = ["16:9", "9:16", "1:1"];
|
|
98
155
|
const PROMO_POLL_EVERY_MS = 2e4;
|
|
99
156
|
const PROMO_POLL_MAX_MS = 75 * 6e4;
|
|
157
|
+
const PROMO_STUDIO_POLL_MAX_MS = 120 * 6e4;
|
|
158
|
+
const PROMO_RUN_TIMEOUT_MS = 55 * 6e4;
|
|
159
|
+
const PROMO_STUDIO_RUN_TIMEOUT_MS = 100 * 6e4;
|
|
100
160
|
function lookupPromoPreset(id) {
|
|
101
161
|
var _a;
|
|
102
|
-
return (_a = PROMO_PRESETS.find((p) => p.id === id)) != null ? _a : PROMO_PRESETS
|
|
162
|
+
return (_a = PROMO_PRESETS.find((p) => p.id === id)) != null ? _a : PROMO_PRESETS.find((p) => p.id === DEFAULT_PROMO_PRESET);
|
|
163
|
+
}
|
|
164
|
+
function defaultPromoQuality(presetId) {
|
|
165
|
+
return lookupPromoPreset(presetId).defaultQuality;
|
|
166
|
+
}
|
|
167
|
+
function promoQualityOf(opts) {
|
|
168
|
+
var _a;
|
|
169
|
+
return (_a = opts.quality) != null ? _a : defaultPromoQuality(opts.preset);
|
|
170
|
+
}
|
|
171
|
+
function promoRunTimeoutMs(opts) {
|
|
172
|
+
return promoQualityOf(opts) === "studio" ? PROMO_STUDIO_RUN_TIMEOUT_MS : PROMO_RUN_TIMEOUT_MS;
|
|
173
|
+
}
|
|
174
|
+
function promoPollMaxMs(opts) {
|
|
175
|
+
return promoQualityOf(opts) === "studio" ? PROMO_STUDIO_POLL_MAX_MS : PROMO_POLL_MAX_MS;
|
|
103
176
|
}
|
|
104
177
|
const EMPTY_PROMO_CONTEXT = {
|
|
105
178
|
onScreenText: "",
|
|
@@ -124,9 +197,9 @@ function readBrandColors(raw) {
|
|
|
124
197
|
return out.slice(0, 6);
|
|
125
198
|
}
|
|
126
199
|
function buildPromoRunParams(opts) {
|
|
127
|
-
var _a, _b, _c, _d, _e, _f, _g;
|
|
200
|
+
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
128
201
|
const referenceImageUrls = ((_a = opts.referenceImageUrls) != null ? _a : []).filter((u) => /^https?:\/\//i.test(u));
|
|
129
|
-
return __spreadProps(__spreadValues(__spreadValues(__spreadValues(__spreadValues(__spreadValues(__spreadValues(__spreadValues(__spreadValues(__spreadValues(__spreadValues(__spreadValues(__spreadValues(__spreadValues(__spreadValues({
|
|
202
|
+
return __spreadProps(__spreadValues(__spreadValues(__spreadProps(__spreadValues(__spreadValues(__spreadValues(__spreadValues(__spreadValues(__spreadValues(__spreadValues(__spreadValues(__spreadValues(__spreadValues(__spreadValues(__spreadValues(__spreadValues(__spreadValues({
|
|
130
203
|
prompt: opts.prompt,
|
|
131
204
|
preset: opts.preset,
|
|
132
205
|
durationSeconds: opts.durationSeconds,
|
|
@@ -160,7 +233,14 @@ function buildPromoRunParams(opts) {
|
|
|
160
233
|
} : {}), opts.stylePlaybook ? {
|
|
161
234
|
stylePlaybook: opts.stylePlaybook
|
|
162
235
|
} : {}), {
|
|
163
|
-
|
|
236
|
+
// Always sent: the timeout below has to agree with whichever quality runs.
|
|
237
|
+
quality: promoQualityOf(opts)
|
|
238
|
+
}), opts.narratorVoice ? {
|
|
239
|
+
narratorVoice: opts.narratorVoice
|
|
240
|
+
} : {}), ((_h = opts.useCases) == null ? void 0 : _h.trim()) ? {
|
|
241
|
+
useCases: opts.useCases
|
|
242
|
+
} : {}), {
|
|
243
|
+
timeoutMs: promoRunTimeoutMs(opts)
|
|
164
244
|
});
|
|
165
245
|
}
|
|
166
246
|
function parsePromoRunResult(result) {
|
|
@@ -226,7 +306,7 @@ async function producePromoVideo(run, opts, onProgress, sleep = (ms) => new Prom
|
|
|
226
306
|
const submit = await run(PRODUCE_SUBMIT_ACTION, buildPromoRunParams(opts));
|
|
227
307
|
const handle = parseSubmitResult(submit);
|
|
228
308
|
if (!handle) throw new Error("Could not start the production (no handle returned)");
|
|
229
|
-
const deadline = Date.now() +
|
|
309
|
+
const deadline = Date.now() + promoPollMaxMs(opts);
|
|
230
310
|
let lastProgress = "";
|
|
231
311
|
let pollErrors = 0;
|
|
232
312
|
while (Date.now() < deadline) {
|
|
@@ -259,15 +339,26 @@ function buildDesignParams(opts) {
|
|
|
259
339
|
const _a = opts, {
|
|
260
340
|
captions: _c,
|
|
261
341
|
narration: _n,
|
|
262
|
-
stylePlaybook: _p
|
|
342
|
+
stylePlaybook: _p,
|
|
343
|
+
quality: _q,
|
|
344
|
+
narratorVoice: _v,
|
|
345
|
+
useCases: _u,
|
|
346
|
+
model
|
|
263
347
|
} = _a, rest = __objRest(_a, [
|
|
264
348
|
"captions",
|
|
265
349
|
"narration",
|
|
266
|
-
"stylePlaybook"
|
|
350
|
+
"stylePlaybook",
|
|
351
|
+
"quality",
|
|
352
|
+
"narratorVoice",
|
|
353
|
+
"useCases",
|
|
354
|
+
"model"
|
|
267
355
|
]);
|
|
268
356
|
const base = buildPromoRunParams(rest);
|
|
269
357
|
delete base.timeoutMs;
|
|
270
|
-
|
|
358
|
+
delete base.quality;
|
|
359
|
+
return __spreadValues(__spreadValues(__spreadValues(__spreadValues({}, base), (model == null ? void 0 : model.trim()) ? {
|
|
360
|
+
model: model.trim()
|
|
361
|
+
} : {}), opts.sourceVideoSeconds && opts.sourceVideoSeconds > 0 ? {
|
|
271
362
|
sourceVideoSeconds: opts.sourceVideoSeconds
|
|
272
363
|
} : {}), opts.musicUrl && /^https?:\/\//i.test(opts.musicUrl) ? {
|
|
273
364
|
musicUrl: opts.musicUrl
|
|
@@ -309,4 +400,4 @@ async function designPromoProject(run, opts) {
|
|
|
309
400
|
const designed = parseDesignResult(raw);
|
|
310
401
|
if (!designed) throw new Error("Could not design the video (no project returned)");
|
|
311
402
|
return designed;
|
|
312
|
-
}export{DEFAULT_PROMO_PRESET,DESIGN_PROJECT_ACTION,EMPTY_PROMO_CONTEXT,PRODUCE_STATUS_ACTION,PRODUCE_SUBMIT_ACTION,PROMO_ASPECT_RATIOS,PROMO_CONNECTOR,PROMO_DURATIONS,PROMO_PLAYBOOKS,PROMO_POLL_EVERY_MS,PROMO_POLL_MAX_MS,PROMO_PRESETS,buildDesignParams,buildPromoRunParams,defaultNarration,designPromoProject,hasPromoContext,lookupPromoPreset,parseDesignResult,parsePollResult,parsePromoRunResult,parseSubmitResult,producePromoVideo,readBrandColors};//# sourceMappingURL=promoVideo.js.map
|
|
403
|
+
}export{DEFAULT_PROMO_PRESET,DESIGN_PROJECT_ACTION,EMPTY_PROMO_CONTEXT,PRODUCE_STATUS_ACTION,PRODUCE_SUBMIT_ACTION,PROMO_ASPECT_RATIOS,PROMO_CONNECTOR,PROMO_DESIGN_MODELS,PROMO_DURATIONS,PROMO_NARRATORS,PROMO_PLAYBOOKS,PROMO_POLL_EVERY_MS,PROMO_POLL_MAX_MS,PROMO_PRESETS,PROMO_QUALITIES,PROMO_RUN_TIMEOUT_MS,PROMO_STUDIO_POLL_MAX_MS,PROMO_STUDIO_RUN_TIMEOUT_MS,buildDesignParams,buildPromoRunParams,defaultNarration,defaultPromoQuality,designPromoProject,hasPromoContext,lookupPromoPreset,parseDesignResult,parsePollResult,parsePromoRunResult,parseSubmitResult,producePromoVideo,promoPollMaxMs,promoQualityOf,promoRunTimeoutMs,readBrandColors};//# sourceMappingURL=promoVideo.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"promoVideo.js","sources":["../../../src/features/canvas/promoVideo.ts"],"sourcesContent":["/**\n * Native twin of canvas-surface `rpc/promoVideoRpc` — catalog + submit/poll\n * envelope. Transport stays `RunMediaAction` (host or remote exec).\n */\n\nexport const PROMO_CONNECTOR = 'yantra-video-generation';\nexport const PRODUCE_SUBMIT_ACTION = 'YANTRA_VIDEO_GENERATION_PRODUCE_SUBMIT';\nexport const PRODUCE_STATUS_ACTION = 'YANTRA_VIDEO_GENERATION_PRODUCE_STATUS';\n/** Design lane: brief → editable studio project (no render). */\nexport const DESIGN_PROJECT_ACTION = 'YANTRA_VIDEO_GENERATION_DESIGN_PROJECT';\nexport const DESIGN_TIMEOUT_MS = 4 * 60_000;\n\nexport interface PromoPreset {\n id: string;\n name: string;\n description: string;\n defaultDurationSeconds: number;\n needsSourceVideo: boolean;\n}\n\nexport const PROMO_PRESETS: readonly PromoPreset[] = [\n {\n id: 'product-teaser',\n name: 'Product teaser',\n description: 'Cinematic launch teaser: hero shots, a reveal, one closing line.',\n defaultDurationSeconds: 30,\n needsSourceVideo: false,\n },\n {\n id: 'brand-film',\n name: 'Brand film',\n description: 'Mood-led brand piece: story, atmosphere, music-first.',\n defaultDurationSeconds: 60,\n needsSourceVideo: false,\n },\n {\n id: 'motion-promo',\n name: 'Motion promo',\n description: 'Kinetic type and motion graphics for a feature, offer or launch.',\n defaultDurationSeconds: 30,\n needsSourceVideo: false,\n },\n {\n id: 'explainer',\n name: 'Explainer',\n description: 'Narrated explainer with captions: what, why, how.',\n defaultDurationSeconds: 60,\n needsSourceVideo: false,\n },\n {\n id: 'social-hook',\n name: 'Social hook',\n description: 'Vertical scroll-stopper: instant hook, big captions, one message.',\n defaultDurationSeconds: 15,\n needsSourceVideo: false,\n },\n {\n id: 'footage-remix',\n name: 'Remix footage',\n description: 'Cut a video already on the canvas into a promo with graphics and music.',\n defaultDurationSeconds: 30,\n needsSourceVideo: true,\n },\n];\n\nexport const PROMO_PLAYBOOKS: readonly { id: string; name: string }[] = [\n { id: '', name: 'Preset default' },\n { id: 'premium-minimalist', name: 'Premium minimalist' },\n { id: 'clean-professional', name: 'Clean professional' },\n { id: 'flat-motion-graphics', name: 'Flat motion graphics' },\n { id: 'minimalist-diagram', name: 'Minimalist diagram' },\n { id: 'anime-ghibli', name: 'Anime / Ghibli' },\n];\n\nexport function defaultNarration(presetId: string): boolean {\n return presetId !== 'brand-film' && presetId !== 'social-hook';\n}\n\nexport const DEFAULT_PROMO_PRESET = 'product-teaser';\nexport const PROMO_DURATIONS = [15, 30, 45, 60, 90] as const;\nexport const PROMO_ASPECT_RATIOS = ['16:9', '9:16', '1:1'] as const;\nexport const PROMO_POLL_EVERY_MS = 20_000;\nexport const PROMO_POLL_MAX_MS = 75 * 60_000;\n\nexport function lookupPromoPreset(id: string): PromoPreset {\n return PROMO_PRESETS.find((p) => p.id === id) ?? PROMO_PRESETS[0];\n}\n\nexport interface PromoContext {\n onScreenText: string;\n keyPoints: string;\n audience: string;\n tone: string;\n avoid: string;\n brandColors: string;\n}\n\nexport const EMPTY_PROMO_CONTEXT: PromoContext = {\n onScreenText: '',\n keyPoints: '',\n audience: '',\n tone: '',\n avoid: '',\n brandColors: '',\n};\n\nexport function hasPromoContext(value: PromoContext, logoUrl?: string | null): boolean {\n return Boolean(logoUrl) || Object.values(value).some((v) => v.trim().length > 0);\n}\n\n/** Hexes in a colours field — mirrors the connector parser. */\nexport function readBrandColors(raw: string): string[] {\n const out: string[] = [];\n for (const token of raw.split(/[\\s,]+/)) {\n const m = token.trim().match(/^#?([0-9a-f]{3}|[0-9a-f]{6})$/i);\n if (!m) continue;\n const h =\n m[1].length === 3\n ? m[1]\n .split('')\n .map((c) => c + c)\n .join('')\n : m[1];\n const hex = `#${h.toLowerCase()}`;\n if (!out.includes(hex)) out.push(hex);\n }\n return out.slice(0, 6);\n}\n\nexport interface PromoRunOptions {\n prompt: string;\n preset: string;\n durationSeconds: number;\n aspectRatio: string;\n referenceImageUrls?: string[];\n sourceVideoUrl?: string;\n brandName?: string;\n callToAction?: string;\n logoUrl?: string;\n onScreenText?: string;\n keyPoints?: string;\n audience?: string;\n tone?: string;\n avoid?: string;\n brandColors?: string;\n captions?: boolean;\n narration?: boolean;\n stylePlaybook?: string;\n}\n\nexport interface PromoRunResult {\n url: string;\n title: string;\n projectId: string;\n preset: string;\n pipeline: string;\n durationSeconds?: number;\n summary?: string;\n}\n\nexport function buildPromoRunParams(opts: PromoRunOptions): Record<string, unknown> {\n const referenceImageUrls = (opts.referenceImageUrls ?? []).filter((u) => /^https?:\\/\\//i.test(u));\n return {\n prompt: opts.prompt,\n preset: opts.preset,\n durationSeconds: opts.durationSeconds,\n aspectRatio: opts.aspectRatio,\n ...(referenceImageUrls.length ? { referenceImageUrls } : {}),\n ...(opts.sourceVideoUrl ? { sourceVideoUrl: opts.sourceVideoUrl } : {}),\n ...(opts.brandName ? { brandName: opts.brandName } : {}),\n ...(opts.callToAction ? { callToAction: opts.callToAction } : {}),\n ...(opts.logoUrl ? { logoUrl: opts.logoUrl } : {}),\n ...(opts.onScreenText?.trim() ? { onScreenText: opts.onScreenText } : {}),\n ...(opts.keyPoints?.trim() ? { keyPoints: opts.keyPoints } : {}),\n ...(opts.audience?.trim() ? { audience: opts.audience.trim() } : {}),\n ...(opts.tone?.trim() ? { tone: opts.tone.trim() } : {}),\n ...(opts.avoid?.trim() ? { avoid: opts.avoid.trim() } : {}),\n ...(opts.brandColors?.trim() ? { brandColors: opts.brandColors } : {}),\n ...(typeof opts.captions === 'boolean' ? { captions: opts.captions } : {}),\n ...(typeof opts.narration === 'boolean' ? { narration: opts.narration } : {}),\n ...(opts.stylePlaybook ? { stylePlaybook: opts.stylePlaybook } : {}),\n timeoutMs: 55 * 60_000,\n };\n}\n\nexport function parsePromoRunResult(result: Record<string, unknown>): PromoRunResult | null {\n const data = (result.data ?? result) as Record<string, unknown>;\n const samples = data.samples as Array<{ uri?: string }> | undefined;\n const url = (typeof data.videoUri === 'string' && data.videoUri) || samples?.find((s) => s?.uri)?.uri || '';\n if (!url) return null;\n const prod = (data.production ?? {}) as Record<string, unknown>;\n const s = (k: string) => (typeof prod[k] === 'string' ? (prod[k] as string) : undefined);\n const n = (k: string) => (typeof prod[k] === 'number' ? (prod[k] as number) : undefined);\n return {\n url,\n title: s('title') ?? 'Marketing video',\n projectId: s('projectId') ?? (typeof data.operationName === 'string' ? data.operationName : ''),\n preset: s('preset') ?? '',\n pipeline: s('pipeline') ?? '',\n durationSeconds: n('durationSeconds'),\n summary: s('summary'),\n };\n}\n\nexport interface PromoSubmitHandle {\n projectId: string;\n sandboxId: string;\n}\n\nexport function parseSubmitResult(result: Record<string, unknown>): PromoSubmitHandle | null {\n const d = (result.data ?? result) as Record<string, unknown>;\n const projectId = typeof d.projectId === 'string' ? d.projectId : '';\n const sandboxId = typeof d.sandboxId === 'string' ? d.sandboxId : '';\n return projectId && sandboxId ? { projectId, sandboxId } : null;\n}\n\nexport type PromoPollState = 'running' | 'succeeded' | 'failed';\n\nexport interface PromoPoll {\n state: PromoPollState;\n progress: string[];\n error?: string;\n result?: PromoRunResult;\n}\n\nexport function parsePollResult(result: Record<string, unknown>): PromoPoll {\n const d = (result.data ?? result) as Record<string, unknown>;\n const state: PromoPollState = d.state === 'succeeded' || d.state === 'failed' ? d.state : 'running';\n const progress = Array.isArray(d.progress) ? (d.progress.filter((x) => typeof x === 'string') as string[]) : [];\n if (state === 'succeeded') {\n const run = parsePromoRunResult(d);\n return run\n ? { state, progress, result: run }\n : { state: 'failed', progress, error: 'Production finished but returned no video' };\n }\n if (state === 'failed') {\n return { state, progress, error: typeof d.error === 'string' ? d.error : 'Marketing video production failed' };\n }\n return { state, progress };\n}\n\nexport async function producePromoVideo(\n run: (action: string, params: Record<string, unknown>) => Promise<Record<string, unknown>>,\n opts: PromoRunOptions,\n onProgress?: (msg: string) => void,\n sleep: (ms: number) => Promise<void> = (ms) => new Promise((r) => setTimeout(r, ms)),\n isCancelled?: () => boolean,\n): Promise<PromoRunResult> {\n onProgress?.('Starting the production…');\n const submit = await run(PRODUCE_SUBMIT_ACTION, buildPromoRunParams(opts));\n const handle = parseSubmitResult(submit);\n if (!handle) throw new Error('Could not start the production (no handle returned)');\n\n const deadline = Date.now() + PROMO_POLL_MAX_MS;\n let lastProgress = '';\n let pollErrors = 0;\n while (Date.now() < deadline) {\n if (isCancelled?.()) throw new Error('cancelled');\n await sleep(PROMO_POLL_EVERY_MS);\n if (isCancelled?.()) throw new Error('cancelled');\n let poll: PromoPoll;\n try {\n const raw = await run(PRODUCE_STATUS_ACTION, {\n projectId: handle.projectId,\n sandboxId: handle.sandboxId,\n });\n poll = parsePollResult(raw);\n pollErrors = 0;\n } catch (err) {\n if (++pollErrors >= 4) throw err instanceof Error ? err : new Error(String(err));\n continue;\n }\n const line = poll.progress.at(-1);\n if (line && line !== lastProgress) {\n lastProgress = line;\n onProgress?.(line);\n }\n if (poll.state === 'succeeded' && poll.result) return poll.result;\n if (poll.state === 'failed') throw new Error(poll.error || 'Marketing video production failed');\n }\n throw new Error('The production is taking longer than expected — check back shortly.');\n}\n\n// ── Design lane (web 0.43) ──────────────────────────────────────────────────\n\nexport interface DesignPromoOptions extends PromoRunOptions {\n sourceVideoSeconds?: number;\n musicUrl?: string;\n}\n\nexport interface DesignedPromo {\n project: Record<string, unknown>;\n title: string;\n card: { category: string; industry?: string; reason?: string };\n summary: {\n scenes: number;\n textLayers: number;\n mediaLayers: number;\n seconds: number;\n sceneNames: string[];\n aspect: string;\n };\n notes: string[];\n}\n\nexport function buildDesignParams(opts: DesignPromoOptions): Record<string, unknown> {\n const { captions: _c, narration: _n, stylePlaybook: _p, ...rest } = opts;\n const base = buildPromoRunParams(rest);\n delete base.timeoutMs;\n return {\n ...base,\n ...(opts.sourceVideoSeconds && opts.sourceVideoSeconds > 0\n ? { sourceVideoSeconds: opts.sourceVideoSeconds }\n : {}),\n ...(opts.musicUrl && /^https?:\\/\\//i.test(opts.musicUrl) ? { musicUrl: opts.musicUrl } : {}),\n };\n}\n\nexport function parseDesignResult(result: Record<string, unknown>): DesignedPromo | null {\n const body = (result?.data && typeof result.data === 'object' ? result.data : result) as Record<string, unknown>;\n const project = body?.project;\n if (!project || typeof project !== 'object' || !Array.isArray((project as Record<string, unknown>).tracks)) {\n return null;\n }\n const summary = (body.summary ?? {}) as Partial<DesignedPromo['summary']>;\n const card = (body.card ?? {}) as Partial<DesignedPromo['card']>;\n return {\n project: project as Record<string, unknown>,\n title: typeof body.title === 'string' && body.title.trim() ? body.title.trim() : 'Video project',\n card: {\n category: typeof card.category === 'string' ? card.category : 'Promos',\n ...(card.industry ? { industry: card.industry } : {}),\n ...(card.reason ? { reason: card.reason } : {}),\n },\n summary: {\n scenes: Number(summary.scenes) || 0,\n textLayers: Number(summary.textLayers) || 0,\n mediaLayers: Number(summary.mediaLayers) || 0,\n seconds: Number(summary.seconds) || 0,\n sceneNames: Array.isArray(summary.sceneNames) ? summary.sceneNames.map(String) : [],\n aspect: typeof summary.aspect === 'string' ? summary.aspect : 'auto',\n },\n notes: Array.isArray(body.notes) ? body.notes.map(String) : [],\n };\n}\n\nexport async function designPromoProject(\n run: (action: string, params: Record<string, unknown>) => Promise<Record<string, unknown>>,\n opts: DesignPromoOptions,\n): Promise<DesignedPromo> {\n const raw = await run(DESIGN_PROJECT_ACTION, buildDesignParams(opts));\n if (raw.successful === false) throw new Error((raw.error as string) || 'Could not design the video');\n const designed = parseDesignResult(raw);\n if (!designed) throw new Error('Could not design the video (no project returned)');\n return designed;\n}\n"],"names":["s"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"promoVideo.js","sources":["../../../src/features/canvas/promoVideo.ts"],"sourcesContent":["/**\n * Native twin of canvas-surface `rpc/promoVideoRpc` — catalog + submit/poll\n * envelope. Transport stays `RunMediaAction` (host or remote exec).\n */\n\nexport const PROMO_CONNECTOR = 'yantra-video-generation';\nexport const PRODUCE_SUBMIT_ACTION = 'YANTRA_VIDEO_GENERATION_PRODUCE_SUBMIT';\nexport const PRODUCE_STATUS_ACTION = 'YANTRA_VIDEO_GENERATION_PRODUCE_STATUS';\n/** Design lane: brief → editable studio project (no render). */\nexport const DESIGN_PROJECT_ACTION = 'YANTRA_VIDEO_GENERATION_DESIGN_PROJECT';\nexport const DESIGN_TIMEOUT_MS = 4 * 60_000;\n\nexport interface PromoPreset {\n id: string;\n name: string;\n description: string;\n defaultDurationSeconds: number;\n needsSourceVideo: boolean;\n /** Quality when the user picks none. */\n defaultQuality: PromoQuality;\n /** Only the production makes it: the design lane's templates have no shape for it. */\n produceOnly?: boolean;\n}\n\n/** How a production is made (connector PRODUCTION_QUALITIES). */\nexport type PromoQuality = 'standard' | 'studio';\n\nexport const PROMO_QUALITIES: readonly { id: PromoQuality; name: string; description: string }[] = [\n { id: 'standard', name: 'Standard', description: 'One pass: a finished cut in about half an hour.' },\n {\n id: 'studio',\n name: 'Studio',\n description:\n 'Directed like a film: three concepts written and judged, characters and narrator cast, keyframes first, the top video models tested on the hardest shots. Takes longer and uses more credits.',\n },\n];\n\n/** Narrator casting notes (connector NARRATOR_STYLES). Empty id = cast for the script. */\nexport const PROMO_NARRATORS: readonly { id: string; name: string }[] = [\n { id: '', name: 'Cast for the script' },\n { id: 'deadpan-documentary', name: 'Deadpan documentary, male' },\n { id: 'warm-storyteller-male', name: 'Warm storyteller, male' },\n { id: 'warm-storyteller-female', name: 'Warm storyteller, female' },\n { id: 'confident-announcer-male', name: 'Confident announcer, male' },\n { id: 'confident-announcer-female', name: 'Confident announcer, female' },\n { id: 'friendly-conversational', name: 'Friendly, conversational' },\n { id: 'calm-expert', name: 'Calm expert' },\n];\n\n/**\n * The model that lays out a promo DESIGN. Empty id = the connector's default.\n * Design only: PRODUCE reads `model` as its rendering agent's model.\n */\nexport const PROMO_DESIGN_MODELS: readonly { id: string; name: string; description: string }[] = [\n { id: '', name: 'Default', description: 'The connector’s own design model.' },\n { id: 'claude-opus-5-5', name: 'Claude Opus 5.5', description: 'Most capable, for long and complex work.' },\n];\n\nexport const PROMO_PRESETS: readonly PromoPreset[] = [\n {\n id: 'launch-film',\n name: 'Launch film',\n description: 'Story-led launch film: a cold open with a laugh, the reveal, then the product doing real jobs.',\n defaultDurationSeconds: 90,\n needsSourceVideo: false,\n defaultQuality: 'studio',\n produceOnly: true,\n },\n {\n id: 'product-teaser',\n name: 'Product teaser',\n description: 'Cinematic launch teaser: hero shots, a reveal, one closing line.',\n defaultDurationSeconds: 30,\n needsSourceVideo: false,\n defaultQuality: 'standard',\n },\n {\n id: 'brand-film',\n name: 'Brand film',\n description: 'Mood-led brand piece: story, atmosphere, music-first.',\n defaultDurationSeconds: 60,\n needsSourceVideo: false,\n defaultQuality: 'standard',\n },\n {\n id: 'motion-promo',\n name: 'Motion promo',\n description: 'Kinetic type and motion graphics for a feature, offer or launch.',\n defaultDurationSeconds: 30,\n needsSourceVideo: false,\n defaultQuality: 'standard',\n },\n {\n id: 'explainer',\n name: 'Explainer',\n description: 'Narrated explainer with captions: what, why, how.',\n defaultDurationSeconds: 60,\n needsSourceVideo: false,\n defaultQuality: 'standard',\n },\n {\n id: 'social-hook',\n name: 'Social hook',\n description: 'Vertical scroll-stopper: instant hook, big captions, one message.',\n defaultDurationSeconds: 15,\n needsSourceVideo: false,\n defaultQuality: 'standard',\n },\n {\n id: 'footage-remix',\n name: 'Remix footage',\n description: 'Cut a video already on the canvas into a promo with graphics and music.',\n defaultDurationSeconds: 30,\n needsSourceVideo: true,\n defaultQuality: 'standard',\n },\n];\n\nexport const PROMO_PLAYBOOKS: readonly { id: string; name: string }[] = [\n { id: '', name: 'Preset default' },\n { id: 'premium-minimalist', name: 'Premium minimalist' },\n { id: 'clean-professional', name: 'Clean professional' },\n { id: 'flat-motion-graphics', name: 'Flat motion graphics' },\n { id: 'minimalist-diagram', name: 'Minimalist diagram' },\n { id: 'anime-ghibli', name: 'Anime / Ghibli' },\n];\n\nexport function defaultNarration(presetId: string): boolean {\n return presetId !== 'brand-film' && presetId !== 'social-hook';\n}\n\nexport const DEFAULT_PROMO_PRESET = 'product-teaser';\nexport const PROMO_DURATIONS = [15, 30, 45, 60, 90] as const;\nexport const PROMO_ASPECT_RATIOS = ['16:9', '9:16', '1:1'] as const;\nexport const PROMO_POLL_EVERY_MS = 20_000;\nexport const PROMO_POLL_MAX_MS = 75 * 60_000;\n/** The same margin past a studio production. */\nexport const PROMO_STUDIO_POLL_MAX_MS = 120 * 60_000;\n/** Production budget sent to the connector. */\nexport const PROMO_RUN_TIMEOUT_MS = 55 * 60_000;\n/** A studio production's budget: writers' room, casting and keyframes come first. */\nexport const PROMO_STUDIO_RUN_TIMEOUT_MS = 100 * 60_000;\n\nexport function lookupPromoPreset(id: string): PromoPreset {\n // The default, not the first: the first is the launch film, and an unknown\n // id must never turn into a studio production.\n return PROMO_PRESETS.find((p) => p.id === id) ?? PROMO_PRESETS.find((p) => p.id === DEFAULT_PROMO_PRESET)!;\n}\n\nexport function defaultPromoQuality(presetId: string): PromoQuality {\n return lookupPromoPreset(presetId).defaultQuality;\n}\n\n/** The quality a request will actually run at: its own, else its preset's. */\nexport function promoQualityOf(opts: { preset: string; quality?: PromoQuality }): PromoQuality {\n return opts.quality ?? defaultPromoQuality(opts.preset);\n}\n\nexport function promoRunTimeoutMs(opts: { preset: string; quality?: PromoQuality }): number {\n return promoQualityOf(opts) === 'studio' ? PROMO_STUDIO_RUN_TIMEOUT_MS : PROMO_RUN_TIMEOUT_MS;\n}\n\nexport function promoPollMaxMs(opts: { preset: string; quality?: PromoQuality }): number {\n return promoQualityOf(opts) === 'studio' ? PROMO_STUDIO_POLL_MAX_MS : PROMO_POLL_MAX_MS;\n}\n\nexport interface PromoContext {\n onScreenText: string;\n keyPoints: string;\n audience: string;\n tone: string;\n avoid: string;\n brandColors: string;\n}\n\nexport const EMPTY_PROMO_CONTEXT: PromoContext = {\n onScreenText: '',\n keyPoints: '',\n audience: '',\n tone: '',\n avoid: '',\n brandColors: '',\n};\n\nexport function hasPromoContext(value: PromoContext, logoUrl?: string | null): boolean {\n return Boolean(logoUrl) || Object.values(value).some((v) => v.trim().length > 0);\n}\n\n/** Hexes in a colours field — mirrors the connector parser. */\nexport function readBrandColors(raw: string): string[] {\n const out: string[] = [];\n for (const token of raw.split(/[\\s,]+/)) {\n const m = token.trim().match(/^#?([0-9a-f]{3}|[0-9a-f]{6})$/i);\n if (!m) continue;\n const h =\n m[1].length === 3\n ? m[1]\n .split('')\n .map((c) => c + c)\n .join('')\n : m[1];\n const hex = `#${h.toLowerCase()}`;\n if (!out.includes(hex)) out.push(hex);\n }\n return out.slice(0, 6);\n}\n\nexport interface PromoRunOptions {\n prompt: string;\n preset: string;\n durationSeconds: number;\n aspectRatio: string;\n referenceImageUrls?: string[];\n sourceVideoUrl?: string;\n brandName?: string;\n callToAction?: string;\n logoUrl?: string;\n onScreenText?: string;\n keyPoints?: string;\n audience?: string;\n tone?: string;\n avoid?: string;\n brandColors?: string;\n captions?: boolean;\n narration?: boolean;\n stylePlaybook?: string;\n /** How it is made. Absent = the preset's default. Production only. */\n quality?: PromoQuality;\n /** A PROMO_NARRATORS id to cast the narrator against. Production only. */\n narratorVoice?: string;\n /** Real jobs the product is shown doing, one per line, in order. Production only. */\n useCases?: string;\n}\n\nexport interface PromoRunResult {\n url: string;\n title: string;\n projectId: string;\n preset: string;\n pipeline: string;\n durationSeconds?: number;\n summary?: string;\n}\n\nexport function buildPromoRunParams(opts: PromoRunOptions): Record<string, unknown> {\n const referenceImageUrls = (opts.referenceImageUrls ?? []).filter((u) => /^https?:\\/\\//i.test(u));\n return {\n prompt: opts.prompt,\n preset: opts.preset,\n durationSeconds: opts.durationSeconds,\n aspectRatio: opts.aspectRatio,\n ...(referenceImageUrls.length ? { referenceImageUrls } : {}),\n ...(opts.sourceVideoUrl ? { sourceVideoUrl: opts.sourceVideoUrl } : {}),\n ...(opts.brandName ? { brandName: opts.brandName } : {}),\n ...(opts.callToAction ? { callToAction: opts.callToAction } : {}),\n ...(opts.logoUrl ? { logoUrl: opts.logoUrl } : {}),\n ...(opts.onScreenText?.trim() ? { onScreenText: opts.onScreenText } : {}),\n ...(opts.keyPoints?.trim() ? { keyPoints: opts.keyPoints } : {}),\n ...(opts.audience?.trim() ? { audience: opts.audience.trim() } : {}),\n ...(opts.tone?.trim() ? { tone: opts.tone.trim() } : {}),\n ...(opts.avoid?.trim() ? { avoid: opts.avoid.trim() } : {}),\n ...(opts.brandColors?.trim() ? { brandColors: opts.brandColors } : {}),\n ...(typeof opts.captions === 'boolean' ? { captions: opts.captions } : {}),\n ...(typeof opts.narration === 'boolean' ? { narration: opts.narration } : {}),\n ...(opts.stylePlaybook ? { stylePlaybook: opts.stylePlaybook } : {}),\n // Always sent: the timeout below has to agree with whichever quality runs.\n quality: promoQualityOf(opts),\n ...(opts.narratorVoice ? { narratorVoice: opts.narratorVoice } : {}),\n ...(opts.useCases?.trim() ? { useCases: opts.useCases } : {}),\n timeoutMs: promoRunTimeoutMs(opts),\n };\n}\n\nexport function parsePromoRunResult(result: Record<string, unknown>): PromoRunResult | null {\n const data = (result.data ?? result) as Record<string, unknown>;\n const samples = data.samples as Array<{ uri?: string }> | undefined;\n const url = (typeof data.videoUri === 'string' && data.videoUri) || samples?.find((s) => s?.uri)?.uri || '';\n if (!url) return null;\n const prod = (data.production ?? {}) as Record<string, unknown>;\n const s = (k: string) => (typeof prod[k] === 'string' ? (prod[k] as string) : undefined);\n const n = (k: string) => (typeof prod[k] === 'number' ? (prod[k] as number) : undefined);\n return {\n url,\n title: s('title') ?? 'Marketing video',\n projectId: s('projectId') ?? (typeof data.operationName === 'string' ? data.operationName : ''),\n preset: s('preset') ?? '',\n pipeline: s('pipeline') ?? '',\n durationSeconds: n('durationSeconds'),\n summary: s('summary'),\n };\n}\n\nexport interface PromoSubmitHandle {\n projectId: string;\n sandboxId: string;\n}\n\nexport function parseSubmitResult(result: Record<string, unknown>): PromoSubmitHandle | null {\n const d = (result.data ?? result) as Record<string, unknown>;\n const projectId = typeof d.projectId === 'string' ? d.projectId : '';\n const sandboxId = typeof d.sandboxId === 'string' ? d.sandboxId : '';\n return projectId && sandboxId ? { projectId, sandboxId } : null;\n}\n\nexport type PromoPollState = 'running' | 'succeeded' | 'failed';\n\nexport interface PromoPoll {\n state: PromoPollState;\n progress: string[];\n error?: string;\n result?: PromoRunResult;\n}\n\nexport function parsePollResult(result: Record<string, unknown>): PromoPoll {\n const d = (result.data ?? result) as Record<string, unknown>;\n const state: PromoPollState = d.state === 'succeeded' || d.state === 'failed' ? d.state : 'running';\n const progress = Array.isArray(d.progress) ? (d.progress.filter((x) => typeof x === 'string') as string[]) : [];\n if (state === 'succeeded') {\n const run = parsePromoRunResult(d);\n return run\n ? { state, progress, result: run }\n : { state: 'failed', progress, error: 'Production finished but returned no video' };\n }\n if (state === 'failed') {\n return { state, progress, error: typeof d.error === 'string' ? d.error : 'Marketing video production failed' };\n }\n return { state, progress };\n}\n\nexport async function producePromoVideo(\n run: (action: string, params: Record<string, unknown>) => Promise<Record<string, unknown>>,\n opts: PromoRunOptions,\n onProgress?: (msg: string) => void,\n sleep: (ms: number) => Promise<void> = (ms) => new Promise((r) => setTimeout(r, ms)),\n isCancelled?: () => boolean,\n): Promise<PromoRunResult> {\n onProgress?.('Starting the production…');\n const submit = await run(PRODUCE_SUBMIT_ACTION, buildPromoRunParams(opts));\n const handle = parseSubmitResult(submit);\n if (!handle) throw new Error('Could not start the production (no handle returned)');\n\n const deadline = Date.now() + promoPollMaxMs(opts);\n let lastProgress = '';\n let pollErrors = 0;\n while (Date.now() < deadline) {\n if (isCancelled?.()) throw new Error('cancelled');\n await sleep(PROMO_POLL_EVERY_MS);\n if (isCancelled?.()) throw new Error('cancelled');\n let poll: PromoPoll;\n try {\n const raw = await run(PRODUCE_STATUS_ACTION, {\n projectId: handle.projectId,\n sandboxId: handle.sandboxId,\n });\n poll = parsePollResult(raw);\n pollErrors = 0;\n } catch (err) {\n if (++pollErrors >= 4) throw err instanceof Error ? err : new Error(String(err));\n continue;\n }\n const line = poll.progress.at(-1);\n if (line && line !== lastProgress) {\n lastProgress = line;\n onProgress?.(line);\n }\n if (poll.state === 'succeeded' && poll.result) return poll.result;\n if (poll.state === 'failed') throw new Error(poll.error || 'Marketing video production failed');\n }\n throw new Error('The production is taking longer than expected — check back shortly.');\n}\n\n// ── Design lane (web 0.43) ──────────────────────────────────────────────────\n\nexport interface DesignPromoOptions extends PromoRunOptions {\n sourceVideoSeconds?: number;\n musicUrl?: string;\n /** A PROMO_DESIGN_MODELS id; empty = the connector's default. Never sent to PRODUCE. */\n model?: string;\n}\n\nexport interface DesignedPromo {\n project: Record<string, unknown>;\n title: string;\n card: { category: string; industry?: string; reason?: string };\n summary: {\n scenes: number;\n textLayers: number;\n mediaLayers: number;\n seconds: number;\n sceneNames: string[];\n aspect: string;\n };\n notes: string[];\n}\n\nexport function buildDesignParams(opts: DesignPromoOptions): Record<string, unknown> {\n const {\n captions: _c,\n narration: _n,\n stylePlaybook: _p,\n quality: _q,\n narratorVoice: _v,\n useCases: _u,\n model,\n ...rest\n } = opts;\n const base = buildPromoRunParams(rest);\n delete base.timeoutMs;\n delete base.quality;\n return {\n ...base,\n ...(model?.trim() ? { model: model.trim() } : {}),\n ...(opts.sourceVideoSeconds && opts.sourceVideoSeconds > 0\n ? { sourceVideoSeconds: opts.sourceVideoSeconds }\n : {}),\n ...(opts.musicUrl && /^https?:\\/\\//i.test(opts.musicUrl) ? { musicUrl: opts.musicUrl } : {}),\n };\n}\n\nexport function parseDesignResult(result: Record<string, unknown>): DesignedPromo | null {\n const body = (result?.data && typeof result.data === 'object' ? result.data : result) as Record<string, unknown>;\n const project = body?.project;\n if (!project || typeof project !== 'object' || !Array.isArray((project as Record<string, unknown>).tracks)) {\n return null;\n }\n const summary = (body.summary ?? {}) as Partial<DesignedPromo['summary']>;\n const card = (body.card ?? {}) as Partial<DesignedPromo['card']>;\n return {\n project: project as Record<string, unknown>,\n title: typeof body.title === 'string' && body.title.trim() ? body.title.trim() : 'Video project',\n card: {\n category: typeof card.category === 'string' ? card.category : 'Promos',\n ...(card.industry ? { industry: card.industry } : {}),\n ...(card.reason ? { reason: card.reason } : {}),\n },\n summary: {\n scenes: Number(summary.scenes) || 0,\n textLayers: Number(summary.textLayers) || 0,\n mediaLayers: Number(summary.mediaLayers) || 0,\n seconds: Number(summary.seconds) || 0,\n sceneNames: Array.isArray(summary.sceneNames) ? summary.sceneNames.map(String) : [],\n aspect: typeof summary.aspect === 'string' ? summary.aspect : 'auto',\n },\n notes: Array.isArray(body.notes) ? body.notes.map(String) : [],\n };\n}\n\nexport async function designPromoProject(\n run: (action: string, params: Record<string, unknown>) => Promise<Record<string, unknown>>,\n opts: DesignPromoOptions,\n): Promise<DesignedPromo> {\n const raw = await run(DESIGN_PROJECT_ACTION, buildDesignParams(opts));\n if (raw.successful === false) throw new Error((raw.error as string) || 'Could not design the video');\n const designed = parseDesignResult(raw);\n if (!designed) throw new Error('Could not design the video (no project returned)');\n return designed;\n}\n"],"names":["s"],"mappings":"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"}
|