deio-scroll 1.0.0
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/LICENSE +21 -0
- package/README.md +21 -0
- package/dist/api/server.d.ts +3 -0
- package/dist/api/server.d.ts.map +1 -0
- package/dist/api/server.js +393 -0
- package/dist/api/server.js.map +1 -0
- package/dist/artifacts/store.d.ts +24 -0
- package/dist/artifacts/store.d.ts.map +1 -0
- package/dist/artifacts/store.js +43 -0
- package/dist/artifacts/store.js.map +1 -0
- package/dist/browser/componentInteraction.d.ts +24 -0
- package/dist/browser/componentInteraction.d.ts.map +1 -0
- package/dist/browser/componentInteraction.js +328 -0
- package/dist/browser/componentInteraction.js.map +1 -0
- package/dist/browser/composition.d.ts +42 -0
- package/dist/browser/composition.d.ts.map +1 -0
- package/dist/browser/composition.js +132 -0
- package/dist/browser/composition.js.map +1 -0
- package/dist/browser/cookies.d.ts +3 -0
- package/dist/browser/cookies.d.ts.map +1 -0
- package/dist/browser/cookies.js +20 -0
- package/dist/browser/cookies.js.map +1 -0
- package/dist/browser/curves.d.ts +4 -0
- package/dist/browser/curves.d.ts.map +1 -0
- package/dist/browser/curves.js +35 -0
- package/dist/browser/curves.js.map +1 -0
- package/dist/browser/detectScrollMode.d.ts +5 -0
- package/dist/browser/detectScrollMode.d.ts.map +1 -0
- package/dist/browser/detectScrollMode.js +61 -0
- package/dist/browser/detectScrollMode.js.map +1 -0
- package/dist/browser/directionGuardrails.d.ts +22 -0
- package/dist/browser/directionGuardrails.d.ts.map +1 -0
- package/dist/browser/directionGuardrails.js +99 -0
- package/dist/browser/directionGuardrails.js.map +1 -0
- package/dist/browser/goto.d.ts +9 -0
- package/dist/browser/goto.d.ts.map +1 -0
- package/dist/browser/goto.js +62 -0
- package/dist/browser/goto.js.map +1 -0
- package/dist/browser/hydrate.d.ts +8 -0
- package/dist/browser/hydrate.d.ts.map +1 -0
- package/dist/browser/hydrate.js +73 -0
- package/dist/browser/hydrate.js.map +1 -0
- package/dist/browser/mediaClock.d.ts +9 -0
- package/dist/browser/mediaClock.d.ts.map +1 -0
- package/dist/browser/mediaClock.js +86 -0
- package/dist/browser/mediaClock.js.map +1 -0
- package/dist/browser/motion.d.ts +21 -0
- package/dist/browser/motion.d.ts.map +1 -0
- package/dist/browser/motion.js +42 -0
- package/dist/browser/motion.js.map +1 -0
- package/dist/browser/networkPolicy.d.ts +11 -0
- package/dist/browser/networkPolicy.d.ts.map +1 -0
- package/dist/browser/networkPolicy.js +119 -0
- package/dist/browser/networkPolicy.js.map +1 -0
- package/dist/browser/prime.d.ts +3 -0
- package/dist/browser/prime.d.ts.map +1 -0
- package/dist/browser/prime.js +13 -0
- package/dist/browser/prime.js.map +1 -0
- package/dist/browser/sanitize.d.ts +3 -0
- package/dist/browser/sanitize.d.ts.map +1 -0
- package/dist/browser/sanitize.js +37 -0
- package/dist/browser/sanitize.js.map +1 -0
- package/dist/browser/scroll.d.ts +29 -0
- package/dist/browser/scroll.d.ts.map +1 -0
- package/dist/browser/scroll.js +420 -0
- package/dist/browser/scroll.js.map +1 -0
- package/dist/browser/scrollEasing.d.ts +5 -0
- package/dist/browser/scrollEasing.d.ts.map +1 -0
- package/dist/browser/scrollEasing.js +40 -0
- package/dist/browser/scrollEasing.js.map +1 -0
- package/dist/browser/scrollReadiness.d.ts +25 -0
- package/dist/browser/scrollReadiness.d.ts.map +1 -0
- package/dist/browser/scrollReadiness.js +105 -0
- package/dist/browser/scrollReadiness.js.map +1 -0
- package/dist/browser/urlGuard.d.ts +4 -0
- package/dist/browser/urlGuard.d.ts.map +1 -0
- package/dist/browser/urlGuard.js +22 -0
- package/dist/browser/urlGuard.js.map +1 -0
- package/dist/browser/virtualScroll.d.ts +19 -0
- package/dist/browser/virtualScroll.d.ts.map +1 -0
- package/dist/browser/virtualScroll.js +50 -0
- package/dist/browser/virtualScroll.js.map +1 -0
- package/dist/capture/detectMargins.d.ts +6 -0
- package/dist/capture/detectMargins.d.ts.map +1 -0
- package/dist/capture/detectMargins.js +145 -0
- package/dist/capture/detectMargins.js.map +1 -0
- package/dist/capture/frameRecorder.d.ts +29 -0
- package/dist/capture/frameRecorder.d.ts.map +1 -0
- package/dist/capture/frameRecorder.js +74 -0
- package/dist/capture/frameRecorder.js.map +1 -0
- package/dist/capture/stitchFrames.d.ts +9 -0
- package/dist/capture/stitchFrames.d.ts.map +1 -0
- package/dist/capture/stitchFrames.js +62 -0
- package/dist/capture/stitchFrames.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +329 -0
- package/dist/cli.js.map +1 -0
- package/dist/config/browserLaunch.d.ts +13 -0
- package/dist/config/browserLaunch.d.ts.map +1 -0
- package/dist/config/browserLaunch.js +63 -0
- package/dist/config/browserLaunch.js.map +1 -0
- package/dist/config/recordingProfile.d.ts +10 -0
- package/dist/config/recordingProfile.d.ts.map +1 -0
- package/dist/config/recordingProfile.js +25 -0
- package/dist/config/recordingProfile.js.map +1 -0
- package/dist/config/runtimeMode.d.ts +2 -0
- package/dist/config/runtimeMode.d.ts.map +1 -0
- package/dist/config/runtimeMode.js +4 -0
- package/dist/config/runtimeMode.js.map +1 -0
- package/dist/config/virtualScroll.d.ts +8 -0
- package/dist/config/virtualScroll.d.ts.map +1 -0
- package/dist/config/virtualScroll.js +19 -0
- package/dist/config/virtualScroll.js.map +1 -0
- package/dist/contracts.d.ts +157 -0
- package/dist/contracts.d.ts.map +1 -0
- package/dist/contracts.js +136 -0
- package/dist/contracts.js.map +1 -0
- package/dist/editor/compileVideo.d.ts +21 -0
- package/dist/editor/compileVideo.d.ts.map +1 -0
- package/dist/editor/compileVideo.js +104 -0
- package/dist/editor/compileVideo.js.map +1 -0
- package/dist/editor/composeComparison.d.ts +30 -0
- package/dist/editor/composeComparison.d.ts.map +1 -0
- package/dist/editor/composeComparison.js +315 -0
- package/dist/editor/composeComparison.js.map +1 -0
- package/dist/editor/composeResponsiveness.d.ts +19 -0
- package/dist/editor/composeResponsiveness.d.ts.map +1 -0
- package/dist/editor/composeResponsiveness.js +198 -0
- package/dist/editor/composeResponsiveness.js.map +1 -0
- package/dist/editor/frameVideo.d.ts +11 -0
- package/dist/editor/frameVideo.d.ts.map +1 -0
- package/dist/editor/frameVideo.js +181 -0
- package/dist/editor/frameVideo.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/inspection/inspectWebsite.d.ts +21 -0
- package/dist/inspection/inspectWebsite.d.ts.map +1 -0
- package/dist/inspection/inspectWebsite.js +412 -0
- package/dist/inspection/inspectWebsite.js.map +1 -0
- package/dist/jobs/manager.d.ts +123 -0
- package/dist/jobs/manager.d.ts.map +1 -0
- package/dist/jobs/manager.js +378 -0
- package/dist/jobs/manager.js.map +1 -0
- package/dist/jobs/store.d.ts +150 -0
- package/dist/jobs/store.d.ts.map +1 -0
- package/dist/jobs/store.js +446 -0
- package/dist/jobs/store.js.map +1 -0
- package/dist/jobs/thumbnail.d.ts +2 -0
- package/dist/jobs/thumbnail.d.ts.map +1 -0
- package/dist/jobs/thumbnail.js +36 -0
- package/dist/jobs/thumbnail.js.map +1 -0
- package/dist/pipeline/processRecordingRequest.d.ts +4 -0
- package/dist/pipeline/processRecordingRequest.d.ts.map +1 -0
- package/dist/pipeline/processRecordingRequest.js +17 -0
- package/dist/pipeline/processRecordingRequest.js.map +1 -0
- package/dist/pipeline/recordComparison.d.ts +4 -0
- package/dist/pipeline/recordComparison.d.ts.map +1 -0
- package/dist/pipeline/recordComparison.js +99 -0
- package/dist/pipeline/recordComparison.js.map +1 -0
- package/dist/pipeline/recordResponsiveness.d.ts +4 -0
- package/dist/pipeline/recordResponsiveness.d.ts.map +1 -0
- package/dist/pipeline/recordResponsiveness.js +122 -0
- package/dist/pipeline/recordResponsiveness.js.map +1 -0
- package/dist/pipeline/recordWebsite.d.ts +11 -0
- package/dist/pipeline/recordWebsite.d.ts.map +1 -0
- package/dist/pipeline/recordWebsite.js +446 -0
- package/dist/pipeline/recordWebsite.js.map +1 -0
- package/dist/pipeline/styleRecording.d.ts +12 -0
- package/dist/pipeline/styleRecording.d.ts.map +1 -0
- package/dist/pipeline/styleRecording.js +59 -0
- package/dist/pipeline/styleRecording.js.map +1 -0
- package/dist/transcode/ffmpeg.d.ts +4 -0
- package/dist/transcode/ffmpeg.d.ts.map +1 -0
- package/dist/transcode/ffmpeg.js +62 -0
- package/dist/transcode/ffmpeg.js.map +1 -0
- package/dist/transcode/probe.d.ts +7 -0
- package/dist/transcode/probe.d.ts.map +1 -0
- package/dist/transcode/probe.js +91 -0
- package/dist/transcode/probe.js.map +1 -0
- package/dist/transcode/quality.d.ts +8 -0
- package/dist/transcode/quality.d.ts.map +1 -0
- package/dist/transcode/quality.js +13 -0
- package/dist/transcode/quality.js.map +1 -0
- package/dist/types.d.ts +302 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/worker.d.ts +3 -0
- package/dist/worker.d.ts.map +1 -0
- package/dist/worker.js +22 -0
- package/dist/worker.js.map +1 -0
- package/package.json +63 -0
- package/public/assets/index-C63t4P1L.css +1 -0
- package/public/assets/index-Sfgf7dSH.js +9 -0
- package/public/background_presets/gray_noise_gradient.png +0 -0
- package/public/background_presets/paper_blue.png +0 -0
- package/public/background_presets/red_blocks_gradient.png +0 -0
- package/public/deio-scroll-mark.svg +12 -0
- package/public/favicon.svg +1 -0
- package/public/icons.svg +24 -0
- package/public/index.html +16 -0
- package/public/scrollizard-mark.png +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scroll.js","sourceRoot":"","sources":["../../src/browser/scroll.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { BezierControlPoints } from "./curves.js";
|
|
2
|
+
export declare function sampleCurveX(t: number, bezier: BezierControlPoints): number;
|
|
3
|
+
export declare function sampleCurveY(t: number, bezier: BezierControlPoints): number;
|
|
4
|
+
export declare function applyScrollCurve(linearProgress: number, bezier: BezierControlPoints): number;
|
|
5
|
+
//# sourceMappingURL=scrollEasing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scrollEasing.d.ts","sourceRoot":"","sources":["../../src/browser/scrollEasing.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAEvD,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,mBAAmB,UAIlE;AAED,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,mBAAmB,UAIlE;AAWD,wBAAgB,gBAAgB,CAC9B,cAAc,EAAE,MAAM,EACtB,MAAM,EAAE,mBAAmB,UAuB5B"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
export function sampleCurveX(t, bezier) {
|
|
2
|
+
const [x1, , x2] = bezier;
|
|
3
|
+
const inv = 1 - t;
|
|
4
|
+
return 3 * inv * inv * t * x1 + 3 * inv * t * t * x2 + t * t * t;
|
|
5
|
+
}
|
|
6
|
+
export function sampleCurveY(t, bezier) {
|
|
7
|
+
const [, y1, , y2] = bezier;
|
|
8
|
+
const inv = 1 - t;
|
|
9
|
+
return 3 * inv * inv * t * y1 + 3 * inv * t * t * y2 + t * t * t;
|
|
10
|
+
}
|
|
11
|
+
function sampleCurveDerivativeX(t, bezier) {
|
|
12
|
+
const [x1, , x2] = bezier;
|
|
13
|
+
return (3 * (1 - t) * (1 - t) * x1 +
|
|
14
|
+
6 * (1 - t) * t * (x2 - x1) +
|
|
15
|
+
3 * t * t * (1 - x2));
|
|
16
|
+
}
|
|
17
|
+
export function applyScrollCurve(linearProgress, bezier) {
|
|
18
|
+
if (linearProgress <= 0)
|
|
19
|
+
return 0;
|
|
20
|
+
if (linearProgress >= 1)
|
|
21
|
+
return 1;
|
|
22
|
+
let start = 0;
|
|
23
|
+
let end = 1;
|
|
24
|
+
let param = linearProgress;
|
|
25
|
+
for (let i = 0; i < 8; i += 1) {
|
|
26
|
+
param = (start + end) / 2;
|
|
27
|
+
const x = sampleCurveX(param, bezier);
|
|
28
|
+
if (x < linearProgress)
|
|
29
|
+
start = param;
|
|
30
|
+
else
|
|
31
|
+
end = param;
|
|
32
|
+
}
|
|
33
|
+
param = (start + end) / 2;
|
|
34
|
+
const dx = sampleCurveDerivativeX(param, bezier);
|
|
35
|
+
if (Math.abs(dx) > 1e-6) {
|
|
36
|
+
param -= (sampleCurveX(param, bezier) - linearProgress) / dx;
|
|
37
|
+
}
|
|
38
|
+
return sampleCurveY(Math.min(1, Math.max(0, param)), bezier);
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=scrollEasing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scrollEasing.js","sourceRoot":"","sources":["../../src/browser/scrollEasing.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,YAAY,CAAC,CAAS,EAAE,MAA2B;IACjE,MAAM,CAAC,EAAE,EAAE,AAAD,EAAG,EAAE,CAAC,GAAG,MAAM,CAAC;IAC1B,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;IAClB,OAAO,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AACnE,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,CAAS,EAAE,MAA2B;IACjE,MAAM,CAAC,EAAE,EAAE,EAAE,AAAD,EAAG,EAAE,CAAC,GAAG,MAAM,CAAC;IAC5B,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;IAClB,OAAO,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AACnE,CAAC;AAED,SAAS,sBAAsB,CAAC,CAAS,EAAE,MAA2B;IACpE,MAAM,CAAC,EAAE,EAAE,AAAD,EAAG,EAAE,CAAC,GAAG,MAAM,CAAC;IAC1B,OAAO,CACL,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE;QAC1B,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC;QAC3B,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,CACrB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,cAAsB,EACtB,MAA2B;IAE3B,IAAI,cAAc,IAAI,CAAC;QAAE,OAAO,CAAC,CAAC;IAClC,IAAI,cAAc,IAAI,CAAC;QAAE,OAAO,CAAC,CAAC;IAElC,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,IAAI,KAAK,GAAG,cAAc,CAAC;IAE3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9B,KAAK,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;QAC1B,MAAM,CAAC,GAAG,YAAY,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QACtC,IAAI,CAAC,GAAG,cAAc;YAAE,KAAK,GAAG,KAAK,CAAC;;YACjC,GAAG,GAAG,KAAK,CAAC;IACnB,CAAC;IAED,KAAK,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;IAC1B,MAAM,EAAE,GAAG,sBAAsB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACjD,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC;QACxB,KAAK,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,cAAc,CAAC,GAAG,EAAE,CAAC;IAC/D,CAAC;IAED,OAAO,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;AAC/D,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { Page } from "playwright";
|
|
2
|
+
export interface ScrollReadinessSnapshot {
|
|
3
|
+
viewportHeight: number;
|
|
4
|
+
documentScrollRange: number;
|
|
5
|
+
latentContentHeight: number;
|
|
6
|
+
bodyLocked: boolean;
|
|
7
|
+
htmlLocked: boolean;
|
|
8
|
+
}
|
|
9
|
+
export interface ScrollReadinessResult {
|
|
10
|
+
waited: boolean;
|
|
11
|
+
timedOut: boolean;
|
|
12
|
+
initial: ScrollReadinessSnapshot;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Some scroll-driven sites render a tall document behind a temporary intro
|
|
16
|
+
* lock. During that intro, scrollHeight is only one viewport and looks exactly
|
|
17
|
+
* like a virtual-scroll page. Wait for the latent document to be released
|
|
18
|
+
* before choosing a scroll strategy or hydrating content.
|
|
19
|
+
*/
|
|
20
|
+
export declare function waitForScrollReady(page: Page, options?: {
|
|
21
|
+
timeoutMs?: number;
|
|
22
|
+
}): Promise<ScrollReadinessResult>;
|
|
23
|
+
export declare function isTransientScrollLock(snapshot: ScrollReadinessSnapshot): boolean;
|
|
24
|
+
export declare function isPotentialScrollLock(snapshot: ScrollReadinessSnapshot): boolean;
|
|
25
|
+
//# sourceMappingURL=scrollReadiness.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scrollReadiness.d.ts","sourceRoot":"","sources":["../../src/browser/scrollReadiness.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAMvC,MAAM,WAAW,uBAAuB;IACtC,cAAc,EAAE,MAAM,CAAC;IACvB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,uBAAuB,CAAC;CAClC;AAED;;;;;GAKG;AACH,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,IAAI,EACV,OAAO,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAO,GACnC,OAAO,CAAC,qBAAqB,CAAC,CAgFhC;AAED,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,uBAAuB,WAUtE;AAED,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,uBAAuB,WAItE"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
const SCROLL_RANGE_THRESHOLD_PX = 48;
|
|
2
|
+
const DEFAULT_TIMEOUT_MS = 12_000;
|
|
3
|
+
const LATENT_CONTENT_OBSERVATION_MS = 2_500;
|
|
4
|
+
/**
|
|
5
|
+
* Some scroll-driven sites render a tall document behind a temporary intro
|
|
6
|
+
* lock. During that intro, scrollHeight is only one viewport and looks exactly
|
|
7
|
+
* like a virtual-scroll page. Wait for the latent document to be released
|
|
8
|
+
* before choosing a scroll strategy or hydrating content.
|
|
9
|
+
*/
|
|
10
|
+
export async function waitForScrollReady(page, options = {}) {
|
|
11
|
+
await page.waitForLoadState("load", { timeout: 5_000 }).catch(() => undefined);
|
|
12
|
+
const initial = await page.evaluate(readinessSnapshot);
|
|
13
|
+
if (!isPotentialScrollLock(initial)) {
|
|
14
|
+
return { waited: false, timedOut: false, initial };
|
|
15
|
+
}
|
|
16
|
+
let locked = initial;
|
|
17
|
+
if (!isTransientScrollLock(locked)) {
|
|
18
|
+
try {
|
|
19
|
+
await page.waitForFunction((threshold) => {
|
|
20
|
+
const html = document.documentElement;
|
|
21
|
+
const body = document.body;
|
|
22
|
+
const candidates = [
|
|
23
|
+
body,
|
|
24
|
+
document.querySelector("main"),
|
|
25
|
+
document.querySelector("[role='main']"),
|
|
26
|
+
...Array.from(document.querySelectorAll("body > div, body > section")),
|
|
27
|
+
].filter((element) => Boolean(element));
|
|
28
|
+
const latentHeight = candidates.reduce((largest, element) => {
|
|
29
|
+
const rect = element.getBoundingClientRect();
|
|
30
|
+
return Math.max(largest, element.scrollHeight, rect.height, rect.bottom + window.scrollY);
|
|
31
|
+
}, 0);
|
|
32
|
+
const documentHeight = Math.max(document.scrollingElement?.scrollHeight ?? html.scrollHeight, innerHeight);
|
|
33
|
+
const bodyStyle = body ? getComputedStyle(body) : null;
|
|
34
|
+
const htmlStyle = getComputedStyle(html);
|
|
35
|
+
const locked = bodyStyle?.overflow === "hidden" ||
|
|
36
|
+
bodyStyle?.overflowY === "hidden" ||
|
|
37
|
+
htmlStyle.overflow === "hidden" ||
|
|
38
|
+
htmlStyle.overflowY === "hidden";
|
|
39
|
+
return (documentHeight - innerHeight > threshold ||
|
|
40
|
+
(locked && latentHeight > innerHeight * 1.5));
|
|
41
|
+
}, SCROLL_RANGE_THRESHOLD_PX, { timeout: LATENT_CONTENT_OBSERVATION_MS, polling: 100 });
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
return { waited: false, timedOut: false, initial };
|
|
45
|
+
}
|
|
46
|
+
locked = await page.evaluate(readinessSnapshot);
|
|
47
|
+
if (locked.documentScrollRange > SCROLL_RANGE_THRESHOLD_PX) {
|
|
48
|
+
return { waited: true, timedOut: false, initial };
|
|
49
|
+
}
|
|
50
|
+
if (!isTransientScrollLock(locked)) {
|
|
51
|
+
return { waited: false, timedOut: false, initial };
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
try {
|
|
55
|
+
await page.waitForFunction((threshold) => {
|
|
56
|
+
const html = document.documentElement;
|
|
57
|
+
const body = document.body;
|
|
58
|
+
const documentHeight = Math.max(document.scrollingElement?.scrollHeight ?? html.scrollHeight, innerHeight);
|
|
59
|
+
return documentHeight - innerHeight > threshold;
|
|
60
|
+
}, SCROLL_RANGE_THRESHOLD_PX, { timeout: options.timeoutMs ?? DEFAULT_TIMEOUT_MS, polling: 100 });
|
|
61
|
+
return { waited: true, timedOut: false, initial };
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
// A genuine fixed-viewport/virtual page can retain the lock indefinitely.
|
|
65
|
+
// Let normal mode detection handle it after the bounded readiness wait.
|
|
66
|
+
return { waited: true, timedOut: true, initial };
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
export function isTransientScrollLock(snapshot) {
|
|
70
|
+
const nativeRangeMissing = snapshot.documentScrollRange <= SCROLL_RANGE_THRESHOLD_PX;
|
|
71
|
+
const contentIsTallerThanViewport = snapshot.latentContentHeight > snapshot.viewportHeight * 1.5;
|
|
72
|
+
return (nativeRangeMissing &&
|
|
73
|
+
contentIsTallerThanViewport &&
|
|
74
|
+
(snapshot.bodyLocked || snapshot.htmlLocked));
|
|
75
|
+
}
|
|
76
|
+
export function isPotentialScrollLock(snapshot) {
|
|
77
|
+
// A site can install its intro lock and tall layout just after `load`, so a
|
|
78
|
+
// one-viewport document is provisional even before overflow becomes hidden.
|
|
79
|
+
return snapshot.documentScrollRange <= SCROLL_RANGE_THRESHOLD_PX;
|
|
80
|
+
}
|
|
81
|
+
function readinessSnapshot() {
|
|
82
|
+
const html = document.documentElement;
|
|
83
|
+
const body = document.body;
|
|
84
|
+
const bodyStyle = body ? getComputedStyle(body) : null;
|
|
85
|
+
const htmlStyle = getComputedStyle(html);
|
|
86
|
+
const candidates = [
|
|
87
|
+
body,
|
|
88
|
+
document.querySelector("main"),
|
|
89
|
+
document.querySelector("[role='main']"),
|
|
90
|
+
...Array.from(document.querySelectorAll("body > div, body > section")),
|
|
91
|
+
].filter((element) => Boolean(element));
|
|
92
|
+
const latentContentHeight = candidates.reduce((largest, element) => {
|
|
93
|
+
const rect = element.getBoundingClientRect();
|
|
94
|
+
return Math.max(largest, element.scrollHeight, rect.height, rect.bottom + window.scrollY);
|
|
95
|
+
}, 0);
|
|
96
|
+
const documentHeight = Math.max(document.scrollingElement?.scrollHeight ?? html.scrollHeight, innerHeight);
|
|
97
|
+
return {
|
|
98
|
+
viewportHeight: innerHeight,
|
|
99
|
+
documentScrollRange: Math.max(0, documentHeight - innerHeight),
|
|
100
|
+
latentContentHeight,
|
|
101
|
+
bodyLocked: bodyStyle?.overflow === "hidden" || bodyStyle?.overflowY === "hidden",
|
|
102
|
+
htmlLocked: htmlStyle.overflow === "hidden" || htmlStyle.overflowY === "hidden",
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=scrollReadiness.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scrollReadiness.js","sourceRoot":"","sources":["../../src/browser/scrollReadiness.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"urlGuard.d.ts","sourceRoot":"","sources":["../../src/browser/urlGuard.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAQvC,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,WASpE;AAED,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,iBAapE"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { gotoReachablePage } from "./goto.js";
|
|
2
|
+
function normalizePath(pathname) {
|
|
3
|
+
const trimmed = pathname.replace(/\/+$/, "");
|
|
4
|
+
return trimmed || "/";
|
|
5
|
+
}
|
|
6
|
+
export function urlsMatchTarget(currentUrl, targetUrl) {
|
|
7
|
+
const current = new URL(currentUrl);
|
|
8
|
+
const target = new URL(targetUrl);
|
|
9
|
+
const host = (value) => value.hostname.replace(/^www\./, "");
|
|
10
|
+
return (host(current) === host(target) &&
|
|
11
|
+
normalizePath(current.pathname) === normalizePath(target.pathname));
|
|
12
|
+
}
|
|
13
|
+
export async function ensureOnTargetUrl(page, targetUrl) {
|
|
14
|
+
if (urlsMatchTarget(page.url(), targetUrl)) {
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
console.warn(`Page drifted to ${page.url()} — re-navigating to ${targetUrl}`);
|
|
18
|
+
await gotoReachablePage(page, targetUrl);
|
|
19
|
+
await page.evaluate(() => window.scrollTo({ top: 0, left: 0, behavior: "instant" }));
|
|
20
|
+
await page.waitForTimeout(300);
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=urlGuard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"urlGuard.js","sourceRoot":"","sources":["../../src/browser/urlGuard.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAE9C,SAAS,aAAa,CAAC,QAAgB;IACrC,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAC7C,OAAO,OAAO,IAAI,GAAG,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,UAAkB,EAAE,SAAiB;IACnE,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC;IACpC,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC;IAClC,MAAM,IAAI,GAAG,CAAC,KAAU,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IAElE,OAAO,CACL,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC;QAC9B,aAAa,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,aAAa,CAAC,MAAM,CAAC,QAAQ,CAAC,CACnE,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,IAAU,EAAE,SAAiB;IACnE,IAAI,eAAe,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,SAAS,CAAC,EAAE,CAAC;QAC3C,OAAO;IACT,CAAC;IAED,OAAO,CAAC,IAAI,CACV,mBAAmB,IAAI,CAAC,GAAG,EAAE,uBAAuB,SAAS,EAAE,CAChE,CAAC;IACF,MAAM,iBAAiB,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IACzC,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,CACvB,MAAM,CAAC,QAAQ,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,CAC1D,CAAC;IACF,MAAM,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;AACjC,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { Page } from "playwright";
|
|
2
|
+
import type { FrameRecorder } from "../capture/frameRecorder.js";
|
|
3
|
+
import type { MotionSample } from "./motion.js";
|
|
4
|
+
export interface VirtualTimelineOptions {
|
|
5
|
+
viewportWidth: number;
|
|
6
|
+
viewportHeight: number;
|
|
7
|
+
wheelBudget: number;
|
|
8
|
+
samples: MotionSample[];
|
|
9
|
+
frameRecorder?: FrameRecorder;
|
|
10
|
+
signal?: AbortSignal;
|
|
11
|
+
onProgress?: (completedFrames: number, totalFrames: number) => void | Promise<void>;
|
|
12
|
+
}
|
|
13
|
+
/** Drives virtual-scroll pages by cumulative progress, preserving fractional wheel deltas. */
|
|
14
|
+
export declare function runVirtualTimeline(page: Page, options: VirtualTimelineOptions): Promise<Array<{
|
|
15
|
+
file: string;
|
|
16
|
+
progress: number;
|
|
17
|
+
}>>;
|
|
18
|
+
export declare function virtualWheelDelta(samples: MotionSample[], index: number, wheelBudget: number): number;
|
|
19
|
+
//# sourceMappingURL=virtualScroll.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"virtualScroll.d.ts","sourceRoot":"","sources":["../../src/browser/virtualScroll.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,MAAM,WAAW,sBAAsB;IACrC,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,UAAU,CAAC,EAAE,CAAC,eAAe,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACrF;AAED,8FAA8F;AAC9F,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,sBAAsB,GAC9B,OAAO,CAAC,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,CA2CpD;AAED,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,YAAY,EAAE,EACvB,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,UAIpB"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/** Drives virtual-scroll pages by cumulative progress, preserving fractional wheel deltas. */
|
|
2
|
+
export async function runVirtualTimeline(page, options) {
|
|
3
|
+
const centerX = Math.floor(options.viewportWidth / 2);
|
|
4
|
+
const centerY = Math.floor(options.viewportHeight / 2);
|
|
5
|
+
const frames = [];
|
|
6
|
+
const cdp = await page.context().newCDPSession(page);
|
|
7
|
+
await page.mouse.move(centerX, centerY);
|
|
8
|
+
await page.mouse.click(centerX, centerY);
|
|
9
|
+
await cdp.send("Input.dispatchMouseEvent", {
|
|
10
|
+
type: "mouseMoved",
|
|
11
|
+
x: centerX,
|
|
12
|
+
y: centerY,
|
|
13
|
+
});
|
|
14
|
+
for (const [index, sample] of options.samples.entries()) {
|
|
15
|
+
options.signal?.throwIfAborted();
|
|
16
|
+
const deltaY = virtualWheelDelta(options.samples, index, options.wheelBudget);
|
|
17
|
+
if (Math.abs(deltaY) > 1e-6) {
|
|
18
|
+
await cdp.send("Input.dispatchMouseEvent", {
|
|
19
|
+
type: "mouseWheel",
|
|
20
|
+
x: centerX,
|
|
21
|
+
y: centerY,
|
|
22
|
+
deltaX: 0,
|
|
23
|
+
deltaY,
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
await settleVirtualPaint(page);
|
|
27
|
+
if (options.frameRecorder) {
|
|
28
|
+
const frameNumber = options.frameRecorder.getFrameCount();
|
|
29
|
+
await options.frameRecorder.writeFrame(page);
|
|
30
|
+
frames.push({
|
|
31
|
+
file: `frame-${String(frameNumber).padStart(6, "0")}.jpg`,
|
|
32
|
+
progress: sample.position,
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
await page.waitForTimeout(1000 / 30);
|
|
37
|
+
}
|
|
38
|
+
await options.onProgress?.(index + 1, options.samples.length);
|
|
39
|
+
}
|
|
40
|
+
await cdp.detach().catch(() => undefined);
|
|
41
|
+
return frames;
|
|
42
|
+
}
|
|
43
|
+
export function virtualWheelDelta(samples, index, wheelBudget) {
|
|
44
|
+
const previous = index === 0 ? 0 : samples[index - 1].position * wheelBudget;
|
|
45
|
+
return samples[index].position * wheelBudget - previous;
|
|
46
|
+
}
|
|
47
|
+
async function settleVirtualPaint(page) {
|
|
48
|
+
await page.evaluate(() => new Promise((resolve) => requestAnimationFrame(() => requestAnimationFrame(() => resolve()))));
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=virtualScroll.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"virtualScroll.js","sourceRoot":"","sources":["../../src/browser/virtualScroll.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detectMargins.d.ts","sourceRoot":"","sources":["../../src/capture/detectMargins.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAkFD,wBAAsB,kBAAkB,CACtC,SAAS,EAAE,MAAM,EACjB,aAAa,SAAM,GAClB,OAAO,CAAC,YAAY,CAAC,CA2EvB"}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import fs from "node:fs/promises";
|
|
3
|
+
import os from "node:os";
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
const COLOR_DIFF_THRESHOLD = 30;
|
|
6
|
+
const MIN_ACTIVE_RATIO = 0.02;
|
|
7
|
+
const MAX_MARGIN_RATIO = 0.12;
|
|
8
|
+
async function probeVideoSize(inputPath) {
|
|
9
|
+
return new Promise((resolve) => {
|
|
10
|
+
const child = spawn("ffprobe", [
|
|
11
|
+
"-v",
|
|
12
|
+
"error",
|
|
13
|
+
"-select_streams",
|
|
14
|
+
"v:0",
|
|
15
|
+
"-show_entries",
|
|
16
|
+
"stream=width,height",
|
|
17
|
+
"-of",
|
|
18
|
+
"csv=p=0:s=x",
|
|
19
|
+
inputPath,
|
|
20
|
+
]);
|
|
21
|
+
let stdout = "";
|
|
22
|
+
child.stdout.on("data", (chunk) => {
|
|
23
|
+
stdout += chunk.toString();
|
|
24
|
+
});
|
|
25
|
+
child.on("error", () => resolve(null));
|
|
26
|
+
child.on("close", (code) => {
|
|
27
|
+
if (code !== 0)
|
|
28
|
+
return resolve(null);
|
|
29
|
+
const [width, height] = stdout.trim().split("x").map(Number);
|
|
30
|
+
if (!width || !height)
|
|
31
|
+
return resolve(null);
|
|
32
|
+
resolve({ width, height });
|
|
33
|
+
});
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
function columnActive(buffer, width, height, x, bg) {
|
|
37
|
+
const step = 4;
|
|
38
|
+
const samples = Math.ceil(height / step);
|
|
39
|
+
let active = 0;
|
|
40
|
+
for (let y = 0; y < height; y += step) {
|
|
41
|
+
const offset = (y * width + x) * 3;
|
|
42
|
+
const diff = Math.abs(buffer[offset] - bg[0]) +
|
|
43
|
+
Math.abs(buffer[offset + 1] - bg[1]) +
|
|
44
|
+
Math.abs(buffer[offset + 2] - bg[2]);
|
|
45
|
+
if (diff > COLOR_DIFF_THRESHOLD) {
|
|
46
|
+
active += 1;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return active / samples >= MIN_ACTIVE_RATIO;
|
|
50
|
+
}
|
|
51
|
+
function rowActive(buffer, width, height, y, bg) {
|
|
52
|
+
const step = 4;
|
|
53
|
+
const samples = Math.ceil(width / step);
|
|
54
|
+
let active = 0;
|
|
55
|
+
for (let x = 0; x < width; x += step) {
|
|
56
|
+
const offset = (y * width + x) * 3;
|
|
57
|
+
const diff = Math.abs(buffer[offset] - bg[0]) +
|
|
58
|
+
Math.abs(buffer[offset + 1] - bg[1]) +
|
|
59
|
+
Math.abs(buffer[offset + 2] - bg[2]);
|
|
60
|
+
if (diff > COLOR_DIFF_THRESHOLD) {
|
|
61
|
+
active += 1;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return active / samples >= MIN_ACTIVE_RATIO;
|
|
65
|
+
}
|
|
66
|
+
export async function detectVideoMargins(videoPath, sampleTimeSec = 0.5) {
|
|
67
|
+
const size = await probeVideoSize(videoPath);
|
|
68
|
+
if (!size) {
|
|
69
|
+
return { right: 0, bottom: 0 };
|
|
70
|
+
}
|
|
71
|
+
const { width, height } = size;
|
|
72
|
+
const rawPath = path.join(os.tmpdir(), `websiterecorder-margin-${process.pid}-${Date.now()}.raw`);
|
|
73
|
+
try {
|
|
74
|
+
await runFfmpeg([
|
|
75
|
+
"-y",
|
|
76
|
+
"-ss",
|
|
77
|
+
String(sampleTimeSec),
|
|
78
|
+
"-i",
|
|
79
|
+
videoPath,
|
|
80
|
+
"-frames:v",
|
|
81
|
+
"1",
|
|
82
|
+
"-f",
|
|
83
|
+
"rawvideo",
|
|
84
|
+
"-pix_fmt",
|
|
85
|
+
"rgb24",
|
|
86
|
+
rawPath,
|
|
87
|
+
]);
|
|
88
|
+
const buffer = await fs.readFile(rawPath);
|
|
89
|
+
const expected = width * height * 3;
|
|
90
|
+
if (buffer.length < expected) {
|
|
91
|
+
return { right: 0, bottom: 0 };
|
|
92
|
+
}
|
|
93
|
+
const bgOffset = ((height - 1) * width + (width - 1)) * 3;
|
|
94
|
+
const bg = [
|
|
95
|
+
buffer[bgOffset],
|
|
96
|
+
buffer[bgOffset + 1],
|
|
97
|
+
buffer[bgOffset + 2],
|
|
98
|
+
];
|
|
99
|
+
let contentMaxX = 0;
|
|
100
|
+
for (let x = 0; x < width; x += 1) {
|
|
101
|
+
if (columnActive(buffer, width, height, x, bg)) {
|
|
102
|
+
contentMaxX = x;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
let contentMaxY = 0;
|
|
106
|
+
for (let y = 0; y < height; y += 1) {
|
|
107
|
+
if (rowActive(buffer, width, height, y, bg)) {
|
|
108
|
+
contentMaxY = y;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
const right = Math.max(0, width - 1 - contentMaxX);
|
|
112
|
+
const bottom = Math.max(0, height - 1 - contentMaxY);
|
|
113
|
+
if (right > width * MAX_MARGIN_RATIO ||
|
|
114
|
+
bottom > height * MAX_MARGIN_RATIO) {
|
|
115
|
+
return { right: 0, bottom: 0 };
|
|
116
|
+
}
|
|
117
|
+
if (right < 3 && bottom < 3) {
|
|
118
|
+
return { right: 0, bottom: 0 };
|
|
119
|
+
}
|
|
120
|
+
return { right, bottom };
|
|
121
|
+
}
|
|
122
|
+
catch {
|
|
123
|
+
return { right: 0, bottom: 0 };
|
|
124
|
+
}
|
|
125
|
+
finally {
|
|
126
|
+
await fs.unlink(rawPath).catch(() => undefined);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
function runFfmpeg(args) {
|
|
130
|
+
return new Promise((resolve, reject) => {
|
|
131
|
+
const child = spawn("ffmpeg", args, { stdio: ["ignore", "pipe", "pipe"] });
|
|
132
|
+
let stderr = "";
|
|
133
|
+
child.stderr.on("data", (chunk) => {
|
|
134
|
+
stderr += chunk.toString();
|
|
135
|
+
});
|
|
136
|
+
child.on("error", reject);
|
|
137
|
+
child.on("close", (code) => {
|
|
138
|
+
if (code === 0)
|
|
139
|
+
resolve();
|
|
140
|
+
else
|
|
141
|
+
reject(new Error(`ffmpeg exited with code ${code}: ${stderr.slice(-2000)}`));
|
|
142
|
+
});
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
//# sourceMappingURL=detectMargins.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detectMargins.js","sourceRoot":"","sources":["../../src/capture/detectMargins.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { Page } from "playwright";
|
|
2
|
+
export interface FrameRecorderOptions {
|
|
3
|
+
outputDir: string;
|
|
4
|
+
fps?: number;
|
|
5
|
+
scaleFactor?: number;
|
|
6
|
+
qualityJpeg?: number;
|
|
7
|
+
parallelWorkers?: number;
|
|
8
|
+
beforeCapture?: (frameNumber: number) => Promise<void>;
|
|
9
|
+
}
|
|
10
|
+
export declare class FrameRecorder {
|
|
11
|
+
private frameCount;
|
|
12
|
+
private outputDir;
|
|
13
|
+
private fps;
|
|
14
|
+
private scaleFactor;
|
|
15
|
+
private qualityJpeg;
|
|
16
|
+
private parallelWorkers;
|
|
17
|
+
private beforeCapture?;
|
|
18
|
+
private captureQueue;
|
|
19
|
+
private activeCaptures;
|
|
20
|
+
constructor(options: FrameRecorderOptions);
|
|
21
|
+
writeFrame(page: Page): Promise<void>;
|
|
22
|
+
private processQueue;
|
|
23
|
+
private captureFrame;
|
|
24
|
+
getFrameCount(): number;
|
|
25
|
+
getFps(): number;
|
|
26
|
+
getScaleFactor(): number;
|
|
27
|
+
setBeforeCapture(beforeCapture: (frameNumber: number) => Promise<void>): void;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=frameRecorder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"frameRecorder.d.ts","sourceRoot":"","sources":["../../src/capture/frameRecorder.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAEvC,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACxD;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,eAAe,CAAS;IAChC,OAAO,CAAC,aAAa,CAAC,CAAyC;IAC/D,OAAO,CAAC,YAAY,CAKZ;IACR,OAAO,CAAC,cAAc,CAAK;gBAEf,OAAO,EAAE,oBAAoB;IASnC,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;YAY7B,YAAY;YAgBZ,YAAY;IA0B1B,aAAa,IAAI,MAAM;IAIvB,MAAM,IAAI,MAAM;IAIhB,cAAc,IAAI,MAAM;IAIxB,gBAAgB,CAAC,aAAa,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC;CAGvE"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import fs from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
export class FrameRecorder {
|
|
4
|
+
frameCount = 0;
|
|
5
|
+
outputDir;
|
|
6
|
+
fps;
|
|
7
|
+
scaleFactor;
|
|
8
|
+
qualityJpeg;
|
|
9
|
+
parallelWorkers;
|
|
10
|
+
beforeCapture;
|
|
11
|
+
captureQueue = [];
|
|
12
|
+
activeCaptures = 0;
|
|
13
|
+
constructor(options) {
|
|
14
|
+
this.outputDir = options.outputDir;
|
|
15
|
+
this.fps = options.fps ?? 60;
|
|
16
|
+
this.scaleFactor = options.scaleFactor ?? 1;
|
|
17
|
+
this.qualityJpeg = options.qualityJpeg ?? 95;
|
|
18
|
+
this.parallelWorkers = options.parallelWorkers ?? 2;
|
|
19
|
+
this.beforeCapture = options.beforeCapture;
|
|
20
|
+
}
|
|
21
|
+
async writeFrame(page) {
|
|
22
|
+
return new Promise((resolve, reject) => {
|
|
23
|
+
this.captureQueue.push({
|
|
24
|
+
frameNum: this.frameCount++,
|
|
25
|
+
page,
|
|
26
|
+
resolve,
|
|
27
|
+
reject,
|
|
28
|
+
});
|
|
29
|
+
this.processQueue();
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
async processQueue() {
|
|
33
|
+
while (this.activeCaptures < this.parallelWorkers &&
|
|
34
|
+
this.captureQueue.length > 0) {
|
|
35
|
+
const task = this.captureQueue.shift();
|
|
36
|
+
if (!task)
|
|
37
|
+
break;
|
|
38
|
+
this.activeCaptures++;
|
|
39
|
+
this.captureFrame(task).finally(() => {
|
|
40
|
+
this.activeCaptures--;
|
|
41
|
+
this.processQueue();
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
async captureFrame(task) {
|
|
46
|
+
try {
|
|
47
|
+
await this.beforeCapture?.(task.frameNum);
|
|
48
|
+
const framePath = path.join(this.outputDir, `frame-${String(task.frameNum).padStart(6, "0")}.jpg`);
|
|
49
|
+
const buffer = await task.page.screenshot({
|
|
50
|
+
type: "jpeg",
|
|
51
|
+
quality: this.qualityJpeg,
|
|
52
|
+
fullPage: false,
|
|
53
|
+
});
|
|
54
|
+
await fs.writeFile(framePath, buffer);
|
|
55
|
+
task.resolve();
|
|
56
|
+
}
|
|
57
|
+
catch (error) {
|
|
58
|
+
task.reject(error);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
getFrameCount() {
|
|
62
|
+
return this.frameCount;
|
|
63
|
+
}
|
|
64
|
+
getFps() {
|
|
65
|
+
return this.fps;
|
|
66
|
+
}
|
|
67
|
+
getScaleFactor() {
|
|
68
|
+
return this.scaleFactor;
|
|
69
|
+
}
|
|
70
|
+
setBeforeCapture(beforeCapture) {
|
|
71
|
+
this.beforeCapture = beforeCapture;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=frameRecorder.js.map
|