mirror of
https://github.com/atdunbg/Nekosonic-Music.git
synced 2026-08-06 03:44:18 +08:00
- 详情页统一 DetailLayout 组件(常驻头部 + 独立滚动 + 紧凑态动画) - 歌曲/评论 tab 切换(懒加载 + 保活),专辑模糊搜索 - 皮肤系统 skins.ts(19 语义色 + 14 预设 + 自定义皮肤 + 壁纸) - 设置页皮肤模块(外观/主题色/皮肤编辑器/壁纸选择) - 可折叠侧边栏 + TopBar + 折叠态歌单浮层(高度不越 PlayerBar) - 首页扩展至 6 区块 + 通用卡片组件 + 虚拟歌曲列表 - audio.rs 拆为 8 模块,api.ts 拆为 api/ 目录,player store 拆为 4 store - 修复播放竞态、seek 暂停、评论提前加载、紧凑态卡死等
45 lines
1.4 KiB
Rust
45 lines
1.4 KiB
Rust
//! 音频流式下载
|
|
//!
|
|
//! 负责从网络 URL 流式下载音频数据到共享缓冲区,并通过事件通知下载进度。
|
|
|
|
use std::io::Read;
|
|
use tauri::{AppHandle, Emitter};
|
|
|
|
use crate::audio::buffer::SharedBuffer;
|
|
|
|
/// 流式下载音频数据到共享缓冲区,支持下载进度事件通知
|
|
pub fn download_audio_streaming(
|
|
url: &str,
|
|
buffer: &SharedBuffer,
|
|
app_handle: &AppHandle,
|
|
) -> Result<(), String> {
|
|
let resp = reqwest::blocking::get(url).map_err(|e| format!("下载失败: {}", e))?;
|
|
if !resp.status().is_success() {
|
|
return Err(format!("HTTP 错误: {}", resp.status()));
|
|
}
|
|
let total_size = resp.content_length().unwrap_or(0);
|
|
let mut downloaded: u64 = 0;
|
|
let mut reader = resp;
|
|
loop {
|
|
if buffer.is_cancelled() {
|
|
return Err("下载已取消".to_string());
|
|
}
|
|
let mut chunk = [0u8; 8192];
|
|
let read_size = reader
|
|
.read(&mut chunk)
|
|
.map_err(|e| format!("读取失败: {}", e))?;
|
|
if read_size == 0 {
|
|
break;
|
|
}
|
|
buffer.write_chunk(&chunk[..read_size]);
|
|
downloaded += read_size as u64;
|
|
let progress = if total_size > 0 {
|
|
(downloaded as f64 / total_size as f64) * 100.0
|
|
} else {
|
|
0.0
|
|
};
|
|
let _ = app_handle.emit("cache-progress", progress);
|
|
}
|
|
Ok(())
|
|
}
|