md-fetch 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.
Files changed (78) hide show
  1. package/AGENTS.md +212 -0
  2. package/LICENSE +21 -0
  3. package/README.md +449 -0
  4. package/README.zh-CN.md +449 -0
  5. package/dist/cli.d.ts +27 -0
  6. package/dist/cli.d.ts.map +1 -0
  7. package/dist/cli.js +158 -0
  8. package/dist/cli.js.map +1 -0
  9. package/dist/constants.d.ts +9 -0
  10. package/dist/constants.d.ts.map +1 -0
  11. package/dist/constants.js +15 -0
  12. package/dist/constants.js.map +1 -0
  13. package/dist/core/browser.d.ts +23 -0
  14. package/dist/core/browser.d.ts.map +1 -0
  15. package/dist/core/browser.js +125 -0
  16. package/dist/core/browser.js.map +1 -0
  17. package/dist/core/converter.d.ts +18 -0
  18. package/dist/core/converter.d.ts.map +1 -0
  19. package/dist/core/converter.js +74 -0
  20. package/dist/core/converter.js.map +1 -0
  21. package/dist/core/extractor.d.ts +28 -0
  22. package/dist/core/extractor.d.ts.map +1 -0
  23. package/dist/core/extractor.js +151 -0
  24. package/dist/core/extractor.js.map +1 -0
  25. package/dist/core/fetcher.d.ts +24 -0
  26. package/dist/core/fetcher.d.ts.map +1 -0
  27. package/dist/core/fetcher.js +111 -0
  28. package/dist/core/fetcher.js.map +1 -0
  29. package/dist/core/processor.d.ts +22 -0
  30. package/dist/core/processor.d.ts.map +1 -0
  31. package/dist/core/processor.js +104 -0
  32. package/dist/core/processor.js.map +1 -0
  33. package/dist/core/screenshotter.d.ts +31 -0
  34. package/dist/core/screenshotter.d.ts.map +1 -0
  35. package/dist/core/screenshotter.js +222 -0
  36. package/dist/core/screenshotter.js.map +1 -0
  37. package/dist/index.d.ts +3 -0
  38. package/dist/index.d.ts.map +1 -0
  39. package/dist/index.js +14 -0
  40. package/dist/index.js.map +1 -0
  41. package/dist/screen-cli.d.ts +26 -0
  42. package/dist/screen-cli.d.ts.map +1 -0
  43. package/dist/screen-cli.js +196 -0
  44. package/dist/screen-cli.js.map +1 -0
  45. package/dist/screen.d.ts +3 -0
  46. package/dist/screen.d.ts.map +1 -0
  47. package/dist/screen.js +14 -0
  48. package/dist/screen.js.map +1 -0
  49. package/dist/types/index.d.ts +151 -0
  50. package/dist/types/index.d.ts.map +1 -0
  51. package/dist/types/index.js +42 -0
  52. package/dist/types/index.js.map +1 -0
  53. package/dist/utils/filename-sanitizer.d.ts +38 -0
  54. package/dist/utils/filename-sanitizer.d.ts.map +1 -0
  55. package/dist/utils/filename-sanitizer.js +79 -0
  56. package/dist/utils/filename-sanitizer.js.map +1 -0
  57. package/dist/utils/frontmatter.d.ts +6 -0
  58. package/dist/utils/frontmatter.d.ts.map +1 -0
  59. package/dist/utils/frontmatter.js +65 -0
  60. package/dist/utils/frontmatter.js.map +1 -0
  61. package/package.json +56 -0
  62. package/skills/md-fetch/SKILL.md +133 -0
  63. package/skills/md-fetch/references/cli-reference.md +257 -0
  64. package/src/cli.ts +169 -0
  65. package/src/constants.ts +17 -0
  66. package/src/core/browser.ts +161 -0
  67. package/src/core/converter.ts +82 -0
  68. package/src/core/extractor.ts +172 -0
  69. package/src/core/fetcher.ts +143 -0
  70. package/src/core/processor.ts +124 -0
  71. package/src/core/screenshotter.ts +289 -0
  72. package/src/index.ts +15 -0
  73. package/src/screen-cli.ts +216 -0
  74. package/src/screen.ts +15 -0
  75. package/src/types/index.ts +227 -0
  76. package/src/utils/filename-sanitizer.ts +88 -0
  77. package/src/utils/frontmatter.ts +81 -0
  78. package/tsconfig.json +20 -0
@@ -0,0 +1,104 @@
1
+ import { Fetcher } from './fetcher.js';
2
+ import { BrowserFetcher } from './browser.js';
3
+ import { ContentExtractor } from './extractor.js';
4
+ import { MarkdownConverter } from './converter.js';
5
+ import { generateFrontmatter } from '../utils/frontmatter.js';
6
+ export class ContentProcessor {
7
+ fetcher;
8
+ browserFetcher = null;
9
+ extractor;
10
+ converter;
11
+ constructor() {
12
+ this.fetcher = new Fetcher();
13
+ this.extractor = new ContentExtractor();
14
+ this.converter = new MarkdownConverter();
15
+ }
16
+ /**
17
+ * Process a single URL: fetch → extract → convert
18
+ */
19
+ async process(url, options) {
20
+ const { useBrowser, useReadability, selector, fetchOptions, conversionOptions, verbose } = options;
21
+ if (verbose) {
22
+ console.log(`Processing: ${url}`);
23
+ }
24
+ // Step 1: Fetch HTML
25
+ let html;
26
+ if (useBrowser) {
27
+ if (verbose) {
28
+ console.log(' Fetching HTML with browser...');
29
+ }
30
+ // 初始化浏览器(如果还没有)
31
+ if (!this.browserFetcher) {
32
+ this.browserFetcher = new BrowserFetcher(options.browserOptions);
33
+ }
34
+ html = await this.browserFetcher.fetchPage(url);
35
+ }
36
+ else {
37
+ if (verbose) {
38
+ console.log(' Fetching HTML...');
39
+ }
40
+ html = await this.fetcher.fetch(url, fetchOptions);
41
+ }
42
+ // Step 2: Extract content and metadata
43
+ if (verbose) {
44
+ console.log(' Extracting content...');
45
+ }
46
+ const extracted = this.extractor.extract(html, url, {
47
+ useReadability,
48
+ selector
49
+ });
50
+ // Step 3: Convert to Markdown
51
+ if (verbose) {
52
+ console.log(' Converting to Markdown...');
53
+ }
54
+ // Update converter if custom options provided
55
+ if (conversionOptions) {
56
+ this.converter = new MarkdownConverter(conversionOptions);
57
+ }
58
+ const markdownContent = this.converter.convert(extracted.content);
59
+ // Step 4: Generate frontmatter
60
+ if (verbose) {
61
+ console.log(' Generating frontmatter...');
62
+ }
63
+ const frontmatter = generateFrontmatter(extracted.metadata);
64
+ const markdown = frontmatter + markdownContent;
65
+ if (verbose) {
66
+ console.log(' ✓ Done');
67
+ }
68
+ return markdown;
69
+ }
70
+ /**
71
+ * Process multiple URLs (batch mode)
72
+ * Will be enhanced in Phase 3 with concurrency control
73
+ */
74
+ async processBatch(urls, options) {
75
+ const results = [];
76
+ for (const url of urls) {
77
+ try {
78
+ const markdown = await this.process(url, options);
79
+ results.push({ url, markdown, success: true });
80
+ }
81
+ catch (error) {
82
+ results.push({
83
+ url,
84
+ error: error,
85
+ success: false
86
+ });
87
+ if (options.verbose) {
88
+ console.error(` ✗ Error processing ${url}: ${error.message}`);
89
+ }
90
+ }
91
+ }
92
+ return results;
93
+ }
94
+ /**
95
+ * Cleanup resources (close browser if opened)
96
+ */
97
+ async cleanup() {
98
+ if (this.browserFetcher) {
99
+ await this.browserFetcher.close();
100
+ this.browserFetcher = null;
101
+ }
102
+ }
103
+ }
104
+ //# sourceMappingURL=processor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"processor.js","sourceRoot":"","sources":["../../src/core/processor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import type { ScreenshotOptions, ScreenshotResult } from '../types/index.js';
2
+ export declare class Screenshotter {
3
+ private browser;
4
+ private options;
5
+ constructor(options: ScreenshotOptions);
6
+ /**
7
+ * 启动浏览器实例
8
+ */
9
+ launch(): Promise<void>;
10
+ /**
11
+ * 对 URL 进行截图
12
+ */
13
+ screenshot(url: string): Promise<ScreenshotResult>;
14
+ /**
15
+ * 批量截图
16
+ */
17
+ screenshotBatch(urls: string[]): Promise<ScreenshotResult[]>;
18
+ /**
19
+ * 关闭浏览器实例
20
+ */
21
+ close(): Promise<void>;
22
+ /**
23
+ * 确保输出目录存在
24
+ */
25
+ private ensureOutputDir;
26
+ /**
27
+ * 查找 Chrome 可执行文件路径
28
+ */
29
+ private findChromePath;
30
+ }
31
+ //# sourceMappingURL=screenshotter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"screenshotter.d.ts","sourceRoot":"","sources":["../../src/core/screenshotter.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAK7E,qBAAa,aAAa;IACxB,OAAO,CAAC,OAAO,CAAwB;IACvC,OAAO,CAAC,OAAO,CAAoB;gBAEvB,OAAO,EAAE,iBAAiB;IAItC;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAmD7B;;OAEG;IACG,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IA2IxD;;OAEG;IACG,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAWlE;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAO5B;;OAEG;YACW,eAAe;IAa7B;;OAEG;IACH,OAAO,CAAC,cAAc;CAgCvB"}
@@ -0,0 +1,222 @@
1
+ import puppeteer from 'puppeteer-core';
2
+ import { existsSync } from 'fs';
3
+ import { mkdir } from 'fs/promises';
4
+ import { join } from 'path';
5
+ import { ScreenshotError } from '../types/index.js';
6
+ import { DEFAULT_TIMEOUT, DEFAULT_WAIT_UNTIL } from '../constants.js';
7
+ import { generateScreenshotFilename } from '../utils/filename-sanitizer.js';
8
+ export class Screenshotter {
9
+ browser = null;
10
+ options;
11
+ constructor(options) {
12
+ this.options = options;
13
+ }
14
+ /**
15
+ * 启动浏览器实例
16
+ */
17
+ async launch() {
18
+ if (this.browser) {
19
+ return; // 已启动
20
+ }
21
+ const { browserOptions: { executablePath, headless = true, timeout = DEFAULT_TIMEOUT, proxy } } = this.options;
22
+ // 查找 Chrome 可执行文件
23
+ const chromePath = executablePath || this.findChromePath();
24
+ if (!chromePath) {
25
+ throw new ScreenshotError('', 'Chrome/Chromium not found. Please install Chrome or specify the path with --browser-path');
26
+ }
27
+ const launchOptions = {
28
+ executablePath: chromePath,
29
+ headless,
30
+ timeout,
31
+ args: [
32
+ '--no-sandbox',
33
+ '--disable-setuid-sandbox',
34
+ '--disable-dev-shm-usage',
35
+ '--disable-gpu'
36
+ ]
37
+ };
38
+ // 添加代理参数
39
+ if (proxy) {
40
+ launchOptions.args.push(`--proxy-server=${proxy}`);
41
+ }
42
+ try {
43
+ this.browser = await puppeteer.launch(launchOptions);
44
+ }
45
+ catch (error) {
46
+ throw new ScreenshotError('', `Failed to launch browser: ${error.message}`);
47
+ }
48
+ }
49
+ /**
50
+ * 对 URL 进行截图
51
+ */
52
+ async screenshot(url) {
53
+ if (!this.browser) {
54
+ await this.launch();
55
+ }
56
+ const { fullPage, width, height, deviceScaleFactor, outputDir, format, quality, browserOptions: { waitUntil = DEFAULT_WAIT_UNTIL, timeout = DEFAULT_TIMEOUT, userAgent }, delay, selector, hideSelectors, verbose } = this.options;
57
+ let page = null;
58
+ try {
59
+ page = await this.browser.newPage();
60
+ // 设置视口
61
+ await page.setViewport({
62
+ width,
63
+ height,
64
+ deviceScaleFactor
65
+ });
66
+ // 设置 User-Agent
67
+ if (userAgent) {
68
+ await page.setUserAgent(userAgent);
69
+ }
70
+ // 设置超时
71
+ page.setDefaultTimeout(timeout);
72
+ if (verbose) {
73
+ console.log(`Navigating to ${url}...`);
74
+ }
75
+ // 导航到页面
76
+ await page.goto(url, {
77
+ waitUntil,
78
+ timeout
79
+ });
80
+ // 隐藏指定的元素
81
+ if (hideSelectors && hideSelectors.length > 0) {
82
+ if (verbose) {
83
+ console.log(`Hiding elements: ${hideSelectors.join(', ')}`);
84
+ }
85
+ await page.evaluate((selectors) => {
86
+ selectors.forEach(selector => {
87
+ const elements = document.querySelectorAll(selector);
88
+ elements.forEach(el => {
89
+ el.style.display = 'none';
90
+ });
91
+ });
92
+ }, hideSelectors);
93
+ }
94
+ // 延迟截图(如果指定)
95
+ if (delay && delay > 0) {
96
+ if (verbose) {
97
+ console.log(`Waiting ${delay}ms before screenshot...`);
98
+ }
99
+ await new Promise(resolve => setTimeout(resolve, delay));
100
+ }
101
+ // 确保输出目录存在
102
+ await this.ensureOutputDir(outputDir);
103
+ // 生成文件名
104
+ const filename = generateScreenshotFilename(url, format);
105
+ const filepath = join(outputDir, filename);
106
+ if (verbose) {
107
+ console.log(`Taking screenshot...`);
108
+ }
109
+ // 截图选项
110
+ const screenshotOptions = {
111
+ path: filepath,
112
+ type: format
113
+ };
114
+ // 添加质量参数(仅 JPEG 和 WebP)
115
+ if ((format === 'jpeg' || format === 'webp') && quality !== undefined) {
116
+ screenshotOptions.quality = quality;
117
+ }
118
+ // 根据选择器或全页模式截图
119
+ if (selector) {
120
+ // 截取特定元素
121
+ const element = await page.$(selector);
122
+ if (!element) {
123
+ throw new ScreenshotError(url, `Element not found: ${selector}`);
124
+ }
125
+ await element.screenshot(screenshotOptions);
126
+ }
127
+ else {
128
+ // 全页或视口截图
129
+ screenshotOptions.fullPage = fullPage;
130
+ await page.screenshot(screenshotOptions);
131
+ }
132
+ if (verbose) {
133
+ console.log(`Screenshot saved to: ${filepath}`);
134
+ }
135
+ return {
136
+ url,
137
+ filepath,
138
+ success: true
139
+ };
140
+ }
141
+ catch (error) {
142
+ return {
143
+ url,
144
+ success: false,
145
+ error: new ScreenshotError(url, `Failed to take screenshot: ${error.message}`)
146
+ };
147
+ }
148
+ finally {
149
+ if (page) {
150
+ await page.close();
151
+ }
152
+ }
153
+ }
154
+ /**
155
+ * 批量截图
156
+ */
157
+ async screenshotBatch(urls) {
158
+ const results = [];
159
+ for (const url of urls) {
160
+ const result = await this.screenshot(url);
161
+ results.push(result);
162
+ }
163
+ return results;
164
+ }
165
+ /**
166
+ * 关闭浏览器实例
167
+ */
168
+ async close() {
169
+ if (this.browser) {
170
+ await this.browser.close();
171
+ this.browser = null;
172
+ }
173
+ }
174
+ /**
175
+ * 确保输出目录存在
176
+ */
177
+ async ensureOutputDir(dir) {
178
+ try {
179
+ if (!existsSync(dir)) {
180
+ await mkdir(dir, { recursive: true });
181
+ }
182
+ }
183
+ catch (error) {
184
+ throw new ScreenshotError('', `Failed to create output directory: ${error.message}`);
185
+ }
186
+ }
187
+ /**
188
+ * 查找 Chrome 可执行文件路径
189
+ */
190
+ findChromePath() {
191
+ // 常见的 Chrome 安装路径
192
+ const possiblePaths = [
193
+ // Windows
194
+ 'C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe',
195
+ 'C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe',
196
+ process.env.LOCALAPPDATA + '\\Google\\Chrome\\Application\\chrome.exe',
197
+ // macOS
198
+ '/Applications/Google Chrome.app/Contents/MacOS/Google Chrome',
199
+ '/Applications/Chromium.app/Contents/MacOS/Chromium',
200
+ // Linux
201
+ '/usr/bin/google-chrome',
202
+ '/usr/bin/google-chrome-stable',
203
+ '/usr/bin/chromium',
204
+ '/usr/bin/chromium-browser',
205
+ '/snap/bin/chromium'
206
+ ];
207
+ // 尝试查找可用的路径
208
+ for (const path of possiblePaths) {
209
+ try {
210
+ if (existsSync(path)) {
211
+ return path;
212
+ }
213
+ }
214
+ catch {
215
+ continue;
216
+ }
217
+ }
218
+ // 从环境变量读取
219
+ return process.env.CHROME_PATH || process.env.CHROMIUM_PATH;
220
+ }
221
+ }
222
+ //# sourceMappingURL=screenshotter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"screenshotter.js","sourceRoot":"","sources":["../../src/core/screenshotter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env node
2
+ import { CLI } from './cli.js';
3
+ async function main() {
4
+ try {
5
+ const cli = new CLI();
6
+ await cli.run(process.argv);
7
+ }
8
+ catch (error) {
9
+ console.error('Fatal error:', error.message);
10
+ process.exit(1);
11
+ }
12
+ }
13
+ main();
14
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAE/B,KAAK,UAAU,IAAI;IACjB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,GAAG,EAAE,CAAC;QACtB,MAAM,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,cAAc,EAAG,KAAe,CAAC,OAAO,CAAC,CAAC;QACxD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC"}
@@ -0,0 +1,26 @@
1
+ export declare class ScreenCLI {
2
+ private program;
3
+ constructor();
4
+ /**
5
+ * 解析整数选项
6
+ */
7
+ private parseIntOption;
8
+ private setupCommands;
9
+ /**
10
+ * 处理截图命令
11
+ */
12
+ private handleScreenshot;
13
+ /**
14
+ * 构建浏览器选项
15
+ */
16
+ private buildBrowserOptions;
17
+ /**
18
+ * 解析隐藏选择器(逗号分隔)
19
+ */
20
+ private parseHideSelectors;
21
+ /**
22
+ * 运行 CLI
23
+ */
24
+ run(argv: string[]): Promise<void>;
25
+ }
26
+ //# sourceMappingURL=screen-cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"screen-cli.d.ts","sourceRoot":"","sources":["../src/screen-cli.ts"],"names":[],"mappings":"AAKA,qBAAa,SAAS;IACpB,OAAO,CAAC,OAAO,CAAU;;IAOzB;;OAEG;IACH,OAAO,CAAC,cAAc;IAQtB,OAAO,CAAC,aAAa;IAiCrB;;OAEG;YACW,gBAAgB;IAyH9B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAW3B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAW1B;;OAEG;IACG,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;CAGzC"}
@@ -0,0 +1,196 @@
1
+ import { Command } from 'commander';
2
+ import { Screenshotter } from './core/screenshotter.js';
3
+ import { DEFAULT_TIMEOUT, DEFAULT_WAIT_UNTIL } from './constants.js';
4
+ export class ScreenCLI {
5
+ program;
6
+ constructor() {
7
+ this.program = new Command();
8
+ this.setupCommands();
9
+ }
10
+ /**
11
+ * 解析整数选项
12
+ */
13
+ parseIntOption(value) {
14
+ const parsed = parseInt(value, 10);
15
+ if (isNaN(parsed)) {
16
+ throw new Error(`Invalid number: ${value}`);
17
+ }
18
+ return parsed;
19
+ }
20
+ setupCommands() {
21
+ this.program
22
+ .name('md-fetch-screen')
23
+ .description('Take screenshots of web pages using headless browser')
24
+ .version('1.0.0')
25
+ .argument('<urls...>', 'URLs to screenshot')
26
+ // 尺寸和视图相关(保留简写)
27
+ .option('-f, --full-page', 'Full page screenshot (default)')
28
+ .option('--viewport', 'Viewport-only screenshot')
29
+ .option('-W, --width <pixels>', 'Viewport width in pixels', this.parseIntOption, 1920)
30
+ .option('-H, --height <pixels>', 'Viewport height in pixels', this.parseIntOption, 1080)
31
+ .option('--scale <number>', 'Device scale factor for high-DPI screenshots (1/2/3)', parseFloat, 1)
32
+ // 输出相关
33
+ .option('--output <dir>', 'Output directory', '.')
34
+ .option('--format <type>', 'Image format (png|jpeg|webp)', 'png')
35
+ .option('--quality <number>', 'JPEG/WebP quality (0-100)', this.parseIntOption, 90)
36
+ // 浏览器相关
37
+ .option('--browser-path <path>', 'Custom Chrome/Chromium executable path')
38
+ .option('--wait-until <event>', 'Browser wait condition (load|domcontentloaded|networkidle0|networkidle2)', DEFAULT_WAIT_UNTIL)
39
+ .option('--timeout <ms>', 'Request timeout in milliseconds', this.parseIntOption, DEFAULT_TIMEOUT)
40
+ .option('--user-agent <string>', 'Custom user agent')
41
+ .option('--proxy <url>', 'Proxy server URL')
42
+ // 内容相关
43
+ .option('--delay <ms>', 'Delay before screenshot in milliseconds', this.parseIntOption, 0)
44
+ .option('--selector <css>', 'CSS selector to screenshot specific element')
45
+ .option('--hide <selectors>', 'CSS selectors to hide (comma-separated)')
46
+ // 其他
47
+ .option('--verbose', 'Enable verbose logging', false)
48
+ .action(async (urls, options) => {
49
+ await this.handleScreenshot(urls, options);
50
+ });
51
+ }
52
+ /**
53
+ * 处理截图命令
54
+ */
55
+ async handleScreenshot(urls, options) {
56
+ try {
57
+ // 验证 URL
58
+ if (!urls || urls.length === 0) {
59
+ console.error('Error: At least one URL is required');
60
+ process.exit(1);
61
+ }
62
+ // 验证图片格式
63
+ const format = options.format?.toLowerCase() || 'png';
64
+ if (!['png', 'jpeg', 'webp'].includes(format)) {
65
+ console.error('Error: Format must be png, jpeg, or webp');
66
+ process.exit(1);
67
+ }
68
+ // 验证像素比例
69
+ const scale = options.scale || 1;
70
+ if (scale < 1 || scale > 3) {
71
+ console.error('Error: Scale must be between 1 and 3');
72
+ process.exit(1);
73
+ }
74
+ // 验证质量
75
+ if (options.quality !== undefined) {
76
+ if (options.quality < 0 || options.quality > 100) {
77
+ console.error('Error: Quality must be between 0 and 100');
78
+ process.exit(1);
79
+ }
80
+ }
81
+ // 验证并处理宽高参数
82
+ const width = options.width ?? 1920;
83
+ const height = options.height ?? 1080;
84
+ if (isNaN(width) || width <= 0) {
85
+ console.error('Error: Width must be a positive number');
86
+ process.exit(1);
87
+ }
88
+ if (isNaN(height) || height <= 0) {
89
+ console.error('Error: Height must be a positive number');
90
+ process.exit(1);
91
+ }
92
+ // 构建截图选项
93
+ const screenshotOptions = {
94
+ fullPage: options.viewport ? false : (options.fullPage ?? true),
95
+ width: Math.floor(width),
96
+ height: Math.floor(height),
97
+ deviceScaleFactor: scale,
98
+ outputDir: options.output || '.',
99
+ format: format,
100
+ quality: options.quality,
101
+ browserOptions: this.buildBrowserOptions(options),
102
+ delay: options.delay,
103
+ selector: options.selector,
104
+ hideSelectors: this.parseHideSelectors(options.hide),
105
+ verbose: options.verbose || false
106
+ };
107
+ // 创建截图器
108
+ const screenshotter = new Screenshotter(screenshotOptions);
109
+ try {
110
+ if (options.verbose) {
111
+ console.log('Screenshot options:');
112
+ console.log(` Mode: ${screenshotOptions.fullPage ? 'Full page' : 'Viewport only'}`);
113
+ console.log(` Viewport size: ${screenshotOptions.width}x${screenshotOptions.height}`);
114
+ console.log(` Device scale factor: ${screenshotOptions.deviceScaleFactor}x`);
115
+ if (screenshotOptions.fullPage) {
116
+ console.log(` Note: In full-page mode, viewport size controls browser window, final image size depends on page content`);
117
+ }
118
+ else {
119
+ console.log(` Expected image size: ${screenshotOptions.width * screenshotOptions.deviceScaleFactor}x${screenshotOptions.height * screenshotOptions.deviceScaleFactor} pixels`);
120
+ }
121
+ console.log(` Format: ${screenshotOptions.format}`);
122
+ console.log(` Output: ${screenshotOptions.outputDir}`);
123
+ console.log('');
124
+ }
125
+ // 截图
126
+ const results = await screenshotter.screenshotBatch(urls);
127
+ // 显示结果
128
+ let successCount = 0;
129
+ let failureCount = 0;
130
+ for (const result of results) {
131
+ if (result.success) {
132
+ successCount++;
133
+ console.log(`✓ ${result.url}`);
134
+ console.log(` Saved to: ${result.filepath}`);
135
+ }
136
+ else {
137
+ failureCount++;
138
+ console.error(`✗ ${result.url}`);
139
+ console.error(` Error: ${result.error?.message}`);
140
+ }
141
+ console.log('');
142
+ }
143
+ // 汇总
144
+ if (results.length > 1) {
145
+ console.log(`Summary: ${successCount} succeeded, ${failureCount} failed`);
146
+ }
147
+ // 清理
148
+ await screenshotter.close();
149
+ // 如果有失败,退出码为 1
150
+ if (failureCount > 0) {
151
+ process.exit(1);
152
+ }
153
+ }
154
+ catch (error) {
155
+ await screenshotter.close();
156
+ throw error;
157
+ }
158
+ }
159
+ catch (error) {
160
+ console.error('Error:', error.message);
161
+ process.exit(1);
162
+ }
163
+ }
164
+ /**
165
+ * 构建浏览器选项
166
+ */
167
+ buildBrowserOptions(options) {
168
+ return {
169
+ executablePath: options.browserPath,
170
+ waitUntil: options.waitUntil || DEFAULT_WAIT_UNTIL,
171
+ timeout: options.timeout || DEFAULT_TIMEOUT,
172
+ userAgent: options.userAgent,
173
+ proxy: options.proxy,
174
+ headless: true
175
+ };
176
+ }
177
+ /**
178
+ * 解析隐藏选择器(逗号分隔)
179
+ */
180
+ parseHideSelectors(hideOption) {
181
+ if (!hideOption) {
182
+ return undefined;
183
+ }
184
+ return hideOption
185
+ .split(',')
186
+ .map(s => s.trim())
187
+ .filter(s => s.length > 0);
188
+ }
189
+ /**
190
+ * 运行 CLI
191
+ */
192
+ async run(argv) {
193
+ await this.program.parseAsync(argv);
194
+ }
195
+ }
196
+ //# sourceMappingURL=screen-cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"screen-cli.js","sourceRoot":"","sources":["../src/screen-cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=screen.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"screen.d.ts","sourceRoot":"","sources":["../src/screen.ts"],"names":[],"mappings":""}