Skip to content

墨读 0.6.0(安卓)

Choose a tag to compare

@RoutineMiku RoutineMiku released this 07 Nov 08:27
· 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 一处命令同步四处。