原实现只能「多画廊并行,每个画廊串行下」,单张大画廊下得很慢。 按用户多年使用习惯(5 画廊 × 每画廊 8 张)改造为双层并发。 - 双层并发:画廊并发(默认5) × 页并发(默认8) = 最多 40 张同时下载, 两个值都在设置面板可调(1-20)。页级 worker 池 + mutex 保护计数。 - 全局限流:对齐参考实现的 nextRequestTime 算法,限所有请求 (含 /s/ 解析与图片本体),默认 0 秒关闭。 - 整轮扫尾:跑完后自动重扫失败页 1 轮(同样走完整 4 次退避重试), 仍失败则停下并标记 partial,换线路后手动点开始即可续传。 - 画廊目录清单 .ehdl.json:记录 gid/token/总页数/已完成页, 即使 state.json 丢失也能算出「应该多少张、还差多少张」。 顺带修复: - Start() 双重加锁导致死锁(引擎完全无法启动) - clampInt 越界时返回默认值而非边界值(设 30 会静默变 8) - 直链正则写死 hath.network,CDN 换域名会全军覆没 -> 加图片 URL 兜底 - ReconcileTask 会误报「有改动」 测试从 37 增至 62,其中并发/限流/扫尾用 httptest 模拟 EH 实测: - 页并发峰值 = 8、画廊并发峰值 = 5(完全生效) - 12 次请求限流 80ms 实测 966ms(期望 880ms) - 断点续传 4 张已存在时只发 5 次请求
88 lines
2.0 KiB
JavaScript
88 lines
2.0 KiB
JavaScript
// @ts-check
|
|
// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL
|
|
// This file is automatically generated. DO NOT EDIT
|
|
|
|
export function AddTasks(arg1) {
|
|
return window['go']['main']['App']['AddTasks'](arg1);
|
|
}
|
|
|
|
export function ClearAll(arg1) {
|
|
return window['go']['main']['App']['ClearAll'](arg1);
|
|
}
|
|
|
|
export function ClearFinished() {
|
|
return window['go']['main']['App']['ClearFinished']();
|
|
}
|
|
|
|
export function CountDone() {
|
|
return window['go']['main']['App']['CountDone']();
|
|
}
|
|
|
|
export function EngineInfo() {
|
|
return window['go']['main']['App']['EngineInfo']();
|
|
}
|
|
|
|
export function ExportFailed(arg1) {
|
|
return window['go']['main']['App']['ExportFailed'](arg1);
|
|
}
|
|
|
|
export function GetSettings() {
|
|
return window['go']['main']['App']['GetSettings']();
|
|
}
|
|
|
|
export function ListTasks() {
|
|
return window['go']['main']['App']['ListTasks']();
|
|
}
|
|
|
|
export function OpenPath(arg1) {
|
|
return window['go']['main']['App']['OpenPath'](arg1);
|
|
}
|
|
|
|
export function PickDir() {
|
|
return window['go']['main']['App']['PickDir']();
|
|
}
|
|
|
|
export function Placeholders() {
|
|
return window['go']['main']['App']['Placeholders']();
|
|
}
|
|
|
|
export function PreviewDir(arg1) {
|
|
return window['go']['main']['App']['PreviewDir'](arg1);
|
|
}
|
|
|
|
export function RemoveTask(arg1, arg2) {
|
|
return window['go']['main']['App']['RemoveTask'](arg1, arg2);
|
|
}
|
|
|
|
export function RequeueFailed() {
|
|
return window['go']['main']['App']['RequeueFailed']();
|
|
}
|
|
|
|
export function ScanDownloadDir() {
|
|
return window['go']['main']['App']['ScanDownloadDir']();
|
|
}
|
|
|
|
export function SelectAll(arg1) {
|
|
return window['go']['main']['App']['SelectAll'](arg1);
|
|
}
|
|
|
|
export function SetSettings(arg1) {
|
|
return window['go']['main']['App']['SetSettings'](arg1);
|
|
}
|
|
|
|
export function ShowItem(arg1) {
|
|
return window['go']['main']['App']['ShowItem'](arg1);
|
|
}
|
|
|
|
export function Start(arg1) {
|
|
return window['go']['main']['App']['Start'](arg1);
|
|
}
|
|
|
|
export function Status() {
|
|
return window['go']['main']['App']['Status']();
|
|
}
|
|
|
|
export function Stop() {
|
|
return window['go']['main']['App']['Stop']();
|
|
}
|