BiliMusic 是一款围绕 B 站音频内容打造的跨平台音乐播放器。基于 Flutter 一次覆盖 Windows、Linux、Android,并对 macOS、Web 提供实验性支持。它不复制视频平台,只做播放器该做的事:搜索、整理、连续播放与跨设备同步。
Important
BiliMusic 仅供学习交流使用,不得用于任何商业用途。项目只提供音频播放能力,不提供任何视听内容;音乐及视频内容的版权归原作者所有,请尊重版权并合理使用。
由于不可抗拒力,请勿在其他平台宣传或讨论本项目。
主流 B 站客户端是完整的视频平台,对「只想听声音」的场景并不友好:后台播放受限、歌单能力弱、跨设备体验割裂。BiliMusic 把 B 站视为音乐内容源,专注于播放器的本职——搜索、整理、播放、漫游、同步。
技术选型上,Flutter 提供一套代码覆盖桌面与移动端;Riverpod 承担状态管理与依赖注入;just_audio 与 libmpv 负责音频解码;局域网同步通过 mDNS 与 TCP 配对实现。代码按 UI / 状态 / 编排 / 领域模型 / 基础设施分层,核心网络与存储层保持纯 Dart,以便 TUI 复用。
作者本人也是重度听歌爱好者,软件的开发会注重使用体验,在上线新功能时会反复打磨
(其实是听了半天),这一块不用担心。
Important
从 v2.0 开始,BiliMusic 将迁移至 AGP 9.0,这会升级 Android-SDK 版本至 Android 14,请自行留意兼容性。
| 平台 | 状态 | 备注 |
|---|---|---|
| Windows 10+ | ✅ 稳定 | 解压即用 |
| Linux | ✅ 稳定 | Ubuntu 20.04+ 或主流发行版;需要 libmpv-dev |
| Android 12+ | ✅ 稳定 | 按设备架构选择 APK(arm64-v8a / armeabi-v7a / x86_64),或全平台 AAB |
| macOS 10.15+, with Metal Support | CI 产出 ad-hoc 签名的未公证 .app,也可从源码构建 |
|
| iOS 13+ | ❓ 未经测试 | 可从源码构建无签名版本 |
| Web | 解压后部署到 Web 服务器,需配置 CORS |
关于应用内更新:Android / Windows / Linux 支持;Web 与 macOS 跳转 Releases(见更新与版本)。
前往 Releases 下载对应平台的最新版本,解压运行即可。
- Android / Windows / Linux:启动时自动检查更新。
- macOS / Web:需手动重新下载。
# Linux 用户需要先安装依赖
sudo apt install libmpv-dev环境要求:Flutter 3.x · Dart SDK ^3.13.0
git clone https://github.com/NaivG/bilimusic.git
cd bilimusic
flutter pub get
flutter run # 默认设备
flutter run -d <device-id> # 指定设备flutter build windows
flutter build linux
flutter build apk
flutter build macos
flutter build ios
# Web 需先生成 sqlite 资源
flutter pub run sqflite_common_ffi_web:setup --force
flutter build webWeb 端 sqlite 资源(
web/sqlite3.wasm、web/sqflite_sw.js)不入库,必须由setup命令生成,否则构建产物无法初始化本地数据库。
仓库附带一个实验性终端客户端,与 App 共享登录状态(当前基于 Windows 下的 libmpv):
dart run bin/bilimusic_tui.dart # 交互式 TUI
dart run bin/bilimusic_tui.dart --probe # 网络与解码分层自检
dart run bin/bilimusic_tui.dart --smoke # 无终端驱动完整循环
dart run bin/bilimusic_tui.dart --preview # 静态设计预览(假数据,无网络无声)典型路径:
搜索内容 → 加入歌单 → 开始播放 → 匹配歌词与主题 → 漫游扩展 → 局域网同步
| 入口 | 用途 |
|---|---|
| 首页 | 推荐、猜你喜欢、播放历史 |
| 搜索 | 通过关键词 / BV / AV 查找 B 站音乐内容 |
| 歌单 | 管理本地歌单与导入的收藏夹 |
| 个人中心 | 用户信息、收藏、历史、漫游、设备同步 |
| 设置 | 主题、外观、播放、缓存等偏好 |
- 在个人中心进入漫游模式。
- 选择歌单或歌曲作为种子。
- 选择「相似 / 平衡 / 探索」风格。
- 队列接近末尾时自动发现并补充相关歌曲。
同局域网内开启设备同步:应用通过 mDNS 发现设备,通过二维码或配对请求建立信任连接,之后可同步播放状态、队列与远程控制。
发现与推荐
- 支持
BV号、AV号与关键词搜索。 - 首页推荐、猜你喜欢、播放历史。
- 基于 simhash 的相关度排序与漫游补队列。
- 三种漫游风格:相似 / 平衡 / 探索。
播放体验
- 播放 / 暂停 / 上一首 / 下一首 / 进度跳转;定时关闭。
- 多 P 视频切换、顺序 / 随机 / 单曲循环。
- A/B 双播放器 + equal-power 曲线的交叉淡入淡出。
- 多档音质选择,DASH 音频流按选择取流并回显实际生效音质。
- 后台播放、系统媒体通知、音量持久化。
- 动态歌词:自动匹配、逐字点亮、辉光效果。
- 主题系统:Lucent / Nocturne / Verdant / Gruvbox / Nord / Solarized 六套主题,运行时切换并按封面主色适配。
- 离线缓存:歌曲可下载到本地,断网也能继续播放。
整理与同步
- 本地歌单:创建、编辑、删除、拖拽排序、滑动删除。
- B 站收藏夹导入并跟踪同步状态。
- mDNS 局域网发现 + TCP 二维码配对 + 远程播放控制。
- 支持手表、折叠屏外屏与近方形 PiP 窗口布局。
终端客户端(TUI)
- 主页与搜索结果两页布局,支持关键词 /
BV/AV搜索、播放、暂停与切歌,键盘与鼠标可用。 - FFI 直驱 libmpv(复用 media_kit 的 Windows 库产物),与 App 共享登录态与网络层。
- 附带
--probe/--smoke/--preview自检、驱动与预览模式。
默认使用 Verdant 主题展示。
部分 B 站功能需要登录:
- 移动端:通过 gt3_flutter_plugin 完成账号密码登录。
- 桌面端:使用 B 站 App 扫码登录。
- 数据迁移:可在数据管理中将移动端数据迁移到桌面端。
数据存储:歌单、收藏和历史保存在本地 SQLite;设置使用
shared_preferences;网络资源与歌词进入本地缓存;歌曲可另存为离线缓存,断网可播。迁移或清理前请做好备份。
应用启动后自动检查一次新版本,发现更新时弹出更新日志与「立即更新」按钮。检查与下载是两套独立操作:
| 环节 | 来源 | 说明 |
|---|---|---|
| 检测 | 仓库 assets/version.json |
只比较 major.minor.patch,忽略 +build 号 |
| 更新日志 | assets/version.json 的 changelog |
应用内「设置 → 更新日志」读取随包内置的同一份数据 |
| 下载 | GitHub Releases API | 点击更新时实时取下载地址与 sha256 摘要 |
各平台行为:
- Android:经
flutter_app_update下载 APK 并拉起系统安装页;Android 13+ 会先申请通知权限以展示下载进度。 - Windows / Linux:下载便携版 zip,校验 sha256 后原地替换文件并重启。
- Web / macOS:不支持应用内更新,点击后跳转 Releases 页面手动下载。
UI / Riverpod Provider
↓
PlayerCoordinator ←── RoamingService
↓
DualAudioService ←── NotificationService / PiP / LAN Sync
↓
ApiService
↓
BiliClient ←── Bilibili API
| 层 | 目录 | 职责 |
|---|---|---|
| UI | features/*/ui/ · widgets/ · app/shells/ |
页面、组件、横竖屏与方屏布局 |
| 状态 | features/*/*_providers.dart · app/shells/ |
Riverpod 状态、命令与页面导航 |
| 编排 | features/*/logic/ · services/ |
播放编排、漫游、局域网同步、登录等业务流程 |
| 领域模型 | domain/ |
纯共享数据模型 |
| 基础设施 | core/ |
HTTP 客户端、异常体系、SQLite 与缓存 |
| 视觉系统 | shared/theme/ |
Palette、Token、主题注册切换 |
| 组合根 | app/app_providers.dart |
长生命周期服务的创建与释放 |
长生命周期服务统一在
lib/app/app_providers.dart中创建与释放;UI 只消费 Provider,不直接实例化业务管理器。
lib/
├── main.dart # 应用入口:窗口、数据库、audio_service 初始化
├── app/ # app_providers.dart 组合根 + shells/ 应用外壳与导航
├── core/ # 无 UI 基础设施
│ ├── network/ # BiliClient、ApiService、PassportClient 与异常体系
│ └── storage/ # AppDatabase(SQLite) 与 CacheManager
├── domain/ # 纯共享模型:Music、Playlist、BiliItem、PeerDevice 等
├── features/ # 功能模块,内部按 logic/ models/ ui/ 分层
│ ├── player/ # PlayerCoordinator、DualAudioService、通知、PiP、正在播放页
│ ├── lyrics/ # 歌词检索、多源匹配与逐字渲染
│ ├── playlist/ # 歌单 / 收藏 / 历史的单一数据源
│ ├── roam/ # 漫游模式:simhash 排序、种子多样性与风格策略
│ ├── lan_sync/ # 局域网同步:mDNS 发现、二维码配对、远程控制
│ ├── offline/ # 离线缓存:下载管理、断网播放与缓存清理
│ ├── auth/ # 扫码登录、验证码与 Cookie 管理
│ ├── fav_sync/ # B 站收藏夹导入与同步状态跟踪
│ ├── home/ search/ profile/ # 首页推荐、搜索、个人中心
│ └── settings/ update/ # 设置、数据迁移;更新检查、Release 解析、应用内更新与更新日志
└── shared/ # 跨模块共享:widgets/、theme/(Lucent/Nocturne/Verdant/Gruvbox/Nord/Solarized)、utils/
bin/
├── bilimusic_tui.dart # 终端客户端入口(dart_tui + libmpv FFI)
└── tui/ # TUI 内部实现:mpv_player(FFI)、tui_api、app_model、probe
| 依赖 | 用途 |
|---|---|
| Flutter | 跨平台 UI 框架 |
| Riverpod | 状态管理与依赖注入 |
| just_audio · audio_service | 音频播放 + 后台与系统媒体控制 |
| just_audio_media_kit | 桌面端 libmpv 音频后端 |
| media_kit_libs_audio | 桌面端 libmpv 原生库(TUI 亦复用其 libmpv 产物) |
| http | 统一 HTTP 客户端 |
| bonsoir | mDNS 局域网设备发现 |
| sqflite(含 ffi / ffi_web 实现) | 本地 SQLite 数据存储 |
| flutter_lyric · lyrics_now | 歌词渲染与歌词源检索 |
| color_thief_dart | 封面主色提取 |
| gt3_flutter_plugin | 登录极验验证码 |
| window_manager | 桌面窗口管理 |
| flutter_app_update · permission_handler | Android 应用内更新与通知权限检查 |
| flutter_cache_manager | 缓存管理 |
| shared_preferences | 跨平台本地存储 |
| dart_tui | 终端 UI 框架 |
flutter pub get # 安装依赖
flutter analyze # 静态分析(CI 使用 dart analyze --no-fatal-warnings)
dart format . # 提交前必须执行,避免 CI 产生格式化噪声提交
flutter test # 运行测试
flutter run # 调试运行提交改动前建议至少执行
flutter analyze与dart format .,并在目标平台完成一次构建验证。
- UI 设计灵感:Apple Music, 某云音乐, ParticleMusic
- 歌词获取:lyrics_now
- 歌词渲染:coriander_player, flutter_lyric
- GitHub Actions:FlutterHub
- README 规范:standard-readme
欢迎通过 Issue 报告问题,或提交 Pull Request 改进功能。提交前请尽量:
- 说明复现环境、平台与具体步骤。
- 保持改动聚焦,并遵循现有 Flutter / Dart 代码风格。
- 执行
flutter analyze和相关测试。 - 不提交 Cookie、账号信息、构建产物或其他敏感数据。
本项目采用 GNU Affero General Public License v3.0 许可证。
Copyright (C) 2026 NaivG and contributors.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Warning
本项目的图标采用 CC BY-NC 4.0 协议。






