English | 繁體中文
基於 Tauri 2 + Svelte 5 + Rust 的桌面音樂播放器。純本地離線播放,不依賴任何網路服務。
Lyra 的設計原則:
零依賴啟動 -- 音訊引擎使用 rodio(純 Rust),不需要 GStreamer、MPV、FFmpeg。下載二進位即可執行。
輕量、不是小功能 -- Tauri 2 不捆綁 Chromium,記憶體佔用遠低於 Electron 方案。但保留了多數使用者實際需要的功能:Gapless Playback、斷點續播、播放清單管理、元資料編輯、System Tray。
你的音樂留在你的機器 -- 無 telemetry(不會在背景收集或回傳任何使用資料)、無帳號、無網路請求。MIT 授權,程式碼完全透明。
前往 GitHub Releases 下載最新版本(支援 AppImage、deb、rpm)。
延伸閱讀:為什麼選擇 Rust、Tauri 2 介紹
| 層級 | 技術 | 說明 |
|---|---|---|
| 前端 | Svelte 5 + TypeScript | 使用 Svelte 5 runes 做響應式狀態管理 |
| 建置工具 | Vite 7 | 開發伺服器與前端打包 |
| 桌面框架 | Tauri 2 | 原生視窗、系統匣、IPC 通訊 |
| 後端 | Rust | 音訊處理、檔案掃描、資料庫操作 |
| 音訊引擎 | rodio 0.21 | 純 Rust 實作,不需要安裝 GStreamer、MPV 等系統音訊框架 |
| 元資料解析 | lofty 0.23 | 讀寫 ID3/Vorbis/MP4 標籤與封面圖 |
| 檔案監視 | notify 8 | 即時偵測資料夾變化,自動更新音樂庫 |
| 資料庫 | SQLite (rusqlite, bundled) | WAL mode,schema migration 管理 |
| 測試 | Vitest + cargo test | 前端 17 個測試檔、後端 10 個整合測試 |
本地音樂播放 -- 支援 MP3、FLAC、WAV、OGG、M4A、AAC 格式。音訊引擎基於 rodio,play / pause / stop / seek 完整控制,音量使用二次曲線映射(UI 0.5 對應實際 0.25),聽感更自然。
Gapless playback -- 預先解碼下一首並 append 到同一 sink,實現無縫銜接。不要求前後曲目 sample rate 一致。
播放清單與斷點續播 -- 建立、編輯、刪除播放清單,支援拖曳排序。每個播放清單記錄最後播放的曲目 ID 與秒數位置,切換播放清單時自動恢復上次播放進度。
Mini Player + System Tray -- 按 m 切換為 420x80 精簡視窗(always-on-top)。系統匣支援 Play/Pause、上一首、下一首、顯示視窗、退出。關閉視窗時自動最小化到系統匣。
Tauri 2 + Svelte 5 + Rust 架構 -- 前後端透過 35 個 Tauri commands 進行 IPC 通訊。前端以 Svelte 5 runes 管理狀態,後端以 Rust 處理音訊解碼、檔案 I/O、資料庫操作。
其他功能:
Linux(Debian/Ubuntu)額外需要:
sudo apt install libwebkit2gtk-4.1-dev build-essential curl wget file \
libssl-dev libayatana-appindicator3-dev librsvg2-dev libasound2-dev
npm install # 安裝前端依賴
npm run tauri dev # 開發模式(同時啟動 Vite dev server 和 Tauri 視窗)
npm run tauri build # 正式建置
建置產物位於 src-tauri/target/release/bundle/,支援 deb、AppImage(Linux)、dmg(macOS)、nsis/msi(Windows)。
npm run test # 前端單元測試 (Vitest, 17 個測試檔)
npm run check # 類型檢查
cd src-tauri && cargo test # 後端整合測試 (10 個測試檔,音訊測試預設跳過)
cd src-tauri && cargo test --features audio-tests # 含音訊測試 (需音訊裝置)
npm run quality # 程式碼品質檢查 (ESLint + Prettier + Stylelint + Clippy + rustfmt)
所有快捷鍵在輸入框聚焦時不生效。
| 按鍵 | 動作 |
|---|---|
Space |
播放 / 暫停 |
ArrowLeft / ArrowRight |
快退 / 快進 5 秒 |
ArrowUp / ArrowDown |
音量增加 / 降低 5%(曲目列表未聚焦時) |
n / p |
下一首 / 上一首 |
s |
切換隨機播放 |
r |
切換循環模式(off / repeat-all / repeat-one) |
m / Escape |
切換 / 退出 Mini Player |
Ctrl+F / Cmd+F |
聚焦搜尋框 |
Ctrl+A / Cmd+A |
全選曲目 |
曲目列表聚焦時:
| 按鍵 | 動作 |
|---|---|
ArrowUp / ArrowDown |
上一首 / 下一首曲目 |
Shift+ArrowUp / Shift+ArrowDown |
向上 / 向下擴展選取 |
Enter |
播放聚焦曲目 |
Home / End |
跳到第一首 / 最後一首 |
src/ # 前端 (Svelte 5 + TypeScript)
lib/
api/ # Tauri IPC 呼叫封裝 (playback, library, playlist)
components/ # UI 元件 (Player, Library, Browse, Playlist, Sidebar, Settings)
state/ # 響應式狀態管理 (Svelte 5 runes)
logic/ # 純函式邏輯 (播放模式、快捷鍵、格式化、選取、排序)
types/ # TypeScript 型別定義
src-tauri/ # 後端 (Rust)
src/
audio/ # 音訊引擎 (rodio sink, gapless queue)
scanner/ # 資料夾掃描與檔案監視 (walkdir, notify)
metadata/ # 元資料讀寫與封面快取 (lofty)
storage/ # SQLite 資料庫 (schema v5, WAL mode)
commands/ # Tauri command handlers (35 個 IPC 介面)
models/ # 資料結構定義 (track, playlist, player_state)
tests/ # 10 個整合測試