如何用 Kotlin 构建 QuickNovel 网络小说阅读器
亚洲轻小说和 Royal Road 上英文小说的粉丝们经常面临同样的问题。通过手机浏览器阅读网络小说非常不便:页面充斥着各种横幅广告,弹出自动播放的视频,甚至在地铁里没有网络连接就无法打开章节。
QuickNovel 项目试图从根本上解决这个问题。它是一个免费的开源 Android 应用,可从数十个网站提取干净文本,并将其整理成精美的离线书籍。
为什么需要单独的聚合器
与 Moon+ Reader 等标准阅读器不同,QuickNovel 还处理内容分发。作者不在自己的服务器上存储书籍——该应用的工作方式类似于搜索引擎。您输入一个标题,QuickNovel 向支持的平台发送请求,获取 HTML 页面,清除垃圾内容,并将章节组装成统一结构。
源列表声称有大约四十个资源。其中包括 Royal Road、Scribble Hub 和 Anna's Archive 等大型英文目录,以及特定的翻译聚合器。
以下是应用在搜索和下载时的界面:

源代码中有哪些有趣的内容
该应用完全使用 Kotlin 编写,采用 GPL-3.0 许可证。如果您从事 Android 开发,可以在仓库代码中找到几种实用的解决方案。
模块化解析器系统
这类应用最复杂的部分在于支持许多不同的网站。在 QuickNovel 中,每个源都通过 provider 抽象来描述。基类定义了搜索、获取元数据和解析章节文本的规则。添加新网站只需要创建一个包含正确 CSS 选择器或 JSON 端点的文件。
构建和打包为 EPUB
QuickNovel 不仅可以在内置阅读器中渲染文本,还可以将下载的章节打包成标准 EPUB 格式。如果您更喜欢通过第三方阅读器或电子阅读器阅读,这非常方便。
这种方法的主要问题
网页抓取有一个不可避免的缺点。一旦网站所有者更改布局、迁移到新域名或启用激进的 Cloudflare 保护,解析器就会失效。
项目仓库目前约有 250 个未解决的问题。其中大多数涉及解析器失效。这里的开发依赖于社区活动:有人注意到问题,修复代码中的 CSS 选择器,然后提交 pull request。
谁会发现这个项目有用
如果您经常阅读网络小说并希望摆脱广告和对网络连接的依赖,QuickNovel 值得安装。
对于 Kotlin 开发者来说,这是一个很好的示例,展示了如何在实际移动应用中组织数百个页面的异步加载、文件系统操作和 HTML 解析。源代码可在 GitHub 上获取。
相关项目