Bilibili 桌面音乐播放器,基于 Tauri v2 构建,前端使用 Vue 3 + TypeScript + Tailwind CSS v4。
Bilibili 上有大量音乐类视频(翻唱、演奏、Vocaloid、音 MAD 等),但官方客户端和网页版偏向视频消费场景,缺乏"纯听"模式。BiliMusiq 将这些视频当作音乐来消费:搜索、收藏、建歌单、一键连播,做 B 站的"音乐播放器"。
- 搜索:Bilibili 全站视频搜索,支持分页浏览
- 播放:内嵌 Bilibili 播放器,支持连播、列表循环、单曲循环
- 收藏:一键收藏,收藏即歌单
- 歌单:创建、管理自定义歌单,支持右键添加
- 历史:自动记录播放历史,支持快捷收藏和添加到歌单
- 批量导入:粘贴 QQ 音乐/网易云音乐/酷狗歌单链接或文本批量匹配
- Node.js >= 18
- Rust (stable)
- 系统依赖:Windows 需 WebView2(Win10+ 自带),macOS 需 Xcode CLI tools,Linux 需 webkit2gtk
git clone https://github.com/yourname/bilimusiq.git
cd bilimusiq
bun install
bun run tauri devbun run tauri dev # 开发模式(前后端一体)
bun run dev # 仅前端热更新 → http://127.0.0.1:5173
bun run tauri build # 生产构建
cargo build -p bilimusiq_lib # Rust 语法检查
bun run build会执行vue-tsc -b全量类型检查——类型错误阻断构建。
src/ # Vue 前端
├── components/ # 视图组件
├── composables/ # 状态管理 (usePlayer, useSearch, useDatabase, useImage…)
├── types/index.ts # TypeScript 类型定义
└── main.ts # 入口
src-tauri/src/ # Rust 后端
├── lib.rs # Tauri 命令 + bili-img 协议处理器 + app setup
├── db.rs # SQLite Schema & 数据迁移
├── import.rs # 歌单导入解析
├── logging.rs # 文件日志(自动轮转)
└── main.rs # 入口 (windows 子系统)
没有 vue-router。App.vue 中一个 activeView ref 完成六个页面的切换(search / player / playlist / history / batch / about),省去路由库的冗余。配合 selectedPlaylistId 实现歌单详情和收藏的导航。
无 Pinia/Vuex。Composable 的 reactive state 定义在模块级别,函数返回同一份引用:
// usePlayer.ts
const currentVideo = ref<Video | null>(null) // 模块级,全局唯一
export function usePlayer() {
return { currentVideo, ... } // 每次调用同一份 ref
}usePlayer、useSearch、useDatabase、useImage、useToast 均采用此模式。
Bilibili CDN 校验 Referer 头,浏览器 <img> 直接引用会 403,所有图片必须经 Rust 后端代理。最终架构:
前端 loadImage(url) → "http://bili-img.localhost/<encoded_url>" -> Tauri 协议处理器拦截 → L1 内存 → L2 磁盘 → L3 CDN
- L1:
OnceLock<Mutex<HashMap>>,100 条目,零 I/O - L2:JPEG 原图缓存(无压缩损失),写入
<exe_dir>/image_cache/ - L3:reqwest 从 Bilibili CDN 下载,后台线程串行缩略落盘
前端 prefetchImage 用 new Image() 触发协议处理器预加载,VideoCard 配合 IntersectionObserver({ rootMargin: '300px' }) 懒加载,首屏仅加载 ~6-8 张图。
这条链路经历了 IPC 硬拉 → 缓存但三倍 IPC → 自定义协议零 IPC → 内存缓存 → 懒加载,共四轮重构。
全部 40+ 处 eprintln! 替换为 log::info! / log::error!,写入 <exe_dir>/bilimusiq.log,格式 [2026-06-21 21:30:00] [INFO] 消息,超 5MB 自动轮转为 .log.old。
windows_subsystem = "windows" 在 Release 构建下隐藏控制台窗口。同时设置窗口最小尺寸 minWidth: 900 / minHeight: 600。
项目内无一处 inline <svg>,全部通过 <font-awesome-icon> 组件使用 Font Awesome 6 Solid,共使用 15 个图标。
欢迎提交 Issue 和 Pull Request。提交前请确保 npm run build 通过。
