@argo-video/cli 0.1.1 → 0.2.1
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/README.md +46 -12
- package/dist/asset-server.d.ts.map +1 -1
- package/dist/asset-server.js +4 -1
- package/dist/asset-server.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +15 -4
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +29 -2
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +23 -3
- package/dist/config.js.map +1 -1
- package/dist/export.d.ts +7 -0
- package/dist/export.d.ts.map +1 -1
- package/dist/export.js +16 -6
- package/dist/export.js.map +1 -1
- package/dist/fixtures.d.ts.map +1 -1
- package/dist/fixtures.js +14 -1
- package/dist/fixtures.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/init.d.ts.map +1 -1
- package/dist/init.js +11 -4
- package/dist/init.js.map +1 -1
- package/dist/narration.d.ts +23 -0
- package/dist/narration.d.ts.map +1 -1
- package/dist/narration.js +59 -0
- package/dist/narration.js.map +1 -1
- package/dist/overlays/index.d.ts +7 -2
- package/dist/overlays/index.d.ts.map +1 -1
- package/dist/overlays/index.js +16 -5
- package/dist/overlays/index.js.map +1 -1
- package/dist/overlays/templates.d.ts +2 -1
- package/dist/overlays/templates.d.ts.map +1 -1
- package/dist/overlays/templates.js +28 -24
- package/dist/overlays/templates.js.map +1 -1
- package/dist/overlays/types.d.ts +4 -0
- package/dist/overlays/types.d.ts.map +1 -1
- package/dist/overlays/types.js.map +1 -1
- package/dist/overlays/zones.d.ts +8 -0
- package/dist/overlays/zones.d.ts.map +1 -1
- package/dist/overlays/zones.js +48 -0
- package/dist/overlays/zones.js.map +1 -1
- package/dist/pipeline.d.ts +1 -1
- package/dist/pipeline.d.ts.map +1 -1
- package/dist/pipeline.js +23 -2
- package/dist/pipeline.js.map +1 -1
- package/dist/record.d.ts +4 -0
- package/dist/record.d.ts.map +1 -1
- package/dist/record.js +25 -5
- package/dist/record.js.map +1 -1
- package/dist/tts/align.d.ts +9 -0
- package/dist/tts/align.d.ts.map +1 -1
- package/dist/tts/align.js +28 -15
- package/dist/tts/align.js.map +1 -1
- package/dist/tts/generate.d.ts +1 -0
- package/dist/tts/generate.d.ts.map +1 -1
- package/dist/tts/generate.js +4 -1
- package/dist/tts/generate.js.map +1 -1
- package/dist/tts/kokoro.d.ts +21 -4
- package/dist/tts/kokoro.d.ts.map +1 -1
- package/dist/tts/kokoro.js +27 -7
- package/dist/tts/kokoro.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -17,7 +17,7 @@ Write a demo script with Playwright. Add a voiceover manifest. Run one command.
|
|
|
17
17
|
|
|
18
18
|
## Showcase
|
|
19
19
|
|
|
20
|
-
[Watch the demo video](https://gist.github.com/user-attachments/assets/
|
|
20
|
+
[Watch the demo video](https://gist.github.com/user-attachments/assets/1344780c-75e4-40fc-ab4a-c9e546f8c2ea)
|
|
21
21
|
|
|
22
22
|
> *This demo was recorded by Argo, using Argo. Yes, really.*
|
|
23
23
|
|
|
@@ -64,22 +64,38 @@ A demo is two files: a **script** and a **voiceover manifest**.
|
|
|
64
64
|
|
|
65
65
|
```ts
|
|
66
66
|
import { test } from '@argo-video/cli';
|
|
67
|
-
import {
|
|
67
|
+
import { showOverlay, withOverlay } from '@argo-video/cli';
|
|
68
68
|
|
|
69
69
|
test('my-feature', async ({ page, narration }) => {
|
|
70
70
|
await page.goto('/');
|
|
71
71
|
|
|
72
72
|
narration.mark('intro');
|
|
73
|
-
await
|
|
73
|
+
await showOverlay(page, 'intro', {
|
|
74
|
+
type: 'lower-third',
|
|
75
|
+
text: 'Welcome to our product',
|
|
76
|
+
placement: 'bottom-center',
|
|
77
|
+
motion: 'fade-in',
|
|
78
|
+
autoBackground: true,
|
|
79
|
+
}, narration.durationFor('intro'));
|
|
74
80
|
|
|
75
81
|
narration.mark('action');
|
|
76
|
-
await
|
|
82
|
+
await withOverlay(page, 'action', {
|
|
83
|
+
type: 'headline-card',
|
|
84
|
+
title: 'Watch this',
|
|
85
|
+
placement: 'top-right',
|
|
86
|
+
motion: 'slide-in',
|
|
87
|
+
}, async () => {
|
|
77
88
|
await page.click('#get-started');
|
|
78
|
-
await page.waitForTimeout(
|
|
89
|
+
await page.waitForTimeout(narration.durationFor('action'));
|
|
79
90
|
});
|
|
80
91
|
|
|
81
92
|
narration.mark('done');
|
|
82
|
-
await
|
|
93
|
+
await showOverlay(page, 'done', {
|
|
94
|
+
type: 'callout',
|
|
95
|
+
text: "That's it!",
|
|
96
|
+
placement: 'top-left',
|
|
97
|
+
motion: 'fade-in',
|
|
98
|
+
}, narration.durationFor('done'));
|
|
83
99
|
});
|
|
84
100
|
```
|
|
85
101
|
|
|
@@ -105,17 +121,24 @@ export default {
|
|
|
105
121
|
demosDir: 'demos/',
|
|
106
122
|
outputDir: 'videos/',
|
|
107
123
|
tts: { defaultVoice: 'af_heart', defaultSpeed: 1.0 },
|
|
108
|
-
video: { width: 1920, height: 1080, fps: 30 },
|
|
124
|
+
video: { width: 1920, height: 1080, fps: 30, browser: 'chromium', deviceScaleFactor: 1 },
|
|
109
125
|
export: { preset: 'slow', crf: 16 },
|
|
110
126
|
};
|
|
111
127
|
```
|
|
112
128
|
|
|
129
|
+
> **Tip:** Use `browser: 'webkit'` for sharper video on macOS. Chromium has a [known video capture quality issue](https://github.com/microsoft/playwright/issues/31424). Set `deviceScaleFactor: 2` for retina-quality recordings (captured at 2x, downscaled with lanczos in export).
|
|
130
|
+
|
|
113
131
|
### `playwright.config.ts`
|
|
114
132
|
|
|
115
133
|
Argo scaffolds this for you via `argo init`. The key settings:
|
|
116
134
|
|
|
117
135
|
```ts
|
|
118
136
|
import { defineConfig } from '@playwright/test';
|
|
137
|
+
import config from './argo.config.js';
|
|
138
|
+
|
|
139
|
+
const scale = Math.max(1, Math.round(config.video?.deviceScaleFactor ?? 1));
|
|
140
|
+
const width = config.video?.width ?? 1920;
|
|
141
|
+
const height = config.video?.height ?? 1080;
|
|
119
142
|
|
|
120
143
|
export default defineConfig({
|
|
121
144
|
preserveOutput: 'always',
|
|
@@ -124,9 +147,11 @@ export default defineConfig({
|
|
|
124
147
|
testDir: 'demos',
|
|
125
148
|
testMatch: '**/*.demo.ts',
|
|
126
149
|
use: {
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
150
|
+
browserName: config.video?.browser ?? 'chromium',
|
|
151
|
+
baseURL: process.env.BASE_URL || config.baseURL || 'http://localhost:3000',
|
|
152
|
+
viewport: { width, height },
|
|
153
|
+
deviceScaleFactor: scale,
|
|
154
|
+
video: { mode: 'on', size: { width: width * scale, height: height * scale } },
|
|
130
155
|
},
|
|
131
156
|
}],
|
|
132
157
|
});
|
|
@@ -141,6 +166,9 @@ argo tts generate <manifest> Generate TTS clips from manifest
|
|
|
141
166
|
argo export <demo> Merge video + audio to MP4
|
|
142
167
|
argo pipeline <demo> Run all steps end-to-end
|
|
143
168
|
argo --config <path> <command> Use a custom config file
|
|
169
|
+
|
|
170
|
+
Options:
|
|
171
|
+
--browser <engine> chromium | webkit | firefox (overrides config)
|
|
144
172
|
```
|
|
145
173
|
|
|
146
174
|
## API
|
|
@@ -149,6 +177,7 @@ Argo exports Playwright fixtures and helpers for use in demo scripts:
|
|
|
149
177
|
|
|
150
178
|
```ts
|
|
151
179
|
import { test, expect, demoType } from '@argo-video/cli';
|
|
180
|
+
import { showOverlay, hideOverlay, withOverlay } from '@argo-video/cli';
|
|
152
181
|
import { showCaption, hideCaption, withCaption } from '@argo-video/cli';
|
|
153
182
|
import { defineConfig, demosProject } from '@argo-video/cli';
|
|
154
183
|
```
|
|
@@ -158,9 +187,14 @@ import { defineConfig, demosProject } from '@argo-video/cli';
|
|
|
158
187
|
| `test` | Playwright `test` with `narration` fixture injected |
|
|
159
188
|
| `expect` | Re-exported from Playwright |
|
|
160
189
|
| `demoType(page, selector, text, delay?)` | Type text character-by-character (cinematic) |
|
|
161
|
-
| `
|
|
190
|
+
| `showOverlay(page, scene, cue, durationMs)` | Show a templated overlay (lower-third, headline-card, callout, image-card) |
|
|
191
|
+
| `withOverlay(page, scene, cue, action)` | Show overlay during an async action |
|
|
192
|
+
| `hideOverlay(page, zone?)` | Remove overlay from a zone |
|
|
193
|
+
| `showCaption(page, scene, text, durationMs)` | Show a simple text caption |
|
|
162
194
|
| `withCaption(page, scene, text, action)` | Show caption during an async action |
|
|
163
|
-
| `hideCaption(page)` | Remove caption
|
|
195
|
+
| `hideCaption(page)` | Remove caption |
|
|
196
|
+
| `narration.mark(scene)` | Record a scene timestamp |
|
|
197
|
+
| `narration.durationFor(scene, opts?)` | Compute hold duration from TTS clip length |
|
|
164
198
|
| `defineConfig(userConfig)` | Create config with defaults |
|
|
165
199
|
| `demosProject(options)` | Create Playwright project entry |
|
|
166
200
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"asset-server.d.ts","sourceRoot":"","sources":["../src/asset-server.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5B;AAaD,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,
|
|
1
|
+
{"version":3,"file":"asset-server.d.ts","sourceRoot":"","sources":["../src/asset-server.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5B;AAaD,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CA8DvE"}
|
package/dist/asset-server.js
CHANGED
|
@@ -13,7 +13,7 @@ const MIME_TYPES = {
|
|
|
13
13
|
};
|
|
14
14
|
export function startAssetServer(assetDir) {
|
|
15
15
|
const resolvedDir = resolve(assetDir);
|
|
16
|
-
return new Promise((resolvePromise) => {
|
|
16
|
+
return new Promise((resolvePromise, rejectPromise) => {
|
|
17
17
|
const server = http.createServer((req, res) => {
|
|
18
18
|
const rawUrl = req.url ?? '/';
|
|
19
19
|
const urlPath = decodeURIComponent(rawUrl);
|
|
@@ -53,6 +53,9 @@ export function startAssetServer(assetDir) {
|
|
|
53
53
|
res.writeHead(200, { 'Content-Type': contentType });
|
|
54
54
|
createReadStream(filePath).pipe(res);
|
|
55
55
|
});
|
|
56
|
+
server.on('error', (err) => {
|
|
57
|
+
rejectPromise(new Error(`Asset server failed to start: ${err.message}`));
|
|
58
|
+
});
|
|
56
59
|
server.listen(0, '127.0.0.1', () => {
|
|
57
60
|
const { port } = server.address();
|
|
58
61
|
resolvePromise({
|
package/dist/asset-server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"asset-server.js","sourceRoot":"","sources":["../src/asset-server.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACvD,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AASjE,MAAM,UAAU,GAA2B;IACzC,MAAM,EAAE,WAAW;IACnB,MAAM,EAAE,YAAY;IACpB,OAAO,EAAE,YAAY;IACrB,MAAM,EAAE,WAAW;IACnB,MAAM,EAAE,eAAe;IACvB,OAAO,EAAE,YAAY;IACrB,MAAM,EAAE,YAAY;IACpB,OAAO,EAAE,kBAAkB;CAC5B,CAAC;AAEF,MAAM,UAAU,gBAAgB,CAAC,QAAgB;IAC/C,MAAM,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IAEtC,OAAO,IAAI,OAAO,CAAC,CAAC,cAAc,EAAE,EAAE;
|
|
1
|
+
{"version":3,"file":"asset-server.js","sourceRoot":"","sources":["../src/asset-server.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAU,MAAM,WAAW,CAAC;AAgB5C,wBAAgB,aAAa,IAAI,OAAO,CAuFvC"}
|
package/dist/cli.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Command } from 'commander';
|
|
1
|
+
import { Command, Option } from 'commander';
|
|
2
2
|
import { loadConfig } from './config.js';
|
|
3
3
|
import { record } from './record.js';
|
|
4
4
|
import { generateClips } from './tts/generate.js';
|
|
@@ -21,16 +21,20 @@ export function createProgram() {
|
|
|
21
21
|
program
|
|
22
22
|
.command('record <demo>')
|
|
23
23
|
.description('Record a demo using Playwright')
|
|
24
|
-
.
|
|
24
|
+
.addOption(new Option('--browser <engine>', 'browser engine').choices(['chromium', 'webkit', 'firefox']))
|
|
25
|
+
.action(async (demo, cmdOpts) => {
|
|
25
26
|
const configPath = program.opts().config;
|
|
26
27
|
const config = await loadConfig(process.cwd(), configPath);
|
|
27
28
|
if (!config.baseURL) {
|
|
28
29
|
throw new Error('baseURL is required but not set. Set it in argo.config.js or pass --config.');
|
|
29
30
|
}
|
|
31
|
+
const browser = cmdOpts.browser ?? config.video.browser;
|
|
30
32
|
await record(demo, {
|
|
31
33
|
demosDir: config.demosDir,
|
|
32
34
|
baseURL: config.baseURL,
|
|
33
35
|
video: { width: config.video.width, height: config.video.height },
|
|
36
|
+
browser,
|
|
37
|
+
deviceScaleFactor: config.video.deviceScaleFactor,
|
|
34
38
|
});
|
|
35
39
|
});
|
|
36
40
|
const tts = program
|
|
@@ -63,14 +67,21 @@ export function createProgram() {
|
|
|
63
67
|
preset: config.export.preset,
|
|
64
68
|
crf: config.export.crf,
|
|
65
69
|
fps: config.video.fps,
|
|
70
|
+
outputWidth: config.video.width,
|
|
71
|
+
outputHeight: config.video.height,
|
|
72
|
+
deviceScaleFactor: config.video.deviceScaleFactor,
|
|
66
73
|
});
|
|
67
74
|
});
|
|
68
75
|
program
|
|
69
76
|
.command('pipeline <demo>')
|
|
70
77
|
.description('Run the full pipeline: TTS → record → export')
|
|
71
|
-
.
|
|
78
|
+
.addOption(new Option('--browser <engine>', 'browser engine').choices(['chromium', 'webkit', 'firefox']))
|
|
79
|
+
.action(async (demo, cmdOpts) => {
|
|
72
80
|
const configPath = program.opts().config;
|
|
73
|
-
const
|
|
81
|
+
const loaded = await ensureTTSEngine(await loadConfig(process.cwd(), configPath));
|
|
82
|
+
const config = cmdOpts.browser
|
|
83
|
+
? { ...loaded, video: { ...loaded.video, browser: cmdOpts.browser } }
|
|
84
|
+
: loaded;
|
|
74
85
|
await runPipeline(demo, config);
|
|
75
86
|
});
|
|
76
87
|
program
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
CHANGED
|
@@ -5,15 +5,21 @@ export interface TTSConfig {
|
|
|
5
5
|
defaultSpeed: number;
|
|
6
6
|
engine?: TTSEngine;
|
|
7
7
|
}
|
|
8
|
+
export type BrowserEngine = 'chromium' | 'webkit' | 'firefox';
|
|
8
9
|
export interface VideoConfig {
|
|
9
10
|
width: number;
|
|
10
11
|
height: number;
|
|
11
12
|
fps: number;
|
|
13
|
+
browser: BrowserEngine;
|
|
14
|
+
deviceScaleFactor: number;
|
|
12
15
|
}
|
|
13
16
|
export interface ExportConfig {
|
|
14
17
|
preset: string;
|
|
15
18
|
crf: number;
|
|
16
19
|
}
|
|
20
|
+
export interface OverlayConfig {
|
|
21
|
+
autoBackground: boolean;
|
|
22
|
+
}
|
|
17
23
|
export interface ArgoConfig {
|
|
18
24
|
baseURL?: string;
|
|
19
25
|
demosDir: string;
|
|
@@ -21,23 +27,44 @@ export interface ArgoConfig {
|
|
|
21
27
|
tts: TTSConfig;
|
|
22
28
|
video: VideoConfig;
|
|
23
29
|
export: ExportConfig;
|
|
30
|
+
overlays: OverlayConfig;
|
|
24
31
|
}
|
|
25
|
-
export type UserConfig = Partial<Omit<ArgoConfig, 'tts' | 'video' | 'export'> & {
|
|
32
|
+
export type UserConfig = Partial<Omit<ArgoConfig, 'tts' | 'video' | 'export' | 'overlays'> & {
|
|
26
33
|
tts: Partial<TTSConfig>;
|
|
27
34
|
video: Partial<VideoConfig>;
|
|
28
35
|
export: Partial<ExportConfig>;
|
|
36
|
+
overlays: Partial<OverlayConfig>;
|
|
29
37
|
}>;
|
|
38
|
+
export declare function normalizeDeviceScaleFactor(rawScale?: number): number;
|
|
30
39
|
export declare function defineConfig(userConfig: UserConfig): ArgoConfig;
|
|
31
40
|
export declare function demosProject(options: {
|
|
32
41
|
baseURL: string;
|
|
33
42
|
demosDir?: string;
|
|
43
|
+
browser?: BrowserEngine;
|
|
44
|
+
deviceScaleFactor?: number;
|
|
45
|
+
video?: {
|
|
46
|
+
width: number;
|
|
47
|
+
height: number;
|
|
48
|
+
};
|
|
34
49
|
}): {
|
|
35
50
|
name: string;
|
|
36
51
|
testDir: string;
|
|
37
52
|
testMatch: string;
|
|
38
53
|
use: {
|
|
54
|
+
browserName: BrowserEngine;
|
|
39
55
|
baseURL: string;
|
|
40
|
-
|
|
56
|
+
viewport: {
|
|
57
|
+
width: number;
|
|
58
|
+
height: number;
|
|
59
|
+
};
|
|
60
|
+
deviceScaleFactor: number;
|
|
61
|
+
video: {
|
|
62
|
+
mode: "on";
|
|
63
|
+
size: {
|
|
64
|
+
width: number;
|
|
65
|
+
height: number;
|
|
66
|
+
};
|
|
67
|
+
};
|
|
41
68
|
};
|
|
42
69
|
};
|
|
43
70
|
export declare function loadConfig(cwd: string, explicitPath?: string): Promise<ArgoConfig>;
|
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,YAAY,EAAE,SAAS,EAAE,CAAC;AAI1B,MAAM,WAAW,SAAS;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,SAAS,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,YAAY,EAAE,SAAS,EAAE,CAAC;AAI1B,MAAM,WAAW,SAAS;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,SAAS,CAAC;CACpB;AAED,MAAM,MAAM,aAAa,GAAG,UAAU,GAAG,QAAQ,GAAG,SAAS,CAAC;AAE9D,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,aAAa,CAAC;IACvB,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,aAAa;IAC5B,cAAc,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,SAAS,CAAC;IACf,KAAK,EAAE,WAAW,CAAC;IACnB,MAAM,EAAE,YAAY,CAAC;IACrB,QAAQ,EAAE,aAAa,CAAC;CACzB;AAED,MAAM,MAAM,UAAU,GAAG,OAAO,CAC9B,IAAI,CAAC,UAAU,EAAE,KAAK,GAAG,OAAO,GAAG,QAAQ,GAAG,UAAU,CAAC,GAAG;IAC1D,GAAG,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;IACxB,KAAK,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;IAC5B,MAAM,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;IAC9B,QAAQ,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;CAClC,CACF,CAAC;AAeF,wBAAgB,0BAA0B,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAGpE;AAED,wBAAgB,YAAY,CAAC,UAAU,EAAE,UAAU,GAAG,UAAU,CAe/D;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,KAAK,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CAC3C;;;;;;;;;;;;;;;;;;;;EAmBA;AAkBD,wBAAsB,UAAU,CAC9B,GAAG,EAAE,MAAM,EACX,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,UAAU,CAAC,CA0BrB"}
|
package/dist/config.js
CHANGED
|
@@ -6,27 +6,47 @@ const DEFAULTS = {
|
|
|
6
6
|
demosDir: 'demos',
|
|
7
7
|
outputDir: 'videos',
|
|
8
8
|
tts: { defaultVoice: 'af_heart', defaultSpeed: 1.0 },
|
|
9
|
-
video: { width: 1920, height: 1080, fps: 30 },
|
|
9
|
+
video: { width: 1920, height: 1080, fps: 30, browser: 'chromium', deviceScaleFactor: 1 },
|
|
10
10
|
export: { preset: 'slow', crf: 16 },
|
|
11
|
+
overlays: { autoBackground: false },
|
|
11
12
|
};
|
|
12
13
|
// ---- Functions ----
|
|
14
|
+
export function normalizeDeviceScaleFactor(rawScale) {
|
|
15
|
+
const scale = typeof rawScale === 'number' && Number.isFinite(rawScale) ? rawScale : 1;
|
|
16
|
+
return Math.max(1, Math.round(scale));
|
|
17
|
+
}
|
|
13
18
|
export function defineConfig(userConfig) {
|
|
19
|
+
const video = {
|
|
20
|
+
...DEFAULTS.video,
|
|
21
|
+
...userConfig.video,
|
|
22
|
+
};
|
|
23
|
+
video.deviceScaleFactor = normalizeDeviceScaleFactor(video.deviceScaleFactor);
|
|
14
24
|
return {
|
|
15
25
|
...DEFAULTS,
|
|
16
26
|
...userConfig,
|
|
17
27
|
tts: { ...DEFAULTS.tts, ...userConfig.tts },
|
|
18
|
-
video
|
|
28
|
+
video,
|
|
19
29
|
export: { ...DEFAULTS.export, ...userConfig.export },
|
|
30
|
+
overlays: { ...DEFAULTS.overlays, ...userConfig.overlays },
|
|
20
31
|
};
|
|
21
32
|
}
|
|
22
33
|
export function demosProject(options) {
|
|
34
|
+
const scale = normalizeDeviceScaleFactor(options.deviceScaleFactor);
|
|
35
|
+
const width = options.video?.width ?? 1920;
|
|
36
|
+
const height = options.video?.height ?? 1080;
|
|
23
37
|
return {
|
|
24
38
|
name: 'demos',
|
|
25
39
|
testDir: options.demosDir ?? 'demos',
|
|
26
40
|
testMatch: '**/*.demo.ts',
|
|
27
41
|
use: {
|
|
42
|
+
browserName: options.browser ?? 'chromium',
|
|
28
43
|
baseURL: options.baseURL,
|
|
29
|
-
|
|
44
|
+
viewport: { width, height },
|
|
45
|
+
deviceScaleFactor: scale,
|
|
46
|
+
video: {
|
|
47
|
+
mode: 'on',
|
|
48
|
+
size: { width: width * scale, height: height * scale },
|
|
49
|
+
},
|
|
30
50
|
},
|
|
31
51
|
};
|
|
32
52
|
}
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/export.d.ts
CHANGED
|
@@ -5,6 +5,13 @@ export interface ExportOptions {
|
|
|
5
5
|
preset?: string;
|
|
6
6
|
crf?: number;
|
|
7
7
|
fps?: number;
|
|
8
|
+
tailPadMs?: number;
|
|
9
|
+
/** Logical output width (e.g. 1920). Used with deviceScaleFactor for downscaling. */
|
|
10
|
+
outputWidth?: number;
|
|
11
|
+
/** Logical output height (e.g. 1080). Used with deviceScaleFactor for downscaling. */
|
|
12
|
+
outputHeight?: number;
|
|
13
|
+
/** When > 1, recording was captured at scaled resolution and needs lanczos downscale. */
|
|
14
|
+
deviceScaleFactor?: number;
|
|
8
15
|
}
|
|
9
16
|
/**
|
|
10
17
|
* Check whether ffmpeg is available on the system PATH.
|
package/dist/export.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"export.d.ts","sourceRoot":"","sources":["../src/export.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"export.d.ts","sourceRoot":"","sources":["../src/export.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qFAAqF;IACrF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,sFAAsF;IACtF,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,yFAAyF;IACzF,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAMD;;;GAGG;AACH,wBAAgB,WAAW,IAAI,OAAO,CAYrC;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CA6EzE"}
|
package/dist/export.js
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import { execFileSync, spawnSync } from 'node:child_process';
|
|
2
2
|
import { existsSync, mkdirSync } from 'node:fs';
|
|
3
3
|
import { join } from 'node:path';
|
|
4
|
+
function formatSeconds(ms) {
|
|
5
|
+
return (ms / 1000).toFixed(3).replace(/\.?0+$/, '');
|
|
6
|
+
}
|
|
4
7
|
/**
|
|
5
8
|
* Check whether ffmpeg is available on the system PATH.
|
|
6
9
|
* Returns true if found, throws with install instructions otherwise.
|
|
@@ -21,7 +24,7 @@ export function checkFfmpeg() {
|
|
|
21
24
|
* Export a demo to MP4 by combining the screen recording with aligned narration audio.
|
|
22
25
|
*/
|
|
23
26
|
export async function exportVideo(options) {
|
|
24
|
-
const { demoName, argoDir, outputDir, preset = 'slow', crf = 16, fps, } = options;
|
|
27
|
+
const { demoName, argoDir, outputDir, preset = 'slow', crf = 16, fps, tailPadMs, outputWidth, outputHeight, deviceScaleFactor = 1, } = options;
|
|
25
28
|
checkFfmpeg();
|
|
26
29
|
const demoDir = join(argoDir, demoName);
|
|
27
30
|
const videoPath = join(demoDir, 'video.webm');
|
|
@@ -39,12 +42,19 @@ export async function exportVideo(options) {
|
|
|
39
42
|
const args = [
|
|
40
43
|
'-i', videoPath,
|
|
41
44
|
'-i', audioPath,
|
|
42
|
-
'-c:v', 'libx264',
|
|
43
|
-
'-preset', preset,
|
|
44
|
-
'-crf', String(crf),
|
|
45
|
-
'-c:a', 'aac',
|
|
46
|
-
'-b:a', '192k',
|
|
47
45
|
];
|
|
46
|
+
// Build video filter chain
|
|
47
|
+
const vFilters = [];
|
|
48
|
+
if (tailPadMs && tailPadMs > 0) {
|
|
49
|
+
vFilters.push(`tpad=stop_mode=clone:stop_duration=${formatSeconds(tailPadMs)}`);
|
|
50
|
+
}
|
|
51
|
+
if (deviceScaleFactor > 1 && outputWidth && outputHeight) {
|
|
52
|
+
vFilters.push(`scale=${outputWidth}:${outputHeight}:flags=lanczos`);
|
|
53
|
+
}
|
|
54
|
+
if (vFilters.length > 0) {
|
|
55
|
+
args.push('-vf', vFilters.join(','));
|
|
56
|
+
}
|
|
57
|
+
args.push('-c:v', 'libx264', '-preset', preset, '-crf', String(crf), '-c:a', 'aac', '-b:a', '192k');
|
|
48
58
|
if (fps !== undefined) {
|
|
49
59
|
args.push('-r', String(fps));
|
|
50
60
|
}
|
package/dist/export.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"export.js","sourceRoot":"","sources":["../src/export.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"export.js","sourceRoot":"","sources":["../src/export.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAkBjC,SAAS,aAAa,CAAC,EAAU;IAC/B,OAAO,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;AACtD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW;IACzB,IAAI,CAAC;QACH,YAAY,CAAC,QAAQ,EAAE,CAAC,UAAU,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QACxD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CACb,6CAA6C;YAC3C,kCAAkC;YAClC,iCAAiC;YACjC,iCAAiC,CACpC,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAAsB;IACtD,MAAM,EACJ,QAAQ,EACR,OAAO,EACP,SAAS,EACT,MAAM,GAAG,MAAM,EACf,GAAG,GAAG,EAAE,EACR,GAAG,EACH,SAAS,EACT,WAAW,EACX,YAAY,EACZ,iBAAiB,GAAG,CAAC,GACtB,GAAG,OAAO,CAAC;IAEZ,WAAW,EAAE,CAAC;IAEd,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IACxC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IAC9C,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,EAAE,uBAAuB,CAAC,CAAC;IAEzD,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,yBAAyB,SAAS,EAAE,CAAC,CAAC;IACxD,CAAC;IACD,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,oCAAoC,SAAS,EAAE,CAAC,CAAC;IACnE,CAAC;IAED,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC3B,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,EAAE,GAAG,QAAQ,MAAM,CAAC,CAAC;IAEtD,MAAM,IAAI,GAAa;QACrB,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,SAAS;KAChB,CAAC;IAEF,2BAA2B;IAC3B,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,IAAI,SAAS,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;QAC/B,QAAQ,CAAC,IAAI,CAAC,sCAAsC,aAAa,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IAClF,CAAC;IACD,IAAI,iBAAiB,GAAG,CAAC,IAAI,WAAW,IAAI,YAAY,EAAE,CAAC;QACzD,QAAQ,CAAC,IAAI,CAAC,SAAS,WAAW,IAAI,YAAY,gBAAgB,CAAC,CAAC;IACtE,CAAC;IACD,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACvC,CAAC;IAED,IAAI,CAAC,IAAI,CACP,MAAM,EAAE,SAAS,EACjB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,EACnB,MAAM,EAAE,KAAK,EACb,MAAM,EAAE,MAAM,CACf,CAAC;IAEF,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QACtB,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IAC/B,CAAC;IAED,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;IAEzC,MAAM,MAAM,GAAG,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;IAE/D,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,4BAA4B,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IACtE,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CAAC,+BAA+B,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IAClE,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,gCAAgC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IACnE,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC"}
|
package/dist/fixtures.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fixtures.d.ts","sourceRoot":"","sources":["../src/fixtures.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,MAAM,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"fixtures.d.ts","sourceRoot":"","sources":["../src/fixtures.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,MAAM,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAE7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAEnD,KAAK,eAAe,GAAG,CAAC,KAAK,EAAE,MAAM,KAAK,iBAAiB,CAAC;AAI5D,wBAAgB,sBAAsB,CAAC,OAAO,GAAE,eAAgC,IAE5E,UAAU,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACjC,KAAK,CAAC,QAAQ,EAAE,iBAAiB,KAAK,OAAO,CAAC,IAAI,CAAC,EACnD,UAAU;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,mBAU9B;AAED,wBAAsB,QAAQ,CAC5B,IAAI,EAAE,IAAI,EACV,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,KAAK,SAAK,GACT,OAAO,CAAC,IAAI,CAAC,CAEf;AAYD,eAAO,MAAM,IAAI;eAA4B,iBAAiB;wGAe5D,CAAC;AAEH,OAAO,EAAE,MAAM,EAAE,CAAC"}
|
package/dist/fixtures.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { test as base, expect } from '@playwright/test';
|
|
2
|
+
import { readFileSync, existsSync } from 'node:fs';
|
|
2
3
|
import { NarrationTimeline } from './narration.js';
|
|
3
4
|
const defaultFactory = () => new NarrationTimeline();
|
|
4
5
|
export function createNarrationFixture(factory = defaultFactory) {
|
|
@@ -16,9 +17,21 @@ export function createNarrationFixture(factory = defaultFactory) {
|
|
|
16
17
|
export async function demoType(page, selector, text, delay = 60) {
|
|
17
18
|
await page.locator(selector).pressSequentially(text, { delay });
|
|
18
19
|
}
|
|
20
|
+
function loadSceneDurations() {
|
|
21
|
+
const durationsPath = process.env.ARGO_SCENE_DURATIONS_PATH;
|
|
22
|
+
if (!durationsPath || !existsSync(durationsPath))
|
|
23
|
+
return undefined;
|
|
24
|
+
try {
|
|
25
|
+
return JSON.parse(readFileSync(durationsPath, 'utf-8'));
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
return undefined;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
19
31
|
export const test = base.extend({
|
|
20
32
|
narration: async ({}, use, testInfo) => {
|
|
21
|
-
const
|
|
33
|
+
const durations = loadSceneDurations();
|
|
34
|
+
const timeline = new NarrationTimeline(durations);
|
|
22
35
|
timeline.start();
|
|
23
36
|
try {
|
|
24
37
|
await use(timeline);
|
package/dist/fixtures.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fixtures.js","sourceRoot":"","sources":["../src/fixtures.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,IAAI,IAAI,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAExD,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAInD,MAAM,cAAc,GAAoB,GAAG,EAAE,CAAC,IAAI,iBAAiB,EAAE,CAAC;AAEtE,MAAM,UAAU,sBAAsB,CAAC,UAA2B,cAAc;IAC9E,OAAO,KAAK,EACV,QAAiC,EACjC,GAAmD,EACnD,QAA2B,EAC3B,EAAE;QACF,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACzC,QAAQ,CAAC,KAAK,EAAE,CAAC;QACjB,IAAI,CAAC;YACH,MAAM,GAAG,CAAC,QAAQ,CAAC,CAAC;QACtB,CAAC;gBAAS,CAAC;YACT,MAAM,QAAQ,CAAC,KAAK,CAAC,aAAa,QAAQ,CAAC,KAAK,OAAO,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,IAAU,EACV,QAAgB,EAChB,IAAY,EACZ,KAAK,GAAG,EAAE;IAEV,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,iBAAiB,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;AAClE,CAAC;AAED,MAAM,CAAC,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAmC;IAChE,SAAS,EAAE,KAAK,EAAE,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,EAAE;QACrC,MAAM,QAAQ,GAAG,IAAI,iBAAiB,
|
|
1
|
+
{"version":3,"file":"fixtures.js","sourceRoot":"","sources":["../src/fixtures.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,IAAI,IAAI,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAExD,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAInD,MAAM,cAAc,GAAoB,GAAG,EAAE,CAAC,IAAI,iBAAiB,EAAE,CAAC;AAEtE,MAAM,UAAU,sBAAsB,CAAC,UAA2B,cAAc;IAC9E,OAAO,KAAK,EACV,QAAiC,EACjC,GAAmD,EACnD,QAA2B,EAC3B,EAAE;QACF,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACzC,QAAQ,CAAC,KAAK,EAAE,CAAC;QACjB,IAAI,CAAC;YACH,MAAM,GAAG,CAAC,QAAQ,CAAC,CAAC;QACtB,CAAC;gBAAS,CAAC;YACT,MAAM,QAAQ,CAAC,KAAK,CAAC,aAAa,QAAQ,CAAC,KAAK,OAAO,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,IAAU,EACV,QAAgB,EAChB,IAAY,EACZ,KAAK,GAAG,EAAE;IAEV,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,iBAAiB,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;AAClE,CAAC;AAED,SAAS,kBAAkB;IACzB,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC;IAC5D,IAAI,CAAC,aAAa,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC;QAAE,OAAO,SAAS,CAAC;IACnE,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC,CAAC;IAC1D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAmC;IAChE,SAAS,EAAE,KAAK,EAAE,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,EAAE;QACrC,MAAM,SAAS,GAAG,kBAAkB,EAAE,CAAC;QACvC,MAAM,QAAQ,GAAG,IAAI,iBAAiB,CAAC,SAAS,CAAC,CAAC;QAClD,QAAQ,CAAC,KAAK,EAAE,CAAC;QACjB,IAAI,CAAC;YACH,MAAM,GAAG,CAAC,QAAQ,CAAC,CAAC;QACtB,CAAC;gBAAS,CAAC;YACT,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;YAC5C,MAAM,UAAU,GAAG,OAAO;gBACxB,CAAC,CAAC,GAAG,OAAO,eAAe;gBAC3B,CAAC,CAAC,aAAa,QAAQ,CAAC,KAAK,OAAO,CAAC;YACvC,MAAM,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;CACF,CAAC,CAAC;AAEH,OAAO,EAAE,MAAM,EAAE,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export { defineConfig, loadConfig, demosProject, type ArgoConfig, type UserConfig, type TTSConfig, type TTSEngine, type VideoConfig, type ExportConfig, } from './config.js';
|
|
2
2
|
export { test, expect, demoType } from './fixtures.js';
|
|
3
|
-
export { NarrationTimeline } from './narration.js';
|
|
3
|
+
export { NarrationTimeline, type SceneDurationOptions } from './narration.js';
|
|
4
4
|
export { showCaption, hideCaption, withCaption } from './captions.js';
|
|
5
5
|
export { showOverlay, hideOverlay, withOverlay, type OverlayCue, type OverlayManifestEntry, type Zone, type TemplateType, type MotionPreset, } from './overlays/index.js';
|
|
6
6
|
export { type TTSEngineOptions } from './tts/engine.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,YAAY,EACZ,UAAU,EACV,YAAY,EACZ,KAAK,UAAU,EACf,KAAK,UAAU,EACf,KAAK,SAAS,EACd,KAAK,SAAS,EACd,KAAK,WAAW,EAChB,KAAK,YAAY,GAClB,MAAM,aAAa,CAAC;AAGrB,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAGvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,YAAY,EACZ,UAAU,EACV,YAAY,EACZ,KAAK,UAAU,EACf,KAAK,UAAU,EACf,KAAK,SAAS,EACd,KAAK,SAAS,EACd,KAAK,WAAW,EAChB,KAAK,YAAY,GAClB,MAAM,aAAa,CAAC;AAGrB,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAGvD,OAAO,EAAE,iBAAiB,EAAE,KAAK,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAG9E,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAGtE,OAAO,EACL,WAAW,EACX,WAAW,EACX,WAAW,EACX,KAAK,UAAU,EACf,KAAK,oBAAoB,EACzB,KAAK,IAAI,EACT,KAAK,YAAY,EACjB,KAAK,YAAY,GAClB,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAGxD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC"}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,qDAAqD;AAErD,SAAS;AACT,OAAO,EACL,YAAY,EACZ,UAAU,EACV,YAAY,GAOb,MAAM,aAAa,CAAC;AAErB,WAAW;AACX,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEvD,YAAY;AACZ,OAAO,EAAE,iBAAiB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,qDAAqD;AAErD,SAAS;AACT,OAAO,EACL,YAAY,EACZ,UAAU,EACV,YAAY,GAOb,MAAM,aAAa,CAAC;AAErB,WAAW;AACX,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEvD,YAAY;AACZ,OAAO,EAAE,iBAAiB,EAA6B,MAAM,gBAAgB,CAAC;AAE9E,WAAW;AACX,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAEtE,WAAW;AACX,OAAO,EACL,WAAW,EACX,WAAW,EACX,WAAW,GAMZ,MAAM,qBAAqB,CAAC;AAK7B,OAAO;AACP,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC"}
|
package/dist/init.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"AA0GA,wBAAsB,IAAI,CAAC,GAAG,GAAE,MAAsB,GAAG,OAAO,CAAC,IAAI,CAAC,CAcrE"}
|
package/dist/init.js
CHANGED
|
@@ -58,11 +58,16 @@ const ARGO_CONFIG = `export default {
|
|
|
58
58
|
demosDir: 'demos/',
|
|
59
59
|
outputDir: 'videos/',
|
|
60
60
|
tts: { defaultVoice: 'af_heart', defaultSpeed: 1.0 },
|
|
61
|
-
video: { width: 1920, height: 1080, fps: 30 },
|
|
61
|
+
video: { width: 1920, height: 1080, fps: 30, browser: 'chromium', deviceScaleFactor: 1 },
|
|
62
62
|
export: { preset: 'slow', crf: 16 },
|
|
63
63
|
};
|
|
64
64
|
`;
|
|
65
65
|
const PLAYWRIGHT_CONFIG = `import { defineConfig } from '@playwright/test';
|
|
66
|
+
import config from './argo.config.js';
|
|
67
|
+
|
|
68
|
+
const scale = Math.max(1, Math.round(config.video?.deviceScaleFactor ?? 1));
|
|
69
|
+
const width = config.video?.width ?? 1920;
|
|
70
|
+
const height = config.video?.height ?? 1080;
|
|
66
71
|
|
|
67
72
|
export default defineConfig({
|
|
68
73
|
preserveOutput: 'always',
|
|
@@ -72,11 +77,13 @@ export default defineConfig({
|
|
|
72
77
|
testDir: 'demos',
|
|
73
78
|
testMatch: '**/*.demo.ts',
|
|
74
79
|
use: {
|
|
75
|
-
|
|
76
|
-
|
|
80
|
+
browserName: config.video?.browser ?? 'chromium',
|
|
81
|
+
baseURL: process.env.BASE_URL || config.baseURL || 'http://localhost:3000',
|
|
82
|
+
viewport: { width, height },
|
|
83
|
+
deviceScaleFactor: scale,
|
|
77
84
|
video: {
|
|
78
85
|
mode: 'on',
|
|
79
|
-
size: { width:
|
|
86
|
+
size: { width: width * scale, height: height * scale },
|
|
80
87
|
},
|
|
81
88
|
},
|
|
82
89
|
},
|
package/dist/init.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,KAAK,UAAU,cAAc,CAAC,QAAgB,EAAE,OAAe;IAC7D,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,UAAU,QAAQ,mBAAmB,CAAC,CAAC;QACnD,OAAO,KAAK,CAAC;IACf,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,IAAI,GAAG,EAAE,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CAAC,iBAAiB,QAAQ,KAAK,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QAC/D,CAAC;QACD,MAAM,SAAS,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QAC5C,OAAO,CAAC,GAAG,CAAC,YAAY,QAAQ,EAAE,CAAC,CAAC;QACpC,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,YAAY,GAAG;;;;;;;;;;;;;;;;;CAiBpB,CAAC;AAEF,MAAM,iBAAiB,GAAG,IAAI,CAAC,SAAS,CACtC;IACE,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,8CAA8C,EAAE;IAC1E,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,yCAAyC,EAAE;IACpE,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,gCAAgC,EAAE,KAAK,EAAE,UAAU,EAAE;CAC7E,EACD,IAAI,EACJ,CAAC,CACF,GAAG,IAAI,CAAC;AAET,MAAM,gBAAgB,GAAG,IAAI,CAAC,SAAS,CACrC;IACE;QACE,KAAK,EAAE,SAAS;QAChB,IAAI,EAAE,aAAa;QACnB,IAAI,EAAE,oBAAoB;KAC3B;IACD;QACE,KAAK,EAAE,QAAQ;QACf,IAAI,EAAE,eAAe;QACrB,SAAS,EAAE,UAAU;QACrB,KAAK,EAAE,iBAAiB;QACxB,IAAI,EAAE,uCAAuC;QAC7C,MAAM,EAAE,UAAU;KACnB;CACF,EACD,IAAI,EACJ,CAAC,CACF,GAAG,IAAI,CAAC;AAET,MAAM,WAAW,GAAG;;;;;;;;CAQnB,CAAC;AAEF,MAAM,iBAAiB,GAAG
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"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"}
|
package/dist/narration.d.ts
CHANGED
|
@@ -1,9 +1,32 @@
|
|
|
1
|
+
export interface SceneDurationOptions {
|
|
2
|
+
leadInMs?: number;
|
|
3
|
+
leadOutMs?: number;
|
|
4
|
+
minMs?: number;
|
|
5
|
+
maxMs?: number;
|
|
6
|
+
multiplier?: number;
|
|
7
|
+
fallbackMs?: number;
|
|
8
|
+
}
|
|
1
9
|
export declare class NarrationTimeline {
|
|
2
10
|
private timings;
|
|
3
11
|
private startTime;
|
|
12
|
+
private sceneDurations;
|
|
13
|
+
private cachedPlacements;
|
|
14
|
+
constructor(sceneDurations?: Record<string, number>);
|
|
4
15
|
start(): void;
|
|
5
16
|
mark(scene: string): void;
|
|
6
17
|
getTimings(): Record<string, number>;
|
|
7
18
|
flush(outputPath: string): Promise<void>;
|
|
19
|
+
private getBaseDuration;
|
|
20
|
+
private getPlacements;
|
|
21
|
+
/**
|
|
22
|
+
* Compute a hold duration for a scene based on its TTS clip length.
|
|
23
|
+
* Use for overlay durations and passive reading time — not for
|
|
24
|
+
* page loads, click completion, or selector readiness.
|
|
25
|
+
*
|
|
26
|
+
* When the scene has already been marked, this returns the remaining wait
|
|
27
|
+
* from "now", not the full scene duration. It also accounts for any audio
|
|
28
|
+
* backlog caused by earlier clips running long.
|
|
29
|
+
*/
|
|
30
|
+
durationFor(scene: string, options?: SceneDurationOptions): number;
|
|
8
31
|
}
|
|
9
32
|
//# sourceMappingURL=narration.d.ts.map
|