# Velora
**Repository Path**: BlueVale/Velora
## Basic Information
- **Project Name**: Velora
- **Description**: A cross-platform Flutter-based e-book reader with a Rust core for performance-critical processing, powered by flutter_rust_bridge for seamless native interop on mobile and desktop. It supports multiple popular e-book formats, including MOBI, TXT, EPUB, and AZW3, delivering a smooth and efficient reading experience across devices.
- **Primary Language**: Dart
- **License**: AGPL-3.0
- **Default Branch**: main
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2026-07-25
- **Last Updated**: 2026-07-27
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# Velora
Flutter + Rust · Material Design 3 · Local books · Legado sources · Comics · Audio · Markdown + LaTeX
Velora 是一个以 Flutter 和 Rust 构建的本地及在线阅读器。Flutter 负责 Material Design 3 界面、响应式布局、动画、阅读交互和平台插件;Rust 负责本地书籍解析、章节索引、在线书源规则、网络可靠性和书架持久化。
Velora is a local and online reader built with Flutter and Rust. Flutter owns the Material Design 3 interface, responsive layout, motion, reading interactions, and platform plugins. Rust owns local-book parsing, chapter indexes, online source rules, network reliability, and bookshelf persistence.
> Velora 只应用于用户依法拥有或获准访问的内容。项目不附带书源、小说、漫画或音频,也不授权绕过 DRM、验证码、付费墙或站点访问控制。
>
> Velora is only for content that the user owns or is authorized to access. The project ships no sources or copyrighted media and does not authorize bypassing DRM, CAPTCHAs, paywalls, or access controls.
## 中文说明
### 已实现能力
- 本地文本书:TXT、EPUB、未加密 MOBI/AZW3。
- 本地 Markdown:`.md` 和 `.markdown`,保留原始标记并按一级/二级标题生成目录。
- Markdown 渲染:GFM 表格、任务列表、引用、代码块、链接、网络图片和相对路径本地图片。
- 数学公式:行内 `$...$` 与块级 `$$...$$`,由 `flutter_math_fork` 解析和排版。
- 本地漫画:CBZ 或包含图片的 ZIP;图片按自然文件名排序,单页惰性解压,支持缩放和前后页导航。
- 本地音频:MP3、M4A、AAC、OGG、OPUS、WAV、FLAC,支持播放/暂停、15 秒跳转、进度拖动和倍速。
- 在线小说:兼容常见 Legado/阅读书源 JSON 的搜索、详情、目录、正文、封面和发现规则。
- 在线漫画与有声漫画:识别标准 `bookSourceType`,类型 `1` 为音频,类型 `2` 为图片;同一章节可同时携带图片和旁白音频。
- 书架:本地书和在线书均可保存,阅读章节/页进度持久化,支持书签、分享和封面更新。
- 封面:优先使用书内封面;缺失时先按书名和作者查询已导入且启用的书源,再回退到公开元数据页面。
- 字体:可搜索 `google_fonts` 当前版本提供的完整字体目录;只下载并缓存用户选中的字体。
- 第三方字体:导入 TTF/OTF,复制到应用支持目录并按需注册;单文件最大 32MB,最多登记 24 个本地字体。
- 主题:Material Design 3、亮色/暗色/跟随系统、Pantone Cloud Dancer、Monet 动态色和 AMOLED。
- 动画:Material 3 motion token、路由转场、列表入场、加载骨架、滑动/覆盖/淡入淡出/仿真翻页。
- 大文件:TXT 使用流式编码探测、稀疏章节锚点、mmap/seek 范围读取和 sidecar 分页缓存。
### 支持格式与边界
| 类型 | 扩展名/来源 | 实现状态 | 明确边界 |
| --- | --- | --- | --- |
| 纯文本 | `.txt` | 支持 | 自动探测 UTF-8、UTF-16、GB18030/GBK、Big5、Shift_JIS 等常见编码 |
| EPUB | `.epub` | 支持 | 按 OPF spine 读取文本和嵌入封面;复杂脚本和 DRM 不支持 |
| Kindle | `.mobi`, `.azw3` | 有限支持 | 支持未加密、可直接解压的 PalmDOC 文本;DRM 和部分 HUFF/CDIC 不支持 |
| Markdown | `.md`, `.markdown` | 支持 | GFM + 数学公式;不是完整 TeX 文档编译器,不加载任意 LaTeX 宏包 |
| 漫画 | `.cbz`, `.zip` | 支持 | JPG/JPEG/PNG/WebP/GIF;每张解压页设有 64MB 安全上限 |
| 音频 | `.mp3`, `.m4a`, `.aac`, `.ogg`, `.opus`, `.wav`, `.flac` | 支持 | 实际编解码能力仍取决于目标系统媒体栈 |
| 在线文本 | Legado/阅读 JSON | 支持常用静态规则 | 任意 `@js`、Java API、登录 Cookie、浏览器验证和 DRM 不是通用兼容范围 |
| 在线媒体 | `bookSourceType: 1/2` | 支持 | 正文规则必须能直接解析出 HTTP(S) 图片或音频地址 |
“LaTeX 支持”指阅读 Markdown 时可渲染 TeX 数学表达式,包括常用分式、根式、矩阵、上下标、积分、求和、对齐和数学符号。它不等同于运行完整 LaTeX 发行版,因此不会执行文件 I/O、shell escape、自定义系统字体加载或任意第三方宏包。
### 导入与阅读
1. 在“书架”点击导入按钮。
2. 选择受支持的文本、电子书、Markdown、漫画或音频文件。
3. Android 也可以从系统文件管理器使用“打开方式”交给 Velora。
4. 导入后 Rust 会建立元数据和目录;缺少封面时会异步尝试补全。
5. TXT/EPUB/MOBI 使用分页阅读器;Markdown 使用纵向富文本阅读器;漫画使用图片阅读器;音频使用专用播放面板。
本地文件不会被上传。Android 的 `content://` 文档会以流式方式复制到应用私有目录,随后 Rust 只访问稳定的本地路径。
### Google Fonts 与本地字体
阅读设置和全局设置页都可以打开字体浏览器:
- Google 标签列出 `GoogleFonts.asMap()` 暴露的全部字体,可按名称即时搜索。
- 选择字体后,Velora 调用 `GoogleFonts.pendingFonts()` 等待必要字体完成下载/缓存,再保存设置。
- 没有网络或下载失败时不会静默应用半加载字体,而会显示错误并保留可用回退字体。
- 本地标签可导入 TTF/OTF。文件复制到应用支持目录,只有被选择时才通过 `FontLoader` 注册。
- Google Fonts 和第三方字体均可能有独立许可证;用户负责确认目标字体允许相应用途和分发方式。
应用不会一次下载全部 Google Fonts。一次性下载整个目录会造成巨大的存储、流量和启动成本;“完整访问”通过完整可搜索目录实现,“必要下载”通过按选择下载实现。
### 在线书源
书源页支持:
- 直接粘贴单个书源 JSON 或 JSON 数组。
- HTTP(S) JSON 地址、批量文本中的多个地址和常见在线导入链接。
- Legado 常见字段名及 `ruleSearch`、`ruleExplore`、`ruleBookInfo`、`ruleToc`、`ruleContent`。
- CSS selector、常见 XPath 子集、JSONPath 风格字段和正则捕获规则。
- GET/POST 请求描述、请求头、UTF-8/GBK 等响应字符集。
- 发现规则;没有可用发现规则时回退到搜索规则获取首批内容。
- 请求超时、取消、有限重试、每源并发限制、熔断和脱敏健康状态。
XIU2/Yuedu 可使用仓库地址或用户提供的代理地址导入:
```text
https://github.com/XIU2/Yuedu
https://wget.la/https://raw.githubusercontent.com/XIU2/Yuedu/master/shuyuan
```
该仓库中的书源由第三方维护。规则是否可用取决于目标站点、地区、网络、规则版本和站点反爬策略。Velora 不保证每个第三方书源永久可用。
简化书源示例:
```json
{
"bookSourceName": "Example",
"bookSourceUrl": "https://example.com",
"bookSourceType": 0,
"enabled": true,
"searchUrl": "/search?q={{key}}",
"ruleSearch": {
"bookList": ".book",
"name": ".name",
"author": ".author",
"bookUrl": "a@href",
"coverUrl": "img@src"
},
"ruleBookInfo": {
"name": "h1",
"author": ".author",
"intro": ".intro",
"coverUrl": ".cover img@src",
"tocUrl": ".toc@href"
},
"ruleToc": {
"chapterList": ".chapter",
"chapterName": "a",
"chapterUrl": "a@href"
},
"ruleContent": {
"content": "#content"
}
}
```
漫画源通常使用 `"bookSourceType": 2`,正文规则直接选择漫画图片或其容器。音频源通常使用 `"bookSourceType": 1`,正文规则直接解析音频 URL。图片源中同时出现 `