Electron 桌面客户端,聚合多个开放获取文献源的搜索、详情与下载。 新增数据源: - Z-Library:邮箱登录(凭据本地存储),会话失效自动重登 - LibGen:适配新版 libgen.ac 前端(旧版 search.php 镜像已全部下线) - Memory of the World、Sci-Hub、Anna's Archive 基础设施: - mirror.js:镜像故障转移,支持串行优先与并发竞速两种策略, 失效镜像 5 分钟冷却后自动重试,避免站点恢复后被永久跳过 - http.js:统一 15 秒请求超时,防止单个卡死镜像拖垮整次搜索 - settings.js:全局代理配置持久化,经 Electron net.fetch 生效于所有请求 Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
55 lines
2.0 KiB
JavaScript
55 lines
2.0 KiB
JavaScript
const fs = require('fs');
|
|
const path = require('path');
|
|
|
|
const ROOT = __dirname;
|
|
const OUT = path.join(ROOT, 'dist', 'PeopleLib-win32-x64');
|
|
const APP = path.join(OUT, 'resources', 'app');
|
|
const pkg = require('./package.json');
|
|
const PRODUCT = 'PeopleLib';
|
|
|
|
function rimraf(p) { if (fs.existsSync(p)) fs.rmSync(p, { recursive: true, force: true }); }
|
|
function copyDir(src, dst, skip) {
|
|
fs.mkdirSync(dst, { recursive: true });
|
|
for (const e of fs.readdirSync(src, { withFileTypes: true })) {
|
|
if (skip && skip(e)) continue;
|
|
const s = path.join(src, e.name);
|
|
const d = path.join(dst, e.name);
|
|
if (e.isDirectory()) copyDir(s, d, skip);
|
|
else fs.copyFileSync(s, d);
|
|
}
|
|
}
|
|
|
|
function skipDevFiles(e) {
|
|
const name = e.name.toLowerCase();
|
|
if (e.isDirectory()) return false;
|
|
if (/\.(d\.ts|d\.ts\.map|ts|tsx|map|flow)$/.test(name)) return true;
|
|
if (/^(readme|changelog|history|license|licence|notice|authors|contributing|security)/.test(name)) return true;
|
|
if (/\.(md|markdown)$/.test(name)) return true;
|
|
return false;
|
|
}
|
|
|
|
console.log('清理输出目录...');
|
|
rimraf(OUT);
|
|
|
|
console.log('复制 Electron 运行时...');
|
|
copyDir(path.join(ROOT, 'node_modules', 'electron', 'dist'), OUT);
|
|
|
|
console.log('重命名可执行文件...');
|
|
fs.renameSync(path.join(OUT, 'electron.exe'), path.join(OUT, PRODUCT + '.exe'));
|
|
rimraf(path.join(OUT, 'resources', 'default_app.asar'));
|
|
|
|
console.log('组装 app 源码...');
|
|
fs.mkdirSync(APP, { recursive: true });
|
|
fs.copyFileSync(path.join(ROOT, 'main.js'), path.join(APP, 'main.js'));
|
|
fs.copyFileSync(path.join(ROOT, 'preload.js'), path.join(APP, 'preload.js'));
|
|
copyDir(path.join(ROOT, 'src'), path.join(APP, 'src'), (e) => e.name.startsWith('_test'));
|
|
|
|
fs.writeFileSync(path.join(APP, 'package.json'), JSON.stringify({
|
|
name: pkg.name, version: pkg.version, description: pkg.description,
|
|
main: 'main.js', author: pkg.author, license: pkg.license
|
|
}, null, 2));
|
|
|
|
console.log('\n构建完成:');
|
|
console.log(' 目录:', OUT);
|
|
console.log(' 可执行文件:', path.join(OUT, PRODUCT + '.exe'));
|