Files
QieKan-3.0/docs/architecture/audiobook-integration.md
T
yusheng d2d2ecd3bc
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
feat: release QieKan 3.26.15
2026-08-08 12:22:26 +08:00

3.2 KiB

且看有声书融合架构

决策

且看将 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.ktapp/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 密码或令牌。