一个用 Rust + Iced 构建的本地音乐播放器 —— 名字的由来:RI = Rust + Iced。
- 🎵 本地音乐播放 —— 支持
mp3/wav/ogg - 🏷️ 标签系统 —— 给歌曲打上自定义标签,自由分类
- 🎤 艺术家视图 —— 按艺术家自动归类,没有艺术家信息的归入「群星」
- 🔍 搜索 —— 支持按文件名或艺术家名模糊搜索
- 🔁 四种播放模式 —— 单曲即停 / 单曲循环 / 下一曲 / 随机播放
- 🎨 可自定义主题 —— 实时调整背景色、文字色、强调色、警示色
- 💾 持久化 —— 搜索源、标签、播放状态、主题,重启后完整恢复
- ⚡ 异步加载元数据 —— 启动秒开,后台分批读取时长和艺术家
- 🌫️ 空状态文案 —— 每个空页面都有专属的一句话,不是冷冰冰的「暂无数据」
- Rust 1.75+
- 系统音频库(
rodio依赖):- Windows:无需额外配置
- macOS:无需额外配置
- Linux:
libasound2-dev(Debian/Ubuntu)或alsa-lib-devel(Fedora)
git clone https://github.com/0x8000S/RIMusic
cd RIMusic
# 调试模式
cargo run
# 发布模式
cargo build --release
./target/release/RIMusicRIMusic 使用 confy 保存配置:
| 平台 | 路径 |
|---|---|
| Windows | %APPDATA%\rimusic\ |
| macOS | ~/Library/Application Support/rimusic/ |
| Linux | ~/.config/rimusic/ |
主题配色单独存储在 theme.toml 中。
src/
├── main.rs # 入口 + 窗口设置
├── app.rs # RIMusic 主结构体(组装层)
├── backend.rs # 后台消息处理(Sync / ReadFileData / CloseSave)
├── ui.rs # UI 渲染 + UI 消息处理
├── state.rs # 所有状态枚举 + 颜色调色板
├── config.rs # Settings + SettingKeys
├── player.rs # 播放引擎(rodio 封装)
├── store.rs # 数据存储 + 索引 + 异步读取
└── music_file.rs # 音乐文件元数据读取
- 消息分层:
Message分为UiMessage(用户操作)和BackendMessage(系统定时任务),职责清晰 UiArgs统一上下文:UI 层通过UiArgs借用player/store/settings,避免参数爆炸- 关注点分离:UI 渲染、播放逻辑、数据管理、配置持久化各自独立
ColorPalette 包含六个可调色槽:
| 色槽 | 用途 |
|---|---|
background |
全局背景 |
text |
文字及边框 |
primary |
强调色(按钮、标题) |
success |
成功状态(暂未使用) |
danger |
危险操作(删除) |
warning |
警告状态 |
在「设置 → 外观」中点击色块即可打开取色器实时修改。整套配色会保存到 theme.toml。
| 库 | 用途 |
|---|---|
iced |
GUI 框架 |
iced_aw |
扩展组件(Menu / ColorPicker) |
rodio |
音频播放 |
lofty |
音频元数据读取 |
confy |
配置持久化 |
serde |
序列化 / 反序列化 |
rfd |
原生文件选择对话框 |
RIMusic 最初是一个用 Python + Flet 写的项目(名为 LPMusicPlayer,LowPython Music Player)。后来决定用 Rust + Iced 重写,经历了多次重构:
| 版本 | 特征 |
|---|---|
| V0 | 单细胞版本,能出声就行 |
| V0.5 | 功能爆发(标签、侧边栏、模态框),结构开始混乱 |
| V1 | 第一次重构,抽出 Player 和 CommonWidget |
| V2 | 功能完整,抽出 MusicStore ,但 main.rs 膨胀到 1400 行 |
| V3 | 拆分为 9 个模块,消息分层,架构清晰 |
| V3.5 | 加入主题自定义、搜索增强 |
- 代码编写:氢気氚
- 美术创作:KEVIN-07
- README 编写: DeepSeek
“空空如也,像冬天的落叶一样。”