pup-recorder 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 CHANGED
@@ -1,4 +1,4 @@
1
- # pup(1) -- High-performance webview recorder
1
+ # pup(1)
2
2
 
3
3
  ## NAME
4
4
 
@@ -6,90 +6,83 @@ pup - record web pages as video
6
6
 
7
7
  ## SYNOPSIS
8
8
 
9
- **pup** \<source\> [**-w** _width_] [**-h** _height_] [**-f** _fps_] [**-t** _duration_] [**-o** _dir_] [**-a**] [**--use-inner-proxy**]
9
+ ```
10
+ pup <source> [-w width] [-h height] [-f fps] [-t duration] [-o dir] [-a]
11
+ pup-mcp-server
12
+ ```
10
13
 
11
14
  ## DESCRIPTION
12
15
 
13
- **pup** captures a web page as video using Electron offscreen rendering.
16
+ Captures web pages as video using Electron offscreen rendering. Outputs MP4
17
+ by default; with `-a` outputs WebM (VP9) and MOV (HEVC alpha).
14
18
 
15
- Without **-a**, produces MP4 (H.264). With **-a**, produces WebM (VP9) and
16
- MOV (HEVC with alpha channel). A cover image (PNG) is extracted from the
17
- first frame.
19
+ `pup-mcp-server` exposes pup as an MCP tool for AI assistants.
18
20
 
19
21
  ## OPTIONS
20
22
 
21
- - **\<source\>**
22
- URL or HTML string to record.
23
-
24
- - **-w**, **--width** _number_
25
- Video width. Default: 1920.
26
-
27
- - **-h**, **--height** _number_
28
- Video height. Default: 1080.
29
-
30
- - **-f**, **--fps** _number_
31
- Frames per second. Default: 30.
32
-
33
- - **-t**, **--duration** _number_
34
- Recording duration in seconds. Default: 5.
35
-
36
- - **-o**, **--out-dir** _path_
37
- Output directory. Default: out.
38
-
39
- - **-a**, **--with-alpha-channel**
40
- Produce WebM + MOV with alpha channel instead of MP4.
41
-
42
- - **--use-inner-proxy**
43
- Use Bilibili internal proxy. Default: `$PUP_USE_INNER_PROXY`.
23
+ ```
24
+ <source> file://, http(s)://, or data: URI
25
+ -w, --width <n> default 1920
26
+ -h, --height <n> default 1080
27
+ -f, --fps <n> default 30
28
+ -t, --duration <n> seconds, default 5
29
+ -o, --out-dir <path> default "out"
30
+ -a, --with-alpha-channel
31
+ --use-inner-proxy bilibili internal proxy
32
+ ```
44
33
 
45
34
  ## ENVIRONMENT
46
35
 
47
- - `PUP_LOG_LEVEL` (default: 2)
48
- 0=error, 1=warn, 2=info, 3=debug.
49
-
50
- - `PUP_USE_INNER_PROXY` (default: 0)
51
- Set to 1 to enable Bilibili internal proxy.
52
-
53
- - `FFMPEG_BIN` (default: ffmpeg)
54
- Path to FFmpeg binary.
36
+ ```
37
+ PUP_LOG_LEVEL 0=error 1=warn 2=info 3=debug, default 2
38
+ PUP_USE_INNER_PROXY 1=on, default 0
39
+ FFMPEG_BIN default "ffmpeg"
40
+ ```
55
41
 
56
42
  ## API
57
43
 
58
44
  ```typescript
59
- import { pup, type PupOptions } from "pup-recorder";
60
-
61
- const result = await pup("https://example.com", {
62
- width: 1920,
63
- height: 1080,
64
- fps: 30,
65
- duration: 5,
66
- outDir: "out",
67
- withAlphaChannel: false,
68
- onProgress: (progress) => console.log(progress),
69
- });
45
+ import { pup } from "pup-recorder";
46
+
47
+ const { mp4, cover, width, height, fps, duration } = await pup(
48
+ "https://example.com",
49
+ {
50
+ width: 1920,
51
+ height: 1080,
52
+ fps: 30,
53
+ duration: 5,
54
+ withAlphaChannel: false,
55
+ },
56
+ );
70
57
  ```
71
58
 
72
- **PupOptions**: `width`, `height`, `fps`, `duration`, `outDir`,
73
- `withAlphaChannel`, `cancelQuery`, `onProgress`.
59
+ Returns `{ mp4?, webm?, mov?, cover, width, height, fps, duration }`.
74
60
 
75
- **Returns**: `{ mp4?, webm?, mov?, cover, width, height, fps, duration }`.
61
+ ## AI INTEGRATION
62
+
63
+ Supports MCP and OpenCode.
76
64
 
77
65
  ## FILES
78
66
 
79
- bin/pup.js CLI entry point
80
- dist/index.js Library entry point
81
- rust/*.node Precompiled native binaries
82
- x265/* Precompiled x265 binaries
67
+ ```
68
+ dist/cli.js CLI
69
+ dist/mcp_server.js MCP server
70
+ dist/index.js library
71
+ rust/*.node native module
72
+ x265/* x265 binaries
73
+ ```
83
74
 
84
75
  ## EXAMPLES
85
76
 
86
- pup https://example.com -w 1280 -h 720 -t 5
87
- pup "file:///path/to/page.html" -a
88
- pup https://example.com -f 60 -o ./output
77
+ ```
78
+ pup https://example.com -t 5
79
+ pup file:///path/to/page.html -a
80
+ pup https://example.com -w 1280 -h 720 -f 60
81
+ ```
89
82
 
90
83
  ## SEE ALSO
91
84
 
92
- **pup-server**(1), **pup**(7)
85
+ pup-server(1), pup(7)
93
86
 
94
87
  ## AUTHOR
95
88
 
package/build.ts CHANGED
@@ -1,55 +1,56 @@
1
- // Created by Autokaka (qq1909698494@gmail.com) on 2026/01/30.
2
-
3
1
  import { $ } from "bun";
4
- import { build } from "esbuild";
5
- import { mkdir, rm } from "fs/promises";
2
+ import { rm } from "fs/promises";
6
3
  import { createRequire } from "module";
7
4
  import { join } from "path";
5
+ import { build } from "tsup";
8
6
 
9
7
  const require = createRequire(import.meta.url);
10
8
  const tsPath = require.resolve("@typescript/native-preview/package.json");
11
- const dtsbPath = require.resolve("dts-bundle-generator");
12
-
13
9
  const tsgo = join(tsPath, "..", "bin", "tsgo.js");
14
- const dtsb = join(dtsbPath, "..", "bin", "dts-bundle-generator.js");
15
10
 
16
- const common = {
17
- platform: "node",
18
- packages: "external",
19
- bundle: true,
20
- sourcemap: true,
21
- } as const;
11
+ await $`${tsgo}`;
22
12
 
23
- try {
24
- await $`${tsgo}`;
13
+ await Promise.all([
14
+ rm("dist", { recursive: true, force: true }),
15
+ rm(".opencode/plugins", { recursive: true, force: true }),
16
+ ]);
25
17
 
26
- await rm("dist", { recursive: true, force: true });
27
- await mkdir("dist", { recursive: true });
18
+ const common = {
19
+ silent: true,
20
+ splitting: false,
21
+ target: "node20",
22
+ sourcemap: true,
23
+ shims: true,
24
+ external: [
25
+ "electron",
26
+ "commander",
27
+ "@modelcontextprotocol/sdk",
28
+ "@opencode-ai/plugin",
29
+ "zod",
30
+ ],
31
+ };
28
32
 
29
- await Promise.all([
30
- // library tsd
31
- $`${dtsb} --silent -o dist/index.d.ts src/index.ts`,
32
- build({
33
- ...common,
34
- entryPoints: [
35
- "src/index.ts", // library
36
- "src/cli.ts", // cli
37
- ],
38
- format: "esm",
39
- outdir: "dist",
40
- }),
41
- build({
42
- ...common,
43
- entryPoints: [
44
- "src/index.ts", // library
45
- "src/cli.ts", // cli
46
- "src/app.ts", // electron app
47
- ],
48
- format: "cjs",
49
- outdir: "dist/cjs",
50
- outExtension: { ".js": ".cjs" },
51
- }),
52
- ]);
53
- } catch {
54
- process.exit(1);
55
- }
33
+ await Promise.all([
34
+ build({
35
+ ...common,
36
+ entry: [
37
+ "src/index.ts", //
38
+ "src/cli.ts",
39
+ "src/mcp_server.ts",
40
+ ],
41
+ format: "esm",
42
+ outDir: "dist",
43
+ dts: true,
44
+ }),
45
+ build({
46
+ ...common,
47
+ entry: [
48
+ "src/index.ts", //
49
+ "src/cli.ts",
50
+ "src/mcp_server.ts",
51
+ "src/app.ts",
52
+ ],
53
+ format: "cjs",
54
+ outDir: "dist/cjs",
55
+ }),
56
+ ]);
package/dist/cjs/app.cjs CHANGED
@@ -22,6 +22,10 @@ var __toESM = (mod2, isNodeMode, target) => (target = mod2 != null ? __create(__
22
22
  mod2
23
23
  ));
24
24
 
25
+ // ../../node_modules/.bun/tsup@8.5.1+3f29b90437d001ad/node_modules/tsup/assets/cjs_shims.js
26
+ var getImportMetaUrl = () => typeof document === "undefined" ? new URL(`file:${__filename}`).href : document.currentScript && document.currentScript.tagName.toUpperCase() === "SCRIPT" ? document.currentScript.src : new URL("main.js", document.baseURI).href;
27
+ var importMetaUrl = /* @__PURE__ */ getImportMetaUrl();
28
+
25
29
  // src/app.ts
26
30
  var import_electron4 = require("electron");
27
31
 
@@ -30,7 +34,12 @@ var import_electron = __toESM(require("electron"), 1);
30
34
 
31
35
  // src/base/constants.ts
32
36
  var import_fs = require("fs");
37
+ var import_path2 = require("path");
38
+
39
+ // src/base/basedir.ts
33
40
  var import_path = require("path");
41
+ var import_url = require("url");
42
+ var basedir = (0, import_path.dirname)((0, import_url.fileURLToPath)(importMetaUrl));
34
43
 
35
44
  // src/base/env.ts
36
45
  function penv(name, parser, defaultValue) {
@@ -55,11 +64,11 @@ function parseNumber(value) {
55
64
 
56
65
  // src/base/constants.ts
57
66
  var pupAppSearchPaths = [
58
- (0, import_path.resolve)(__dirname, "cjs/app.cjs"),
67
+ (0, import_path2.join)(basedir, "cjs/app.cjs"),
59
68
  // process from dist
60
- (0, import_path.resolve)(__dirname, "app.cjs"),
69
+ (0, import_path2.join)(basedir, "app.cjs"),
61
70
  // process from dist/cjs
62
- (0, import_path.resolve)(__dirname, "../../cjs/app.cjs")
71
+ (0, import_path2.join)(basedir, "../../cjs/app.cjs")
63
72
  // process from src
64
73
  ];
65
74
  var pupAppPath = pupAppSearchPaths.find(import_fs.existsSync);
@@ -124,7 +133,7 @@ var Logger = class {
124
133
  }
125
134
  }
126
135
  attach(proc, name) {
127
- return new Promise((resolve2, reject) => {
136
+ return new Promise((resolve, reject) => {
128
137
  this.debug(`${name}.attach`);
129
138
  let fatal = "";
130
139
  const dispatch = (data) => {
@@ -147,7 +156,7 @@ var Logger = class {
147
156
  reject(new Error(fatal));
148
157
  } else {
149
158
  this.debug(`${name}.close`);
150
- resolve2();
159
+ resolve();
151
160
  }
152
161
  }).on("unhandledRejection", (reason) => {
153
162
  this.error(`${name}.unhandled`, reason);
@@ -201,17 +210,17 @@ var ELECTRON_OPTS = [
201
210
  // src/base/record.ts
202
211
  var import_electron3 = require("electron");
203
212
  var import_promises2 = require("fs/promises");
204
- var import_path3 = require("path");
213
+ var import_path4 = require("path");
205
214
 
206
215
  // src/rust/lib.ts
207
216
  var import_fs2 = require("fs");
208
- var import_path2 = require("path");
217
+ var import_path3 = require("path");
209
218
  var { platform, arch } = process;
210
219
  var rustPath = `rust/${platform}-${arch}.node`;
211
220
  var nativeSearchPaths = [
212
- (0, import_path2.join)(__dirname, `../../${rustPath}`),
221
+ (0, import_path3.join)(basedir, `../../${rustPath}`),
213
222
  // process start from src
214
- (0, import_path2.join)(__dirname, `../${rustPath}`)
223
+ (0, import_path3.join)(basedir, `../${rustPath}`)
215
224
  // process start from dist
216
225
  ];
217
226
  var mod = require(nativeSearchPaths.find(import_fs2.existsSync));
@@ -392,7 +401,7 @@ var import_promises = require("timers/promises");
392
401
 
393
402
  // src/base/timing.ts
394
403
  function sleep(ms) {
395
- return new Promise((resolve2) => setTimeout(resolve2, ms));
404
+ return new Promise((resolve) => setTimeout(resolve, ms));
396
405
  }
397
406
 
398
407
  // src/base/retry.ts
@@ -468,11 +477,11 @@ async function loadWindow(source, options) {
468
477
  const wrapperHTML = buildWrapperHTML(src, { width, height });
469
478
  const dataURL = `data:text/html;charset=utf-8,${encodeURIComponent(wrapperHTML)}`;
470
479
  let token;
471
- await new Promise((resolve2, reject) => {
480
+ await new Promise((resolve, reject) => {
472
481
  token = setTimeout(() => {
473
482
  reject(new Error("load window timeout"));
474
483
  }, 20 * 1e3);
475
- win.webContents.once("did-finish-load", resolve2);
484
+ win.webContents.once("did-finish-load", resolve);
476
485
  win.webContents.once("did-fail-load", (_event, code, desc, url) => {
477
486
  reject(new Error(`failed to load ${url}: [${code}] ${desc}`));
478
487
  });
@@ -499,7 +508,7 @@ async function record(source, options) {
499
508
  if (!win.webContents.isPainting()) {
500
509
  win.webContents.startPainting();
501
510
  }
502
- const bgraPath = (0, import_path3.join)(outDir, "output.bgra");
511
+ const bgraPath = (0, import_path4.join)(outDir, "output.bgra");
503
512
  const total = Math.ceil(fps * duration);
504
513
  const frameInterval = 1e3 / fps;
505
514
  const bufferSize = width * height * 4;
@@ -574,7 +583,7 @@ async function record(source, options) {
574
583
  }
575
584
  try {
576
585
  const result = { options, written, bgraPath };
577
- await (0, import_promises2.writeFile)((0, import_path3.join)(outDir, "record.json"), JSON.stringify(result));
586
+ await (0, import_promises2.writeFile)((0, import_path4.join)(outDir, "record.json"), JSON.stringify(result));
578
587
  logger.info(TAG2, `progress: 100%, ${written} frames written`);
579
588
  } finally {
580
589
  win.close();
@@ -599,12 +608,24 @@ function noerr(fn, defaultValue) {
599
608
  };
600
609
  }
601
610
 
602
- // src/common.ts
611
+ // src/base/schema.ts
612
+ var import_zod = __toESM(require("zod"), 1);
603
613
  var DEFAULT_WIDTH = 1920;
604
614
  var DEFAULT_HEIGHT = 1080;
605
615
  var DEFAULT_FPS = 30;
606
616
  var DEFAULT_DURATION = 5;
607
617
  var DEFAULT_OUT_DIR = "out";
618
+ var RecordSchema = import_zod.default.object({
619
+ duration: import_zod.default.number().optional().default(DEFAULT_DURATION).describe("Recording duration in seconds"),
620
+ width: import_zod.default.number().optional().default(DEFAULT_WIDTH).describe("Video width"),
621
+ height: import_zod.default.number().optional().default(DEFAULT_HEIGHT).describe("Video height"),
622
+ fps: import_zod.default.number().optional().default(DEFAULT_FPS).describe("Frames per second"),
623
+ withAlphaChannel: import_zod.default.boolean().optional().default(false).describe("Output with alpha channel"),
624
+ outDir: import_zod.default.string().optional().default(DEFAULT_OUT_DIR).describe("Output directory"),
625
+ useInnerProxy: import_zod.default.boolean().optional().default(false).describe("Use bilibili inner proxy for resource access")
626
+ });
627
+
628
+ // src/common.ts
608
629
  function makeCLI(name, callback) {
609
630
  import_commander.program.name(name).argument("<source>", "file://, http(s)://, \u6216 data: URI").option("-w, --width <number>", "\u89C6\u9891\u5BBD\u5EA6", `${DEFAULT_WIDTH}`).option("-h, --height <number>", "\u89C6\u9891\u9AD8\u5EA6", `${DEFAULT_HEIGHT}`).option("-f, --fps <number>", "\u5E27\u7387", `${DEFAULT_FPS}`).option("-t, --duration <number>", "\u5F55\u5236\u65F6\u957F\uFF08\u79D2\uFF09", `${DEFAULT_DURATION}`).option("-o, --out-dir <path>", "\u8F93\u51FA\u76EE\u5F55", `${DEFAULT_OUT_DIR}`).option("-a, --with-alpha-channel", "\u8F93\u51FA\u5305\u542B alpha \u901A\u9053\u7684\u89C6\u9891", false).option(
610
631
  "--use-inner-proxy",
@@ -640,4 +661,4 @@ makeCLI("app", async (source, options) => {
640
661
  import_electron4.app.quit();
641
662
  }
642
663
  });
643
- //# sourceMappingURL=app.cjs.map
664
+ //# sourceMappingURL=app.cjs.map
@@ -1,7 +1 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/app.ts", "../../src/base/electron.ts", "../../src/base/constants.ts", "../../src/base/env.ts", "../../src/base/parser.ts", "../../src/base/logging.ts", "../../src/base/process.ts", "../../src/base/record.ts", "../../src/rust/lib.ts", "../../src/base/frame_sync.ts", "../../src/base/html_check.ts", "../../src/base/image.ts", "../../src/base/proxy.ts", "../../src/base/retry.ts", "../../src/base/timing.ts", "../../src/common.ts", "../../src/base/noerr.ts"],
4
- "sourcesContent": ["// Created by Autokaka (qq1909698494@gmail.com) on 2026/01/30.\n\nimport { app } from \"electron\";\nimport { ELECTRON_OPTS } from \"./base/electron\";\nimport { record, type RecordOptions } from \"./base/record\";\nimport { makeCLI } from \"./common\";\n\nprocess.once(\"exit\", () => app.quit());\n\nmakeCLI(\"app\", async (source: string, options: RecordOptions) => {\n try {\n ELECTRON_OPTS.forEach((o) => app.commandLine.appendSwitch(o));\n app.dock?.hide();\n await app.whenReady();\n await record(source, options);\n } finally {\n app.quit();\n }\n});\n", "// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/25.\n\nimport electron, { type Size } from \"electron\";\nimport { exec } from \"./process\";\n\nexport const ELECTRON_OPTS = [\n \"no-sandbox\",\n \"disable-setuid-sandbox\",\n \"disable-gpu\",\n \"disable-dev-shm-usage\",\n \"disable-software-rasterizer\",\n \"disable-web-security\",\n \"disable-site-isolation-trials\",\n \"disable-features=IsolateOrigins,site-per-process\",\n \"allow-insecure-localhost\",\n \"ignore-certificate-errors\",\n \"disable-blink-features=AutomationControlled\",\n \"mute-audio\",\n \"disable-extensions\",\n \"disable-background-networking\",\n \"address-family=ipv4\",\n \"disable-async-dns\",\n \"force-device-scale-factor=1\",\n \"trace-warnings\",\n \"force-color-profile=srgb\",\n \"disable-color-correct-rendering\",\n \"log-level=3\",\n];\n\nexport function runElectronApp(size: Size, app: unknown, args: unknown[]) {\n const electronArgs = ELECTRON_OPTS.map((a) => `--${a}`);\n const cmdParts = [];\n if (process.platform === \"linux\") {\n cmdParts.push(\n \"xvfb-run\",\n \"--auto-servernum\",\n `--server-args='-screen 0 ${size.width}x${size.height}x24'`,\n );\n }\n cmdParts.push(electron, ...electronArgs, app);\n return exec(cmdParts.join(\" \"), {\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n shell: true,\n env: {\n ...process.env,\n ELECTRON_DISABLE_DBUS: \"1\",\n RUST_BACKTRACE: \"full\",\n __PUP_ARGS__: JSON.stringify(args),\n },\n });\n}\n", "// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/09.\n\nimport { existsSync } from \"fs\";\nimport { resolve } from \"path\";\nimport { penv } from \"./env\";\nimport { parseNumber } from \"./parser\";\n\nconst pupAppSearchPaths = [\n resolve(__dirname, \"cjs/app.cjs\"), // process from dist\n resolve(__dirname, \"app.cjs\"), // process from dist/cjs\n resolve(__dirname, \"../../cjs/app.cjs\"), // process from src\n];\nexport const pupAppPath = pupAppSearchPaths.find(existsSync)!;\n\nconst env = process.env;\nexport const pupLogLevel = penv(\"PUP_LOG_LEVEL\", parseNumber, 2);\nexport const pupUseInnerProxy = env[\"PUP_USE_INNER_PROXY\"] === \"1\";\nexport const pupFFmpegPath = env[\"FFMPEG_BIN\"] ?? `ffmpeg`;\n", "// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/25.\n\nexport type EnvParser<T> = (value: unknown) => T;\n\nexport function penv<T>(name: string, parser: EnvParser<T>, defaultValue: T): T;\nexport function penv<T>(\n name: string,\n parser: EnvParser<T>,\n defaultValue?: T,\n): T | undefined;\nexport function penv<T>(\n name: string,\n parser: EnvParser<T>,\n defaultValue?: T,\n): T | undefined {\n try {\n return parser(process.env[name]);\n } catch {\n return defaultValue;\n }\n}\n", "// Created by Autokaka (qq1909698494@gmail.com) on 2026/01/30.\n\nexport function parseNumber(value: unknown): number {\n if (typeof value === \"number\") {\n return value;\n }\n const num = Number(value);\n if (Number.isNaN(num)) {\n throw new Error(`Value ${value} is not a valid number`);\n }\n return num;\n}\n", "// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/06.\n\nimport { ChildProcess, type Serializable } from \"child_process\";\nimport { pupLogLevel } from \"./constants\";\n\nexport interface LoggerLike {\n debug?(this: void, ...messages: unknown[]): void;\n\n info?(this: void, ...messages: unknown[]): void;\n\n warn?(this: void, ...messages: unknown[]): void;\n\n error?(this: void, ...messages: unknown[]): void;\n}\n\nconst DEBUG = \"<pup@debug>\";\nconst INFO = \"<pup@info>\";\nconst WARN = \"<pup@warn>\";\nconst ERROR = \"<pup@error>\";\nconst FATAL = \"<pup@fatal>\";\n\nclass Logger implements LoggerLike {\n private _impl?: LoggerLike;\n\n get impl(): LoggerLike | undefined {\n return this._impl;\n }\n\n set impl(value: LoggerLike) {\n const debug = value.debug ?? console.debug;\n const info = value.info ?? console.info;\n const warn = value.warn ?? console.warn;\n const error = value.error ?? console.error;\n this._impl = {\n debug: pupLogLevel >= 3 ? debug : undefined,\n info: pupLogLevel >= 2 ? info : undefined,\n warn: pupLogLevel >= 1 ? warn : undefined,\n error: pupLogLevel >= 0 ? error : undefined,\n };\n }\n\n constructor() {\n this.impl = console;\n }\n\n debug(...messages: unknown[]): void {\n this.impl?.debug?.(DEBUG, ...messages);\n }\n\n info(...messages: unknown[]): void {\n this.impl?.info?.(INFO, ...messages);\n }\n\n warn(...messages: unknown[]): void {\n this.impl?.warn?.(WARN, ...messages);\n }\n\n error(...messages: unknown[]): void {\n this.impl?.error?.(ERROR, ...messages);\n }\n\n fatal(...messages: unknown[]): never {\n this.impl?.error?.(FATAL, ...messages);\n process.exit(1);\n }\n\n private dispatch(message: string) {\n if (message.startsWith(DEBUG)) {\n this.debug(message.slice(DEBUG.length + 1));\n } else if (message.startsWith(INFO)) {\n this.info(message.slice(INFO.length + 1));\n } else if (message.startsWith(WARN)) {\n this.warn(message.slice(WARN.length + 1));\n } else if (message.startsWith(ERROR)) {\n this.error(message.slice(ERROR.length + 1));\n } else {\n this.info(message);\n }\n }\n\n attach(proc: ChildProcess, name: string) {\n return new Promise<void>((resolve, reject) => {\n this.debug(`${name}.attach`);\n let fatal: string = \"\";\n const dispatch = (data: Buffer | Serializable) => {\n const message = data.toString();\n if (message.startsWith(FATAL)) {\n fatal += message.slice(FATAL.length + 1);\n } else {\n this.dispatch(message);\n }\n };\n proc.stderr?.on(\"data\", dispatch);\n proc.stdout?.on(\"data\", dispatch);\n proc\n .on(\"message\", dispatch)\n .on(\"error\", (err) => {\n fatal += err.message;\n proc.kill();\n })\n .once(\"close\", (code, signal) => {\n if (code || signal || fatal) {\n fatal ||= `command failed: ${proc.spawnargs.join(\" \")}`;\n this.error(`${name}.close`, { code, signal, fatal });\n reject(new Error(fatal));\n } else {\n this.debug(`${name}.close`);\n resolve();\n }\n })\n .on(\"unhandledRejection\", (reason) => {\n this.error(`${name}.unhandled`, reason);\n })\n .on(\"uncaughtExceptionMonitor\", (err) => {\n this.error(`${name}.unhandled`, err);\n });\n });\n }\n}\n\nconst logger = new Logger();\n\nexport { logger };\n", "// Created by Autokaka (qq1909698494@gmail.com) on 2026/01/30.\n\nimport { spawn, type ChildProcess, type SpawnOptions } from \"child_process\";\nimport { logger } from \"./logging\";\n\nexport const PUP_ARGS_ENV_KEY = \"__PUP_ARGS__\";\n\nexport function pargs() {\n const pupArgs = process.env[PUP_ARGS_ENV_KEY];\n if (pupArgs) {\n const args = [\"exec\", ...process.argv.slice(-1)];\n args.push(...JSON.parse(pupArgs));\n logger.debug(\"pupargs\", args);\n return args;\n }\n\n logger.debug(\"procargv\", process.argv);\n return process.argv;\n}\n\nexport interface ProcessHandle {\n process: ChildProcess;\n wait: Promise<void>;\n}\n\nexport function exec(cmd: string, options?: SpawnOptions): ProcessHandle {\n const parts = cmd.split(\" \").filter((s) => s.length);\n const [command, ...args] = parts;\n if (!command) throw new Error(\"empty command\");\n const proc = spawn(command, args, {\n stdio: \"inherit\",\n ...options,\n });\n return { process: proc, wait: logger.attach(proc, command) };\n}\n", "// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/09.\n\nimport { BrowserWindow, session, type NativeImage } from \"electron\";\nimport { mkdir, writeFile } from \"fs/promises\";\nimport { join } from \"path\";\nimport { FixedBufferWriter } from \"../rust/lib\";\nimport {\n buildWrapperHTML,\n decodeTimestamp,\n startSync,\n stopSync,\n} from \"./frame_sync\";\nimport { checkHTML } from \"./html_check\";\nimport { isEmpty } from \"./image\";\nimport { logger } from \"./logging\";\nimport { enableProxy, proxiedUrl } from \"./proxy\";\nimport { useRetry } from \"./retry\";\n\nconst TAG = \"[Record]\";\n\nexport interface RecordOptions {\n outDir: string;\n duration: number;\n fps: number;\n width: number;\n height: number;\n withAlphaChannel: boolean;\n useInnerProxy: boolean;\n}\n\nexport interface RecordResult {\n options: RecordOptions;\n written: number;\n bgraPath: string;\n}\n\nasync function loadWindow(source: string, options: RecordOptions) {\n checkHTML(source);\n\n const { width, height, useInnerProxy } = options;\n\n // Remove X-Frame-Options and CSP headers to allow iframe loading\n // Note: Electron's onHeadersReceived uses REPLACE behavior (not append).\n // Only the last attached listener is used, so no cleanup needed.\n // Ref: https://www.electronjs.org/docs/latest/api/web-request\n session.defaultSession.webRequest.onHeadersReceived((details, callback) => {\n const responseHeaders = { ...details.responseHeaders };\n delete responseHeaders[\"x-frame-options\"];\n delete responseHeaders[\"X-Frame-Options\"];\n delete responseHeaders[\"content-security-policy\"];\n delete responseHeaders[\"Content-Security-Policy\"];\n callback({ cancel: false, responseHeaders });\n });\n\n let src = source;\n if (useInnerProxy) {\n src = proxiedUrl(source);\n enableProxy();\n }\n\n const win = new BrowserWindow({\n width: width,\n height: height + 1,\n show: false,\n transparent: true,\n backgroundColor: undefined,\n webPreferences: {\n offscreen: true,\n backgroundThrottling: false,\n nodeIntegration: true,\n contextIsolation: false,\n webSecurity: false,\n allowRunningInsecureContent: true,\n experimentalFeatures: true,\n },\n });\n\n win.webContents.on(\"console-message\", (event) => {\n if (event.level === \"error\") {\n logger.error(TAG, \"console:\", event.message);\n }\n });\n\n const wrapperHTML = buildWrapperHTML(src, { width, height });\n const dataURL = `data:text/html;charset=utf-8,${encodeURIComponent(wrapperHTML)}`;\n let token: NodeJS.Timeout | undefined;\n\n await new Promise<void>((resolve, reject) => {\n token = setTimeout(() => {\n reject(new Error(\"load window timeout\"));\n }, 20 * 1000);\n\n win.webContents.once(\"did-finish-load\", resolve);\n\n win.webContents.once(\"did-fail-load\", (_event, code, desc, url) => {\n reject(new Error(`failed to load ${url}: [${code}] ${desc}`));\n });\n\n win.webContents.once(\"render-process-gone\", (_event, details) => {\n const { exitCode, reason } = details;\n reject(new Error(`renderer crashed: ${exitCode}, ${reason}`));\n });\n\n win.loadURL(dataURL);\n });\n clearTimeout(token);\n return win;\n}\n\nexport async function record(\n source: string,\n options: RecordOptions,\n): Promise<void> {\n logger.info(TAG, `progress: 0%`);\n const { outDir, fps, width, height, duration } = options;\n\n const win = await useRetry({ fn: loadWindow, maxAttempts: 2 })(\n source,\n options,\n );\n\n await mkdir(outDir, { recursive: true });\n\n const cdp = win.webContents.debugger;\n cdp.attach(\"1.3\");\n\n win.webContents.setFrameRate(fps);\n if (!win.webContents.isPainting()) {\n win.webContents.startPainting();\n }\n\n const bgraPath = join(outDir, \"output.bgra\");\n const total = Math.ceil(fps * duration);\n const frameInterval = 1000 / fps;\n const bufferSize = width * height * 4;\n\n const writer = new FixedBufferWriter(bgraPath, bufferSize, fps);\n\n let written = 0;\n let lastWrittenTime: number | undefined;\n let progress = 0;\n let frameError: Error | undefined;\n let resolver: (() => void) | undefined;\n let rejecter: ((reason?: unknown) => void) | undefined;\n\n const scheduleWrite = (buffer: Buffer) => {\n written++;\n try {\n writer.write(buffer);\n } catch (error) {\n frameError ??= error as Error;\n }\n };\n\n const paint = (_e: unknown, _r: unknown, image: NativeImage) => {\n if (frameError) {\n rejecter?.(frameError);\n return;\n }\n\n if (written >= total) {\n resolver?.();\n return;\n }\n\n if (isEmpty(image)) return;\n\n const bitmap = image.toBitmap();\n const currentTime = decodeTimestamp(bitmap, image.getSize());\n if (currentTime === undefined) {\n frameError ??= new Error(`no timestamp @ ${written}`);\n return;\n }\n\n const bytesPerRow = width * 4;\n const cropped = bitmap.subarray(0, height * bytesPerRow);\n\n if (lastWrittenTime === undefined) {\n scheduleWrite(cropped);\n lastWrittenTime = currentTime;\n return;\n }\n\n const timeSinceLastFrame = currentTime - lastWrittenTime;\n if (timeSinceLastFrame < frameInterval * 0.8) {\n return;\n }\n\n if (timeSinceLastFrame <= frameInterval * 1.2) {\n scheduleWrite(cropped);\n } else {\n const framesToInsert = Math.round(timeSinceLastFrame / frameInterval);\n for (let i = 0; i < framesToInsert && written < total; i++) {\n scheduleWrite(cropped);\n }\n }\n lastWrittenTime = currentTime;\n\n const newProgress = Math.floor((written / total) * 100);\n if (Math.abs(newProgress - progress) > 10) {\n progress = newProgress;\n logger.info(TAG, `progress: ${Math.round(progress)}%`);\n }\n };\n\n win.webContents.on(\"paint\", paint);\n await startSync(cdp);\n try {\n await new Promise<void>((r, j) => ([resolver, rejecter] = [r, j]));\n } finally {\n await stopSync(cdp);\n win.webContents.off(\"paint\", paint);\n await writer.close();\n }\n\n if (frameError || written === 0) {\n throw frameError ?? new Error(\"no frames captured\");\n }\n\n try {\n const result: RecordResult = { options, written, bgraPath };\n await writeFile(join(outDir, \"record.json\"), JSON.stringify(result));\n logger.info(TAG, `progress: 100%, ${written} frames written`);\n } finally {\n win.close();\n }\n}\n", "// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/10.\n\nimport { existsSync } from \"fs\";\nimport { join } from \"path\";\n\nconst { platform, arch } = process;\n\nconst rustPath = `rust/${platform}-${arch}.node`;\n\nconst nativeSearchPaths = [\n join(__dirname, `../../${rustPath}`), // process start from src\n join(__dirname, `../${rustPath}`), // process start from dist\n];\nconst mod = require(nativeSearchPaths.find(existsSync)!);\n\nexport interface FixedBufferWriter {\n new (\n path: string,\n bufferSize: number,\n queueDepth?: number,\n ): FixedBufferWriter;\n\n write(buffer: Buffer): void;\n\n close(): Promise<void>;\n}\n\nexport const FixedBufferWriter = mod.FixedBufferWriter as FixedBufferWriter;\n", "// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/09.\n\nimport type { Debugger, Size } from \"electron\";\n\nexport const FRAME_SYNC_MARKER_WIDTH = 32;\nexport const FRAME_SYNC_MARKER_HEIGHT = 1;\n\nexport function buildWrapperHTML(targetURL: string, size: Size): string {\n const { width, height } = size;\n return `<!DOCTYPE html>\n<html>\n<head>\n <meta charset=\"UTF-8\">\n <style>\n * { margin: 0; padding: 0; box-sizing: border-box; }\n html, body { width: ${width}px; height: ${height + 1}px; overflow: hidden; }\n #target { \n position: absolute; \n top: 0; \n left: 0; \n width: ${width}px; \n height: ${height}px; \n border: none; \n display: block;\n }\n #stego { \n position: absolute; \n top: ${height}px; \n left: 0; \n width: ${width}px; \n height: 1px; \n display: block;\n image-rendering: pixelated;\n }\n </style>\n</head>\n<body>\n <iframe id=\"target\" src=\"${targetURL}\"></iframe>\n <canvas id=\"stego\" width=\"${width}\" height=\"1\"></canvas>\n <script>\n (function() {\n const WIDTH = ${width};\n const MARKER_WIDTH = ${FRAME_SYNC_MARKER_WIDTH};\n const canvas = document.getElementById('stego');\n const ctx = canvas.getContext('2d', { willReadFrequently: true });\n let startTime = null;\n let rafId = null;\n\n function encodeTimestamp(timestampMs) {\n const imageData = ctx.createImageData(WIDTH, 1);\n const data = imageData.data;\n \n const timestampInt = Math.floor(timestampMs) >>> 0;\n \n for (let i = 0; i < MARKER_WIDTH; i++) {\n const bit = (timestampInt >>> (MARKER_WIDTH - 1 - i)) & 1;\n const value = bit ? 255 : 0;\n const idx = i * 4;\n data[idx] = value;\n data[idx + 1] = value;\n data[idx + 2] = value;\n data[idx + 3] = 255;\n }\n \n for (let i = MARKER_WIDTH; i < WIDTH; i++) {\n const idx = i * 4;\n data[idx] = 0;\n data[idx + 1] = 0;\n data[idx + 2] = 0;\n data[idx + 3] = 255;\n }\n \n ctx.putImageData(imageData, 0, 0);\n }\n\n function updateLoop() {\n if (startTime === null) return;\n const elapsed = performance.now() - startTime;\n encodeTimestamp(elapsed);\n rafId = requestAnimationFrame(updateLoop);\n }\n\n window.__pup_start_recording__ = () => {\n startTime = performance.now();\n encodeTimestamp(0);\n requestAnimationFrame(updateLoop);\n };\n\n window.__pup_stop_recording__ = () => {\n if (rafId !== null) {\n cancelAnimationFrame(rafId);\n rafId = null;\n }\n };\n })();\n </script>\n</body>\n</html>`;\n}\n\nexport function decodeTimestamp(\n bitmap: Buffer,\n size: Size,\n): number | undefined {\n const { width, height } = size;\n if (width < FRAME_SYNC_MARKER_WIDTH || height < 2) {\n return undefined;\n }\n\n const markerRow = height - 1;\n\n let timestamp = 0;\n for (let i = 0; i < FRAME_SYNC_MARKER_WIDTH; i++) {\n const pixelIdx = (markerRow * width + i) * 4;\n const r = bitmap[pixelIdx] ?? 0;\n const bit = r > 127 ? 1 : 0;\n timestamp = (timestamp << 1) | bit;\n }\n\n timestamp = timestamp >>> 0;\n\n if (!Number.isFinite(timestamp) || timestamp < 0 || timestamp > 1e7) {\n return undefined;\n }\n\n return timestamp;\n}\n\nexport function startSync(cdp: Debugger) {\n return cdp.sendCommand(\"Runtime.evaluate\", {\n expression: `window.__pup_start_recording__()`,\n });\n}\n\nexport function stopSync(cdp: Debugger) {\n return cdp.sendCommand(\"Runtime.evaluate\", {\n expression: `window.__pup_stop_recording__()`,\n });\n}\n", "/*\n * Created by Lu Ao (luao@bilibili.com) on 2026/02/25.\n * Copyright \u00A9 2026 bilibili. All rights reserved.\n */\n\nconst SUPPORTED_PROTOCOLS = [\"file:\", \"http:\", \"https:\", \"data:\"];\nconst SOURCE_PATTERN = /^(file:|https?:|data:)/;\n\nexport function checkHTML(source: string): void {\n if (SOURCE_PATTERN.test(source)) {\n return;\n }\n\n const protocol = source.split(\":\")[0] + \":\";\n const message = SUPPORTED_PROTOCOLS.includes(protocol)\n ? `unsupported protocol: ${protocol}, expected ${SUPPORTED_PROTOCOLS.join(\", \")}`\n : `invalid source format, expected ${SUPPORTED_PROTOCOLS.join(\", \")}`;\n\n throw new Error(message);\n}\n", "// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/06.\n\nimport type { NativeImage } from \"electron\";\n\nexport function isEmpty(image: NativeImage) {\n const size = image.getSize();\n if (size.width === 0 || size.height === 0) return true;\n return image.isEmpty();\n}\n", "// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/09.\n\nimport { session } from \"electron\";\nimport { logger } from \"./logging\";\n\nconst TAG = \"[Proxy]\";\n\nexport function proxiedUrl(url: string) {\n if (!url.startsWith(\"http\")) {\n return url;\n }\n // Redirect boss.hdslb.com to boss.bilibili.co\n const match = url.match(/^https:\\/\\/([^-]+)-boss\\.hdslb\\.com(.*)$/);\n if (match) {\n const [, prefix, path] = match;\n return `http://${prefix}-boss.bilibili.co${path}`;\n }\n return url;\n}\n\nexport function enableProxy() {\n // Redirect boss.hdslb.com to boss.bilibili.co\n session.defaultSession.webRequest.onBeforeRequest((details, callback) => {\n const url = details.url;\n const proxied = proxiedUrl(url);\n if (proxied === url) {\n return callback({ cancel: false });\n } else {\n logger.debug(TAG, `${url} -> ${proxied}`);\n callback({ cancel: false, redirectURL: proxied });\n }\n });\n}\n", "// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/05.\n\nimport { setTimeout } from \"timers/promises\";\nimport { sleep } from \"./timing\";\n\nexport interface RetryOptions<Args extends any[], Ret> {\n fn: (...args: Args) => Promise<Ret>;\n maxAttempts?: number;\n timeout?: number;\n}\n\nexport function useRetry<Args extends any[], Ret>({\n fn,\n maxAttempts = 3,\n timeout,\n}: RetryOptions<Args, Ret>) {\n const timeoutError = new Error(`timeout over ${timeout}ms`);\n return async function (...args: Args) {\n let attempt = 0;\n while (true) {\n try {\n const promises = [fn(...args)];\n if (timeout) {\n promises.push(\n setTimeout(timeout).then(() => {\n throw timeoutError;\n }),\n );\n }\n return await Promise.race(promises);\n } catch (e) {\n attempt++;\n if (attempt >= maxAttempts) {\n throw e;\n }\n await sleep(Math.pow(2, attempt) * 100 + Math.random() * 100);\n }\n }\n };\n}\n", "// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/09.\n\nexport function sleep(ms: number) {\n return new Promise<void>((resolve) => setTimeout(resolve, ms));\n}\n\nexport function periodical(\n callback: (count: number) => Promise<void> | void,\n ms: number,\n) {\n let token: NodeJS.Timeout;\n let closed = false;\n async function tick(count: number) {\n await callback(count);\n if (closed) return;\n token = setTimeout(() => tick(count + 1), ms);\n }\n token = setTimeout(() => tick(0), ms);\n return () => {\n closed = true;\n clearTimeout(token);\n };\n}\n", "// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/09.\n\nimport { program } from \"commander\";\nimport { pupUseInnerProxy } from \"./base/constants\";\nimport { logger } from \"./base/logging\";\nimport { noerr } from \"./base/noerr\";\nimport { parseNumber } from \"./base/parser\";\nimport { pargs } from \"./base/process\";\nimport type { RecordOptions } from \"./base/record\";\n\nexport const DEFAULT_WIDTH = 1920;\nexport const DEFAULT_HEIGHT = 1080;\nexport const DEFAULT_FPS = 30;\nexport const DEFAULT_DURATION = 5;\nexport const DEFAULT_OUT_DIR = \"out\";\n\nexport type CLICallback = (\n source: string,\n options: RecordOptions & Record<string, unknown>,\n) => Promise<unknown>;\n\nexport function makeCLI(name: string, callback: CLICallback) {\n program\n .name(name)\n .argument(\"<source>\", \"file://, http(s)://, \u6216 data: URI\")\n .option(\"-w, --width <number>\", \"\u89C6\u9891\u5BBD\u5EA6\", `${DEFAULT_WIDTH}`)\n .option(\"-h, --height <number>\", \"\u89C6\u9891\u9AD8\u5EA6\", `${DEFAULT_HEIGHT}`)\n .option(\"-f, --fps <number>\", \"\u5E27\u7387\", `${DEFAULT_FPS}`)\n .option(\"-t, --duration <number>\", \"\u5F55\u5236\u65F6\u957F\uFF08\u79D2\uFF09\", `${DEFAULT_DURATION}`)\n .option(\"-o, --out-dir <path>\", \"\u8F93\u51FA\u76EE\u5F55\", `${DEFAULT_OUT_DIR}`)\n .option(\"-a, --with-alpha-channel\", \"\u8F93\u51FA\u5305\u542B alpha \u901A\u9053\u7684\u89C6\u9891\", false)\n .option(\n \"--use-inner-proxy\",\n \"\u4F7F\u7528 B \u7AD9\u5185\u7F51\u4EE3\u7406\u52A0\u901F\u8D44\u6E90\u8BBF\u95EE\",\n pupUseInnerProxy,\n )\n .action(async (source: string, opts) => {\n try {\n await callback(source, {\n width: noerr(parseNumber, DEFAULT_WIDTH)(opts.width),\n height: noerr(parseNumber, DEFAULT_HEIGHT)(opts.height),\n fps: noerr(parseNumber, DEFAULT_FPS)(opts.fps),\n duration: noerr(parseNumber, DEFAULT_DURATION)(opts.duration),\n outDir: opts.outDir ?? DEFAULT_OUT_DIR,\n withAlphaChannel: opts.withAlphaChannel ?? false,\n useInnerProxy: opts.useInnerProxy ?? pupUseInnerProxy,\n });\n } catch (e) {\n logger.fatal(e);\n }\n });\n program.parse(pargs());\n}\n", "// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/24.\n\nexport function noerr<Fn extends (...args: any[]) => any, D>(\n fn: Fn,\n defaultValue: D,\n): (...args: Parameters<Fn>) => ReturnType<Fn> | D {\n return (...args) => {\n try {\n const ret = fn(...args);\n if (ret instanceof Promise) {\n return ret.catch(() => defaultValue);\n }\n return ret;\n } catch {\n return defaultValue;\n }\n };\n}\n"],
5
- "mappings": "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",
6
- "names": ["import_electron", "resolve", "import_electron", "import_promises", "import_path", "import_fs", "import_path", "import_electron", "resolve", "TAG", "resolve"]
7
- }
1
+ {"version":3,"sources":["../../../../node_modules/.bun/tsup@8.5.1+3f29b90437d001ad/node_modules/tsup/assets/cjs_shims.js","../../src/app.ts","../../src/base/electron.ts","../../src/base/constants.ts","../../src/base/basedir.ts","../../src/base/env.ts","../../src/base/parser.ts","../../src/base/logging.ts","../../src/base/process.ts","../../src/base/record.ts","../../src/rust/lib.ts","../../src/base/frame_sync.ts","../../src/base/html_check.ts","../../src/base/image.ts","../../src/base/proxy.ts","../../src/base/retry.ts","../../src/base/timing.ts","../../src/common.ts","../../src/base/noerr.ts","../../src/base/schema.ts"],"sourcesContent":["// Shim globals in cjs bundle\n// There's a weird bug that esbuild will always inject importMetaUrl\n// if we export it as `const importMetaUrl = ... __filename ...`\n// But using a function will not cause this issue\n\nconst getImportMetaUrl = () => \n typeof document === \"undefined\" \n ? new URL(`file:${__filename}`).href \n : (document.currentScript && document.currentScript.tagName.toUpperCase() === 'SCRIPT') \n ? document.currentScript.src \n : new URL(\"main.js\", document.baseURI).href;\n\nexport const importMetaUrl = /* @__PURE__ */ getImportMetaUrl()\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/01/30.\n\nimport { app } from \"electron\";\nimport { ELECTRON_OPTS } from \"./base/electron\";\nimport { record } from \"./base/record\";\nimport { makeCLI } from \"./common\";\n\nprocess.once(\"exit\", () => app.quit());\n\nmakeCLI(\"app\", async (source, options) => {\n try {\n ELECTRON_OPTS.forEach((o) => app.commandLine.appendSwitch(o));\n app.dock?.hide();\n await app.whenReady();\n await record(source, options);\n } finally {\n app.quit();\n }\n});\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/25.\n\nimport electron, { type Size } from \"electron\";\nimport { exec } from \"./process\";\n\nexport const ELECTRON_OPTS = [\n \"no-sandbox\",\n \"disable-setuid-sandbox\",\n \"disable-gpu\",\n \"disable-dev-shm-usage\",\n \"disable-software-rasterizer\",\n \"disable-web-security\",\n \"disable-site-isolation-trials\",\n \"disable-features=IsolateOrigins,site-per-process\",\n \"allow-insecure-localhost\",\n \"ignore-certificate-errors\",\n \"disable-blink-features=AutomationControlled\",\n \"mute-audio\",\n \"disable-extensions\",\n \"disable-background-networking\",\n \"address-family=ipv4\",\n \"disable-async-dns\",\n \"force-device-scale-factor=1\",\n \"trace-warnings\",\n \"force-color-profile=srgb\",\n \"disable-color-correct-rendering\",\n \"log-level=3\",\n];\n\nexport function runElectronApp(size: Size, app: unknown, args: unknown[]) {\n const electronArgs = ELECTRON_OPTS.map((a) => `--${a}`);\n const cmdParts = [];\n if (process.platform === \"linux\") {\n cmdParts.push(\n \"xvfb-run\",\n \"--auto-servernum\",\n `--server-args='-screen 0 ${size.width}x${size.height}x24'`,\n );\n }\n cmdParts.push(electron, ...electronArgs, app);\n return exec(cmdParts.join(\" \"), {\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n shell: true,\n env: {\n ...process.env,\n ELECTRON_DISABLE_DBUS: \"1\",\n RUST_BACKTRACE: \"full\",\n __PUP_ARGS__: JSON.stringify(args),\n },\n });\n}\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/09.\n\nimport { existsSync } from \"fs\";\nimport { join } from \"path\";\nimport { basedir } from \"./basedir\";\nimport { penv } from \"./env\";\nimport { parseNumber } from \"./parser\";\n\nconst pupAppSearchPaths = [\n join(basedir, \"cjs/app.cjs\"), // process from dist\n join(basedir, \"app.cjs\"), // process from dist/cjs\n join(basedir, \"../../cjs/app.cjs\"), // process from src\n];\nexport const pupAppPath = pupAppSearchPaths.find(existsSync)!;\n\nconst env = process.env;\nexport const pupLogLevel = penv(\"PUP_LOG_LEVEL\", parseNumber, 2);\nexport const pupUseInnerProxy = env[\"PUP_USE_INNER_PROXY\"] === \"1\";\nexport const pupFFmpegPath = env[\"FFMPEG_BIN\"] ?? `ffmpeg`;\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/25.\n\nimport { dirname } from \"path\";\nimport { fileURLToPath } from \"url\";\n\nexport const basedir = dirname(fileURLToPath(import.meta.url));\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/25.\n\nexport type EnvParser<T> = (value: unknown) => T;\n\nexport function penv<T>(name: string, parser: EnvParser<T>, defaultValue: T): T;\nexport function penv<T>(\n name: string,\n parser: EnvParser<T>,\n defaultValue?: T,\n): T | undefined;\nexport function penv<T>(\n name: string,\n parser: EnvParser<T>,\n defaultValue?: T,\n): T | undefined {\n try {\n return parser(process.env[name]);\n } catch {\n return defaultValue;\n }\n}\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/01/30.\n\nexport function parseNumber(value: unknown): number {\n if (typeof value === \"number\") {\n return value;\n }\n const num = Number(value);\n if (Number.isNaN(num)) {\n throw new Error(`Value ${value} is not a valid number`);\n }\n return num;\n}\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/06.\n\nimport { ChildProcess, type Serializable } from \"child_process\";\nimport { pupLogLevel } from \"./constants\";\n\nexport interface LoggerLike {\n debug?(this: void, ...messages: unknown[]): void;\n\n info?(this: void, ...messages: unknown[]): void;\n\n warn?(this: void, ...messages: unknown[]): void;\n\n error?(this: void, ...messages: unknown[]): void;\n}\n\nconst DEBUG = \"<pup@debug>\";\nconst INFO = \"<pup@info>\";\nconst WARN = \"<pup@warn>\";\nconst ERROR = \"<pup@error>\";\nconst FATAL = \"<pup@fatal>\";\n\nclass Logger implements LoggerLike {\n private _impl?: LoggerLike;\n\n get impl(): LoggerLike | undefined {\n return this._impl;\n }\n\n set impl(value: LoggerLike) {\n const debug = value.debug ?? console.debug;\n const info = value.info ?? console.info;\n const warn = value.warn ?? console.warn;\n const error = value.error ?? console.error;\n this._impl = {\n debug: pupLogLevel >= 3 ? debug : undefined,\n info: pupLogLevel >= 2 ? info : undefined,\n warn: pupLogLevel >= 1 ? warn : undefined,\n error: pupLogLevel >= 0 ? error : undefined,\n };\n }\n\n constructor() {\n this.impl = console;\n }\n\n debug(...messages: unknown[]): void {\n this.impl?.debug?.(DEBUG, ...messages);\n }\n\n info(...messages: unknown[]): void {\n this.impl?.info?.(INFO, ...messages);\n }\n\n warn(...messages: unknown[]): void {\n this.impl?.warn?.(WARN, ...messages);\n }\n\n error(...messages: unknown[]): void {\n this.impl?.error?.(ERROR, ...messages);\n }\n\n fatal(...messages: unknown[]): never {\n this.impl?.error?.(FATAL, ...messages);\n process.exit(1);\n }\n\n private dispatch(message: string) {\n if (message.startsWith(DEBUG)) {\n this.debug(message.slice(DEBUG.length + 1));\n } else if (message.startsWith(INFO)) {\n this.info(message.slice(INFO.length + 1));\n } else if (message.startsWith(WARN)) {\n this.warn(message.slice(WARN.length + 1));\n } else if (message.startsWith(ERROR)) {\n this.error(message.slice(ERROR.length + 1));\n } else {\n this.info(message);\n }\n }\n\n attach(proc: ChildProcess, name: string) {\n return new Promise<void>((resolve, reject) => {\n this.debug(`${name}.attach`);\n let fatal: string = \"\";\n const dispatch = (data: Buffer | Serializable) => {\n const message = data.toString();\n if (message.startsWith(FATAL)) {\n fatal += message.slice(FATAL.length + 1);\n } else {\n this.dispatch(message);\n }\n };\n proc.stderr?.on(\"data\", dispatch);\n proc.stdout?.on(\"data\", dispatch);\n proc\n .on(\"message\", dispatch)\n .on(\"error\", (err) => {\n fatal += err.message;\n proc.kill();\n })\n .once(\"close\", (code, signal) => {\n if (code || signal || fatal) {\n fatal ||= `command failed: ${proc.spawnargs.join(\" \")}`;\n this.error(`${name}.close`, { code, signal, fatal });\n reject(new Error(fatal));\n } else {\n this.debug(`${name}.close`);\n resolve();\n }\n })\n .on(\"unhandledRejection\", (reason) => {\n this.error(`${name}.unhandled`, reason);\n })\n .on(\"uncaughtExceptionMonitor\", (err) => {\n this.error(`${name}.unhandled`, err);\n });\n });\n }\n}\n\nconst logger = new Logger();\n\nexport { logger };\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/01/30.\n\nimport { spawn, type ChildProcess, type SpawnOptions } from \"child_process\";\nimport { logger } from \"./logging\";\n\nexport const PUP_ARGS_ENV_KEY = \"__PUP_ARGS__\";\n\nexport function pargs() {\n const pupArgs = process.env[PUP_ARGS_ENV_KEY];\n if (pupArgs) {\n const args = [\"exec\", ...process.argv.slice(-1)];\n args.push(...JSON.parse(pupArgs));\n logger.debug(\"pupargs\", args);\n return args;\n }\n\n logger.debug(\"procargv\", process.argv);\n return process.argv;\n}\n\nexport interface ProcessHandle {\n process: ChildProcess;\n wait: Promise<void>;\n}\n\nexport function exec(cmd: string, options?: SpawnOptions): ProcessHandle {\n const parts = cmd.split(\" \").filter((s) => s.length);\n const [command, ...args] = parts;\n if (!command) throw new Error(\"empty command\");\n const proc = spawn(command, args, {\n stdio: \"inherit\",\n ...options,\n });\n return { process: proc, wait: logger.attach(proc, command) };\n}\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/09.\n\nimport { BrowserWindow, session, type NativeImage } from \"electron\";\nimport { mkdir, writeFile } from \"fs/promises\";\nimport { join } from \"path\";\nimport { FixedBufferWriter } from \"../rust/lib\";\nimport {\n buildWrapperHTML,\n decodeTimestamp,\n startSync,\n stopSync,\n} from \"./frame_sync\";\nimport { checkHTML } from \"./html_check\";\nimport { isEmpty } from \"./image\";\nimport { logger } from \"./logging\";\nimport { enableProxy, proxiedUrl } from \"./proxy\";\nimport { useRetry } from \"./retry\";\nimport type { RecordOptions, RecordResult } from \"./schema\";\n\nconst TAG = \"[Record]\";\n\nasync function loadWindow(source: string, options: RecordOptions) {\n checkHTML(source);\n\n const { width, height, useInnerProxy } = options;\n\n // Remove X-Frame-Options and CSP headers to allow iframe loading\n // Note: Electron's onHeadersReceived uses REPLACE behavior (not append).\n // Only the last attached listener is used, so no cleanup needed.\n // Ref: https://www.electronjs.org/docs/latest/api/web-request\n session.defaultSession.webRequest.onHeadersReceived((details, callback) => {\n const responseHeaders = { ...details.responseHeaders };\n delete responseHeaders[\"x-frame-options\"];\n delete responseHeaders[\"X-Frame-Options\"];\n delete responseHeaders[\"content-security-policy\"];\n delete responseHeaders[\"Content-Security-Policy\"];\n callback({ cancel: false, responseHeaders });\n });\n\n let src = source;\n if (useInnerProxy) {\n src = proxiedUrl(source);\n enableProxy();\n }\n\n const win = new BrowserWindow({\n width: width,\n height: height + 1,\n show: false,\n transparent: true,\n backgroundColor: undefined,\n webPreferences: {\n offscreen: true,\n backgroundThrottling: false,\n nodeIntegration: true,\n contextIsolation: false,\n webSecurity: false,\n allowRunningInsecureContent: true,\n experimentalFeatures: true,\n },\n });\n\n win.webContents.on(\"console-message\", (event) => {\n if (event.level === \"error\") {\n logger.error(TAG, \"console:\", event.message);\n }\n });\n\n const wrapperHTML = buildWrapperHTML(src, { width, height });\n const dataURL = `data:text/html;charset=utf-8,${encodeURIComponent(wrapperHTML)}`;\n let token: NodeJS.Timeout | undefined;\n\n await new Promise<void>((resolve, reject) => {\n token = setTimeout(() => {\n reject(new Error(\"load window timeout\"));\n }, 20 * 1000);\n\n win.webContents.once(\"did-finish-load\", resolve);\n\n win.webContents.once(\"did-fail-load\", (_event, code, desc, url) => {\n reject(new Error(`failed to load ${url}: [${code}] ${desc}`));\n });\n\n win.webContents.once(\"render-process-gone\", (_event, details) => {\n const { exitCode, reason } = details;\n reject(new Error(`renderer crashed: ${exitCode}, ${reason}`));\n });\n\n win.loadURL(dataURL);\n });\n clearTimeout(token);\n return win;\n}\n\nexport async function record(\n source: string,\n options: RecordOptions,\n): Promise<void> {\n logger.info(TAG, `progress: 0%`);\n const { outDir, fps, width, height, duration } = options;\n\n const win = await useRetry({ fn: loadWindow, maxAttempts: 2 })(\n source,\n options,\n );\n\n await mkdir(outDir, { recursive: true });\n\n const cdp = win.webContents.debugger;\n cdp.attach(\"1.3\");\n\n win.webContents.setFrameRate(fps);\n if (!win.webContents.isPainting()) {\n win.webContents.startPainting();\n }\n\n const bgraPath = join(outDir, \"output.bgra\");\n const total = Math.ceil(fps * duration);\n const frameInterval = 1000 / fps;\n const bufferSize = width * height * 4;\n\n const writer = new FixedBufferWriter(bgraPath, bufferSize, fps);\n\n let written = 0;\n let lastWrittenTime: number | undefined;\n let progress = 0;\n let frameError: Error | undefined;\n let resolver: (() => void) | undefined;\n let rejecter: ((reason?: unknown) => void) | undefined;\n\n const scheduleWrite = (buffer: Buffer) => {\n written++;\n try {\n writer.write(buffer);\n } catch (error) {\n frameError ??= error as Error;\n }\n };\n\n const paint = (_e: unknown, _r: unknown, image: NativeImage) => {\n if (frameError) {\n rejecter?.(frameError);\n return;\n }\n\n if (written >= total) {\n resolver?.();\n return;\n }\n\n if (isEmpty(image)) return;\n\n const bitmap = image.toBitmap();\n const currentTime = decodeTimestamp(bitmap, image.getSize());\n if (currentTime === undefined) {\n frameError ??= new Error(`no timestamp @ ${written}`);\n return;\n }\n\n const bytesPerRow = width * 4;\n const cropped = bitmap.subarray(0, height * bytesPerRow);\n\n if (lastWrittenTime === undefined) {\n scheduleWrite(cropped);\n lastWrittenTime = currentTime;\n return;\n }\n\n const timeSinceLastFrame = currentTime - lastWrittenTime;\n if (timeSinceLastFrame < frameInterval * 0.8) {\n return;\n }\n\n if (timeSinceLastFrame <= frameInterval * 1.2) {\n scheduleWrite(cropped);\n } else {\n const framesToInsert = Math.round(timeSinceLastFrame / frameInterval);\n for (let i = 0; i < framesToInsert && written < total; i++) {\n scheduleWrite(cropped);\n }\n }\n lastWrittenTime = currentTime;\n\n const newProgress = Math.floor((written / total) * 100);\n if (Math.abs(newProgress - progress) > 10) {\n progress = newProgress;\n logger.info(TAG, `progress: ${Math.round(progress)}%`);\n }\n };\n\n win.webContents.on(\"paint\", paint);\n await startSync(cdp);\n try {\n await new Promise<void>((r, j) => ([resolver, rejecter] = [r, j]));\n } finally {\n await stopSync(cdp);\n win.webContents.off(\"paint\", paint);\n await writer.close();\n }\n\n if (frameError || written === 0) {\n throw frameError ?? new Error(\"no frames captured\");\n }\n\n try {\n const result: RecordResult = { options, written, bgraPath };\n await writeFile(join(outDir, \"record.json\"), JSON.stringify(result));\n logger.info(TAG, `progress: 100%, ${written} frames written`);\n } finally {\n win.close();\n }\n}\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/10.\n\nimport { existsSync } from \"fs\";\nimport { join } from \"path\";\nimport { basedir } from \"../base/basedir\";\n\nconst { platform, arch } = process;\n\nconst rustPath = `rust/${platform}-${arch}.node`;\n\nconst nativeSearchPaths = [\n join(basedir, `../../${rustPath}`), // process start from src\n join(basedir, `../${rustPath}`), // process start from dist\n];\nconst mod = require(nativeSearchPaths.find(existsSync)!);\n\nexport interface FixedBufferWriter {\n new (\n path: string,\n bufferSize: number,\n queueDepth?: number,\n ): FixedBufferWriter;\n\n write(buffer: Buffer): void;\n\n close(): Promise<void>;\n}\n\nexport const FixedBufferWriter = mod.FixedBufferWriter as FixedBufferWriter;\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/09.\n\nimport type { Debugger, Size } from \"electron\";\n\nexport const FRAME_SYNC_MARKER_WIDTH = 32;\nexport const FRAME_SYNC_MARKER_HEIGHT = 1;\n\nexport function buildWrapperHTML(targetURL: string, size: Size): string {\n const { width, height } = size;\n return `<!DOCTYPE html>\n<html>\n<head>\n <meta charset=\"UTF-8\">\n <style>\n * { margin: 0; padding: 0; box-sizing: border-box; }\n html, body { width: ${width}px; height: ${height + 1}px; overflow: hidden; }\n #target { \n position: absolute; \n top: 0; \n left: 0; \n width: ${width}px; \n height: ${height}px; \n border: none; \n display: block;\n }\n #stego { \n position: absolute; \n top: ${height}px; \n left: 0; \n width: ${width}px; \n height: 1px; \n display: block;\n image-rendering: pixelated;\n }\n </style>\n</head>\n<body>\n <iframe id=\"target\" src=\"${targetURL}\"></iframe>\n <canvas id=\"stego\" width=\"${width}\" height=\"1\"></canvas>\n <script>\n (function() {\n const WIDTH = ${width};\n const MARKER_WIDTH = ${FRAME_SYNC_MARKER_WIDTH};\n const canvas = document.getElementById('stego');\n const ctx = canvas.getContext('2d', { willReadFrequently: true });\n let startTime = null;\n let rafId = null;\n\n function encodeTimestamp(timestampMs) {\n const imageData = ctx.createImageData(WIDTH, 1);\n const data = imageData.data;\n \n const timestampInt = Math.floor(timestampMs) >>> 0;\n \n for (let i = 0; i < MARKER_WIDTH; i++) {\n const bit = (timestampInt >>> (MARKER_WIDTH - 1 - i)) & 1;\n const value = bit ? 255 : 0;\n const idx = i * 4;\n data[idx] = value;\n data[idx + 1] = value;\n data[idx + 2] = value;\n data[idx + 3] = 255;\n }\n \n for (let i = MARKER_WIDTH; i < WIDTH; i++) {\n const idx = i * 4;\n data[idx] = 0;\n data[idx + 1] = 0;\n data[idx + 2] = 0;\n data[idx + 3] = 255;\n }\n \n ctx.putImageData(imageData, 0, 0);\n }\n\n function updateLoop() {\n if (startTime === null) return;\n const elapsed = performance.now() - startTime;\n encodeTimestamp(elapsed);\n rafId = requestAnimationFrame(updateLoop);\n }\n\n window.__pup_start_recording__ = () => {\n startTime = performance.now();\n encodeTimestamp(0);\n requestAnimationFrame(updateLoop);\n };\n\n window.__pup_stop_recording__ = () => {\n if (rafId !== null) {\n cancelAnimationFrame(rafId);\n rafId = null;\n }\n };\n })();\n </script>\n</body>\n</html>`;\n}\n\nexport function decodeTimestamp(\n bitmap: Buffer,\n size: Size,\n): number | undefined {\n const { width, height } = size;\n if (width < FRAME_SYNC_MARKER_WIDTH || height < 2) {\n return undefined;\n }\n\n const markerRow = height - 1;\n\n let timestamp = 0;\n for (let i = 0; i < FRAME_SYNC_MARKER_WIDTH; i++) {\n const pixelIdx = (markerRow * width + i) * 4;\n const r = bitmap[pixelIdx] ?? 0;\n const bit = r > 127 ? 1 : 0;\n timestamp = (timestamp << 1) | bit;\n }\n\n timestamp = timestamp >>> 0;\n\n if (!Number.isFinite(timestamp) || timestamp < 0 || timestamp > 1e7) {\n return undefined;\n }\n\n return timestamp;\n}\n\nexport function startSync(cdp: Debugger) {\n return cdp.sendCommand(\"Runtime.evaluate\", {\n expression: `window.__pup_start_recording__()`,\n });\n}\n\nexport function stopSync(cdp: Debugger) {\n return cdp.sendCommand(\"Runtime.evaluate\", {\n expression: `window.__pup_stop_recording__()`,\n });\n}\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/09.\n\nconst SUPPORTED_PROTOCOLS = [\"file:\", \"http:\", \"https:\", \"data:\"];\nconst SOURCE_PATTERN = /^(file:|https?:|data:)/;\n\nexport function checkHTML(source: string): void {\n if (SOURCE_PATTERN.test(source)) {\n return;\n }\n\n const protocol = source.split(\":\")[0] + \":\";\n const message = SUPPORTED_PROTOCOLS.includes(protocol)\n ? `unsupported protocol: ${protocol}, expected ${SUPPORTED_PROTOCOLS.join(\", \")}`\n : `invalid source format, expected ${SUPPORTED_PROTOCOLS.join(\", \")}`;\n\n throw new Error(message);\n}\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/06.\n\nimport type { NativeImage } from \"electron\";\n\nexport function isEmpty(image: NativeImage) {\n const size = image.getSize();\n if (size.width === 0 || size.height === 0) return true;\n return image.isEmpty();\n}\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/09.\n\nimport { session } from \"electron\";\nimport { logger } from \"./logging\";\n\nconst TAG = \"[Proxy]\";\n\nexport function proxiedUrl(url: string) {\n if (!url.startsWith(\"http\")) {\n return url;\n }\n // Redirect boss.hdslb.com to boss.bilibili.co\n const match = url.match(/^https:\\/\\/([^-]+)-boss\\.hdslb\\.com(.*)$/);\n if (match) {\n const [, prefix, path] = match;\n return `http://${prefix}-boss.bilibili.co${path}`;\n }\n return url;\n}\n\nexport function enableProxy() {\n // Redirect boss.hdslb.com to boss.bilibili.co\n session.defaultSession.webRequest.onBeforeRequest((details, callback) => {\n const url = details.url;\n const proxied = proxiedUrl(url);\n if (proxied === url) {\n return callback({ cancel: false });\n } else {\n logger.debug(TAG, `${url} -> ${proxied}`);\n callback({ cancel: false, redirectURL: proxied });\n }\n });\n}\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/05.\n\nimport { setTimeout } from \"timers/promises\";\nimport { sleep } from \"./timing\";\n\nexport interface RetryOptions<Args extends any[], Ret> {\n fn: (...args: Args) => Promise<Ret>;\n maxAttempts?: number;\n timeout?: number;\n}\n\nexport function useRetry<Args extends any[], Ret>({\n fn,\n maxAttempts = 3,\n timeout,\n}: RetryOptions<Args, Ret>) {\n const timeoutError = new Error(`timeout over ${timeout}ms`);\n return async function (...args: Args) {\n let attempt = 0;\n while (true) {\n try {\n const promises = [fn(...args)];\n if (timeout) {\n promises.push(\n setTimeout(timeout).then(() => {\n throw timeoutError;\n }),\n );\n }\n return await Promise.race(promises);\n } catch (e) {\n attempt++;\n if (attempt >= maxAttempts) {\n throw e;\n }\n await sleep(Math.pow(2, attempt) * 100 + Math.random() * 100);\n }\n }\n };\n}\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/09.\n\nexport function sleep(ms: number) {\n return new Promise<void>((resolve) => setTimeout(resolve, ms));\n}\n\nexport function periodical(\n callback: (count: number) => Promise<void> | void,\n ms: number,\n) {\n let token: NodeJS.Timeout;\n let closed = false;\n async function tick(count: number) {\n await callback(count);\n if (closed) return;\n token = setTimeout(() => tick(count + 1), ms);\n }\n token = setTimeout(() => tick(0), ms);\n return () => {\n closed = true;\n clearTimeout(token);\n };\n}\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/09.\n\nimport { program } from \"commander\";\nimport { pupUseInnerProxy } from \"./base/constants\";\nimport { logger } from \"./base/logging\";\nimport { noerr } from \"./base/noerr\";\nimport { parseNumber } from \"./base/parser\";\nimport { pargs } from \"./base/process\";\nimport {\n DEFAULT_DURATION,\n DEFAULT_FPS,\n DEFAULT_HEIGHT,\n DEFAULT_OUT_DIR,\n DEFAULT_WIDTH,\n type RecordOptions,\n} from \"./base/schema\";\n\nexport type CLICallback = (\n source: string,\n options: RecordOptions,\n) => Promise<unknown>;\n\nexport function makeCLI(name: string, callback: CLICallback) {\n program\n .name(name)\n .argument(\"<source>\", \"file://, http(s)://, 或 data: URI\")\n .option(\"-w, --width <number>\", \"视频宽度\", `${DEFAULT_WIDTH}`)\n .option(\"-h, --height <number>\", \"视频高度\", `${DEFAULT_HEIGHT}`)\n .option(\"-f, --fps <number>\", \"帧率\", `${DEFAULT_FPS}`)\n .option(\"-t, --duration <number>\", \"录制时长(秒)\", `${DEFAULT_DURATION}`)\n .option(\"-o, --out-dir <path>\", \"输出目录\", `${DEFAULT_OUT_DIR}`)\n .option(\"-a, --with-alpha-channel\", \"输出包含 alpha 通道的视频\", false)\n .option(\n \"--use-inner-proxy\",\n \"使用 B 站内网代理加速资源访问\",\n pupUseInnerProxy,\n )\n .action(async (source: string, opts) => {\n try {\n await callback(source, {\n width: noerr(parseNumber, DEFAULT_WIDTH)(opts.width),\n height: noerr(parseNumber, DEFAULT_HEIGHT)(opts.height),\n fps: noerr(parseNumber, DEFAULT_FPS)(opts.fps),\n duration: noerr(parseNumber, DEFAULT_DURATION)(opts.duration),\n outDir: opts.outDir ?? DEFAULT_OUT_DIR,\n withAlphaChannel: opts.withAlphaChannel ?? false,\n useInnerProxy: opts.useInnerProxy ?? pupUseInnerProxy,\n });\n } catch (e) {\n logger.fatal(e);\n }\n });\n program.parse(pargs());\n}\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/24.\n\nexport function noerr<Fn extends (...args: any[]) => any, D>(\n fn: Fn,\n defaultValue: D,\n): (...args: Parameters<Fn>) => ReturnType<Fn> | D {\n return (...args) => {\n try {\n const ret = fn(...args);\n if (ret instanceof Promise) {\n return ret.catch(() => defaultValue);\n }\n return ret;\n } catch {\n return defaultValue;\n }\n };\n}\n","// Created by Autokaka (qq1909698494@gmail.com) on 2026/02/06.\n\nimport type { Size } from \"electron\";\nimport z from \"zod\";\n\nexport interface VideoSpec {\n fps: number;\n frames: number;\n size: Size;\n}\n\nexport interface VideoFiles {\n mp4?: string;\n webm?: string;\n mov?: string;\n}\n\nexport interface VideoFilesWithCover extends VideoFiles {\n cover: string;\n}\n\nexport const DEFAULT_WIDTH = 1920;\nexport const DEFAULT_HEIGHT = 1080;\nexport const DEFAULT_FPS = 30;\nexport const DEFAULT_DURATION = 5;\nexport const DEFAULT_OUT_DIR = \"out\";\n\nexport const RecordSchema = z.object({\n duration: z\n .number()\n .optional()\n .default(DEFAULT_DURATION)\n .describe(\"Recording duration in seconds\"),\n width: z.number().optional().default(DEFAULT_WIDTH).describe(\"Video width\"),\n height: z\n .number()\n .optional()\n .default(DEFAULT_HEIGHT)\n .describe(\"Video height\"),\n fps: z.number().optional().default(DEFAULT_FPS).describe(\"Frames per second\"),\n withAlphaChannel: z\n .boolean()\n .optional()\n .default(false)\n .describe(\"Output with alpha channel\"),\n outDir: z\n .string()\n .optional()\n .default(DEFAULT_OUT_DIR)\n .describe(\"Output directory\"),\n useInnerProxy: z\n .boolean()\n .optional()\n .default(false)\n .describe(\"Use bilibili inner proxy for resource access\"),\n});\n\nexport interface RecordOptions {\n duration: number;\n width: number;\n height: number;\n fps: number;\n withAlphaChannel: boolean;\n outDir: string;\n useInnerProxy: boolean;\n}\n\nexport interface RecordResult {\n options: RecordOptions;\n written: number;\n bgraPath: string;\n}\n"],"mappings":"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","names":["import_electron","import_path","import_electron","import_promises","import_path","import_fs","import_path","import_electron","TAG","z"]}