hectorqin
|
a6fddab953
|
feat(reader): 接入插件章节阅读与目录刷新
接入远程章节出版物、稳定定位、服务端与设备端缓存及手动刷新;补充账号隔离、同步并发保护、API 和设计文档。
|
2026-09-20 18:40:09 +08:00 |
|
hectorqin
|
037bdd6880
|
feat(sources): 增加内置 local、OPDS 与进程插件系统
|
2026-09-20 17:51:12 +08:00 |
|
hectorqin
|
558f44e206
|
feat(web,server): 书架默认按最近阅读排,书库拆成预览与文件两页
|
2026-09-19 14:17:55 +08:00 |
|
hectorqin
|
f2701da703
|
fix(web,server): 继续阅读带上完整书对象,书库能上架,放大镜回到中线
三处 #40 后续:继续阅读卡片点了报「不在书架上」、书库的书加不回书架、
书架搜索框的放大镜高了一行。
|
2026-09-19 11:46:42 +08:00 |
|
hectorqin
|
c7d065bd52
|
feat(web): 书架与书库拆成两个可分页的屏幕
|
2026-09-19 08:45:37 +08:00 |
|
cnb.dQC5J6ohAGA
|
b7ffa42c80
|
feat(library): 支持上传书籍与批量管理
|
2026-09-17 16:50:47 +08:00 |
|
cnb.dQC5J6ohAGA
|
282e0426c2
|
feat(library): 新增书库管理页面
|
2026-09-17 12:54:52 +08:00 |
|
cnb.dQC5J6ohAGA
|
0370cd98e8
|
feat: HTTP TTS 与双端兼容朗读,书架体验与自定义设置
朗读(Closes #13 的朗读部分)
新增服务端 HTTP TTS 代理与客户端第二、第三个朗读引擎,三者在同一个
SpeechEngine 接口下可切换:
- 服务端 GET /api/v1/tts 代理 TTS_URL 指向的合成服务(edge-tts / Piper
等兼容形态),只代理不内置合成模型;GET /api/v1/tts/voices 回答
「这个实例能用什么」,未配置时返回 http:false 而不是 404。
按句合成、磁盘缓存、上游返回非 audio/* 时明确报错(一个指到网页的
TTS_URL 会以 200 返回 HTML,塞进 audio 里既没声音也没事件)。
/tts 是精确的查询串令牌白名单项之一:<audio src> 无法带 Authorization。
- 客户端 HttpTtsEngine 用 <audio> 而不是 Web Audio,事件驱动推进队列。
- 客户端 NativeTtsEngine 走 Android 外壳新增的 speech 接口(shell v3):
WebView 自带的合成器与系统的是两个引擎,手机系统装好的中文语音经常
不在 getVoices() 里,这是「朗读没有中文声音」最常见的原因。
- speechAvailability 决定 auto 用哪个引擎:native → system → http。
- 原 TtsEngine 抽出 loadQueue/onChunk/onState 为公开字段以结构化满足接口。
书架
- 排序:最近更新 / 最近入库 / 书名 / 作者,中文按数字大小排。
排序规则抽到 shelf-order.ts,离线路径与服务端用同一条规则。
- 密度、作者显隐、封面进度条;搜索一键清空 + 回车即搜;下拉刷新。
- 服务端 BookDto 增加 addedAt,否则客户端离线排序无法复现服务端结果。
自定义设置
- 朗读引擎可选(引擎多于一个时才显示该行);音调行只对有声调的引擎出现。
- 书架设置独立成 sheet,与阅读面板分开。
测试与文档
- server: tts.test.ts(10 例)。web: tts-http / speech / shelf-order
新增 39 例,合计 245 passing。
- android/scripts/check-shell.sh 修正为同时校验嵌套的 speech 接口,
之前它只能看到一个顶层接口。
- README / docs/api.md / docs/architecture.md 补齐三个引擎的取舍、
环境变量与错误码。
Ref: #13
|
2026-09-16 23:29:41 +08:00 |
|
CodeBuddy
|
b9b9c63605
|
merge: 把 main 合并进按窗口读取分支,并修正目录书页契约的两处缺陷
冲突只有两处文档(README 的测试计数与端点清单、docs/api.md 的 /manifest 说明),
两边各自都是对的,所以按并集处理:计数取本分支的实际值,端点清单保留 main 新增的
/items、/toc、/file、/library/formats。
合并后按契约把两边一起验了一遍,发现目录书这条链路上有两个会被静默吞掉的缺陷,
都是「服务端仍回 200、读者看到的是坏内容」那一类:
1. 「卷」的判据里有一句 `images === 0`。整卷系列里放一张封面扫描是常态,于是
`第01卷.cbz` 与 `第02卷/` 并列、旁边再有张图时,整个系列会被判成「不是漫画」,
而它也不是别的格式的书——书架上直接消失。判据改成按来源问:压缩包的页就在包里,
一个压缩包本身就是一卷;卷子目录要往下看才知道有没有页。散图仍由 MIN_IMAGES 管,
既不能否定同级存在的整卷,也不该在自己是唯一页源时被当成书。
2. 页的资源引用被 API 层按「列表下标」拼成了 `page:<index>`,而这个格式的引用形态是
`page:<卷>:<页>`。「一个压缩包算一页」意味着一个卷在列表里的下标与它在卷里的位置
无关,于是按 `page:1` 去问一卷时格式处理器解不出引用,异常回退到「当普通文件发」,
客户端请求一页、拿到的是那个压缩包——状态码 200,内容不对。引用现在由同一次页面
遍历给出(manifest 的 files[].ref),/file 原样回传,不再有第二处实现。
顺带修正三处文档与实际不符的地方:`.cbr`/`.rar` 并未被解析(原「不做」清单暗示只有它
不做)、嵌套深度措辞与实现(读到第 4 层,且内嵌压缩包不展开)、README 的测试计数。
server 137/137(typecheck + test + build),web 179 vitest + 29 node:test(typecheck + test + build)。
|
2026-09-16 22:49:45 +08:00 |
|
cnb.dQC5J6ohAGA
|
5f1e29a3e5
|
fix(server,docs): 目录书页面清单成为契约,修正三处会让书静默消失的缺陷
|
2026-09-16 18:40:37 +08:00 |
|
cnb.dQC5J6ohAGA
|
ca68a03e5d
|
merge: 解决 auto/init-server-scaffold-81b3 与 main 的冲突
两个分支各自演进:一侧引入格式注册表、H5 客户端与 Android 外壳,另一侧
引入漫画目录书与逐页取图。冲突集中在扫描器、metadata、library 路由和 web
客户端,逐项按「两边能力都要保留」的原则合并。
合并后修复了 4 个被冲突掩盖的真实缺陷:
- scanner 同时保留了两套目录书实现,类型检查与测试均无法通过;改为统一
走格式注册表,目录书在文件遍历之前发现,其内容不再重复入库。
- /manifest 的 files 对漫画目录书返回的是文件夹路径,客户端无法逐页取图;
改为由 manifest 派生真实页路径。
- 单个文件端点只认 book_files 行,漫画目录书的每一页都 404;改为目录书
额外认领其目录下的路径,并修正路径归一化使穿越尝试仍被拒绝。
- 目录书判定只看图片数量,会把夹着一本书的目录整体吞掉;改为注册表驱动
的判定,含书籍文件的目录始终是书架。
同时修复了 web 端两套测试运行器互相无法执行对方用例的问题(vitest 与
node:test 混跑会静默跳过),以及 web 侧 5 处类型错误。
Ref: #9
|
2026-09-16 18:04:11 +08:00 |
|
cnb.dQC5J6ohAGA
|
2233b295bb
|
feat: 初始化自部署书库服务端
按产品设计 v0.2 落地服务端,覆盖第一版范围中的扫描、元数据、权限与同步。
核心决策:
- 书籍主键用 dc:identifier + 内容哈希,不用文件路径。
重命名/移动不丢进度,副本自动合并,重新编码的文件保持独立。
- 库目录只读挂载,写操作全部落到 DATA_DIR。
启动时断言 DATA_DIR 不在 BOOKS_DIR 内,路径解析统一走 resolveInside
拦截逃逸,扫描不跟随符号链接。
- 元数据优先级:手动修改 > 内嵌 > provider > 文件名解析。
手动修改独立成表,扫描永远碰不到,可单字段撤销。
- 中文文件名解析采取保守策略,无证据时不猜测作者方向。
- 离线合并用 LWW,笔记删除写墓碑,批次单事务。
- 无原生编译依赖:node:sqlite 与 scrypt 均为内置模块。
交付:
- Fastify + TypeScript 服务端,Docker 单容器
- 27 个自动化测试用例全部通过
- AGPL-3.0,README 做到一条命令跑起来
- CNB 流水线:typecheck / test / build
|
2026-09-16 14:07:25 +08:00 |
|