Repository navigation
墨读 0.6.0(安卓)
·
57 commits
to main
since this release
这次把「高级书源」真正跑起来了,顺手修掉三处误触与错位
上一版导入备份后很多书能用,但有一本《我在美国搞内战》点进去永远是「目录为空 / 请重试 / 换源找不到资源」。
用户说得很明确:这份备份他在 Legado 里读得好好的,导入墨读就不行。查下来不是备份的问题,是引擎缺了一整层能力。
1. 引擎:从「能跑表达式」升级到「能跑 JavaScript 书源」
那本书用的雨鹿小说书源,是 Legado 里最难的一类:
- 书源自带 39KB 的
jsLib,规则里只写一句@js:yuluNovelContent(java, source, result, baseUrl); - 这段 JS 内部用
java.ajax/java.connect自己发请求,用 MD5 拼签名,用 AES/CBC 解密正文; - 目录走
ruleBookInfo.init先解密详情页,再把解密结果当 HTML 喂给 CSS 选择器; - 还会
source.get/put记住域名和正则缓存。
之前的引擎只把这些当成「不认识的字段」丢掉了。这次补齐:
jsLib执行:把整段库new Function('java','source','scope','Packages', lib + ';return function(expr){...}')
编成闭包并按源缓存,同一本书翻 500 章也只编译一次。java对象:ajax/connect/get/post、md5Encode/digestHex、base64Encode/Decode、
hexEncodeToString/strToBytes/bytesToStr、createSymmetricCrypto、encodeURI、log。- 加密算法自己写:MD5、SHA-256、AES-128/192/256-CBC 全部手写(不引第三方包,安卓 WebView 里也能跑)。
AES 第一版往返是乱码,两个 bug:S 盒生成公式写成了x ^= x<<1 ...(那不是求逆),
以及最后一轮多做了一次 MixColumns。改成 GF(2⁸) 乘法逆元 + 仿射变换、循环写成for (r = 1; r < nr; r++),
用标准零向量66e94bd4ef8a2c3b884cfa59ca342b2e校准通过。 - 同步 HTTP:书源 JS 是按同步写的(
var r = java.ajax(url)),而浏览器的同步 XHR 不允许跨域。
网页端改走网关/fetch(window.__moreadHttpSync),书源自定义请求头用base64url(JSON)放进h参数透传;
桌面/安卓端仍走原生桥或同源同步 XHR。 Packages垫片:java.io.ByteArrayOutputStream、java.util.ArrayList、java.lang.String。- 另外修了
normalizeSource会把jsLib/header/ruleBookInfo.init丢掉的问题——
字段一丢,再强的引擎也救不回来。
真机结果:目录 582 章,正文 120 段正常显示。
2. 「继续阅读」其实一直在从第 1 章打开
书架点「继续阅读」调 openReader(bookId) 时不带章节号,函数里 ci == null 就取了 0,
本地进度完全没用上——一本读到 53% 的书,每次进去都回到开头。
改成 ci == null 时回落 progressOf(b.id).ci,并 clamp 到有效范围。
同一本书实测:进度 0% → 53%,打开耗时 30826ms → 1197ms(第二次命中章节缓存)。
顺带的加载提速:
- 打开书籍先渲染书名 / 章节名占位,正文到了再替换,不再白屏等抓取;
- 章节缓存写入不再阻塞渲染(先给用户看,再落盘);
- 正文请求超时 30s → 20s,失败更快给出「重试 / 换源」;
- 预取下一章 → 预取两章(读到末尾不用等);
- 网关加 keep-alive 连接复用:一次打开要连打 3~5 个请求,省掉重复 TLS 握手。
3. 三处误触与错位
| 问题 | 原因 | 改法 |
|---|---|---|
| 书架「从头开始」按钮显示不全 | hero 卡片 overflow:hidden 裁掉了 flex 换行后的第二行 |
.hero-actions 允许 flex-wrap,竖屏 hero 改 align-items:flex-start 并收窄封面 |
| 「从头开始」一点就跳走 | 没有确认步骤 | 新增 confirmAsk() Promise 弹窗,文案说明「原进度不会删除,随时能在目录跳回去」 |
| 阅读器底栏元素重叠、多出横向滚动条 | .rb-row2 固定单行 + overflow 裁切,393px 下「A− 16 A+ / 翻页 / 黑●○○○ / ⚙」挤在一起 |
行容器 flex-wrap:wrap + row-gap,分组 flex:0 0 auto,中间 spacer 吃掉剩余宽度 |
393px 真机度量(DOM 实测,不是肉眼):
[hero] 按钮 inside:true, inside:true
[confirm] open:true,点「取消」后 reader 未打开
[bottombar] rowH:95, scrollW:345 = clientW:345, overflowX:false, overlaps:[]
版本
0.5.0 → 0.6.0(versionCode 600),网页 / 安卓 / Windows 同一条版本线,
node build/version.js --bump patch 一处命令同步四处。