一个精致的第三方音乐客户端
基于 Flutter 构建 · 支持多平台 · Material You 设计
KA Music 是一个功能丰富的 第三方音乐播放器,使用 Flutter 框架构建,支持 Android、iOS、Windows、macOS、Linux 及 Web 六大平台。它提供跨平台音乐搜索、在线播放、歌词展示、下载缓存等完整的音乐体验,并采用 Material You 设计语言,支持深色模式和高度自定义主题。
🔌 该项目通过第三方 API 获取音乐数据,仅供学习交流使用。
| 首页推荐 | 播放器 | 歌词 |
|---|---|---|
![]() |
![]() |
![]() |
| 个人库 | 搜索页 | 歌单详情 |
|---|---|---|
![]() |
![]() |
![]() |
.lrc / .LRC 文件和音频内嵌时间歌词;LRC 支持 UTF-8、带 BOM 的 UTF-16 和 GBK 编码。匹配依赖音频标签;标签缺失时会尝试从文件名识别。信息不足或找不到对应录音时不会强行套用其他版本的歌词。网络请求失败不会缓存为空结果,下次播放会重试;只有普通文本内嵌歌词时,会在没有匹配结果的情况下展示该文本。Android 的文件访问权限可能影响同目录 LRC 的读取。
QQ 导入支持短链接和歌单详情链接,直接读取公开歌单并分页获取歌名、歌手和时长,再匹配到当前曲库。目标歌单已有歌曲按 hash 跳过,源歌单中同名但不同歌手的歌曲会分别匹配。私密、失效或不可读取的歌单会提示错误;部分歌曲不可读取时会显示原始数量与可读取数量的差异。网易云分享链接继续使用服务器解析。
| 类别 | 技术 |
|---|---|
| 框架 | Flutter (SDK ^3.11.5) |
| 语言 | Dart |
| 音频播放 | just_audio — 低延迟音频引擎 |
| 后台播放 | audio_service — 通知栏控制 & 后台保活 |
| 音频焦点 | audio_session — 系统级音频焦点管理 |
| HTTP | http (API 请求) + dio (文件下载) |
| 持久化 | shared_preferences — 设置 & 缓存 |
| 状态管理 | ChangeNotifier + AnimatedBuilder(原生方案) |
| 路由 | Navigator 1.0 |
| 设计系统 | Material 3 (Material You) |
| 代码规范 | flutter_lints |
┌─────────────────────────────────────┐
│ UI Layer │
│ Pages · Widgets · AppTheme │
├─────────────────────────────────────┤
│ Controllers │
│ Auth · Player · Download · Theme │ ← ChangeNotifier
├─────────────────────────────────────┤
│ Services │
│ MusicApi · CacheService │
│ DownloadService · AudioHandler │
├─────────────────────────────────────┤
│ Core │
│ ApiClient (HTTP + 重试 + Session) │
├─────────────────────────────────────┤
│ Config │
│ AppConfig · Models │
└─────────────────────────────────────┘
X-Kg-Session-Id 持久化,自动恢复登录# 克隆仓库
git clone <repo-url>
cd kgka_music_hl
# 安装依赖
flutter pub get
# 运行(选择目标平台)
flutter run # 自动检测设备
flutter run -d android
flutter run -d ios
flutter run -d windows
flutter run -d macos
flutter run -d linux
flutter run -d chrome
flutter test test/local_lyrics_test.dart
覆盖 LRC 编码、MP3 / FLAC 内嵌歌词、联网匹配、缓存离线复用、文件替换后缓存失效,以及同名翻唱和不同录音版本的排除。测试夹具为生成的短音频,不依赖个人音乐文件。
flutter test test/playlist_import_test.dart
覆盖 QQ 短链接跳转、分页、同名不同歌手、重复歌曲、停止导入、写入失败,以及新建歌单到显示导入结果的界面流程。自动化测试使用模拟服务,不会修改真实账号的歌单。
| 变量 | 说明 | 默认值 |
|---|---|---|
KA_MUSIC_API_BASE_URL |
自定义默认 API 地址 | https://music.api.hoilai.cn |
KA_MUSIC_DEBUG_LYRICS |
启用歌词调试日志 | true |
# 编译时指定环境变量示例
flutter run --dart-define=KA_MUSIC_API_BASE_URL=https://your-api.com
lib/
├── main.dart # 应用入口
├── assets/
│ └── logo.jpg # App Logo
├── config/
│ └── app_config.dart # 全局配置(API 地址、缓存大小等)
├── core/
│ └── api_client.dart # HTTP 客户端(重试、Session)
├── controllers/
│ ├── auth_controller.dart # 登录认证
│ ├── player_controller.dart# 播放引擎
│ ├── download_controller.dart # 下载管理
│ └── theme_controller.dart # 主题管理
├── models/
│ ├── music_models.dart # 音乐领域模型
│ └── app_version.dart # 版本更新模型
├── services/
│ ├── music_api.dart # API 接口封装
│ ├── cache_service.dart # 数据缓存(SWR)
│ ├── download_service.dart # 文件下载服务
│ ├── music_audio_handler.dart # 后台音频服务
│ └── ... # 其他服务
└── ui/
├── app_theme.dart # 主题定义
├── adaptive_layout.dart # 响应式布局
├── pages/ # 页面
│ ├── home_page.dart # 首页
│ ├── player_page.dart # 播放器
│ ├── library_page.dart # 我的
│ ├── search_page.dart # 搜索
│ └── ... # 其他页面
└── widgets/ # 可复用组件
├── mini_player.dart # 迷你播放栏
├── artwork.dart # 封面组件
└── ... # 其他组件
详细的版本更新日志请查看 update.md。
v2.0.5 主要更新:
本项目仅供学习交流使用,请勿用于商业用途。
Made with XiaoMai and Flutter
| 日期 | 榜单 | 排名 | 周期新增 | 总 STAR |
|---|