ThaiGL Library
自托管泰语 GL 电子书图书馆,基于 OPDS 协议,兼容 KOReader、Moon+ Reader 等主流阅读器客户端。
稳定运行的自托管电子书库,通过 OPDS 协议服务于主流阅读器,支持泰文、中文、英文、日文多语言内容。
这个项目来自一个具体的需求:有一批泰语 GL 小说和漫画,需要一个能在 KOReader 等阅读器上直接访问和下载的地方,而不是把文件散放在各处。
为什么选 OPDS
OPDS(Open Publication Distribution System)是电子书领域的标准分发协议,主流阅读器客户端都支持它。接入 OPDS 意味着:你的图书馆可以像一个”书店”一样被阅读器直接发现、浏览和下载,不需要手动传文件、不需要额外的客户端 app。
这是最关键的产品决策——不造轮子,用标准协议换取兼容性。
我做的关键技术决策
1. Express + MySQL,不用现成的图书馆软件
市面上有 Calibre Web、Kavita 等成熟的自托管图书馆方案,为什么不用?
因为内容以泰文为主,现有方案的中文/泰文元数据处理不够可靠,搜索和分类逻辑也不完全符合需求。自己写反而更可控——OPDS 协议规范清晰,实现成本不高,换来的是完全定制的分类和搜索逻辑。
2. Sharp 处理封面,统一缩略图规格
原始封面图来自多个来源,尺寸和质量参差不齐。引入 Sharp 在上传时统一处理:生成标准尺寸缩略图、压缩到合理体积,静态资源加了一年的缓存头。这让图书馆的浏览体验更流畅,也降低了带宽消耗。
3. JWT 认证的 Admin 面板
图书馆本身对外开放,但内容管理需要保护。用 JWT + bcrypt 做了一个轻量的后台,支持书目增删改、封面上传、标签管理。Admin 路径可配置,不走默认路径。
4. 健康检查接口
部署在自己的服务器上,加了 /health、/health/ready、/health/live 三个探针接口,方便接入监控和自动重启策略。用 Winston 记录请求日志,出问题时能快速定位。
内容结构
图书馆按四个大类组织内容:
- Novels:泰语 GL 小说,主体内容
- Comics:漫画,CBZ/CBR/ZIP 格式
- Manga:日漫,含泰译版本
- Books:其他书籍
每个分类下支持按标签、语言、系列过滤,OPDS feed 会正确生成对应的导航层级。
这个项目的结果
目前稳定运行,通过 OPDS 协议服务于 KOReader 和 Moon+ Reader 用户。内容以泰语 GL 为主,兼收中文、英文、日文内容。
对我来说更重要的收获是:OPDS 协议的实现比想象中简洁,核心就是 Atom feed 的组装。理解了协议之后,扩展新的内容类型或过滤维度只需要增加 feed 路由,主体逻辑不需要改动。