mulmocast 2.1.31 → 2.1.32
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/actions/images.d.ts +4 -0
- package/lib/actions/images.js +4 -0
- package/lib/types/schema.d.ts +100 -0
- package/lib/types/schema.js +2 -0
- package/lib/utils/context.d.ts +30 -0
- package/lib/utils/image_plugins/bg_image_util.d.ts +6 -1
- package/lib/utils/image_plugins/bg_image_util.js +13 -0
- package/lib/utils/image_plugins/markdown.js +13 -10
- package/lib/utils/image_plugins/mermaid.js +4 -2
- package/lib/utils/image_plugins/text_slide.js +4 -10
- package/package.json +2 -2
- package/scripts/test/test_background_image.json +34 -0
- package/scripts/test/test_vertexai.json +109 -11
- package/scripts/test/test_vertexai_simple.json +17 -0
package/lib/actions/images.d.ts
CHANGED
|
@@ -245,6 +245,8 @@ export declare const beat_graph_data: {
|
|
|
245
245
|
moderation: string;
|
|
246
246
|
canvasSize: string;
|
|
247
247
|
quality: string;
|
|
248
|
+
vertexai_project: string;
|
|
249
|
+
vertexai_location: string;
|
|
248
250
|
};
|
|
249
251
|
};
|
|
250
252
|
defaultValue: {};
|
|
@@ -271,6 +273,8 @@ export declare const beat_graph_data: {
|
|
|
271
273
|
model: string;
|
|
272
274
|
duration: string;
|
|
273
275
|
canvasSize: string;
|
|
276
|
+
vertexai_project: string;
|
|
277
|
+
vertexai_location: string;
|
|
274
278
|
};
|
|
275
279
|
};
|
|
276
280
|
defaultValue: {};
|
package/lib/actions/images.js
CHANGED
|
@@ -149,6 +149,8 @@ export const beat_graph_data = {
|
|
|
149
149
|
moderation: ":preprocessor.imageParams.moderation",
|
|
150
150
|
canvasSize: ":context.presentationStyle.canvasSize",
|
|
151
151
|
quality: ":preprocessor.imageParams.quality",
|
|
152
|
+
vertexai_project: ":preprocessor.imageParams.vertexai_project",
|
|
153
|
+
vertexai_location: ":preprocessor.imageParams.vertexai_location",
|
|
152
154
|
},
|
|
153
155
|
},
|
|
154
156
|
defaultValue: {},
|
|
@@ -175,6 +177,8 @@ export const beat_graph_data = {
|
|
|
175
177
|
model: ":preprocessor.movieAgentInfo.movieParams.model",
|
|
176
178
|
duration: ":preprocessor.beatDuration",
|
|
177
179
|
canvasSize: ":context.presentationStyle.canvasSize",
|
|
180
|
+
vertexai_project: ":preprocessor.movieAgentInfo.movieParams.vertexai_project",
|
|
181
|
+
vertexai_location: ":preprocessor.movieAgentInfo.movieParams.vertexai_location",
|
|
178
182
|
},
|
|
179
183
|
},
|
|
180
184
|
defaultValue: {},
|
package/lib/types/schema.d.ts
CHANGED
|
@@ -349,6 +349,26 @@ export declare const mulmoMermaidMediaSchema: z.ZodObject<{
|
|
|
349
349
|
path: z.ZodString;
|
|
350
350
|
}, z.core.$strict>], "kind">;
|
|
351
351
|
appendix: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
352
|
+
style: z.ZodOptional<z.ZodString>;
|
|
353
|
+
backgroundImage: z.ZodOptional<z.ZodNullable<z.ZodUnion<readonly [z.ZodString, z.ZodObject<{
|
|
354
|
+
source: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
355
|
+
kind: z.ZodLiteral<"url">;
|
|
356
|
+
url: z.ZodURL;
|
|
357
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
358
|
+
kind: z.ZodLiteral<"base64">;
|
|
359
|
+
data: z.ZodString;
|
|
360
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
361
|
+
kind: z.ZodLiteral<"path">;
|
|
362
|
+
path: z.ZodString;
|
|
363
|
+
}, z.core.$strict>], "kind">;
|
|
364
|
+
size: z.ZodOptional<z.ZodEnum<{
|
|
365
|
+
cover: "cover";
|
|
366
|
+
contain: "contain";
|
|
367
|
+
fill: "fill";
|
|
368
|
+
auto: "auto";
|
|
369
|
+
}>>;
|
|
370
|
+
opacity: z.ZodOptional<z.ZodNumber>;
|
|
371
|
+
}, z.core.$strip>]>>>;
|
|
352
372
|
}, z.core.$strict>;
|
|
353
373
|
export declare const mulmoHtmlTailwindMediaSchema: z.ZodObject<{
|
|
354
374
|
type: z.ZodLiteral<"html_tailwind">;
|
|
@@ -498,6 +518,26 @@ export declare const mulmoImageAssetSchema: z.ZodUnion<readonly [z.ZodObject<{
|
|
|
498
518
|
path: z.ZodString;
|
|
499
519
|
}, z.core.$strict>], "kind">;
|
|
500
520
|
appendix: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
521
|
+
style: z.ZodOptional<z.ZodString>;
|
|
522
|
+
backgroundImage: z.ZodOptional<z.ZodNullable<z.ZodUnion<readonly [z.ZodString, z.ZodObject<{
|
|
523
|
+
source: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
524
|
+
kind: z.ZodLiteral<"url">;
|
|
525
|
+
url: z.ZodURL;
|
|
526
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
527
|
+
kind: z.ZodLiteral<"base64">;
|
|
528
|
+
data: z.ZodString;
|
|
529
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
530
|
+
kind: z.ZodLiteral<"path">;
|
|
531
|
+
path: z.ZodString;
|
|
532
|
+
}, z.core.$strict>], "kind">;
|
|
533
|
+
size: z.ZodOptional<z.ZodEnum<{
|
|
534
|
+
cover: "cover";
|
|
535
|
+
contain: "contain";
|
|
536
|
+
fill: "fill";
|
|
537
|
+
auto: "auto";
|
|
538
|
+
}>>;
|
|
539
|
+
opacity: z.ZodOptional<z.ZodNumber>;
|
|
540
|
+
}, z.core.$strip>]>>>;
|
|
501
541
|
}, z.core.$strict>, z.ZodObject<{
|
|
502
542
|
type: z.ZodLiteral<"html_tailwind">;
|
|
503
543
|
html: z.ZodUnion<readonly [z.ZodString, z.ZodArray<z.ZodString>]>;
|
|
@@ -1092,6 +1132,26 @@ export declare const mulmoBeatSchema: z.ZodObject<{
|
|
|
1092
1132
|
path: z.ZodString;
|
|
1093
1133
|
}, z.core.$strict>], "kind">;
|
|
1094
1134
|
appendix: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
1135
|
+
style: z.ZodOptional<z.ZodString>;
|
|
1136
|
+
backgroundImage: z.ZodOptional<z.ZodNullable<z.ZodUnion<readonly [z.ZodString, z.ZodObject<{
|
|
1137
|
+
source: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
1138
|
+
kind: z.ZodLiteral<"url">;
|
|
1139
|
+
url: z.ZodURL;
|
|
1140
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
1141
|
+
kind: z.ZodLiteral<"base64">;
|
|
1142
|
+
data: z.ZodString;
|
|
1143
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
1144
|
+
kind: z.ZodLiteral<"path">;
|
|
1145
|
+
path: z.ZodString;
|
|
1146
|
+
}, z.core.$strict>], "kind">;
|
|
1147
|
+
size: z.ZodOptional<z.ZodEnum<{
|
|
1148
|
+
cover: "cover";
|
|
1149
|
+
contain: "contain";
|
|
1150
|
+
fill: "fill";
|
|
1151
|
+
auto: "auto";
|
|
1152
|
+
}>>;
|
|
1153
|
+
opacity: z.ZodOptional<z.ZodNumber>;
|
|
1154
|
+
}, z.core.$strip>]>>>;
|
|
1095
1155
|
}, z.core.$strict>, z.ZodObject<{
|
|
1096
1156
|
type: z.ZodLiteral<"html_tailwind">;
|
|
1097
1157
|
html: z.ZodUnion<readonly [z.ZodString, z.ZodArray<z.ZodString>]>;
|
|
@@ -2363,6 +2423,26 @@ export declare const mulmoScriptSchema: z.ZodObject<{
|
|
|
2363
2423
|
path: z.ZodString;
|
|
2364
2424
|
}, z.core.$strict>], "kind">;
|
|
2365
2425
|
appendix: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
2426
|
+
style: z.ZodOptional<z.ZodString>;
|
|
2427
|
+
backgroundImage: z.ZodOptional<z.ZodNullable<z.ZodUnion<readonly [z.ZodString, z.ZodObject<{
|
|
2428
|
+
source: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
2429
|
+
kind: z.ZodLiteral<"url">;
|
|
2430
|
+
url: z.ZodURL;
|
|
2431
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
2432
|
+
kind: z.ZodLiteral<"base64">;
|
|
2433
|
+
data: z.ZodString;
|
|
2434
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
2435
|
+
kind: z.ZodLiteral<"path">;
|
|
2436
|
+
path: z.ZodString;
|
|
2437
|
+
}, z.core.$strict>], "kind">;
|
|
2438
|
+
size: z.ZodOptional<z.ZodEnum<{
|
|
2439
|
+
cover: "cover";
|
|
2440
|
+
contain: "contain";
|
|
2441
|
+
fill: "fill";
|
|
2442
|
+
auto: "auto";
|
|
2443
|
+
}>>;
|
|
2444
|
+
opacity: z.ZodOptional<z.ZodNumber>;
|
|
2445
|
+
}, z.core.$strip>]>>>;
|
|
2366
2446
|
}, z.core.$strict>, z.ZodObject<{
|
|
2367
2447
|
type: z.ZodLiteral<"html_tailwind">;
|
|
2368
2448
|
html: z.ZodUnion<readonly [z.ZodString, z.ZodArray<z.ZodString>]>;
|
|
@@ -3319,6 +3399,26 @@ export declare const mulmoStudioSchema: z.ZodObject<{
|
|
|
3319
3399
|
path: z.ZodString;
|
|
3320
3400
|
}, z.core.$strict>], "kind">;
|
|
3321
3401
|
appendix: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
3402
|
+
style: z.ZodOptional<z.ZodString>;
|
|
3403
|
+
backgroundImage: z.ZodOptional<z.ZodNullable<z.ZodUnion<readonly [z.ZodString, z.ZodObject<{
|
|
3404
|
+
source: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
3405
|
+
kind: z.ZodLiteral<"url">;
|
|
3406
|
+
url: z.ZodURL;
|
|
3407
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
3408
|
+
kind: z.ZodLiteral<"base64">;
|
|
3409
|
+
data: z.ZodString;
|
|
3410
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
3411
|
+
kind: z.ZodLiteral<"path">;
|
|
3412
|
+
path: z.ZodString;
|
|
3413
|
+
}, z.core.$strict>], "kind">;
|
|
3414
|
+
size: z.ZodOptional<z.ZodEnum<{
|
|
3415
|
+
cover: "cover";
|
|
3416
|
+
contain: "contain";
|
|
3417
|
+
fill: "fill";
|
|
3418
|
+
auto: "auto";
|
|
3419
|
+
}>>;
|
|
3420
|
+
opacity: z.ZodOptional<z.ZodNumber>;
|
|
3421
|
+
}, z.core.$strip>]>>>;
|
|
3322
3422
|
}, z.core.$strict>, z.ZodObject<{
|
|
3323
3423
|
type: z.ZodLiteral<"html_tailwind">;
|
|
3324
3424
|
html: z.ZodUnion<readonly [z.ZodString, z.ZodArray<z.ZodString>]>;
|
package/lib/types/schema.js
CHANGED
|
@@ -186,6 +186,8 @@ export const mulmoMermaidMediaSchema = z
|
|
|
186
186
|
title: z.string().describe("The title of the diagram"),
|
|
187
187
|
code: mediaSourceMermaidSchema.describe("The code of the mermaid diagram"),
|
|
188
188
|
appendix: z.array(z.string()).optional().describe("The appendix of the mermaid diagram; typically, style information."),
|
|
189
|
+
style: z.string().optional(),
|
|
190
|
+
backgroundImage: backgroundImageSchema,
|
|
189
191
|
})
|
|
190
192
|
.strict();
|
|
191
193
|
export const mulmoHtmlTailwindMediaSchema = z
|
package/lib/utils/context.d.ts
CHANGED
|
@@ -395,6 +395,21 @@ export declare const createStudioData: (_mulmoScript: MulmoScript, fileName: str
|
|
|
395
395
|
path: string;
|
|
396
396
|
};
|
|
397
397
|
appendix?: string[] | undefined;
|
|
398
|
+
style?: string | undefined;
|
|
399
|
+
backgroundImage?: string | {
|
|
400
|
+
source: {
|
|
401
|
+
kind: "url";
|
|
402
|
+
url: string;
|
|
403
|
+
} | {
|
|
404
|
+
kind: "base64";
|
|
405
|
+
data: string;
|
|
406
|
+
} | {
|
|
407
|
+
kind: "path";
|
|
408
|
+
path: string;
|
|
409
|
+
};
|
|
410
|
+
size?: "cover" | "contain" | "fill" | "auto" | undefined;
|
|
411
|
+
opacity?: number | undefined;
|
|
412
|
+
} | null | undefined;
|
|
398
413
|
} | {
|
|
399
414
|
type: "html_tailwind";
|
|
400
415
|
html: string | string[];
|
|
@@ -1104,6 +1119,21 @@ export declare const initializeContextFromFiles: (files: FileObject, raiseError:
|
|
|
1104
1119
|
path: string;
|
|
1105
1120
|
};
|
|
1106
1121
|
appendix?: string[] | undefined;
|
|
1122
|
+
style?: string | undefined;
|
|
1123
|
+
backgroundImage?: string | {
|
|
1124
|
+
source: {
|
|
1125
|
+
kind: "url";
|
|
1126
|
+
url: string;
|
|
1127
|
+
} | {
|
|
1128
|
+
kind: "base64";
|
|
1129
|
+
data: string;
|
|
1130
|
+
} | {
|
|
1131
|
+
kind: "path";
|
|
1132
|
+
path: string;
|
|
1133
|
+
};
|
|
1134
|
+
size?: "cover" | "contain" | "fill" | "auto" | undefined;
|
|
1135
|
+
opacity?: number | undefined;
|
|
1136
|
+
} | null | undefined;
|
|
1107
1137
|
} | {
|
|
1108
1138
|
type: "html_tailwind";
|
|
1109
1139
|
html: string | string[];
|
|
@@ -1,8 +1,13 @@
|
|
|
1
|
-
import { BackgroundImage, MulmoStudioContext } from "../../types/index.js";
|
|
1
|
+
import { BackgroundImage, MulmoStudioContext, ImageProcessorParams } from "../../types/index.js";
|
|
2
2
|
/**
|
|
3
3
|
* Resolve background image from beat level and global level settings.
|
|
4
4
|
* Beat level takes precedence over global level.
|
|
5
5
|
* null explicitly disables background image.
|
|
6
6
|
*/
|
|
7
7
|
export declare const resolveBackgroundImage: (beatBackgroundImage: BackgroundImage | undefined, globalBackgroundImage: BackgroundImage | undefined) => BackgroundImage | undefined;
|
|
8
|
+
/**
|
|
9
|
+
* Resolve combined style from background image and custom style.
|
|
10
|
+
* Common pattern used by markdown, textSlide, mermaid plugins.
|
|
11
|
+
*/
|
|
12
|
+
export declare const resolveCombinedStyle: (params: ImageProcessorParams, beatBackgroundImage: BackgroundImage | undefined, beatStyle: string | undefined) => Promise<string>;
|
|
8
13
|
export declare const backgroundImageToCSS: (backgroundImage: BackgroundImage | undefined, context: MulmoStudioContext) => Promise<string>;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { MulmoMediaSourceMethods } from "../../methods/mulmo_media_source.js";
|
|
2
|
+
import { resolveStyle } from "./utils.js";
|
|
2
3
|
const DEFAULT_FETCH_TIMEOUT_MS = 30000;
|
|
3
4
|
/**
|
|
4
5
|
* Resolve background image from beat level and global level settings.
|
|
@@ -52,6 +53,18 @@ const fetchUrlAsDataUrl = async (url, timeoutMs = DEFAULT_FETCH_TIMEOUT_MS) => {
|
|
|
52
53
|
const sizeToCSS = (size) => {
|
|
53
54
|
return size === "fill" ? "100% 100%" : size;
|
|
54
55
|
};
|
|
56
|
+
/**
|
|
57
|
+
* Resolve combined style from background image and custom style.
|
|
58
|
+
* Common pattern used by markdown, textSlide, mermaid plugins.
|
|
59
|
+
*/
|
|
60
|
+
export const resolveCombinedStyle = async (params, beatBackgroundImage, beatStyle) => {
|
|
61
|
+
const { context, textSlideStyle } = params;
|
|
62
|
+
const globalBackgroundImage = context.studio.script.imageParams?.backgroundImage;
|
|
63
|
+
const resolvedBackgroundImage = resolveBackgroundImage(beatBackgroundImage, globalBackgroundImage);
|
|
64
|
+
const backgroundCSS = await backgroundImageToCSS(resolvedBackgroundImage, context);
|
|
65
|
+
const style = resolveStyle(beatStyle, textSlideStyle);
|
|
66
|
+
return backgroundCSS + style;
|
|
67
|
+
};
|
|
55
68
|
export const backgroundImageToCSS = async (backgroundImage, context) => {
|
|
56
69
|
if (!backgroundImage) {
|
|
57
70
|
return "";
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { getHTMLFile } from "../file.js";
|
|
2
2
|
import { renderHTMLToImage, interpolate } from "../html_render.js";
|
|
3
|
-
import { parrotingImagePath
|
|
4
|
-
import {
|
|
3
|
+
import { parrotingImagePath } from "./utils.js";
|
|
4
|
+
import { resolveCombinedStyle } from "./bg_image_util.js";
|
|
5
5
|
import { generateLayoutHtml, layoutToMarkdown, toMarkdownString, parseMarkdown } from "./markdown_layout.js";
|
|
6
6
|
import { isObject } from "graphai";
|
|
7
7
|
export const imageType = "markdown";
|
|
@@ -24,17 +24,11 @@ const dumpMarkdown = (params) => {
|
|
|
24
24
|
};
|
|
25
25
|
// Generate full HTML for rendering
|
|
26
26
|
const generateHtml = async (params) => {
|
|
27
|
-
const { beat
|
|
27
|
+
const { beat } = params;
|
|
28
28
|
if (!beat.image || beat.image.type !== imageType)
|
|
29
29
|
return "";
|
|
30
30
|
const md = beat.image.markdown;
|
|
31
|
-
const
|
|
32
|
-
// Resolve background image (beat level overrides global)
|
|
33
|
-
const globalBackgroundImage = context.studio.script.imageParams?.backgroundImage;
|
|
34
|
-
const beatBackgroundImage = beat.image.backgroundImage;
|
|
35
|
-
const resolvedBackgroundImage = resolveBackgroundImage(beatBackgroundImage, globalBackgroundImage);
|
|
36
|
-
const backgroundCSS = await backgroundImageToCSS(resolvedBackgroundImage, context);
|
|
37
|
-
const combinedStyle = backgroundCSS + style;
|
|
31
|
+
const combinedStyle = await resolveCombinedStyle(params, beat.image.backgroundImage, beat.image.style);
|
|
38
32
|
if (isMarkdownLayout(md)) {
|
|
39
33
|
const htmlBody = await generateLayoutHtml(md);
|
|
40
34
|
const template = getHTMLFile("tailwind");
|
|
@@ -46,6 +40,15 @@ const generateHtml = async (params) => {
|
|
|
46
40
|
}
|
|
47
41
|
const markdown = dumpMarkdown(params) ?? "";
|
|
48
42
|
const body = await parseMarkdown(markdown);
|
|
43
|
+
// Use tailwind template if mermaid is present to ensure mermaid CDN is loaded
|
|
44
|
+
if (containsMermaid(md)) {
|
|
45
|
+
const template = getHTMLFile("tailwind");
|
|
46
|
+
return interpolate(template, {
|
|
47
|
+
title: "Markdown",
|
|
48
|
+
html_body: `<div class="prose max-w-none p-6">${body}</div>`,
|
|
49
|
+
custom_style: combinedStyle,
|
|
50
|
+
});
|
|
51
|
+
}
|
|
49
52
|
return `<html><head><style>${combinedStyle}</style></head><body>${body}</body></html>`;
|
|
50
53
|
};
|
|
51
54
|
// Check if markdown content contains mermaid code blocks
|
|
@@ -2,6 +2,7 @@ import { MulmoMediaSourceMethods } from "../../methods/index.js";
|
|
|
2
2
|
import { getHTMLFile } from "../file.js";
|
|
3
3
|
import { renderHTMLToImage, interpolate } from "../html_render.js";
|
|
4
4
|
import { parrotingImagePath, generateUniqueId } from "./utils.js";
|
|
5
|
+
import { resolveCombinedStyle } from "./bg_image_util.js";
|
|
5
6
|
export const imageType = "mermaid";
|
|
6
7
|
// Generate mermaid HTML from code string (shared utility)
|
|
7
8
|
export const generateMermaidHtml = (code, title) => {
|
|
@@ -18,15 +19,16 @@ export const generateMermaidHtml = (code, title) => {
|
|
|
18
19
|
</div>`;
|
|
19
20
|
};
|
|
20
21
|
const processMermaid = async (params) => {
|
|
21
|
-
const { beat, imagePath, canvasSize, context
|
|
22
|
+
const { beat, imagePath, canvasSize, context } = params;
|
|
22
23
|
if (!beat?.image || beat.image.type !== imageType)
|
|
23
24
|
return;
|
|
24
25
|
const template = getHTMLFile("mermaid");
|
|
25
26
|
const diagram_code = await MulmoMediaSourceMethods.getText(beat.image.code, context);
|
|
26
27
|
if (diagram_code) {
|
|
28
|
+
const combinedStyle = await resolveCombinedStyle(params, beat.image.backgroundImage, beat.image.style);
|
|
27
29
|
const htmlData = interpolate(template, {
|
|
28
30
|
title: beat.image.title,
|
|
29
|
-
style:
|
|
31
|
+
style: combinedStyle,
|
|
30
32
|
diagram_code: `${diagram_code}\n${beat.image.appendix?.join("\n") ?? ""}`,
|
|
31
33
|
});
|
|
32
34
|
await renderHTMLToImage(htmlData, imagePath, canvasSize.width, canvasSize.height, true);
|
|
@@ -1,20 +1,14 @@
|
|
|
1
1
|
import { renderMarkdownToImage } from "../html_render.js";
|
|
2
|
-
import { parrotingImagePath
|
|
3
|
-
import {
|
|
2
|
+
import { parrotingImagePath } from "./utils.js";
|
|
3
|
+
import { resolveCombinedStyle } from "./bg_image_util.js";
|
|
4
4
|
import { marked } from "marked";
|
|
5
5
|
export const imageType = "textSlide";
|
|
6
6
|
const processTextSlide = async (params) => {
|
|
7
|
-
const { beat,
|
|
7
|
+
const { beat, imagePath, canvasSize } = params;
|
|
8
8
|
if (!beat.image || beat.image.type !== imageType)
|
|
9
9
|
return;
|
|
10
10
|
const slide = beat.image.slide;
|
|
11
|
-
const
|
|
12
|
-
// Resolve background image (beat level overrides global)
|
|
13
|
-
const globalBackgroundImage = context.studio.script.imageParams?.backgroundImage;
|
|
14
|
-
const beatBackgroundImage = beat.image.backgroundImage;
|
|
15
|
-
const resolvedBackgroundImage = resolveBackgroundImage(beatBackgroundImage, globalBackgroundImage);
|
|
16
|
-
const backgroundCSS = await backgroundImageToCSS(resolvedBackgroundImage, context);
|
|
17
|
-
const combinedStyle = backgroundCSS + style;
|
|
11
|
+
const combinedStyle = await resolveCombinedStyle(params, beat.image.backgroundImage, beat.image.style);
|
|
18
12
|
const markdown = dumpMarkdown(params) ?? "";
|
|
19
13
|
const topMargin = (() => {
|
|
20
14
|
if (slide.bullets?.length && slide.bullets.length > 0) {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "mulmocast",
|
|
3
|
-
"version": "2.1.
|
|
3
|
+
"version": "2.1.32",
|
|
4
4
|
"description": "",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "lib/index.node.js",
|
|
@@ -123,6 +123,6 @@
|
|
|
123
123
|
"typescript-eslint": "^8.54.0"
|
|
124
124
|
},
|
|
125
125
|
"engines": {
|
|
126
|
-
"node": ">=
|
|
126
|
+
"node": ">=22.0.0"
|
|
127
127
|
}
|
|
128
128
|
}
|
|
@@ -108,6 +108,40 @@
|
|
|
108
108
|
"size": "cover"
|
|
109
109
|
}
|
|
110
110
|
}
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
"text": "マークダウンにMermaid図を埋め込むこともできます。",
|
|
114
|
+
"image": {
|
|
115
|
+
"type": "markdown",
|
|
116
|
+
"markdown": "# システム構成\n\n```mermaid\ngraph TD\n A[ユーザー] --> B[API]\n B --> C[データベース]\n```",
|
|
117
|
+
"backgroundImage": {
|
|
118
|
+
"source": {
|
|
119
|
+
"kind": "url",
|
|
120
|
+
"url": "https://raw.githubusercontent.com/SingularitySociety/societys_statement/main/images/mulmocast/mulmocast-logo.png"
|
|
121
|
+
},
|
|
122
|
+
"opacity": 0.2,
|
|
123
|
+
"size": "cover"
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
},
|
|
127
|
+
{
|
|
128
|
+
"text": "Mermaidタイプでも背景画像が使えます。",
|
|
129
|
+
"image": {
|
|
130
|
+
"type": "mermaid",
|
|
131
|
+
"title": "アーキテクチャ",
|
|
132
|
+
"code": {
|
|
133
|
+
"kind": "text",
|
|
134
|
+
"text": "graph LR\n Client --> Gateway\n Gateway --> Service\n Service --> Database[(DB)]"
|
|
135
|
+
},
|
|
136
|
+
"backgroundImage": {
|
|
137
|
+
"source": {
|
|
138
|
+
"kind": "url",
|
|
139
|
+
"url": "https://raw.githubusercontent.com/SingularitySociety/societys_statement/main/images/mulmocast/mulmocast-logo.png"
|
|
140
|
+
},
|
|
141
|
+
"opacity": 0.2,
|
|
142
|
+
"size": "cover"
|
|
143
|
+
}
|
|
144
|
+
}
|
|
111
145
|
}
|
|
112
146
|
]
|
|
113
147
|
}
|
|
@@ -1,24 +1,122 @@
|
|
|
1
1
|
{
|
|
2
|
-
"$mulmocast": {
|
|
3
|
-
"version": "1.1",
|
|
4
|
-
"credit": "closing"
|
|
5
|
-
},
|
|
6
|
-
"title": "Vertex AI Test",
|
|
7
|
-
"description": "Test Vertex AI integration",
|
|
2
|
+
"$mulmocast": { "version": "1.1" },
|
|
8
3
|
"lang": "en",
|
|
4
|
+
"title": "Vertex AI Test (TTS + Image + Movie)",
|
|
5
|
+
"description": "Replace YOUR_PROJECT_ID with your Google Cloud project ID",
|
|
6
|
+
"speechParams": {
|
|
7
|
+
"speakers": {
|
|
8
|
+
"GCP": {
|
|
9
|
+
"provider": "google",
|
|
10
|
+
"voiceId": "en-US-Studio-O"
|
|
11
|
+
},
|
|
12
|
+
"Gemini": {
|
|
13
|
+
"provider": "google",
|
|
14
|
+
"model": "gemini-2.5-pro-tts",
|
|
15
|
+
"voiceId": "Kore"
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
},
|
|
9
19
|
"imageParams": {
|
|
10
20
|
"provider": "google",
|
|
11
21
|
"model": "imagen-4.0-generate-001",
|
|
12
|
-
"vertexai_project": "
|
|
22
|
+
"vertexai_project": "YOUR_PROJECT_ID",
|
|
13
23
|
"vertexai_location": "us-central1"
|
|
14
24
|
},
|
|
15
|
-
"
|
|
16
|
-
"provider": "
|
|
25
|
+
"movieParams": {
|
|
26
|
+
"provider": "google",
|
|
27
|
+
"model": "veo-2.0-generate-001",
|
|
28
|
+
"vertexai_project": "YOUR_PROJECT_ID",
|
|
29
|
+
"vertexai_location": "us-central1"
|
|
17
30
|
},
|
|
18
31
|
"beats": [
|
|
19
32
|
{
|
|
20
|
-
"
|
|
21
|
-
"
|
|
33
|
+
"id": "gcp_tts_imagen4",
|
|
34
|
+
"speaker": "GCP",
|
|
35
|
+
"text": "TTS: Google Cloud TTS en-US-Studio-O. Image: Imagen 4.",
|
|
36
|
+
"imagePrompt": "A beautiful mountain landscape at sunrise"
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
"id": "gemini_tts_imagen4",
|
|
40
|
+
"speaker": "Gemini",
|
|
41
|
+
"text": "TTS: Gemini 2.5 Pro TTS Kore. Image: Imagen 4.",
|
|
42
|
+
"imagePrompt": "A futuristic city with flying cars"
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
"id": "imagen4_ultra_override",
|
|
46
|
+
"speaker": "GCP",
|
|
47
|
+
"text": "TTS: Google Cloud TTS en-US-Studio-O. Image: Imagen 4 Ultra override.",
|
|
48
|
+
"imagePrompt": "A woman walking through Tokyo at night with neon lights",
|
|
49
|
+
"imageParams": {
|
|
50
|
+
"model": "imagen-4.0-ultra-generate-001",
|
|
51
|
+
"vertexai_project": "YOUR_PROJECT_ID",
|
|
52
|
+
"vertexai_location": "us-central1"
|
|
53
|
+
}
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
"id": "imagen4_fast_override",
|
|
57
|
+
"speaker": "Gemini",
|
|
58
|
+
"text": "TTS: Gemini 2.5 Pro TTS Kore. Image: Imagen 4 Fast override.",
|
|
59
|
+
"imagePrompt": "A cat sitting on a windowsill watching rain",
|
|
60
|
+
"imageParams": {
|
|
61
|
+
"model": "imagen-4.0-fast-generate-001",
|
|
62
|
+
"vertexai_project": "YOUR_PROJECT_ID",
|
|
63
|
+
"vertexai_location": "us-central1"
|
|
64
|
+
}
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
"id": "veo2_movie",
|
|
68
|
+
"speaker": "GCP",
|
|
69
|
+
"text": "TTS: Google Cloud TTS en-US-Studio-O. Movie: Veo 2.",
|
|
70
|
+
"moviePrompt": "A butterfly flying in slow motion through a garden",
|
|
71
|
+
"duration": 5
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
"id": "veo3_movie_override",
|
|
75
|
+
"speaker": "Gemini",
|
|
76
|
+
"text": "TTS: Gemini 2.5 Pro TTS Kore. Movie: Veo 3 override.",
|
|
77
|
+
"moviePrompt": "Ocean waves crashing on a beach at sunset",
|
|
78
|
+
"movieParams": {
|
|
79
|
+
"model": "veo-3.0-generate-001",
|
|
80
|
+
"vertexai_project": "YOUR_PROJECT_ID",
|
|
81
|
+
"vertexai_location": "us-central1"
|
|
82
|
+
}
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
"id": "image_to_movie_veo2",
|
|
86
|
+
"speaker": "GCP",
|
|
87
|
+
"text": "TTS: Google Cloud TTS en-US-Studio-O. Image: Imagen 4. Movie: Veo 2 with image reference.",
|
|
88
|
+
"imagePrompt": "A woman standing in a busy Tokyo street at night",
|
|
89
|
+
"moviePrompt": "The woman takes a selfie with her phone",
|
|
90
|
+
"duration": 5
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
"id": "image_to_movie_veo3_override",
|
|
94
|
+
"speaker": "Gemini",
|
|
95
|
+
"text": "TTS: Gemini 2.5 Pro TTS Kore. Image: Imagen 4 Fast override. Movie: Veo 3 override with image reference.",
|
|
96
|
+
"imagePrompt": "A robot standing in a futuristic laboratory",
|
|
97
|
+
"imageParams": {
|
|
98
|
+
"model": "imagen-4.0-fast-generate-001",
|
|
99
|
+
"vertexai_project": "YOUR_PROJECT_ID",
|
|
100
|
+
"vertexai_location": "us-central1"
|
|
101
|
+
},
|
|
102
|
+
"moviePrompt": "The robot turns its head and waves at the camera",
|
|
103
|
+
"movieParams": {
|
|
104
|
+
"model": "veo-3.0-generate-001",
|
|
105
|
+
"vertexai_project": "YOUR_PROJECT_ID",
|
|
106
|
+
"vertexai_location": "us-central1"
|
|
107
|
+
},
|
|
108
|
+
"duration": 5
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
"id": "gemini_flash_image_override",
|
|
112
|
+
"speaker": "GCP",
|
|
113
|
+
"text": "TTS: Google Cloud TTS en-US-Studio-O. Image: Gemini 2.5 Flash Image override.",
|
|
114
|
+
"imagePrompt": "A cozy coffee shop interior with warm lighting",
|
|
115
|
+
"imageParams": {
|
|
116
|
+
"model": "gemini-2.5-flash-image",
|
|
117
|
+
"vertexai_project": "YOUR_PROJECT_ID",
|
|
118
|
+
"vertexai_location": "us-central1"
|
|
119
|
+
}
|
|
22
120
|
}
|
|
23
121
|
]
|
|
24
122
|
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$mulmocast": { "version": "1.1" },
|
|
3
|
+
"lang": "en",
|
|
4
|
+
"title": "Vertex AI Simple Test",
|
|
5
|
+
"description": "Replace YOUR_PROJECT_ID with your Google Cloud project ID",
|
|
6
|
+
"imageParams": {
|
|
7
|
+
"provider": "google",
|
|
8
|
+
"model": "imagen-4.0-generate-001",
|
|
9
|
+
"vertexai_project": "YOUR_PROJECT_ID"
|
|
10
|
+
},
|
|
11
|
+
"beats": [
|
|
12
|
+
{
|
|
13
|
+
"text": "Hello, world! This is a simple Vertex AI test.",
|
|
14
|
+
"imagePrompt": "A beautiful sunset over the ocean"
|
|
15
|
+
}
|
|
16
|
+
]
|
|
17
|
+
}
|