整体架构
AniBaka 采用“平台界面 + 共享服务 + 规则运行时 + 媒体运行时”的分层结构。UI 不直接理解每个站点协议,规则解释器也不直接依赖 Flutter 控件。
PresentationPages & Widgets移动端 · 桌面端 · TV
ApplicationServices搜索 · 详情 · 历史 · 下载
Source runtimeAdapter + Pipeline规则校验 · 调度 · 解析
RuntimeNetwork & PlayerHTTP · WebView · media_kit
1. 表现层
lib/pages/ 组织页面,lib/widgets/ 提供复用组件和平台专属表面。桌面、移动与 TV 可以拥有不同布局,但通过服务层读取相同的业务状态。
关键入口:
lib/main.dart:应用启动。lib/app_state.dart:应用级状态。lib/pages/:首页、搜索、详情、播放器、设置等页面。lib/widgets/platform/:Windows、macOS、TV 专属界面。
2. 应用服务层
lib/services/ 负责编排数据、缓存、持久化和跨模块流程。典型服务包括:
| 服务 | 职责 |
|---|---|
HomeDataService | 首页内容、分页与缓存 |
BgmService | 番剧元数据匹配与补全 |
PlayerService | 选集、线路、解析结果和播放状态 |
SourceAdapterService | 内置源与自定义源生命周期 |
RuleRepositoryService | 订阅、索引缓存、安装与更新检测 |
DownloadService | MP4/HLS 下载任务 |
TorrentService | Torrent 下载与本地流式播放 |
3. 规则运行时
规则运行时把站点差异限制在 JSON 管线中:
text
Rule Hub index
↓
SourceCodec / CustomSourceConfig
↓
RuleMigrator → SourceRule → RuleValidator
↓
PipelineSourceAdapter
↓
PipelineInterpreter ↔ PipelineHostPipelineInterpreter 只认识操作符与上下文;PipelineHost 提供 HTTP、DOM、URL 归一化和 WebView 能力;PipelineSourceAdapter 把两者接入上层统一的 AdapterBase。
4. 媒体运行时
播放阶段不止返回 URL。最终结果可以同时携带:
- 媒体 HTTP Headers。
- 允许携带的 Cookie 名称或前缀。
- 需要维持的播放授权。
- 需要本地物化或代理的 HLS 清单。
- 是否绕过系统代理直连。
解析完成后由 PlayerService 与 media_kit 打开媒体。Torrent 资源则通过本地 HTTP 流服务提供给播放器。
5. 数据与持久化
- Hive / SharedPreferences:本地配置、缓存与安装状态。
- 文件系统:下载、字幕、日志和媒体库。
- WebDAV:远程媒体库。
- 可选账户接口:播放历史等同步能力。
一个播放请求如何流动
- 页面选择番剧与剧集。
PlayerService根据 source key 找到适配器。- 适配器执行
detail或复用已经预取的剧集目录。 PipelineInterpreter执行play管线。- 宿主完成网络、Cookie、WebView 或解密工作。
- 适配器整理媒体 URL 与 Headers,并进行必要的直链校验。
- 播放器打开媒体;会话协调器负责切集、换源与回收。
