screenci 0.0.68 → 0.0.70

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.
Files changed (161) hide show
  1. package/README.md +45 -122
  2. package/dist/cli.d.ts +3 -18
  3. package/dist/cli.d.ts.map +1 -1
  4. package/dist/cli.js +117 -158
  5. package/dist/cli.js.map +1 -1
  6. package/dist/docs/manifest.d.ts +66 -35
  7. package/dist/docs/manifest.d.ts.map +1 -1
  8. package/dist/docs/manifest.js +22 -11
  9. package/dist/docs/manifest.js.map +1 -1
  10. package/dist/docs/video-sources/cli.screenci.d.ts +2 -0
  11. package/dist/docs/video-sources/cli.screenci.d.ts.map +1 -0
  12. package/dist/docs/video-sources/{cli.video.js → cli.screenci.js} +1 -1
  13. package/dist/docs/video-sources/cli.screenci.js.map +1 -0
  14. package/dist/docs/video-sources/installation.screenci.d.ts +2 -0
  15. package/dist/docs/video-sources/installation.screenci.d.ts.map +1 -0
  16. package/dist/docs/video-sources/{installation.video.js → installation.screenci.js} +1 -1
  17. package/dist/docs/video-sources/installation.screenci.js.map +1 -0
  18. package/dist/docs/video-sources/landing.screenci.d.ts +2 -0
  19. package/dist/docs/video-sources/landing.screenci.d.ts.map +1 -0
  20. package/dist/docs/video-sources/{landing.video.js → landing.screenci.js} +1 -1
  21. package/dist/docs/video-sources/landing.screenci.js.map +1 -0
  22. package/dist/docs/video-sources/locator-highlight-animated.screenci.d.ts +2 -0
  23. package/dist/docs/video-sources/locator-highlight-animated.screenci.d.ts.map +1 -0
  24. package/dist/docs/video-sources/locator-highlight-animated.screenci.js +53 -0
  25. package/dist/docs/video-sources/locator-highlight-animated.screenci.js.map +1 -0
  26. package/dist/docs/video-sources/locator-highlight-still.screenci.d.ts +2 -0
  27. package/dist/docs/video-sources/locator-highlight-still.screenci.d.ts.map +1 -0
  28. package/dist/docs/video-sources/locator-highlight-still.screenci.js +24 -0
  29. package/dist/docs/video-sources/locator-highlight-still.screenci.js.map +1 -0
  30. package/dist/docs/video-sources/product-pitch.screenci.d.ts +2 -0
  31. package/dist/docs/video-sources/product-pitch.screenci.d.ts.map +1 -0
  32. package/dist/docs/video-sources/product-pitch.screenci.js +136 -0
  33. package/dist/docs/video-sources/product-pitch.screenci.js.map +1 -0
  34. package/dist/docs/video-sources/public-urls.screenci.d.ts +2 -0
  35. package/dist/docs/video-sources/public-urls.screenci.d.ts.map +1 -0
  36. package/dist/docs/video-sources/public-urls.screenci.js +34 -0
  37. package/dist/docs/video-sources/public-urls.screenci.js.map +1 -0
  38. package/dist/docs/video-sources/studio.screenci.d.ts +2 -0
  39. package/dist/docs/video-sources/studio.screenci.d.ts.map +1 -0
  40. package/dist/docs/video-sources/studio.screenci.js +57 -0
  41. package/dist/docs/video-sources/studio.screenci.js.map +1 -0
  42. package/dist/docs/videos.d.ts +36 -15
  43. package/dist/docs/videos.d.ts.map +1 -1
  44. package/dist/docs/videos.js +27 -2
  45. package/dist/docs/videos.js.map +1 -1
  46. package/dist/e2e/htmlRasterizer.e2e.d.ts +2 -0
  47. package/dist/e2e/htmlRasterizer.e2e.d.ts.map +1 -0
  48. package/dist/e2e/htmlRasterizer.e2e.js +107 -0
  49. package/dist/e2e/htmlRasterizer.e2e.js.map +1 -0
  50. package/dist/e2e/screenshot.e2e.d.ts +2 -0
  51. package/dist/e2e/screenshot.e2e.d.ts.map +1 -0
  52. package/dist/e2e/screenshot.e2e.js +73 -0
  53. package/dist/e2e/screenshot.e2e.js.map +1 -0
  54. package/dist/index.d.ts +10 -4
  55. package/dist/index.d.ts.map +1 -1
  56. package/dist/index.js +5 -2
  57. package/dist/index.js.map +1 -1
  58. package/dist/src/asset.d.ts +245 -53
  59. package/dist/src/asset.d.ts.map +1 -1
  60. package/dist/src/asset.js +718 -77
  61. package/dist/src/asset.js.map +1 -1
  62. package/dist/src/audio.d.ts +127 -0
  63. package/dist/src/audio.d.ts.map +1 -0
  64. package/dist/src/audio.js +207 -0
  65. package/dist/src/audio.js.map +1 -0
  66. package/dist/src/config.d.ts.map +1 -1
  67. package/dist/src/config.js +9 -3
  68. package/dist/src/config.js.map +1 -1
  69. package/dist/src/contextOptions.d.ts +48 -0
  70. package/dist/src/contextOptions.d.ts.map +1 -0
  71. package/dist/src/contextOptions.js +71 -0
  72. package/dist/src/contextOptions.js.map +1 -0
  73. package/dist/src/crop.d.ts +93 -0
  74. package/dist/src/crop.d.ts.map +1 -0
  75. package/dist/src/crop.js +133 -0
  76. package/dist/src/crop.js.map +1 -0
  77. package/dist/src/cue.d.ts +17 -4
  78. package/dist/src/cue.d.ts.map +1 -1
  79. package/dist/src/cue.js +31 -3
  80. package/dist/src/cue.js.map +1 -1
  81. package/dist/src/defaults.d.ts +13 -1
  82. package/dist/src/defaults.d.ts.map +1 -1
  83. package/dist/src/defaults.js +13 -0
  84. package/dist/src/defaults.js.map +1 -1
  85. package/dist/src/dimensions.d.ts +6 -0
  86. package/dist/src/dimensions.d.ts.map +1 -1
  87. package/dist/src/dimensions.js +15 -0
  88. package/dist/src/dimensions.js.map +1 -1
  89. package/dist/src/events.d.ts +283 -13
  90. package/dist/src/events.d.ts.map +1 -1
  91. package/dist/src/events.js +134 -5
  92. package/dist/src/events.js.map +1 -1
  93. package/dist/src/htmlRasterizer.d.ts +153 -0
  94. package/dist/src/htmlRasterizer.d.ts.map +1 -0
  95. package/dist/src/htmlRasterizer.js +386 -0
  96. package/dist/src/htmlRasterizer.js.map +1 -0
  97. package/dist/src/init.d.ts +17 -0
  98. package/dist/src/init.d.ts.map +1 -1
  99. package/dist/src/init.js +131 -11
  100. package/dist/src/init.js.map +1 -1
  101. package/dist/src/linkSession.d.ts +36 -0
  102. package/dist/src/linkSession.d.ts.map +1 -0
  103. package/dist/src/linkSession.js +122 -0
  104. package/dist/src/linkSession.js.map +1 -0
  105. package/dist/src/overlayFlush.d.ts +18 -0
  106. package/dist/src/overlayFlush.d.ts.map +1 -0
  107. package/dist/src/overlayFlush.js +56 -0
  108. package/dist/src/overlayFlush.js.map +1 -0
  109. package/dist/src/overlayRect.d.ts +69 -0
  110. package/dist/src/overlayRect.d.ts.map +1 -0
  111. package/dist/src/overlayRect.js +55 -0
  112. package/dist/src/overlayRect.js.map +1 -0
  113. package/dist/src/performance.d.ts +1 -3
  114. package/dist/src/performance.d.ts.map +1 -1
  115. package/dist/src/performance.js +0 -12
  116. package/dist/src/performance.js.map +1 -1
  117. package/dist/src/recording.d.ts +3 -2
  118. package/dist/src/recording.d.ts.map +1 -1
  119. package/dist/src/recordingData.d.ts +22 -2
  120. package/dist/src/recordingData.d.ts.map +1 -1
  121. package/dist/src/runtimeContext.d.ts +57 -1
  122. package/dist/src/runtimeContext.d.ts.map +1 -1
  123. package/dist/src/runtimeContext.js +40 -0
  124. package/dist/src/runtimeContext.js.map +1 -1
  125. package/dist/src/screenshot.d.ts +105 -0
  126. package/dist/src/screenshot.d.ts.map +1 -0
  127. package/dist/src/screenshot.js +188 -0
  128. package/dist/src/screenshot.js.map +1 -0
  129. package/dist/src/stillCapture.d.ts +68 -0
  130. package/dist/src/stillCapture.d.ts.map +1 -0
  131. package/dist/src/stillCapture.js +119 -0
  132. package/dist/src/stillCapture.js.map +1 -0
  133. package/dist/src/studio.d.ts +8 -11
  134. package/dist/src/studio.d.ts.map +1 -1
  135. package/dist/src/studio.js +2 -25
  136. package/dist/src/studio.js.map +1 -1
  137. package/dist/src/types.d.ts +125 -15
  138. package/dist/src/types.d.ts.map +1 -1
  139. package/dist/src/types.js.map +1 -1
  140. package/dist/src/video.d.ts +54 -1
  141. package/dist/src/video.d.ts.map +1 -1
  142. package/dist/src/video.js +190 -42
  143. package/dist/src/video.js.map +1 -1
  144. package/dist/src/voices.d.ts +22 -9
  145. package/dist/src/voices.d.ts.map +1 -1
  146. package/dist/src/voices.js +6 -24
  147. package/dist/src/voices.js.map +1 -1
  148. package/dist/tsconfig.tsbuildinfo +1 -1
  149. package/package.json +16 -2
  150. package/skills/screenci/SKILL.md +37 -15
  151. package/skills/screenci/references/init.md +3 -1
  152. package/skills/screenci/references/record.md +8 -3
  153. package/dist/docs/video-sources/cli.video.d.ts +0 -2
  154. package/dist/docs/video-sources/cli.video.d.ts.map +0 -1
  155. package/dist/docs/video-sources/cli.video.js.map +0 -1
  156. package/dist/docs/video-sources/installation.video.d.ts +0 -2
  157. package/dist/docs/video-sources/installation.video.d.ts.map +0 -1
  158. package/dist/docs/video-sources/installation.video.js.map +0 -1
  159. package/dist/docs/video-sources/landing.video.d.ts +0 -2
  160. package/dist/docs/video-sources/landing.video.d.ts.map +0 -1
  161. package/dist/docs/video-sources/landing.video.js.map +0 -1
package/dist/src/video.js CHANGED
@@ -9,15 +9,19 @@ import { setActiveCueRecorder } from './cue.js';
9
9
  import { setActiveHideRecorder } from './hide.js';
10
10
  import { setActiveAutoZoomRecorder, setActiveZoomPage } from './autoZoom.js';
11
11
  import { setActiveAssetRecorder } from './asset.js';
12
- import { DEFAULT_VIDEO_OPTIONS, DEFAULT_ASPECT_RATIO, DEFAULT_QUALITY, DEFAULT_FPS, } from './defaults.js';
12
+ import { flushPendingOverlays } from './overlayFlush.js';
13
+ import { setActiveAudioRecorder } from './audio.js';
14
+ import { DEFAULT_VIDEO_OPTIONS, DEFAULT_ASPECT_RATIO, DEFAULT_QUALITY, DEFAULT_FPS, DEFAULT_VIDEO_ENCODER, } from './defaults.js';
13
15
  import { EventRecorder } from './events.js';
14
16
  import { bindClickRecorderToPage, instrumentBrowser, instrumentContext, setActiveClickRecorder, } from './instrument.js';
15
17
  import { logger } from './logger.js';
16
18
  import { setMousePosition } from './mouse.js';
17
19
  import { getChromiumLaunchOptions } from './browserLaunchOptions.js';
18
- import { createScreenCIRuntimeContext, runWithScreenCIRuntimeContext, setActiveScreenCIRuntimeContext, setRuntimeAssetRecorder, setRuntimeAutoZoomRecorder, setRuntimeClickRecorder, setRuntimeCueRecorder, setRuntimeHideRecorder, setRuntimePage, } from './runtimeContext.js';
20
+ import { createScreenCIRuntimeContext, runWithScreenCIRuntimeContext, setActiveScreenCIRuntimeContext, setRuntimeAssetRecorder, setRuntimeAudioRecorder, setRuntimeAutoZoomRecorder, setRuntimeClickRecorder, setRuntimeCueRecorder, setRuntimeHideRecorder, setRuntimePage, } from './runtimeContext.js';
19
21
  import { escapeFileSystemPathSegment } from './fileSystemName.js';
20
22
  import { resolveRecordingTimingDuration } from './runtimeMode.js';
23
+ import { buildScreenCIContextOptions } from './contextOptions.js';
24
+ import { bindStillCaptureToPage } from './stillCapture.js';
21
25
  export const POST_VIDEO_PAUSE = 500;
22
26
  export async function finalizeDeferredRecordingStops(entries) {
23
27
  await Promise.all(entries.map(async ({ recorder }) => {
@@ -67,7 +71,98 @@ export async function positionMouseAtViewportCenter(page, dimensions) {
67
71
  setMousePosition(page, viewportCenter);
68
72
  return viewportCenter;
69
73
  }
70
- async function startScreencastRecording(page, outputPath, fps, quality, aspectRatio) {
74
+ /**
75
+ * Encoder arguments for the screencast's realtime first pass, per preset.
76
+ *
77
+ * We keep the recorder's realtime first pass as the final artifact (the second
78
+ * pass is disabled below via `runSecondPass`), so these are the only encoder
79
+ * settings that reach the saved recording. playwright-recorder-plus has no
80
+ * public option for the first-pass encoder, so `applyFirstPassEncoderArgs`
81
+ * overrides the recorder's internal first-pass args at runtime. Doing it at
82
+ * runtime (rather than patching the dependency on disk) means it works for
83
+ * every install: npm, pnpm and yarn, with no postinstall step.
84
+ *
85
+ * - `'sharp'` is tuned for text-heavy UI: `-tune stillimage` and a low `-crf`
86
+ * preserve sharp glyph edges, while `-preset veryfast` stays above realtime
87
+ * so the screencast stream never backpressures (which drops frames and
88
+ * shortens the timeline).
89
+ * - `'fast'` mirrors the library's original `-preset ultrafast -crf 18` for
90
+ * resource-constrained CI that cannot keep up with the sharper encode.
91
+ *
92
+ * Both use `yuv420p` so the output stays decodable by the downstream NVDEC
93
+ * CUDA render pipeline (4:4:4 H.264 is not reliably hardware-decodable).
94
+ */
95
+ const FIRST_PASS_ARGS_BY_ENCODER = {
96
+ sharp: [
97
+ '-c:v',
98
+ 'libx264',
99
+ '-preset',
100
+ 'veryfast',
101
+ '-crf',
102
+ '12',
103
+ '-tune',
104
+ 'stillimage',
105
+ '-pix_fmt',
106
+ 'yuv420p',
107
+ '-movflags',
108
+ '+faststart',
109
+ ],
110
+ fast: [
111
+ '-c:v',
112
+ 'libx264',
113
+ '-preset',
114
+ 'ultrafast',
115
+ '-crf',
116
+ '18',
117
+ '-pix_fmt',
118
+ 'yuv420p',
119
+ '-movflags',
120
+ '+faststart',
121
+ ],
122
+ };
123
+ /**
124
+ * Resolve the first-pass encoder args for a given preset. Exported for testing.
125
+ */
126
+ export function resolveRecordingFirstPassArgs(encoder = DEFAULT_VIDEO_ENCODER) {
127
+ return FIRST_PASS_ARGS_BY_ENCODER[encoder];
128
+ }
129
+ /**
130
+ * Replace the output-encoder tail of a built first-pass ffmpeg arg list.
131
+ *
132
+ * The recorder's first-pass args contain two `-c:v` flags: the first selects
133
+ * the mjpeg input decoder, the last selects the output encoder. We swap
134
+ * everything from that last `-c:v` to the end with `encoderArgs` (which start
135
+ * at their own `-c:v`), leaving the input/rate flags before it untouched.
136
+ *
137
+ * Pure and exported for testing. Throws if no output encoder is present, so a
138
+ * future change to the recorder's internals fails loudly instead of silently
139
+ * recording with the wrong encoder.
140
+ */
141
+ export function overrideFirstPassEncoderArgs(currentArgs, encoderArgs) {
142
+ const encoderStart = currentArgs.lastIndexOf('-c:v');
143
+ if (encoderStart === -1) {
144
+ throw new Error('playwright-recorder-plus first-pass args contained no output encoder (-c:v); ' +
145
+ 'cannot apply the configured capture encoder. The recorder internals may have changed.');
146
+ }
147
+ return [...currentArgs.slice(0, encoderStart), ...encoderArgs];
148
+ }
149
+ /**
150
+ * Override the recorder's first-pass encoder in place, before `start()`.
151
+ *
152
+ * `attachRecorder` builds `config.firstPassArgs` eagerly but only spawns the
153
+ * first-pass ffmpeg process on `start()`, so mutating it here (with
154
+ * `autoStart: false`) takes effect for the actual recording.
155
+ */
156
+ export function applyFirstPassEncoderArgs(recorder, encoderArgs) {
157
+ const config = recorder.config;
158
+ const current = config?.firstPassArgs;
159
+ if (!config || !Array.isArray(current)) {
160
+ throw new Error('playwright-recorder-plus recorder did not expose config.firstPassArgs; ' +
161
+ 'cannot apply the configured capture encoder. The recorder internals may have changed.');
162
+ }
163
+ config.firstPassArgs = overrideFirstPassEncoderArgs(current, encoderArgs);
164
+ }
165
+ async function startScreencastRecording(page, outputPath, fps, quality, aspectRatio, encoder) {
71
166
  const { width, height } = getDimensions(aspectRatio, quality);
72
167
  const recorder = await attachRecorder(page, {
73
168
  path: outputPath,
@@ -76,26 +171,42 @@ async function startScreencastRecording(page, outputPath, fps, quality, aspectRa
76
171
  size: { width, height },
77
172
  fps,
78
173
  jpegQuality: 100,
79
- ffmpegArgs: [
80
- '-c:v',
81
- 'libx264',
82
- '-preset',
83
- 'slow',
84
- '-tune',
85
- 'stillimage',
86
- '-crf',
87
- '12',
88
- '-pix_fmt',
89
- 'yuv444p',
90
- '-movflags',
91
- 'frag_keyframe+empty_moov',
92
- ],
93
174
  });
175
+ // Apply the configured capture encoder. The library has no public option for
176
+ // the first-pass encoder, so we override the recorder's internal first-pass
177
+ // args in place (before start(), which autoStart: false guarantees).
178
+ applyFirstPassEncoderArgs(recorder, resolveRecordingFirstPassArgs(encoder));
94
179
  recorder.runSecondPass = async (firstPass) => firstPass;
95
180
  return recorder;
96
181
  }
97
- async function withActiveRecordingContext(params) {
98
- const { runtimeContext, page, recorder, fn } = params;
182
+ /**
183
+ * Fails the recording if any overlay was `start()`ed but never `end()`ed.
184
+ * Every live overlay must be paired so the renderer never sees a dangling
185
+ * `assetStart` with no `assetEnd`. Only called on the success path, so it never
186
+ * masks an error thrown by the video function itself.
187
+ */
188
+ export function assertAllOverlaysEnded(runtimeContext) {
189
+ const open = [...runtimeContext.asset.activeRuns.keys()];
190
+ if (open.length === 0)
191
+ return;
192
+ const names = open.map((name) => `"${name}"`).join(', ');
193
+ throw new Error(`[screenci] Overlay(s) ${names} were started with .start() but never ended. Call end() for each overlay before the video function returns.`);
194
+ }
195
+ /**
196
+ * Ends any overlays left open with `.start()`, in record order. Used by the
197
+ * screenshot fixture, where a `.start()` with no `.end()` means "keep this
198
+ * overlay visible in the still" rather than being an error (the still has no
199
+ * timeline, so the renderer shows every overlay regardless).
200
+ */
201
+ export function autoEndOpenOverlays(runtimeContext, recorder) {
202
+ for (const [name, run] of runtimeContext.asset.activeRuns) {
203
+ recorder.addAssetEnd(name, 'auto');
204
+ run.resolveFinished();
205
+ }
206
+ runtimeContext.asset.activeRuns.clear();
207
+ }
208
+ export async function withActiveRecordingContext(params) {
209
+ const { runtimeContext, page, recorder, fn, unendedOverlays = 'throw', } = params;
99
210
  setActiveScreenCIRuntimeContext(runtimeContext);
100
211
  try {
101
212
  return await runWithScreenCIRuntimeContext(runtimeContext, async () => {
@@ -104,16 +215,31 @@ async function withActiveRecordingContext(params) {
104
215
  setRuntimeHideRecorder(recorder);
105
216
  setRuntimeAutoZoomRecorder(recorder);
106
217
  setRuntimeAssetRecorder(recorder);
218
+ setRuntimeAudioRecorder(recorder);
107
219
  setRuntimeClickRecorder(recorder);
108
220
  setActiveCueRecorder(recorder);
109
221
  setActiveHideRecorder(recorder);
110
222
  setActiveAutoZoomRecorder(recorder);
111
223
  setActiveZoomPage(page);
112
224
  setActiveAssetRecorder(recorder);
225
+ setActiveAudioRecorder(recorder);
113
226
  setActiveClickRecorder(recorder);
114
227
  bindClickRecorderToPage(page, recorder);
115
228
  setRuntimePage(page);
116
- return await fn();
229
+ const result = await fn();
230
+ if (unendedOverlays === 'autoEnd') {
231
+ autoEndOpenOverlays(runtimeContext, recorder);
232
+ }
233
+ else {
234
+ assertAllOverlaysEnded(runtimeContext);
235
+ }
236
+ // Rasterize deferred overlays now that the test body has succeeded and
237
+ // every overlay's props/timing are known, before the recorder is written
238
+ // to disk. On the failure path fn() throws, so this never runs and no
239
+ // partial assets are produced (matching writeToFile, which only runs on a
240
+ // passing test).
241
+ await flushPendingOverlays(recorder);
242
+ return result;
117
243
  });
118
244
  }
119
245
  finally {
@@ -144,32 +270,46 @@ const _videoBase = base.extend({
144
270
  await browser.close();
145
271
  }
146
272
  },
147
- context: async ({ browser, recordOptions }, use) => {
148
- // Configure browser context
273
+ context: async ({ browser, recordOptions, colorScheme, locale, timezoneId, userAgent, geolocation, permissions, extraHTTPHeaders, httpCredentials, ignoreHTTPSErrors, offline, storageState, baseURL, bypassCSP, acceptDownloads, javaScriptEnabled, hasTouch, isMobile, }, use) => {
274
+ // Configure browser context. The viewport is derived from recordOptions;
275
+ // other Playwright `use` options (colorScheme, locale, storageState, ...)
276
+ // are forwarded so they take effect on the context screenci creates.
149
277
  const aspectRatio = recordOptions.aspectRatio ?? DEFAULT_ASPECT_RATIO;
150
278
  const quality = recordOptions.quality ?? DEFAULT_QUALITY;
151
279
  const dimensions = getDimensions(aspectRatio, quality);
152
280
  const shouldRecord = process.env.SCREENCI_RECORDING === 'true';
153
- if (shouldRecord) {
154
- const context = await browser.newContext({
155
- locale: 'en-US',
156
- viewport: dimensions,
157
- });
158
- instrumentContext(context);
159
- try {
160
- await use(context);
161
- }
162
- finally {
163
- await context.close();
164
- }
165
- return;
166
- }
167
- const context = await browser.newContext({
168
- viewport: dimensions,
169
- });
281
+ // deviceScaleFactor is intentionally not applied to video: the screencast
282
+ // encoder expects frames at the viewport resolution.
283
+ const context = await browser.newContext(buildScreenCIContextOptions({
284
+ dimensions,
285
+ applyLocaleDefault: shouldRecord,
286
+ forwarded: {
287
+ colorScheme,
288
+ locale,
289
+ timezoneId,
290
+ userAgent,
291
+ geolocation,
292
+ permissions,
293
+ extraHTTPHeaders,
294
+ httpCredentials,
295
+ ignoreHTTPSErrors,
296
+ offline,
297
+ storageState,
298
+ baseURL,
299
+ bypassCSP,
300
+ acceptDownloads,
301
+ javaScriptEnabled,
302
+ hasTouch,
303
+ isMobile,
304
+ },
305
+ }));
170
306
  instrumentContext(context);
171
- await use(context);
172
- await context.close();
307
+ try {
308
+ await use(context);
309
+ }
310
+ finally {
311
+ await context.close();
312
+ }
173
313
  },
174
314
  page: async ({ context, recordOptions, renderOptions, recordingFinalizationQueue }, use, testInfo) => {
175
315
  // Only record when explicitly enabled (record command)
@@ -181,7 +321,10 @@ const _videoBase = base.extend({
181
321
  recorder,
182
322
  page,
183
323
  testFilePath: testInfo.file,
324
+ recordOptions,
325
+ renderOptions,
184
326
  });
327
+ bindStillCaptureToPage(page);
185
328
  await setupMouseTracking(page, recorder);
186
329
  recorder.start();
187
330
  await withActiveRecordingContext({
@@ -199,6 +342,7 @@ const _videoBase = base.extend({
199
342
  const aspectRatio = recordOptions.aspectRatio ?? DEFAULT_ASPECT_RATIO;
200
343
  const quality = recordOptions.quality ?? DEFAULT_QUALITY;
201
344
  const fps = recordOptions.fps ?? DEFAULT_FPS;
345
+ const encoder = recordOptions.encoder ?? DEFAULT_VIDEO_ENCODER;
202
346
  const dimensions = getDimensions(aspectRatio, quality);
203
347
  const directoryName = escapeFileSystemPathSegment(testInfo.title);
204
348
  // Create directory path: .screenci/[video-title]/
@@ -220,14 +364,18 @@ const _videoBase = base.extend({
220
364
  recorder,
221
365
  page,
222
366
  testFilePath: testInfo.file,
367
+ recordingDir: videoDir,
368
+ recordOptions,
369
+ renderOptions,
223
370
  });
371
+ bindStillCaptureToPage(page);
224
372
  await setupMouseTracking(page, recorder);
225
373
  // Navigate to blank page to ensure window is ready and rendered
226
374
  await page.goto('about:blank');
227
375
  // Wait for browser window to be fully rendered before starting recording
228
376
  // This prevents black screen captures
229
377
  await page.waitForTimeout(resolveRecordingTimingDuration(1500));
230
- const screenRecorder = await startScreencastRecording(page, videoPath, fps, quality, aspectRatio);
378
+ const screenRecorder = await startScreencastRecording(page, videoPath, fps, quality, aspectRatio, encoder);
231
379
  await positionMouseAtViewportCenter(page, dimensions);
232
380
  await screenRecorder.start();
233
381
  // Mark the moment the video recording actually begins after the cursor is positioned.
@@ -1 +1 @@
1
- {"version":3,"file":"video.js","sourceRoot":"","sources":["../../src/video.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"video.js","sourceRoot":"","sources":["../../src/video.ts"],"names":[],"mappings":"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"}
@@ -24,22 +24,33 @@ export type ModelType = (typeof modelTypes)[keyof typeof modelTypes];
24
24
  *
25
25
  * ```ts
26
26
  * createNarration({
27
- * en: { voice: voices.Aria, intro: 'Hello' },
28
- * fi: { voice: voices.Aria, intro: 'Hei' },
27
+ * en: { voice: { name: voices.Aria }, intro: 'Hello' },
28
+ * fi: { voice: { name: voices.Aria }, intro: 'Hei' },
29
29
  * })
30
30
  * ```
31
31
  *
32
- * ElevenLabs voices are passed explicitly by provider voice id:
32
+ * ElevenLabs voices are passed by provider voice id, or cloned from a local
33
+ * audio/video sample — both via `voices.elevenlabs(...)`:
33
34
  *
34
35
  * ```ts
35
36
  * createNarration({
36
37
  * en: {
37
- * voice: voices.elevenlabs({ voiceId: 'tMvyQtpCVQ0DkixuYm6J' }),
38
+ * voice: { name: voices.elevenlabs({ voiceId: 'tMvyQtpCVQ0DkixuYm6J' }) },
38
39
  * intro: 'Hello',
39
40
  * },
41
+ * fi: {
42
+ * voice: { name: voices.elevenlabs({ path: './my-voice.mp3' }) },
43
+ * intro: 'Hei',
44
+ * },
40
45
  * })
41
46
  * ```
42
47
  */
48
+ declare function elevenlabsVoice(ref: {
49
+ voiceId: string;
50
+ }): ElevenLabsVoiceKey;
51
+ declare function elevenlabsVoice(ref: {
52
+ path: string;
53
+ }): CustomVoiceRef;
43
54
  export declare const voices: {
44
55
  /** Male — Clear — Direct and structured, ideal for straightforward explanations. */
45
56
  readonly Adrian: "Adrian";
@@ -101,9 +112,7 @@ export declare const voices: {
101
112
  readonly Victor: "Victor";
102
113
  /** Female — Upbeat — Positive and motivating, encouraging continued interaction. */
103
114
  readonly Zoe: "Zoe";
104
- readonly elevenlabs: ({ voiceId }: {
105
- voiceId: string;
106
- }) => ElevenLabsVoiceKey;
115
+ readonly elevenlabs: typeof elevenlabsVoice;
107
116
  };
108
117
  export type ModelVoiceKey = keyof Omit<typeof voices, 'elevenlabs'>;
109
118
  export type ElevenLabsVoiceKey = `elevenlabs:${string}`;
@@ -116,12 +125,16 @@ export declare const supportedLanguages: readonly ["ar", "bn", "nl", "en", "fr",
116
125
  export type Lang = SupportedBaseLanguageCode;
117
126
  /**
118
127
  * A reference to a local audio or video file for ElevenLabs Instant Voice Cloning.
119
- * Pass as the `voice` in `createNarration` to clone a voice from the file at `path`.
128
+ * Build one with `voices.elevenlabs({ path })` and pass it as the voice `name`
129
+ * in `createNarration` to clone a voice from the file at `path`.
120
130
  *
121
131
  * @example
122
132
  * ```ts
123
133
  * createNarration({
124
- * en: { voice: { path: './my-voice.mp3' }, intro: 'Hello.' },
134
+ * en: {
135
+ * voice: { name: voices.elevenlabs({ path: './my-voice.mp3' }) },
136
+ * intro: 'Hello.',
137
+ * },
125
138
  * })
126
139
  * ```
127
140
  */
@@ -1 +1 @@
1
- {"version":3,"file":"voices.d.ts","sourceRoot":"","sources":["../../src/voices.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,UAAU;;;CAGb,CAAA;AAEV,MAAM,MAAM,SAAS,GAAG,CAAC,OAAO,UAAU,CAAC,CAAC,MAAM,OAAO,UAAU,CAAC,CAAA;AAEpE;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAIH,eAAO,MAAM,MAAM;IACjB,oFAAoF;;IAGpF,2FAA2F;;IAG3F,+EAA+E;;IAG/E,+EAA+E;;IAG/E,4FAA4F;;IAG5F,+FAA+F;;IAG/F,yFAAyF;;IAGzF,gGAAgG;;IAGhG,+EAA+E;;IAG/E,qFAAqF;;IAGrF,0FAA0F;;IAG1F,iFAAiF;;IAGjF,+EAA+E;;IAG/E,sFAAsF;;IAGtF,uEAAuE;;IAGvE,4FAA4F;;IAG5F,4FAA4F;;IAG5F,sFAAsF;;IAGtF,qFAAqF;;IAGrF,yFAAyF;;IAGzF,4EAA4E;;IAG5E,+EAA+E;;IAG/E,wEAAwE;;IAGxE,6FAA6F;;IAG7F,gFAAgF;;IAGhF,oFAAoF;;IAGpF,6EAA6E;;IAG7E,iFAAiF;;IAGjF,sFAAsF;;IAGtF,oFAAoF;;uCAG1D;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,KAChB,kBAAkB;CACvC,CAAA;AAEV,MAAM,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,OAAO,MAAM,EAAE,YAAY,CAAC,CAAA;AACnE,MAAM,MAAM,kBAAkB,GAAG,cAAc,MAAM,EAAE,CAAA;AAEvD,0EAA0E;AAC1E,MAAM,MAAM,QAAQ,GAAG,aAAa,GAAG,kBAAkB,CAAA;AAKzD,QAAA,MAAM,0BAA0B,oeA+EtB,CAAA;AAEV,KAAK,yBAAyB,GAAG,CAAC,OAAO,0BAA0B,CAAC,CAAC,MAAM,CAAC,CAAA;AAE5E,eAAO,MAAM,kBAAkB,oeAA6B,CAAA;AAE5D,qEAAqE;AACrE,MAAM,MAAM,IAAI,GAAG,yBAAyB,CAAA;AAE5C;;;;;;;;;;GAUG;AACH,MAAM,MAAM,cAAc,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAA"}
1
+ {"version":3,"file":"voices.d.ts","sourceRoot":"","sources":["../../src/voices.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,UAAU;;;CAGb,CAAA;AAEV,MAAM,MAAM,SAAS,GAAG,CAAC,OAAO,UAAU,CAAC,CAAC,MAAM,OAAO,UAAU,CAAC,CAAA;AAEpE;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAGH,iBAAS,eAAe,CAAC,GAAG,EAAE;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,kBAAkB,CAAA;AACtE,iBAAS,eAAe,CAAC,GAAG,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,cAAc,CAAA;AAY/D,eAAO,MAAM,MAAM;IACjB,oFAAoF;;IAGpF,2FAA2F;;IAG3F,+EAA+E;;IAG/E,+EAA+E;;IAG/E,4FAA4F;;IAG5F,+FAA+F;;IAG/F,yFAAyF;;IAGzF,gGAAgG;;IAGhG,+EAA+E;;IAG/E,qFAAqF;;IAGrF,0FAA0F;;IAG1F,iFAAiF;;IAGjF,+EAA+E;;IAG/E,sFAAsF;;IAGtF,uEAAuE;;IAGvE,4FAA4F;;IAG5F,4FAA4F;;IAG5F,sFAAsF;;IAGtF,qFAAqF;;IAGrF,yFAAyF;;IAGzF,4EAA4E;;IAG5E,+EAA+E;;IAG/E,wEAAwE;;IAGxE,6FAA6F;;IAG7F,gFAAgF;;IAGhF,oFAAoF;;IAGpF,6EAA6E;;IAG7E,iFAAiF;;IAGjF,sFAAsF;;IAGtF,oFAAoF;;;CAI5E,CAAA;AAEV,MAAM,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,OAAO,MAAM,EAAE,YAAY,CAAC,CAAA;AACnE,MAAM,MAAM,kBAAkB,GAAG,cAAc,MAAM,EAAE,CAAA;AAEvD,0EAA0E;AAC1E,MAAM,MAAM,QAAQ,GAAG,aAAa,GAAG,kBAAkB,CAAA;AAKzD,QAAA,MAAM,0BAA0B,oeA+EtB,CAAA;AAEV,KAAK,yBAAyB,GAAG,CAAC,OAAO,0BAA0B,CAAC,CAAC,MAAM,CAAC,CAAA;AAE5E,eAAO,MAAM,kBAAkB,oeAA6B,CAAA;AAE5D,qEAAqE;AACrE,MAAM,MAAM,IAAI,GAAG,yBAAyB,CAAA;AAE5C;;;;;;;;;;;;;;GAcG;AACH,MAAM,MAAM,cAAc,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAA"}
@@ -16,29 +16,11 @@ export const modelTypes = {
16
16
  expressive: 'expressive',
17
17
  consistent: 'consistent',
18
18
  };
19
- /**
20
- * Named voices available for use with `createNarration`.
21
- *
22
- * Built-in voices are language-agnostic at the call site:
23
- *
24
- * ```ts
25
- * createNarration({
26
- * en: { voice: voices.Aria, intro: 'Hello' },
27
- * fi: { voice: voices.Aria, intro: 'Hei' },
28
- * })
29
- * ```
30
- *
31
- * ElevenLabs voices are passed explicitly by provider voice id:
32
- *
33
- * ```ts
34
- * createNarration({
35
- * en: {
36
- * voice: voices.elevenlabs({ voiceId: 'tMvyQtpCVQ0DkixuYm6J' }),
37
- * intro: 'Hello',
38
- * },
39
- * })
40
- * ```
41
- */
19
+ function elevenlabsVoice(ref) {
20
+ return 'path' in ref
21
+ ? { path: ref.path }
22
+ : `elevenlabs:${ref.voiceId}`;
23
+ }
42
24
  // DOCS_SYNC:
43
25
  // Keep the "Available voices" section in docs/narration-and-localization.md
44
26
  // in sync with this list and the voice character blurbs below.
@@ -103,7 +85,7 @@ export const voices = {
103
85
  Victor: 'Victor',
104
86
  /** Female — Upbeat — Positive and motivating, encouraging continued interaction. */
105
87
  Zoe: 'Zoe',
106
- elevenlabs: ({ voiceId }) => `elevenlabs:${voiceId}`,
88
+ elevenlabs: elevenlabsVoice,
107
89
  };
108
90
  // DOCS_SYNC:
109
91
  // Keep the "Available languages" section in docs/narration-and-localization.md
@@ -1 +1 @@
1
- {"version":3,"file":"voices.js","sourceRoot":"","sources":["../../src/voices.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"voices.js","sourceRoot":"","sources":["../../src/voices.ts"],"names":[],"mappings":"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"}