feat: v0.9.0 多音源系统、歌曲标签、搜索建议、播放器改进

音源系统:
- 新增可配置多音源(波点/酷狗/酷我),支持启用/禁用/排序/自定义源
- 酷我 kwDES 加密 + mobi.s 接口绕过 VIP 限制
- VIP/版权歌曲跨源 fallback,版本一致性匹配(原版/DJ/Live/混音)
- 多源聚合搜索,歌名+歌手组合去重

歌曲标签:
- 付费/音质/版本/音源标签,网易云 fee 字段精确判断
- privilege 数组合并(歌手/歌单/专辑/每日推荐/收藏页)

搜索建议:
- 120ms 防抖 + compositionend 支持,中文输入实时建议
- Teleport + fixed 定位避免父容器裁剪

播放器:
- 网络流 seek 支持(SharedBuffer 下载完成后 byte_len 可用)
- 切歌停止旧播放再加载新歌,进度条起步归零
- 切歌加载状态可视化,按钮禁用反馈
- tick generation 防竞态,旧 tick 不覆盖新歌位置
- 系统媒体控制(跨平台,Windows 增加 hwnd 就绪检查避免 panic)

其他:
- 设置迁移 v7(恢复酷我音源)
- useUpdater 模块级共享状态
This commit is contained in:
2026-07-02 09:54:45 +08:00
parent 2993495d05
commit 1fddbeab77
35 changed files with 4754 additions and 248 deletions
+10 -1
View File
@@ -8,6 +8,7 @@ use std::sync::atomic::{AtomicBool, Ordering};
mod api;
mod audio;
mod media_controls;
mod music_sources;
use api::ApiController;
use audio::AppAudio;
@@ -41,7 +42,13 @@ pub fn run() {
} else {
None
};
media_controls::start_media_controls(app.handle().clone(), hwnd);
// Windows 上 souvlaki 要求 hwnd 必须存在,否则 panic
// 窗口尚未创建时跳过媒体控制初始化(不阻塞 app 启动)
if hwnd.is_some() {
media_controls::start_media_controls(app.handle().clone(), hwnd);
} else {
eprintln!("[media_controls] 窗口未就绪,跳过媒体控制初始化");
}
}
#[cfg(not(target_os = "windows"))]
@@ -140,6 +147,8 @@ pub fn run() {
api::cloudsearch,
api::search_suggest,
api::get_song_url,
api::search_songs_multi,
api::get_external_song_url,
api::get_hot_search,
api::get_playlist_detail,
api::get_lyric,