manhuagui-cli 1.0.0 → 1.0.2
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 +172 -58
- package/README_EN.md +172 -56
- package/dist/lib/browser.d.ts +4 -0
- package/dist/lib/browser.d.ts.map +1 -0
- package/dist/lib/browser.js +22 -0
- package/dist/lib/browser.js.map +1 -0
- package/dist/lib/chapter.d.ts +19 -3
- package/dist/lib/chapter.d.ts.map +1 -1
- package/dist/lib/chapter.js +142 -63
- package/dist/lib/chapter.js.map +1 -1
- package/dist/lib/cli.d.ts +20 -0
- package/dist/lib/cli.d.ts.map +1 -1
- package/dist/lib/cli.js +142 -131
- package/dist/lib/cli.js.map +1 -1
- package/dist/lib/comic.d.ts.map +1 -1
- package/dist/lib/comic.js +26 -17
- package/dist/lib/comic.js.map +1 -1
- package/dist/lib/config.d.ts +26 -19
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +92 -33
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/logger.d.ts +3 -0
- package/dist/lib/logger.d.ts.map +1 -1
- package/dist/lib/logger.js +6 -2
- package/dist/lib/logger.js.map +1 -1
- package/dist/lib/progress.d.ts +11 -5
- package/dist/lib/progress.d.ts.map +1 -1
- package/dist/lib/progress.js +17 -15
- package/dist/lib/progress.js.map +1 -1
- package/dist/lib/prompts.d.ts +1 -0
- package/dist/lib/prompts.d.ts.map +1 -1
- package/dist/lib/prompts.js +9 -12
- package/dist/lib/prompts.js.map +1 -1
- package/dist/lib/speed.d.ts +16 -0
- package/dist/lib/speed.d.ts.map +1 -0
- package/dist/lib/speed.js +83 -0
- package/dist/lib/speed.js.map +1 -0
- package/dist/lib/tasks.d.ts +21 -0
- package/dist/lib/tasks.d.ts.map +1 -0
- package/dist/lib/tasks.js +124 -0
- package/dist/lib/tasks.js.map +1 -0
- package/dist/lib/ui.d.ts +33 -0
- package/dist/lib/ui.d.ts.map +1 -0
- package/dist/lib/ui.js +216 -0
- package/dist/lib/ui.js.map +1 -0
- package/package.json +5 -3
package/dist/lib/chapter.js
CHANGED
|
@@ -1,21 +1,22 @@
|
|
|
1
1
|
import { writeFileSync } from "node:fs";
|
|
2
2
|
import { join } from "node:path";
|
|
3
|
-
import {
|
|
3
|
+
import { createBrowserContext, handleAdultCheck } from "./browser.js";
|
|
4
|
+
import { config } from "./config.js";
|
|
4
5
|
import { rotateHost } from "./download.js";
|
|
5
6
|
import { logger } from "./logger.js";
|
|
6
|
-
import { ensureDir,
|
|
7
|
+
import { ensureDir, sleep } from "./utils.js";
|
|
7
8
|
export function computePadLength(count) {
|
|
8
|
-
return Math.max(
|
|
9
|
+
return Math.max(config.padMinLength, String(count).length);
|
|
9
10
|
}
|
|
10
11
|
export function extractExtension(url) {
|
|
11
12
|
const match = url.match(/\.(\w{3,4})(?:\?|$)/);
|
|
12
13
|
return match?.[1] ?? "webp";
|
|
13
14
|
}
|
|
14
|
-
export function buildFilePath(
|
|
15
|
-
const padNum = String(index + 1).padStart(padLen, "0");
|
|
16
|
-
return join(outputDir, `${padNum}.${ext}`);
|
|
15
|
+
export function buildFilePath(opts) {
|
|
16
|
+
const padNum = String(opts.index + 1).padStart(opts.padLen, "0");
|
|
17
|
+
return join(opts.outputDir, `${padNum}.${opts.ext}`);
|
|
17
18
|
}
|
|
18
|
-
async function getPageCount(page) {
|
|
19
|
+
export async function getPageCount(page) {
|
|
19
20
|
return page.evaluate(() => {
|
|
20
21
|
const pageSpan = document.querySelector("#page");
|
|
21
22
|
if (pageSpan?.parentElement) {
|
|
@@ -29,8 +30,25 @@ async function getPageCount(page) {
|
|
|
29
30
|
return 0;
|
|
30
31
|
});
|
|
31
32
|
}
|
|
32
|
-
async function
|
|
33
|
+
export async function getSubPageUrls(page) {
|
|
34
|
+
try {
|
|
35
|
+
await page.waitForSelector("#pagination a", { timeout: config.tabLoadTimeout });
|
|
36
|
+
return await page.evaluate(() => {
|
|
37
|
+
const links = document.querySelectorAll("#pagination a");
|
|
38
|
+
if (links.length <= 1)
|
|
39
|
+
return [];
|
|
40
|
+
return Array.from(links)
|
|
41
|
+
.map((a) => a.href)
|
|
42
|
+
.filter((href) => href.startsWith("http"));
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
return [];
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
export async function collectImageUrls(page, pageCount) {
|
|
33
50
|
const urls = [];
|
|
51
|
+
const pagePath = page.url().split("#")[0];
|
|
34
52
|
let currentUrl = await page.$eval("#mangaFile", (img) => img.src);
|
|
35
53
|
urls.push(currentUrl);
|
|
36
54
|
for (let i = 1; i < pageCount; i++) {
|
|
@@ -42,68 +60,104 @@ async function collectImageUrls(page, pageCount) {
|
|
|
42
60
|
await page.waitForFunction((prev) => {
|
|
43
61
|
const img = document.querySelector("#mangaFile");
|
|
44
62
|
return img !== null && img.src !== "" && img.src !== prev;
|
|
45
|
-
}, prevUrl, { timeout:
|
|
46
|
-
await page.waitForTimeout(
|
|
63
|
+
}, prevUrl, { timeout: config.nextPageTimeout });
|
|
64
|
+
await page.waitForTimeout(config.imageLoadDelay);
|
|
65
|
+
if (page.url().split("#")[0] !== pagePath)
|
|
66
|
+
break;
|
|
47
67
|
currentUrl = await page.$eval("#mangaFile", (img) => img.src);
|
|
48
68
|
urls.push(currentUrl);
|
|
49
69
|
}
|
|
50
70
|
return urls;
|
|
51
71
|
}
|
|
52
|
-
async function
|
|
72
|
+
async function navigateToChapterPage(page, url) {
|
|
73
|
+
await page.goto(url, {
|
|
74
|
+
waitUntil: "domcontentloaded",
|
|
75
|
+
timeout: config.pageLoadTimeout,
|
|
76
|
+
});
|
|
77
|
+
await handleAdultCheck(page);
|
|
78
|
+
await page.waitForSelector("#mangaFile", { timeout: config.chapterSelectorTimeout });
|
|
79
|
+
}
|
|
80
|
+
export function validateImageResponse(response) {
|
|
81
|
+
if (response?.status() !== 200) {
|
|
82
|
+
throw new Error(`HTTP ${response?.status() ?? "no response"}`);
|
|
83
|
+
}
|
|
84
|
+
const contentType = response?.headers()?.["content-type"] ?? "";
|
|
85
|
+
if (contentType && !contentType.startsWith("image/")) {
|
|
86
|
+
throw new Error(`Unexpected content type: ${contentType}`);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
async function fetchImageAsBase64(page) {
|
|
90
|
+
return page.evaluate(async () => {
|
|
91
|
+
const res = await fetch(window.location.href);
|
|
92
|
+
if (!res.ok)
|
|
93
|
+
throw new Error(`Fetch failed: ${res.status}`);
|
|
94
|
+
const buf = await res.arrayBuffer();
|
|
95
|
+
const bytes = new Uint8Array(buf);
|
|
96
|
+
let binary = "";
|
|
97
|
+
const step = 0x8000;
|
|
98
|
+
for (let j = 0; j < bytes.length; j += step) {
|
|
99
|
+
binary += String.fromCharCode.apply(null, Array.from(bytes.subarray(j, j + step)));
|
|
100
|
+
}
|
|
101
|
+
return btoa(binary);
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
async function downloadImage(opts) {
|
|
105
|
+
const { dlPage, chapterUrl, url, outputDir, imageIndex, padLen } = opts;
|
|
53
106
|
const ext = extractExtension(url);
|
|
54
|
-
const filePath = buildFilePath(outputDir, imageIndex, padLen, ext);
|
|
107
|
+
const filePath = buildFilePath({ outputDir, index: imageIndex, padLen, ext });
|
|
55
108
|
let downloadUrl = url;
|
|
56
|
-
for (let attempt = 0; attempt <
|
|
109
|
+
for (let attempt = 0; attempt < config.retryCount; attempt++) {
|
|
57
110
|
try {
|
|
111
|
+
const started = Date.now();
|
|
58
112
|
const response = await dlPage.goto(downloadUrl, {
|
|
59
113
|
referer: chapterUrl,
|
|
60
114
|
waitUntil: "load",
|
|
61
|
-
timeout:
|
|
115
|
+
timeout: config.pageLoadTimeout,
|
|
62
116
|
});
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
throw new Error(`Unexpected content type: ${contentType}`);
|
|
69
|
-
}
|
|
70
|
-
const base64 = await dlPage.evaluate(async () => {
|
|
71
|
-
const res = await fetch(window.location.href);
|
|
72
|
-
if (!res.ok)
|
|
73
|
-
throw new Error(`Fetch failed: ${res.status}`);
|
|
74
|
-
const buf = await res.arrayBuffer();
|
|
75
|
-
const bytes = new Uint8Array(buf);
|
|
76
|
-
let binary = "";
|
|
77
|
-
const step = 0x8000;
|
|
78
|
-
for (let j = 0; j < bytes.length; j += step) {
|
|
79
|
-
binary += String.fromCharCode.apply(null, Array.from(bytes.subarray(j, j + step)));
|
|
80
|
-
}
|
|
81
|
-
return btoa(binary);
|
|
82
|
-
});
|
|
83
|
-
writeFileSync(filePath, Buffer.from(base64, "base64"));
|
|
84
|
-
return true;
|
|
117
|
+
validateImageResponse(response);
|
|
118
|
+
const base64 = await fetchImageAsBase64(dlPage);
|
|
119
|
+
const buffer = Buffer.from(base64, "base64");
|
|
120
|
+
writeFileSync(filePath, buffer);
|
|
121
|
+
return { ok: true, bytes: buffer.length, durationMs: Date.now() - started };
|
|
85
122
|
}
|
|
86
123
|
catch {
|
|
87
|
-
if (attempt <
|
|
124
|
+
if (attempt < config.retryCount - 1) {
|
|
88
125
|
downloadUrl = rotateHost(downloadUrl);
|
|
89
|
-
await sleep(
|
|
126
|
+
await sleep(config.retryBackoffBase * (attempt + 1));
|
|
90
127
|
}
|
|
91
128
|
}
|
|
92
129
|
}
|
|
93
|
-
logger.warn(`Failed to download after ${
|
|
94
|
-
return false;
|
|
130
|
+
logger.warn(`Failed to download after ${config.retryCount} retries: ${url}`);
|
|
131
|
+
return { ok: false, bytes: 0, durationMs: 0 };
|
|
95
132
|
}
|
|
96
|
-
async function downloadImages(
|
|
97
|
-
const
|
|
133
|
+
async function downloadImages(opts) {
|
|
134
|
+
const { context, chapterUrl, outputDir, urls, padLen, tracker, onProgress } = opts;
|
|
135
|
+
const concurrency = Math.min(config.imageConcurrency, urls.length);
|
|
98
136
|
const downloadPages = await Promise.all(Array.from({ length: concurrency }, () => context.newPage()));
|
|
99
137
|
try {
|
|
100
138
|
for (let i = 0; i < urls.length; i += concurrency) {
|
|
101
139
|
const batch = urls.slice(i, i + concurrency);
|
|
102
|
-
const results = await Promise.all(batch.map((url, idx) => downloadImage(
|
|
103
|
-
|
|
140
|
+
const results = await Promise.all(batch.map((url, idx) => downloadImage({
|
|
141
|
+
dlPage: downloadPages[idx],
|
|
142
|
+
chapterUrl,
|
|
143
|
+
url,
|
|
144
|
+
outputDir,
|
|
145
|
+
imageIndex: i + idx,
|
|
146
|
+
padLen,
|
|
147
|
+
})));
|
|
148
|
+
let batchBytes = 0;
|
|
149
|
+
for (const r of results) {
|
|
150
|
+
if (r.ok) {
|
|
151
|
+
tracker.record(r.bytes, r.durationMs);
|
|
152
|
+
batchBytes += r.bytes;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
if (results.some((r) => !r.ok))
|
|
104
156
|
return;
|
|
105
|
-
|
|
106
|
-
|
|
157
|
+
onProgress?.(Math.min(i + batch.length, urls.length), batchBytes);
|
|
158
|
+
const isLast = i + concurrency >= urls.length;
|
|
159
|
+
if (!isLast && config.downloadDelay > 0) {
|
|
160
|
+
await sleep(Math.round(config.downloadDelay * (0.5 + Math.random())));
|
|
107
161
|
}
|
|
108
162
|
}
|
|
109
163
|
}
|
|
@@ -111,28 +165,53 @@ async function downloadImages(context, chapterUrl, outputDir, urls, padLen) {
|
|
|
111
165
|
await Promise.all(downloadPages.map((p) => p.close()));
|
|
112
166
|
}
|
|
113
167
|
}
|
|
114
|
-
|
|
168
|
+
async function collectImageUrlsFromSubPages(page, subPageUrls) {
|
|
169
|
+
const allUrls = [];
|
|
170
|
+
for (let i = 0; i < subPageUrls.length; i++) {
|
|
171
|
+
if (i > 0) {
|
|
172
|
+
await navigateToChapterPage(page, subPageUrls[i]);
|
|
173
|
+
}
|
|
174
|
+
const tabPageCount = await getPageCount(page);
|
|
175
|
+
if (tabPageCount <= 0)
|
|
176
|
+
continue;
|
|
177
|
+
const tabUrls = await collectImageUrls(page, tabPageCount);
|
|
178
|
+
allUrls.push(...tabUrls);
|
|
179
|
+
}
|
|
180
|
+
return allUrls;
|
|
181
|
+
}
|
|
182
|
+
export async function extractChapterImages(opts) {
|
|
183
|
+
const { chapterUrl, browser, outputDir, tracker, onProgress } = opts;
|
|
115
184
|
ensureDir(outputDir);
|
|
116
|
-
const context = await browser
|
|
117
|
-
userAgent: pickUserAgent(),
|
|
118
|
-
viewport: {
|
|
119
|
-
width: randInt(VIEWPORT_MIN_WIDTH, VIEWPORT_MAX_WIDTH),
|
|
120
|
-
height: randInt(VIEWPORT_MIN_HEIGHT, VIEWPORT_MAX_HEIGHT),
|
|
121
|
-
},
|
|
122
|
-
});
|
|
185
|
+
const context = await createBrowserContext(browser);
|
|
123
186
|
const page = await context.newPage();
|
|
124
187
|
try {
|
|
125
|
-
await page
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
188
|
+
await navigateToChapterPage(page, chapterUrl);
|
|
189
|
+
const subPageUrls = await getSubPageUrls(page);
|
|
190
|
+
let urls;
|
|
191
|
+
if (subPageUrls.length > 0) {
|
|
192
|
+
urls = await collectImageUrlsFromSubPages(page, subPageUrls);
|
|
193
|
+
}
|
|
194
|
+
else {
|
|
195
|
+
const expectedCount = await getPageCount(page);
|
|
196
|
+
if (expectedCount <= 0)
|
|
197
|
+
return [];
|
|
198
|
+
onProgress?.(0, expectedCount, 0);
|
|
199
|
+
urls = await collectImageUrls(page, expectedCount);
|
|
200
|
+
}
|
|
201
|
+
if (urls.length === 0)
|
|
132
202
|
return [];
|
|
133
|
-
const urls = await collectImageUrls(page, pageCount);
|
|
134
203
|
const padLen = computePadLength(urls.length);
|
|
135
|
-
|
|
204
|
+
const actualCount = urls.length;
|
|
205
|
+
onProgress?.(0, actualCount, 0);
|
|
206
|
+
await downloadImages({
|
|
207
|
+
context,
|
|
208
|
+
chapterUrl,
|
|
209
|
+
outputDir,
|
|
210
|
+
urls,
|
|
211
|
+
padLen,
|
|
212
|
+
tracker,
|
|
213
|
+
onProgress: (downloaded, bytes) => onProgress?.(downloaded, actualCount, bytes),
|
|
214
|
+
});
|
|
136
215
|
return urls;
|
|
137
216
|
}
|
|
138
217
|
finally {
|
package/dist/lib/chapter.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chapter.js","sourceRoot":"","sources":["../../src/lib/chapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,
|
|
1
|
+
{"version":3,"file":"chapter.js","sourceRoot":"","sources":["../../src/lib/chapter.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/cli.d.ts
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import type { Section } from "./types.js";
|
|
2
|
+
export declare function applyFilters(sections: Section[], sectionFilter?: string, chapterFilter?: string): Section[];
|
|
1
3
|
export declare const command: import("citty").CommandDef<{
|
|
2
4
|
readonly url: {
|
|
3
5
|
readonly type: "positional";
|
|
@@ -26,5 +28,23 @@ export declare const command: import("citty").CommandDef<{
|
|
|
26
28
|
readonly alias: "d";
|
|
27
29
|
readonly default: false;
|
|
28
30
|
};
|
|
31
|
+
readonly output: {
|
|
32
|
+
readonly type: "string";
|
|
33
|
+
readonly description: "下载输出目录 / Output directory for downloads";
|
|
34
|
+
readonly alias: "o";
|
|
35
|
+
};
|
|
36
|
+
readonly concurrency: {
|
|
37
|
+
readonly type: "string";
|
|
38
|
+
readonly description: "章节内图片并发下载数 / Concurrent image downloads per chapter";
|
|
39
|
+
readonly alias: "C";
|
|
40
|
+
};
|
|
41
|
+
readonly retry: {
|
|
42
|
+
readonly type: "string";
|
|
43
|
+
readonly description: "图片下载重试次数 / Retry count per image";
|
|
44
|
+
};
|
|
45
|
+
readonly "log-level": {
|
|
46
|
+
readonly type: "string";
|
|
47
|
+
readonly description: "日志级别: debug | info | warn | error / Log level";
|
|
48
|
+
};
|
|
29
49
|
}>;
|
|
30
50
|
//# sourceMappingURL=cli.d.ts.map
|
package/dist/lib/cli.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/lib/cli.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/lib/cli.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAa,OAAO,EAAE,MAAM,YAAY,CAAC;AAmBrD,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,OAAO,EAAE,EACnB,aAAa,CAAC,EAAE,MAAM,EACtB,aAAa,CAAC,EAAE,MAAM,GACrB,OAAO,EAAE,CAgBX;AAuMD,eAAO,MAAM,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAmFlB,CAAC"}
|