screenci 0.0.10 → 0.0.12
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 +56 -56
- package/dist/Dockerfile +1 -2
- package/dist/cli.d.ts +22 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +1164 -423
- package/dist/cli.js.map +1 -1
- package/dist/e2e/instrument.e2e.js +12 -0
- package/dist/e2e/instrument.e2e.js.map +1 -1
- package/dist/index.d.ts +7 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/playwright.config.d.ts +1 -1
- package/dist/src/asset.d.ts +27 -67
- package/dist/src/asset.d.ts.map +1 -1
- package/dist/src/asset.js +44 -45
- package/dist/src/asset.js.map +1 -1
- package/dist/src/caption.d.ts +164 -54
- package/dist/src/caption.d.ts.map +1 -1
- package/dist/src/caption.js +304 -131
- package/dist/src/caption.js.map +1 -1
- package/dist/src/events.d.ts +67 -25
- package/dist/src/events.d.ts.map +1 -1
- package/dist/src/events.js +34 -18
- package/dist/src/events.js.map +1 -1
- package/dist/src/instrument.d.ts.map +1 -1
- package/dist/src/instrument.js +142 -35
- package/dist/src/instrument.js.map +1 -1
- package/dist/src/logger.d.ts.map +1 -1
- package/dist/src/logger.js +2 -1
- package/dist/src/logger.js.map +1 -1
- package/dist/src/recording.d.ts +1 -1
- package/dist/src/recording.d.ts.map +1 -1
- package/dist/src/recordingData.d.ts +145 -0
- package/dist/src/recordingData.d.ts.map +1 -0
- package/dist/src/recordingData.js +2 -0
- package/dist/src/recordingData.js.map +1 -0
- package/dist/src/types.d.ts +133 -66
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/video.d.ts.map +1 -1
- package/dist/src/video.js +28 -20
- package/dist/src/video.js.map +1 -1
- package/dist/src/voices.d.ts +344 -41
- package/dist/src/voices.d.ts.map +1 -1
- package/dist/src/voices.js +261 -30
- package/dist/src/voices.js.map +1 -1
- package/dist/test-fixtures/screenci.config.d.ts +5 -0
- package/dist/test-fixtures/screenci.config.d.ts.map +1 -0
- package/dist/test-fixtures/screenci.config.js +4 -0
- package/dist/test-fixtures/screenci.config.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +35 -5
- package/skills/playwright-cli/SKILL.md +348 -0
- package/skills/screenci/SKILL.md +56 -0
- package/skills/screenci/references/init.md +46 -0
- package/skills/screenci/references/record.md +43 -0
- package/dist/reporter.d.ts +0 -9
- package/dist/reporter.d.ts.map +0 -1
- package/dist/reporter.js +0 -49
- package/dist/reporter.js.map +0 -1
- package/dist/src/caption.test-d.d.ts +0 -2
- package/dist/src/caption.test-d.d.ts.map +0 -1
- package/dist/src/caption.test-d.js +0 -50
- package/dist/src/caption.test-d.js.map +0 -1
- package/dist/src/captionHash.d.ts +0 -12
- package/dist/src/captionHash.d.ts.map +0 -1
- package/dist/src/captionHash.js +0 -17
- package/dist/src/captionHash.js.map +0 -1
package/dist/src/caption.js
CHANGED
|
@@ -1,13 +1,10 @@
|
|
|
1
|
+
import { isCustomVoiceRef } from './voices.js';
|
|
1
2
|
import { isInsideHide } from './hide.js';
|
|
3
|
+
import { access, readFile } from 'fs/promises';
|
|
4
|
+
import { createHash } from 'crypto';
|
|
5
|
+
import { dirname, resolve } from 'path';
|
|
2
6
|
// One frame at 24fps — ensures at least one rendered frame captures each caption state.
|
|
3
7
|
export const ONE_FRAME_MS = 1000 / 24;
|
|
4
|
-
function parsePercentage(percent) {
|
|
5
|
-
const value = parseFloat(percent);
|
|
6
|
-
if (!isFinite(value) || value < 0 || value > 100) {
|
|
7
|
-
throw new Error(`Invalid percentage: "${percent}". Must be a finite number between 0 and 100 followed by %.`);
|
|
8
|
-
}
|
|
9
|
-
return value;
|
|
10
|
-
}
|
|
11
8
|
// Blocking sleep — spin until the elapsed time has passed
|
|
12
9
|
let sleepFn = (ms) => {
|
|
13
10
|
const end = performance.now() + ms;
|
|
@@ -20,146 +17,313 @@ export function setSleepFn(fn) {
|
|
|
20
17
|
}
|
|
21
18
|
let activeRecorder = null;
|
|
22
19
|
let captionStarted = false;
|
|
20
|
+
const registeredCustomVoiceRefs = new Set();
|
|
21
|
+
/** Maps local asset path → SHA-256 hash, populated during validateCustomVoiceRefs. */
|
|
22
|
+
const videoCaptionFileHashes = new Map();
|
|
23
23
|
export function setActiveCaptionRecorder(recorder) {
|
|
24
24
|
activeRecorder = recorder;
|
|
25
25
|
}
|
|
26
26
|
export function resetCaptionChain() {
|
|
27
27
|
captionStarted = false;
|
|
28
28
|
}
|
|
29
|
-
function
|
|
30
|
-
|
|
29
|
+
export function resetRegisteredCustomVoiceRefs() {
|
|
30
|
+
registeredCustomVoiceRefs.clear();
|
|
31
|
+
videoCaptionFileHashes.clear();
|
|
32
|
+
}
|
|
33
|
+
export async function validateCustomVoiceRefs(testFilePath) {
|
|
34
|
+
const testDir = dirname(testFilePath);
|
|
35
|
+
for (const ref of registeredCustomVoiceRefs) {
|
|
36
|
+
const candidates = [ref.path, resolve(testDir, ref.path)];
|
|
37
|
+
let fileBuffer = null;
|
|
38
|
+
for (const candidate of candidates) {
|
|
39
|
+
try {
|
|
40
|
+
await access(candidate);
|
|
41
|
+
fileBuffer = await readFile(candidate);
|
|
42
|
+
break;
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
// try next candidate
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
if (fileBuffer === null) {
|
|
49
|
+
throw new Error(`Custom voice file not found: ${ref.path}`);
|
|
50
|
+
}
|
|
51
|
+
;
|
|
52
|
+
ref.assetHash = createHash('sha256')
|
|
53
|
+
.update(fileBuffer)
|
|
54
|
+
.digest('hex');
|
|
55
|
+
}
|
|
56
|
+
for (const assetPath of videoCaptionFileHashes.keys()) {
|
|
57
|
+
const candidates = [assetPath, resolve(testDir, assetPath)];
|
|
58
|
+
let fileBuffer = null;
|
|
59
|
+
for (const candidate of candidates) {
|
|
60
|
+
try {
|
|
61
|
+
fileBuffer = await readFile(candidate);
|
|
62
|
+
break;
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
// try next candidate
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
if (fileBuffer === null) {
|
|
69
|
+
throw new Error(`Video caption asset file not found: ${assetPath}`);
|
|
70
|
+
}
|
|
71
|
+
videoCaptionFileHashes.set(assetPath, createHash('sha256').update(fileBuffer).digest('hex'));
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
function toRecordedVoice(voice) {
|
|
75
|
+
if (!isCustomVoiceRef(voice))
|
|
76
|
+
return voice;
|
|
77
|
+
if (!('assetHash' in voice) ||
|
|
78
|
+
typeof voice.assetHash !==
|
|
79
|
+
'string') {
|
|
80
|
+
throw new Error(`Custom voice assetHash missing for path: ${voice.path}`);
|
|
81
|
+
}
|
|
82
|
+
return {
|
|
83
|
+
assetHash: voice.assetHash,
|
|
84
|
+
assetPath: voice.path,
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Auto-ends any currently active caption before starting a new one.
|
|
89
|
+
* Called internally at the start of every voiceOver controller.
|
|
90
|
+
*/
|
|
91
|
+
function captionAutoEnd() {
|
|
92
|
+
if (!captionStarted || activeRecorder === null)
|
|
31
93
|
return;
|
|
32
|
-
|
|
33
|
-
throw new Error('Cannot call caption.waitEnd inside hide()');
|
|
34
|
-
if (!captionStarted)
|
|
35
|
-
throw new Error('No caption has been started');
|
|
36
|
-
activeRecorder.addCaptionEnd();
|
|
94
|
+
activeRecorder.addCaptionEnd('auto');
|
|
37
95
|
sleepFn(2 * ONE_FRAME_MS);
|
|
96
|
+
captionStarted = false;
|
|
38
97
|
}
|
|
39
|
-
function
|
|
40
|
-
if (activeRecorder === null)
|
|
98
|
+
async function doWaitEnd() {
|
|
99
|
+
if (activeRecorder === null || !captionStarted)
|
|
41
100
|
return;
|
|
42
101
|
if (isInsideHide())
|
|
43
|
-
throw new Error('Cannot call
|
|
44
|
-
|
|
45
|
-
throw new Error('No caption has been started');
|
|
46
|
-
const percentage = parsePercentage(percent);
|
|
47
|
-
activeRecorder.addCaptionUntil(percentage);
|
|
102
|
+
throw new Error('Cannot call waitEnd inside hide()');
|
|
103
|
+
activeRecorder.addCaptionEnd('waitEnd');
|
|
48
104
|
sleepFn(2 * ONE_FRAME_MS);
|
|
105
|
+
captionStarted = false;
|
|
49
106
|
}
|
|
50
107
|
/**
|
|
51
|
-
* Creates a set of typed
|
|
108
|
+
* Creates a set of typed voiceover controllers, one per key in the map.
|
|
109
|
+
*
|
|
110
|
+
* Each controller has `start()` and `end()`.
|
|
111
|
+
* At render time screenci generates a voiceover, and syncs the audio to the
|
|
112
|
+
* recording. You write text; the voice is handled for you.
|
|
52
113
|
*
|
|
53
|
-
*
|
|
54
|
-
*
|
|
55
|
-
*
|
|
56
|
-
* voice is handled for you.
|
|
114
|
+
* The top-level `voice` applies to all languages. Override it per-language via
|
|
115
|
+
* the `voice` field inside each language entry. Only language-level overrides
|
|
116
|
+
* may set `seed`.
|
|
57
117
|
*
|
|
58
118
|
* TypeScript enforces that every language has the same caption keys.
|
|
59
119
|
* Forget a translation key → compile error.
|
|
60
120
|
*
|
|
61
121
|
* @example
|
|
62
122
|
* ```ts
|
|
63
|
-
* const
|
|
64
|
-
*
|
|
65
|
-
*
|
|
123
|
+
* const voiceOvers = createVoiceOvers({
|
|
124
|
+
* voice: { name: voices.Ava, style: 'Clear and friendly' },
|
|
125
|
+
* languages: {
|
|
126
|
+
* en: { captions: { intro: 'Welcome.', next: 'Click here.' } },
|
|
127
|
+
* fi: {
|
|
128
|
+
* voice: { name: voices.Nora, style: 'Selkeä opastus', seed: 42 },
|
|
129
|
+
* captions: { intro: 'Tervetuloa.', next: 'Napsauta tästä.' },
|
|
130
|
+
* },
|
|
131
|
+
* },
|
|
66
132
|
* })
|
|
133
|
+
*
|
|
134
|
+
* // Await a voiceOver directly to start it:
|
|
135
|
+
* await voiceOvers.intro
|
|
136
|
+
* await page.goto('/dashboard')
|
|
137
|
+
*
|
|
138
|
+
* // Consecutive voiceOvers sequence automatically:
|
|
139
|
+
* await voiceOvers.intro
|
|
140
|
+
* await voiceOvers.next // ends intro, then starts next
|
|
141
|
+
*
|
|
142
|
+
* // Wait for audio to finish before an action:
|
|
143
|
+
* await voiceOvers.intro
|
|
144
|
+
* await voiceOvers.waitEnd()
|
|
145
|
+
* await page.click('#start')
|
|
67
146
|
* ```
|
|
68
147
|
*/
|
|
69
|
-
export function
|
|
70
|
-
return
|
|
148
|
+
export function createVoiceOvers(input) {
|
|
149
|
+
return buildCaptionsFromInput(input.voice, input.languages);
|
|
71
150
|
}
|
|
72
|
-
function
|
|
73
|
-
|
|
151
|
+
function voiceToKeyString(voice) {
|
|
152
|
+
if (isCustomVoiceRef(voice))
|
|
153
|
+
return `custom:${voice.path}`;
|
|
154
|
+
return voice;
|
|
155
|
+
}
|
|
156
|
+
function buildCaptionsFromInput(topVoice, languages) {
|
|
157
|
+
const langs = Object.keys(languages);
|
|
74
158
|
const firstLang = langs[0];
|
|
75
|
-
if (firstLang === undefined)
|
|
159
|
+
if (firstLang === undefined) {
|
|
160
|
+
throw new Error('createVoiceOvers requires at least one language in "languages"');
|
|
161
|
+
}
|
|
162
|
+
// Resolve effective voice and metadata per language
|
|
163
|
+
const resolvedVoices = new Map();
|
|
164
|
+
const resolvedVoiceMeta = new Map();
|
|
165
|
+
for (const lang of langs) {
|
|
166
|
+
const entry = languages[lang];
|
|
167
|
+
const langOverride = entry?.voice;
|
|
168
|
+
const effectiveVoiceName = langOverride?.name ?? topVoice.name;
|
|
169
|
+
const effectiveSeed = langOverride?.seed;
|
|
170
|
+
const effectiveRegion = entry?.region;
|
|
171
|
+
// If a lang override exists it owns style/accent/pacing entirely — no inheritance from the
|
|
172
|
+
// top-level voice. This prevents a top-level `style` from forcing `expressive` on a lang
|
|
173
|
+
// that explicitly sets `modelType: 'consistent'`.
|
|
174
|
+
const effectiveStyle = langOverride !== undefined
|
|
175
|
+
? langOverride?.style
|
|
176
|
+
: 'style' in topVoice
|
|
177
|
+
? topVoice.style
|
|
178
|
+
: undefined;
|
|
179
|
+
const effectiveAccent = langOverride !== undefined
|
|
180
|
+
? langOverride?.accent
|
|
181
|
+
: 'accent' in topVoice
|
|
182
|
+
? topVoice.accent
|
|
183
|
+
: undefined;
|
|
184
|
+
const effectivePacing = langOverride !== undefined
|
|
185
|
+
? langOverride?.pacing
|
|
186
|
+
: 'pacing' in topVoice
|
|
187
|
+
? topVoice.pacing
|
|
188
|
+
: undefined;
|
|
189
|
+
const effectiveModelType = effectiveStyle
|
|
190
|
+
? 'expressive'
|
|
191
|
+
: (langOverride?.modelType ?? topVoice.modelType);
|
|
192
|
+
if (isCustomVoiceRef(effectiveVoiceName)) {
|
|
193
|
+
registeredCustomVoiceRefs.add(effectiveVoiceName);
|
|
194
|
+
}
|
|
195
|
+
resolvedVoices.set(lang, effectiveVoiceName);
|
|
196
|
+
resolvedVoiceMeta.set(lang, {
|
|
197
|
+
name: voiceToKeyString(effectiveVoiceName),
|
|
198
|
+
...(effectiveSeed !== undefined && { seed: effectiveSeed }),
|
|
199
|
+
...(effectiveRegion !== undefined && { region: effectiveRegion }),
|
|
200
|
+
...(effectiveModelType !== undefined && {
|
|
201
|
+
modelType: effectiveModelType,
|
|
202
|
+
}),
|
|
203
|
+
...(effectiveStyle !== undefined && { style: effectiveStyle }),
|
|
204
|
+
...(effectiveAccent !== undefined && { accent: effectiveAccent }),
|
|
205
|
+
...(effectivePacing !== undefined && { pacing: effectivePacing }),
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
const firstEntry = languages[firstLang];
|
|
209
|
+
if (!firstEntry)
|
|
76
210
|
return {};
|
|
77
211
|
const result = {};
|
|
78
|
-
for (const key in
|
|
212
|
+
for (const key in firstEntry.captions) {
|
|
79
213
|
const keyStr = key;
|
|
80
214
|
// Determine if any language uses a file-based value for this key.
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
215
|
+
let hasFileEntry = false;
|
|
216
|
+
for (const lang of langs) {
|
|
217
|
+
const val = languages[lang]?.captions[keyStr];
|
|
218
|
+
if (val !== undefined && typeof val !== 'string') {
|
|
219
|
+
hasFileEntry = true;
|
|
220
|
+
videoCaptionFileHashes.set(val.path, '');
|
|
221
|
+
}
|
|
222
|
+
}
|
|
87
223
|
if (hasFileEntry) {
|
|
88
|
-
const
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
if (
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
voice: languagesMap[lang].voice,
|
|
97
|
-
};
|
|
224
|
+
const fileStartFn = async () => {
|
|
225
|
+
if (isInsideHide())
|
|
226
|
+
throw new Error('Cannot start a voiceOver inside hide()');
|
|
227
|
+
if (activeRecorder === null)
|
|
228
|
+
return;
|
|
229
|
+
captionAutoEnd();
|
|
230
|
+
for (const lang of langs) {
|
|
231
|
+
activeRecorder.registerVoiceForLang(lang, resolvedVoiceMeta.get(lang));
|
|
98
232
|
}
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
233
|
+
const videoTranslations = {};
|
|
234
|
+
for (const lang of langs) {
|
|
235
|
+
const val = languages[lang]?.captions[keyStr];
|
|
236
|
+
if (val === undefined)
|
|
237
|
+
continue;
|
|
238
|
+
const voice = resolvedVoices.get(lang);
|
|
239
|
+
const region = languages[lang]?.region;
|
|
240
|
+
const meta = resolvedVoiceMeta.get(lang);
|
|
241
|
+
const modelType = meta?.modelType;
|
|
242
|
+
const style = meta?.style;
|
|
243
|
+
const accent = meta?.accent;
|
|
244
|
+
const pacing = meta?.pacing;
|
|
245
|
+
if (typeof val === 'string') {
|
|
246
|
+
videoTranslations[lang] = {
|
|
247
|
+
text: val,
|
|
248
|
+
voice: toRecordedVoice(voice),
|
|
249
|
+
...(region !== undefined && { region }),
|
|
250
|
+
...(modelType !== undefined && { modelType }),
|
|
251
|
+
...(style !== undefined && { style }),
|
|
252
|
+
...(accent !== undefined && { accent }),
|
|
253
|
+
...(pacing !== undefined && { pacing }),
|
|
254
|
+
};
|
|
255
|
+
}
|
|
256
|
+
else {
|
|
257
|
+
videoTranslations[lang] = entryToVideoTranslation(val);
|
|
258
|
+
}
|
|
105
259
|
}
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
captionStarted = true;
|
|
114
|
-
sleepFn(2 * ONE_FRAME_MS);
|
|
115
|
-
activeRecorder.addVideoCaptionStart(keyStr, undefined, undefined, videoTranslations);
|
|
116
|
-
},
|
|
117
|
-
async waitUntil(progress) {
|
|
118
|
-
captionWaitUntil(progress);
|
|
119
|
-
},
|
|
120
|
-
async end() {
|
|
121
|
-
captionWaitEnd();
|
|
260
|
+
captionStarted = true;
|
|
261
|
+
sleepFn(2 * ONE_FRAME_MS);
|
|
262
|
+
activeRecorder.addVideoCaptionStart(keyStr, undefined, undefined, undefined, videoTranslations);
|
|
263
|
+
};
|
|
264
|
+
result[keyStr] = {
|
|
265
|
+
then(resolve, reject) {
|
|
266
|
+
return fileStartFn().then(resolve, reject);
|
|
122
267
|
},
|
|
123
268
|
};
|
|
124
269
|
}
|
|
125
270
|
else {
|
|
126
|
-
const
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
if (
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
271
|
+
const textStartFn = async () => {
|
|
272
|
+
if (isInsideHide())
|
|
273
|
+
throw new Error('Cannot start a voiceOver inside hide()');
|
|
274
|
+
if (activeRecorder === null)
|
|
275
|
+
return;
|
|
276
|
+
captionAutoEnd();
|
|
277
|
+
for (const lang of langs) {
|
|
278
|
+
activeRecorder.registerVoiceForLang(lang, resolvedVoiceMeta.get(lang));
|
|
134
279
|
}
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
if (
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
280
|
+
const textTranslations = {};
|
|
281
|
+
for (const lang of langs) {
|
|
282
|
+
const val = languages[lang]?.captions[keyStr];
|
|
283
|
+
if (val !== undefined && typeof val === 'string') {
|
|
284
|
+
const voice = resolvedVoices.get(lang);
|
|
285
|
+
const region = languages[lang]?.region;
|
|
286
|
+
const meta = resolvedVoiceMeta.get(lang);
|
|
287
|
+
const modelType = meta?.modelType;
|
|
288
|
+
const style = meta?.style;
|
|
289
|
+
const accent = meta?.accent;
|
|
290
|
+
const pacing = meta?.pacing;
|
|
291
|
+
textTranslations[lang] = {
|
|
292
|
+
text: val,
|
|
293
|
+
voice: toRecordedVoice(voice),
|
|
294
|
+
...(region !== undefined && { region }),
|
|
295
|
+
...(modelType !== undefined && { modelType }),
|
|
296
|
+
...(style !== undefined && { style }),
|
|
297
|
+
...(accent !== undefined && { accent }),
|
|
298
|
+
...(pacing !== undefined && { pacing }),
|
|
299
|
+
};
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
captionStarted = true;
|
|
303
|
+
sleepFn(2 * ONE_FRAME_MS);
|
|
304
|
+
activeRecorder.addCaptionStart('', keyStr, undefined, textTranslations);
|
|
305
|
+
};
|
|
306
|
+
result[keyStr] = {
|
|
307
|
+
then(resolve, reject) {
|
|
308
|
+
return textStartFn().then(resolve, reject);
|
|
151
309
|
},
|
|
152
310
|
};
|
|
153
311
|
}
|
|
154
312
|
}
|
|
313
|
+
;
|
|
314
|
+
result.waitEnd = doWaitEnd;
|
|
155
315
|
return result;
|
|
156
316
|
}
|
|
157
317
|
function entryToVideoTranslation(entry) {
|
|
158
|
-
|
|
159
|
-
|
|
318
|
+
const path = typeof entry === 'string' ? entry : entry.path;
|
|
319
|
+
const subtitle = typeof entry === 'string' ? undefined : entry.subtitle;
|
|
320
|
+
const assetHash = videoCaptionFileHashes.get(path);
|
|
321
|
+
if (!assetHash)
|
|
322
|
+
throw new Error(`Video caption asset hash missing for path: ${path}`);
|
|
160
323
|
return {
|
|
161
|
-
|
|
162
|
-
|
|
324
|
+
assetHash,
|
|
325
|
+
assetPath: path,
|
|
326
|
+
...(subtitle !== undefined && { subtitle }),
|
|
163
327
|
};
|
|
164
328
|
}
|
|
165
329
|
export function createVideoCaptions(firstArg) {
|
|
@@ -182,31 +346,38 @@ function buildSingleLangVideoCaptions(captionsMap) {
|
|
|
182
346
|
continue;
|
|
183
347
|
const assetPath = typeof entry === 'string' ? entry : entry.path;
|
|
184
348
|
const subtitle = typeof entry === 'string' ? undefined : entry.subtitle;
|
|
349
|
+
videoCaptionFileHashes.set(assetPath, '');
|
|
350
|
+
const startFn = async () => {
|
|
351
|
+
if (isInsideHide())
|
|
352
|
+
throw new Error('Cannot start a voiceOver inside hide()');
|
|
353
|
+
if (activeRecorder === null)
|
|
354
|
+
return;
|
|
355
|
+
captionAutoEnd();
|
|
356
|
+
const assetHash = videoCaptionFileHashes.get(assetPath);
|
|
357
|
+
if (!assetHash)
|
|
358
|
+
throw new Error(`Video caption asset hash missing for path: ${assetPath}`);
|
|
359
|
+
captionStarted = true;
|
|
360
|
+
sleepFn(2 * ONE_FRAME_MS);
|
|
361
|
+
activeRecorder.addVideoCaptionStart(key, assetPath, assetHash, subtitle);
|
|
362
|
+
};
|
|
185
363
|
result[key] = {
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
return;
|
|
189
|
-
if (isInsideHide())
|
|
190
|
-
throw new Error('Cannot call videoCaption.start inside hide()');
|
|
191
|
-
captionStarted = true;
|
|
192
|
-
sleepFn(2 * ONE_FRAME_MS);
|
|
193
|
-
activeRecorder.addVideoCaptionStart(key, assetPath, subtitle);
|
|
194
|
-
},
|
|
195
|
-
async waitUntil(progress) {
|
|
196
|
-
captionWaitUntil(progress);
|
|
197
|
-
},
|
|
198
|
-
async end() {
|
|
199
|
-
captionWaitEnd();
|
|
364
|
+
then(resolve, reject) {
|
|
365
|
+
return startFn().then(resolve, reject);
|
|
200
366
|
},
|
|
201
367
|
};
|
|
202
368
|
}
|
|
369
|
+
;
|
|
370
|
+
result.waitEnd = doWaitEnd;
|
|
203
371
|
return result;
|
|
204
372
|
}
|
|
205
373
|
function buildMultiLangVideoCaptions(languagesMap) {
|
|
206
374
|
const langs = Object.keys(languagesMap);
|
|
207
375
|
const firstLang = langs[0];
|
|
208
|
-
if (firstLang === undefined)
|
|
209
|
-
|
|
376
|
+
if (firstLang === undefined) {
|
|
377
|
+
const empty = {};
|
|
378
|
+
empty.waitEnd = doWaitEnd;
|
|
379
|
+
return empty;
|
|
380
|
+
}
|
|
210
381
|
const result = {};
|
|
211
382
|
for (const key in languagesMap[firstLang].captions) {
|
|
212
383
|
const keyStr = key;
|
|
@@ -214,27 +385,29 @@ function buildMultiLangVideoCaptions(languagesMap) {
|
|
|
214
385
|
for (const lang of langs) {
|
|
215
386
|
const entry = languagesMap[lang].captions[keyStr];
|
|
216
387
|
if (entry !== undefined) {
|
|
388
|
+
const assetPath = typeof entry === 'string' ? entry : entry.path;
|
|
389
|
+
videoCaptionFileHashes.set(assetPath, '');
|
|
217
390
|
translations[lang] = entryToVideoTranslation(entry);
|
|
218
391
|
}
|
|
219
392
|
}
|
|
393
|
+
const startFn = async () => {
|
|
394
|
+
if (isInsideHide())
|
|
395
|
+
throw new Error('Cannot start a voiceOver inside hide()');
|
|
396
|
+
if (activeRecorder === null)
|
|
397
|
+
return;
|
|
398
|
+
captionAutoEnd();
|
|
399
|
+
captionStarted = true;
|
|
400
|
+
sleepFn(2 * ONE_FRAME_MS);
|
|
401
|
+
activeRecorder.addVideoCaptionStart(keyStr, undefined, undefined, undefined, translations);
|
|
402
|
+
};
|
|
220
403
|
result[key] = {
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
return;
|
|
224
|
-
if (isInsideHide())
|
|
225
|
-
throw new Error('Cannot call videoCaption.start inside hide()');
|
|
226
|
-
captionStarted = true;
|
|
227
|
-
sleepFn(2 * ONE_FRAME_MS);
|
|
228
|
-
activeRecorder.addVideoCaptionStart(keyStr, undefined, undefined, translations);
|
|
229
|
-
},
|
|
230
|
-
async waitUntil(progress) {
|
|
231
|
-
captionWaitUntil(progress);
|
|
232
|
-
},
|
|
233
|
-
async end() {
|
|
234
|
-
captionWaitEnd();
|
|
404
|
+
then(resolve, reject) {
|
|
405
|
+
return startFn().then(resolve, reject);
|
|
235
406
|
},
|
|
236
407
|
};
|
|
237
408
|
}
|
|
409
|
+
;
|
|
410
|
+
result.waitEnd = doWaitEnd;
|
|
238
411
|
return result;
|
|
239
412
|
}
|
|
240
413
|
//# sourceMappingURL=caption.js.map
|
package/dist/src/caption.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"caption.js","sourceRoot":"","sources":["../../src/caption.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAExC,wFAAwF;AACxF,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,GAAG,EAAE,CAAA;AAKrC,SAAS,eAAe,CAAC,OAAmB;IAC1C,MAAM,KAAK,GAAG,UAAU,CAAC,OAAO,CAAC,CAAA;IACjC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,GAAG,EAAE,CAAC;QACjD,MAAM,IAAI,KAAK,CACb,wBAAwB,OAAO,6DAA6D,CAC7F,CAAA;IACH,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC;AAED,0DAA0D;AAC1D,IAAI,OAAO,GAAG,CAAC,EAAU,EAAQ,EAAE;IACjC,MAAM,GAAG,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,CAAA;IAClC,OAAO,WAAW,CAAC,GAAG,EAAE,GAAG,GAAG,EAAE,CAAC;QAC/B,UAAU;IACZ,CAAC;AACH,CAAC,CAAA;AAED,MAAM,UAAU,UAAU,CAAC,EAAwB;IACjD,OAAO,GAAG,EAAE,CAAA;AACd,CAAC;AAED,IAAI,cAAc,GAA0B,IAAI,CAAA;AAChD,IAAI,cAAc,GAAG,KAAK,CAAA;AAE1B,MAAM,UAAU,wBAAwB,CACtC,QAA+B;IAE/B,cAAc,GAAG,QAAQ,CAAA;AAC3B,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,cAAc,GAAG,KAAK,CAAA;AACxB,CAAC;AAED,SAAS,cAAc;IACrB,IAAI,cAAc,KAAK,IAAI;QAAE,OAAM;IACnC,IAAI,YAAY,EAAE;QAChB,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAA;IAC9D,IAAI,CAAC,cAAc;QAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAA;IACnE,cAAc,CAAC,aAAa,EAAE,CAAA;IAC9B,OAAO,CAAC,CAAC,GAAG,YAAY,CAAC,CAAA;AAC3B,CAAC;AAED,SAAS,gBAAgB,CAAC,OAAmB;IAC3C,IAAI,cAAc,KAAK,IAAI;QAAE,OAAM;IACnC,IAAI,YAAY,EAAE;QAChB,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAA;IAChE,IAAI,CAAC,cAAc;QAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAA;IACnE,MAAM,UAAU,GAAG,eAAe,CAAC,OAAO,CAAC,CAAA;IAC3C,cAAc,CAAC,eAAe,CAAC,UAAU,CAAC,CAAA;IAC1C,OAAO,CAAC,CAAC,GAAG,YAAY,CAAC,CAAA;AAC3B,CAAC;AAgFD;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,cAAc,CAK5B,YAKC;IAED,OAAO,sBAAsB,CAC3B,YAGC,CAC0B,CAAA;AAC/B,CAAC;AAED,SAAS,sBAAsB,CAG7B,YAAgC;IAChC,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,CAAQ,CAAA;IAC9C,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;IAC1B,IAAI,SAAS,KAAK,SAAS;QAAE,OAAO,EAAiB,CAAA;IAErD,MAAM,MAAM,GAAG,EAAiB,CAAA;IAEhC,KAAK,MAAM,GAAG,IAAI,YAAY,CAAC,SAAS,CAAC,CAAC,QAAQ,EAAE,CAAC;QACnD,MAAM,MAAM,GAAG,GAAa,CAAA;QAE5B,kEAAkE;QAClE,+EAA+E;QAC/E,0EAA0E;QAC1E,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;YACvC,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;YAC/C,OAAO,GAAG,KAAK,SAAS,IAAI,OAAO,GAAG,KAAK,QAAQ,CAAA;QACrD,CAAC,CAAC,CAAA;QAEF,IAAI,YAAY,EAAE,CAAC;YACjB,MAAM,iBAAiB,GAA4C,EAAE,CAAA;YACrE,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;gBAC/C,IAAI,GAAG,KAAK,SAAS;oBAAE,SAAQ;gBAC/B,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;oBAC5B,iBAAiB,CAAC,IAAI,CAAC,GAAG;wBACxB,IAAI,EAAE,GAAG;wBACT,KAAK,EAAE,YAAY,CAAC,IAAI,CAAC,CAAC,KAAiB;qBAC5C,CAAA;gBACH,CAAC;qBAAM,CAAC;oBACN,MAAM,SAAS,GAAgC;wBAC7C,SAAS,EAAE,GAAG,CAAC,IAAI;wBACnB,GAAG,CAAC,GAAG,CAAC,QAAQ,KAAK,SAAS,IAAI,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,CAAC;qBAC9D,CAAA;oBACD,iBAAiB,CAAC,IAAI,CAAC,GAAG,SAAS,CAAA;gBACrC,CAAC;YACH,CAAC;YACD,MAAM,CAAC,GAAc,CAAC,GAAG;gBACvB,KAAK,CAAC,KAAK;oBACT,IAAI,cAAc,KAAK,IAAI;wBAAE,OAAM;oBACnC,IAAI,YAAY,EAAE;wBAChB,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAA;oBAC5D,cAAc,GAAG,IAAI,CAAA;oBACrB,OAAO,CAAC,CAAC,GAAG,YAAY,CAAC,CAAA;oBACzB,cAAc,CAAC,oBAAoB,CACjC,MAAM,EACN,SAAS,EACT,SAAS,EACT,iBAAiB,CAClB,CAAA;gBACH,CAAC;gBACD,KAAK,CAAC,SAAS,CAAC,QAAgB;oBAC9B,gBAAgB,CAAC,QAAsB,CAAC,CAAA;gBAC1C,CAAC;gBACD,KAAK,CAAC,GAAG;oBACP,cAAc,EAAE,CAAA;gBAClB,CAAC;aACF,CAAA;QACH,CAAC;aAAM,CAAC;YACN,MAAM,gBAAgB,GAAuC,EAAE,CAAA;YAC/D,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;gBAC/C,IAAI,GAAG,KAAK,SAAS,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;oBACjD,gBAAgB,CAAC,IAAI,CAAC,GAAG;wBACvB,IAAI,EAAE,GAAG;wBACT,KAAK,EAAE,YAAY,CAAC,IAAI,CAAC,CAAC,KAAiB;qBAC5C,CAAA;gBACH,CAAC;YACH,CAAC;YACD,MAAM,CAAC,GAAc,CAAC,GAAG;gBACvB,KAAK,CAAC,KAAK;oBACT,IAAI,cAAc,KAAK,IAAI;wBAAE,OAAM;oBACnC,IAAI,YAAY,EAAE;wBAChB,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAA;oBAC5D,cAAc,GAAG,IAAI,CAAA;oBACrB,OAAO,CAAC,CAAC,GAAG,YAAY,CAAC,CAAA;oBACzB,cAAc,CAAC,eAAe,CAC5B,EAAE,EACF,MAAM,EACN,SAAS,EACT,gBAAgB,CACjB,CAAA;gBACH,CAAC;gBACD,KAAK,CAAC,SAAS,CAAC,QAAgB;oBAC9B,gBAAgB,CAAC,QAAsB,CAAC,CAAA;gBAC1C,CAAC;gBACD,KAAK,CAAC,GAAG;oBACP,cAAc,EAAE,CAAA;gBAClB,CAAC;aACF,CAAA;QACH,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC;AAqBD,SAAS,uBAAuB,CAC9B,KAAwB;IAExB,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAA;IAC1D,OAAO;QACL,SAAS,EAAE,KAAK,CAAC,IAAI;QACrB,GAAG,CAAC,KAAK,CAAC,QAAQ,KAAK,SAAS,IAAI,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC;KAClE,CAAA;AACH,CAAC;AA8CD,MAAM,UAAU,mBAAmB,CAGjC,QAA4C;IAC5C,8FAA8F;IAC9F,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAA;IAC7C,IACE,UAAU,KAAK,SAAS;QACxB,OAAO,UAAU,KAAK,QAAQ;QAC9B,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC;QAC1B,UAAU,IAAI,UAAU;QACxB,OAAQ,UAAsC,CAAC,QAAQ,KAAK,QAAQ,EACpE,CAAC;QACD,OAAO,2BAA2B,CAChC,QAA0C,CAC3C,CAAA;IACH,CAAC;IACD,OAAO,4BAA4B,CAAC,QAAa,CAAC,CAAA;AACpD,CAAC;AAED,SAAS,4BAA4B,CAEnC,WAAc;IACd,MAAM,MAAM,GAAG,EAAsB,CAAA;IAErC,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;QAC9B,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,CAAA;QAC9B,IAAI,KAAK,KAAK,SAAS;YAAE,SAAQ;QACjC,MAAM,SAAS,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAA;QAChE,MAAM,QAAQ,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAA;QAEvE,MAAM,CAAC,GAAG,CAAC,GAAG;YACZ,KAAK,CAAC,KAAK;gBACT,IAAI,cAAc,KAAK,IAAI;oBAAE,OAAM;gBACnC,IAAI,YAAY,EAAE;oBAChB,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAA;gBACjE,cAAc,GAAG,IAAI,CAAA;gBACrB,OAAO,CAAC,CAAC,GAAG,YAAY,CAAC,CAAA;gBACzB,cAAc,CAAC,oBAAoB,CAAC,GAAG,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAA;YAC/D,CAAC;YACD,KAAK,CAAC,SAAS,CAAC,QAAgB;gBAC9B,gBAAgB,CAAC,QAAsB,CAAC,CAAA;YAC1C,CAAC;YACD,KAAK,CAAC,GAAG;gBACP,cAAc,EAAE,CAAA;YAClB,CAAC;SACF,CAAA;IACH,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC;AAED,SAAS,2BAA2B,CAGlC,YAA4C;IAC5C,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,CAAQ,CAAA;IAC9C,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;IAC1B,IAAI,SAAS,KAAK,SAAS;QAAE,OAAO,EAAsB,CAAA;IAE1D,MAAM,MAAM,GAAG,EAAsB,CAAA;IAErC,KAAK,MAAM,GAAG,IAAI,YAAY,CAAC,SAAS,CAAC,CAAC,QAAQ,EAAE,CAAC;QACnD,MAAM,MAAM,GAAG,GAAa,CAAA;QAE5B,MAAM,YAAY,GAA4C,EAAE,CAAA;QAChE,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;YACjD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACxB,YAAY,CAAC,IAAI,CAAC,GAAG,uBAAuB,CAAC,KAAK,CAAC,CAAA;YACrD,CAAC;QACH,CAAC;QAED,MAAM,CAAC,GAAc,CAAC,GAAG;YACvB,KAAK,CAAC,KAAK;gBACT,IAAI,cAAc,KAAK,IAAI;oBAAE,OAAM;gBACnC,IAAI,YAAY,EAAE;oBAChB,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAA;gBACjE,cAAc,GAAG,IAAI,CAAA;gBACrB,OAAO,CAAC,CAAC,GAAG,YAAY,CAAC,CAAA;gBACzB,cAAc,CAAC,oBAAoB,CACjC,MAAM,EACN,SAAS,EACT,SAAS,EACT,YAAY,CACb,CAAA;YACH,CAAC;YACD,KAAK,CAAC,SAAS,CAAC,QAAgB;gBAC9B,gBAAgB,CAAC,QAAsB,CAAC,CAAA;YAC1C,CAAC;YACD,KAAK,CAAC,GAAG;gBACP,cAAc,EAAE,CAAA;YAClB,CAAC;SACF,CAAA;IACH,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC"}
|
|
1
|
+
{"version":3,"file":"caption.js","sourceRoot":"","sources":["../../src/caption.ts"],"names":[],"mappings":"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"}
|