feat: release QieKan 3.26.15
Auto Release / build (app, release) (push) Canceled after 0s
Auto Release / create_release (push) Canceled after 0s
Auto Release / prepare (push) Canceled after 0s
CodeQL / Analyze (java-kotlin) (java-kotlin) (push) Canceled after 0s
Deploy Docs / build (push) Canceled after 0s
Deploy Docs / Deploy (push) Canceled after 0s

This commit is contained in:
2026-08-08 12:22:26 +08:00
parent 25e22b5711
commit d2d2ecd3bc
58 changed files with 1863 additions and 172 deletions
@@ -0,0 +1,63 @@
# 且看有声书融合架构
## 决策
且看将 Audiobookshelf 作为独立的伴随服务端,通过原生 Android 客户端模块接入。
Node.js、Nuxt、Sequelize、服务端 SQLite、FFmpeg 和媒体扫描器不打包进 APK。
当前工作区中的 `.audiobookshelf` 仅用于协议核对和服务端 Fork 开发。正式维护时应将它
保留为独立仓库或 Git submodule,并使用可识别的 Fork 版本号,例如
`2.34.0-qiekan.1`
## 模块边界
- `:modules:audiobookshelf-client`
- Audiobookshelf REST 请求、DTO 和协议模型。
- 不依赖且看的 Room、Compose、主题或阅读领域。
- `app/domain/gateway/AudiobookGateway.kt``app/domain/model/AudiobookModels.kt`
- 服务器、媒体库、书籍、播放会话和进度的领域接口及模型。
- `app/data/audiobook`
- 领域仓库、服务器配置映射和安全令牌存储。
- `app/ui/audiobook`
- Compose、MVI/UDF、Navigation 3 页面。
- `app/service/audiobook`
- 后续阶段新增的 Media3 `MediaSessionService`
Audiobookshelf 条目不能映射为现有 `Book`/`BookChapter`,也不能直接写入旧版
`AudioPlay` 的全局状态。远端条目统一使用 `serverId + libraryItemId` 标识。
## 认证与安全
- API 使用独立的标准 OkHttpClient,不复用且看支持书源规则的宽松 TLS 客户端。
- 登录请求使用 `x-return-tokens: true`
- access token 仅保存在进程内存中。
- refresh token 使用 Android Keystore 的 AES/GCM 密钥加密,并写入
`noBackupFilesDir`,不进入且看备份。
- 401 刷新采用 single-flight,避免刷新令牌并发轮换。
- 服务器地址和用户名可随 `servers.json` 备份;密码和令牌不得进入配置 JSON。
- 公网地址默认使用 HTTPS。HTTP 仅用于用户明确配置的可信局域网环境。
## 导航与隐私
首版入口位于“我的 > 有声书”,不增加默认第六个底部导航项。后续可将有声书加入
主导航显示与排序设置,但默认保持隐藏。
后续接入且看首页“继续收听”、听书历史和统计时,必须在领域层统一应用隐私过滤,
而不是由各个组件自行过滤。隐藏书库的内容不得进入首页、历史、统计和锁屏元数据。
## 实施阶段
1. 连接与浏览:服务器配置、登录、令牌刷新、媒体库和书籍列表。
2. 播放:独立 Media3 Session、direct play、HLS、STRM、多音轨和进度同步。
3. 体验融合:继续收听、迷你播放器、书签、历史、主导航和隐私联动。
4. 离线:独立缓存数据库、断点续传、空间管理和离线进度回传。
5. 高级能力:Socket.IO、OIDC、播客和 115 动态换链或代理。
## 第一阶段验收
- 可连接带根路径的 Audiobookshelf 地址,例如 `/audiobookshelf`
- 可使用用户名和密码登录,并列出当前账号可访问的媒体库。
- 应用重启后可用加密 refresh token 恢复会话。
- refresh token 无效时保留服务器地址和用户名,并要求重新输入密码。
- WebDAV 服务器列表不显示 Audiobookshelf 类型的连接。
- 旧备份恢复流程不变,备份文件中不包含 Audiobookshelf 密码或令牌。