Move native platform downloaders and cookie lookup into omniget-core so the CLI and desktop app can share the same extraction path. Route CLI info/download through the core registry and move Bilibili auth flows behind a runtime account persistence provider. Also updates the porting handover notes and refreshes the nav config test expectation for the current About nav placement. Constraint: Preserve existing Tauri cookie storage semantics while moving reusable platform logic into core. Confidence: high Scope-risk: Medium; broad platform registry and Bilibili downloader/auth wiring, with old Tauri modules still retained for transition. Reversibility: Revert this commit to restore the prior Tauri-local platform layout. Directive: User requested continuing the porting work, testing, then commit and push. Tested: cargo.exe test --workspace; pnpm check; pnpm test Not-tested: Interactive GUI Bilibili login/download smoke test requiring live account interaction.
14 KiB
OmniGet 平台提取器移植 — 交接文档
日期:2026-07-01
状态:Phase 0-4 基本完成;14/15 平台 Downloader 已移植到omniget-core,Bilibili auth 网络流程已移入 core,桌面写入通过 runtime provider 适配
Fork:https://github.com/gkd2323c/omniget
PR:https://github.com/tonhowtf/omniget/pull/163
1. 背景
OmniGet 的原生平台提取器(YouTube、Twitter、Bilibili 等)原本全部位于 src-tauri/src/platforms/,与 Tauri GUI 框架强耦合。这导致:
- CLI 工具(
omniget-cli)无法复用这些提取器,只能降级走通用 yt-dlp 路径 - 桌面应用换框架(如从 Tauri 换成 egui、终端 UI)需要全部重写
- 无法在服务端/无 GUI 场景复用下载逻辑
目标:将平台提取器从 Tauri 层迁移到 omniget-core,使其成为框架无关的纯 Rust 库。
2. 架构设计
2.1 移植前后对比
移植前(Tauri 专属)
├── src-tauri/
│ ├── src/
│ │ ├── platforms/ ← 所有提取器都在这里
│ │ │ ├── youtube/mod.rs
│ │ │ ├── twitter/mod.rs
│ │ │ └── ...
│ │ ├── models/media.rs ← Tauri 特有模型
│ │ ├── core/ ← 重新导出 omniget_core::
│ │ └── cookies/ ← Tauri 特有 Cookie 管理
│ └── Cargo.toml
移植后(核心库 + Tauri 适配层)
├── src-tauri/
│ ├── omniget-core/
│ │ ├── src/
│ │ │ ├── platforms/ ← 提取器在这里(框架无关)
│ │ │ │ ├── mod.rs (registry + re-exports)
│ │ │ │ ├── traits.rs (PlatformDownloader trait)
│ │ │ │ ├── generic_ytdlp.rs
│ │ │ │ ├── youtube.rs
│ │ │ │ ├── twitter.rs (未移植)
│ │ │ │ └── ...
│ │ │ ├── models/media.rs ← 核心模型(与 Tauri 共享)
│ │ │ └── core/ ← 下载引擎、HTTP、编解码
│ │ └── Cargo.toml
│ └── src/
│ ├── platforms/ ← 重新导出核心库(pub use)
│ └── ...
2.2 PlatformDownloader Trait
所有平台提取器实现同一个 trait:
// omniget-core/src/platforms/traits.rs
#[async_trait]
pub trait PlatformDownloader: Send + Sync {
fn name(&self) -> &str;
fn can_handle(&self, url: -> bool;
async fn get_media_info(&self, url: &str) -> Result<MediaInfo>;
async fn download(&self, info: &MediaInfo, opts: &DownloadOptions,
progress: Sender<ProgressUpdate>) -> Result<DownloadResult>;
}
2.3 共享模型
MediaInfo、DownloadOptions、DownloadResult、MediaType、VideoQuality 定义在 omniget-core/src/models/media.rs,Tauri 层通过 pub use omniget_core::models::media::* 重新导出,零重复。
3. 已移植平台清单
3.1 核心基础设施
| 组件 | 文件 | 说明 |
|---|---|---|
| PlatformDownloader trait | omniget-core/src/platforms/traits.rs |
统一下载接口 |
| CookieProvider trait | omniget-core/src/platforms/cookie_provider.rs |
框架无关 Cookie 路径/手动 Cookie 抽象,CLI 默认读取 app data cookies.txt |
| GenericYtdlpDownloader | omniget-core/src/platforms/generic_ytdlp.rs |
yt-dlp 通用封装,含质量选择、HLS、直链、fallback |
| Platform 枚举 | omniget-core/src/platforms/mod.rs |
URL→平台检测 |
| is_direct_file_url | omniget-core/src/platforms/mod.rs |
直链文件检测 |
3.2 平台提取器
| 平台 | 文件 | 大小 | 特殊依赖 |
|---|---|---|---|
| YouTube | youtube.rs |
16KB | yt-dlp 引擎、播放列表支持 |
| Vimeo | vimeo.rs |
6KB | yt-dlp |
| Douyin | douyin.rs |
9KB | yt-dlp + referer |
| Bluesky | bluesky.rs |
14KB | GenericYtdlp |
| Twitch | twitch.rs |
12KB | GenericYtdlp |
pinterest.rs |
11KB | cookie + referer | |
reddit.rs |
28KB | cookie + 音频提取 | |
instagram.rs |
36KB | cookie + GraphQL API | |
| TikTok | tiktok.rs |
24KB | cookie + 浏览器指纹 |
| Twitter/X | twitter.rs |
41KB | CookieProvider + GraphQL guest token + yt-dlp fallback |
| P2P | p2p.rs + p2p_words.rs |
16KB | 纯网络传输 |
| DirectFile | direct_file.rs |
5KB | HTTP 直链下载 |
4. 未移植平台分析
4.1 Twitter(~41KB) — Phase 3 ✅ core/CLI/桌面注册已完成
已完成:
omniget-core/src/platforms/cookie_provider.rs定义CookieProvideromniget-core/src/platforms/twitter.rs已移除 Tauri 依赖- CLI 核心平台注册表已接入
TwitterDownloader - 桌面端
src-tauri/src/lib.rs已切换注册omniget_core::platforms::TwitterDownloader - 桌面端已实现
DesktopCookieProvider,委托crate::cookies::account_path_for_consumer与设置里的手动 cookie - 原生 Twitter 失败时仍保留 yt-dlp fallback
- 2026-07-01 实测:
omniget-cli --json --proxy http://127.0.0.1:7897 info https://twitter.com/CTVJLaidlaw/status/1600649710662213632命中platform=twitter,GraphQL 200,提取 2 个媒体项 - 2026-07-01 实测:同 URL
download -o target/twitter-smoke成功下载 2 个 mp4(16,344,602 + 14,872,817 bytes)
实测修复:
- DefaultCookieProvider 从全局
cookies.txt读取时必须按 domain 过滤 Netscape cookie,否则会把整份 cookies 拼进 Cookie header,Windows 下触发 yt-dlpos error 206 - Twitter 多媒体下载分支不能把 progress 发到无人消费的 mpsc channel,否则 direct downloader 会在缓冲区满后死锁
待收尾:
src-tauri/src/platforms/twitter/旧适配层已不再注册,可后续单独删除- 桌面 GUI 运行时 smoke test 尚未执行;当前完成的是
cargo check层面的注册切换验证
4.2 Bilibili(~200KB/36 文件) — Phase 4 基本完成
已迁移到 omniget-core/src/platforms/bilibili/:
- 底座:
api.rs,wbi.rs,url_kind.rs,cdn.rs,cover.rs,cookie.rs - 解析:
parser/全量子模块(video / bangumi / cheese / favlist / list / space / popular / history / watch_later / festival) - 媒体选择与元数据:
preview.rs,naming.rs,nfo.rs - 弹幕:
danmaku/(proto/xml/json/ass) - 下载执行层:
engine/(fetch/query/mux) - 入口与 fallback:
mod.rs,legacy.rs,notify.rs
同步完成的抽象与接线:
CookieProvider增加cookie_path_for_account(domain, slug),支持 Bilibili 精确账户 cookie 读取- 默认
CookieProvider支持 core/CLI 写入cookies/<domain>/<slug>.txt - 新增
BilibiliRuntimeProvider,用于注入 active account、settings、session-expired 通知 - 桌面端实现
DesktopBilibiliRuntimeProvider,保留原 Bilibili active-account 选择语义 - Bilibili auth(二维码、短信、CAPTCHA、账号探测)已迁移到
omniget-core/src/platforms/bilibili/auth/ BilibiliRuntimeProvider::persist_account负责登录 cookie 持久化,桌面端实现仍复用现有cookies::storageregistry- 桌面 registry 已从
platforms::bilibili::BilibiliDownloader切到omniget_core::platforms::BilibiliDownloader - CLI registry 已注册 core
BilibiliDownloader omniget-core新增依赖:once_cell,thiserror,md-5,hex,hmac,murmur3,qrcode
当前验证:
cargo check -p omniget-core✅cargo check -p omniget-cli✅cargo check✅cargo test -p omniget-core --lib platforms::bilibili✅ 51 passedcargo test -p omniget-core --lib✅ 244 passed- 2026-07-01 继续移植 auth 后复验:
cargo check -p omniget-core✅,cargo check✅,cargo test -p omniget-core --lib platforms::bilibili✅ 51 passed,cargo test -p omniget-core --lib✅ 244 passed
仍未迁移 / 阻塞:
- 旧
src-tauri/src/platforms/bilibili/auth/仍保留但桌面命令已改用 core auth;可在确认无其他引用后删除 - 旧
src-tauri/src/platforms/bilibili/下载相关模块仍保留,供 cleanup 过渡使用;删除需要单独清理引用 - GUI runtime smoke test 尚未执行
建议下一步:
- 跑桌面 GUI Bilibili 登录账号下载 smoke test,确认 core Downloader 与桌面 runtime provider 行为一致
- 删除旧 Tauri
platforms/bilibili/auth/,确认bilibili_auth命令仍只依赖 core auth - 清理旧 Tauri Bilibili 下载模块,只保留必要 adapter 或完全移除旧目录
4.3 Magnet — 视需求决定
阻塞依赖:librqbit crate、crate::core::trackers
可选方案:
- 将
librqbit加为omniget-core的可选 dependency - 或保留在 Tauri 层,CLI 不支持磁力下载
5. 移植模式(标准操作程序)
每个平台的移植遵循相同模式:
# 1. 在核心库创建新文件
cp src-tauri/src/platforms/<name>/mod.rs src-tauri/omniget-core/src/platforms/<name>.rs
# 2. 替换第一行
sed -i 's/use omniget_core::models::progress::ProgressUpdate;/use crate::models::progress::ProgressUpdate;/' \
src-tauri/omniget-core/src/platforms/<name>.rs
# 3. 在核心库 platforms/mod.rs 注册
echo "pub mod <name>;" >> src-tauri/omniget-core/src/platforms/mod.rs
echo "pub use <name>::<Name>Downloader;" >> src-tauri/omniget-core/src/platforms/mod.rs
# 4. 更新 Tauri 重新导出
# 在 src-tauri/src/platforms/mod.rs 中:
# - 删除 `pub mod <name>;`
# - 添加 `pub use omniget_core::platforms::<Name>Downloader;`
# 5. 更新 lib.rs 引用
# 将 `platforms::<name>::<Name>Downloader` 改为 `omniget_core::platforms::<Name>Downloader`
# 6. 编译测试
cargo check -p omniget-core
cargo check # 全 workspace
关键注意点
pub use不要立即删除:先添加核心库导出,确认编译通过后再清理旧模块- Tauri 特有依赖:如遇到
crate::cookies::*或crate::storage::*,需要引入 trait 抽象 - 测试移植:
#[cfg(test)]模块随文件一起搬运,确保单元测试不中断 - 文件布局:小平台使用单文件(如
youtube.rs);Bilibili 这种多子系统平台使用目录模块(bilibili/mod.rs+ 子模块)
6. 测试指南
6.1 编译检查
# 仅核心库
cargo check -p omniget-core
# 全 workspace(含 Tauri)
cargo check
# CLI
cargo build -p omniget-cli --release
6.2 单元测试
# 核心库全部测试
cargo test -p omniget-core --lib
# 各平台子模块测试
cargo test -p omniget-core --lib platforms::youtube::tests
cargo test -p omniget-core --lib platforms::instagram::tests
当前:核心库完整测试 244 tests passed;Bilibili 子模块定向测试 51 tests passed。
6.3 CLI 实操测试
# 构建
cargo build -p omniget-cli --release
# YouTube 信息
omniget-cli --proxy http://127.0.0.1:7897 --json info \
'https://www.youtube.com/watch?v=dQw4w9WgXcQ'
# YouTube 下载
omniget-cli --proxy http://127.0.0.1:7897 --json download \
'https://www.youtube.com/watch?v=dQw4w9WgXcQ' \
-q 1080 -o ~/Downloads
# Cookie 导入
omniget-cli import-cookies ~/Downloads/cookies.txt --dry-run
omniget-cli import-cookies ~/Downloads/cookies.txt -n bilibili
# 批量下载
omniget-cli --proxy http://127.0.0.1:7897 batch urls.txt -m 3
6.4 回归测试
每次移植新平台后,确认:
cargo check无新增错误cargo test -p omniget-core --lib无新增失败- 桌面 app 启动正常、下载队列工作正常
- CLI info/download 对已移植站点正常
7. 构建产物
| 产物 | 路径 | 说明 |
|---|---|---|
| 核心库(静态) | target/release/omniget_core.lib |
平台提取器 + yt-dlp + HTTP |
| 桌面应用 | target/release/omniget.exe |
GUI + 所有平台 |
| CLI 工具 | target/release/omniget-cli.exe |
头less + 核心库平台 |
8. PR 建议
建议将当前 PR 拆分为两个:
PR-A(已 ready):Phase 0-2 基础设施 + 12 个平台移植
- 安全、已测试、不破坏现有功能
- 包含
import-cookies新命令 - 包含
omniget-clibinary
PR-B(后续):Bilibili smoke + auth/旧模块清理
- Twitter 已完成 core/CLI/桌面注册切换,旧
src-tauri/src/platforms/twitter/可单独删除 - Bilibili Downloader 与 auth 已完成 core/CLI/桌面注册切换,仍需 GUI smoke 与旧模块删除
9. 已知问题
| 问题 | 状态 | 说明 |
|---|---|---|
| P2P 代码验证 | ✅ 已修复 | 使用 super::p2p_words 替代 crate::platforms::p2p_words |
| Magnet 磁力链 | ⏸ 暂缓 | 需 librqbit 进入核心库 |
| CLI 平台调度器 | ✅ 已实现 | info / download 通过核心 PlatformRegistry 路由,非 generic 失败时回退 GenericYtdlp |
| Twitter CLI 实测 | ✅ 已通过 | info + carousel download 通过,测试产物位于 src-tauri/target/twitter-smoke/ |
| Twitter 桌面注册 | ✅ 已切换 | lib.rs 注册 core Twitter,并在 setup 安装 DesktopCookieProvider;cargo check 通过 |
| Bilibili Downloader 迁移 | ✅ 已切换 | core 已包含 cookie/legacy/notify/mod,CLI 与桌面 registry 已注册 core Bilibili,51 个定向测试通过 |
| Bilibili auth/旧模块清理 | ⏳ 部分完成 | auth 网络流程已迁入 core,桌面写入由 provider 适配;旧目录暂保留,GUI runtime smoke 未跑 |
10. 下一步
如果要继续 Phase 3 清理:
- 删除未注册的
src-tauri/src/platforms/twitter/旧适配层 - 运行桌面 GUI smoke test,确认队列中的 Twitter 下载仍走 core Twitter
- 视情况优化 Twitter 多文件下载的聚合进度显示
如果要继续 Bilibili:
- 跑桌面 GUI 登录账号下载 smoke test,确认 core Downloader 与
DesktopBilibiliRuntimeProvider行为一致 - 删除旧
src-tauri/src/platforms/bilibili/auth/,确认桌面 auth 命令仍编译通过 - 清理旧
src-tauri/src/platforms/bilibili/下载相关代码,只保留必要 adapter 或完全移除旧目录
文档维护者:Hanako
最后更新:2026-07-01