- 修复循环播放

This commit is contained in:
Pine
2026-05-13 00:10:59 +08:00
parent 4ad266f6c4
commit 7794012299
4 changed files with 182 additions and 127 deletions
+22
View File
@@ -3,6 +3,9 @@ mod models;
mod server;
mod storage;
use std::io::{Read, Write};
use std::time::Duration;
#[cfg_attr(mobile, tauri::mobile_entry_point)]
pub fn run() {
// 在后台线程启动 HTTP 服务器
@@ -13,6 +16,25 @@ pub fn run() {
});
});
// 等待 HTTP 服务器就绪后再打开窗口
for i in 0..50 {
if let Ok(mut s) = std::net::TcpStream::connect_timeout(
&"127.0.0.1:8000".parse().unwrap(),
Duration::from_millis(500),
) {
// 发送一个简单的 HTTP 请求测试
let _ = s.write_all(b"GET /api/state HTTP/1.0\r\n\r\n");
let mut buf = [0u8; 4];
if s.read(&mut buf).is_ok() {
break;
}
}
if i == 0 {
eprintln!("[dpm] 等待 HTTP 服务器启动...");
}
std::thread::sleep(Duration::from_millis(100));
}
tauri::Builder::default()
.plugin(tauri_plugin_opener::init())
.run(tauri::generate_context!())
+49 -3
View File
@@ -18,7 +18,7 @@ use std::fs;
use tokio_stream::wrappers::BroadcastStream;
use tokio_stream::StreamExt;
use tower_http::cors::CorsLayer;
use tower_http::services::{ServeDir, ServeFile};
use tower_http::services::ServeDir;
// ===================== 媒体目录 =====================
fn media_dir() -> PathBuf {
@@ -46,8 +46,50 @@ impl AppState {
}
}
/// 智能查找 dist 目录(前端静态文件)
/// 支持多种运行场景:
/// - tauri dev 时 CWD = src-tauri/ → ../dist
/// - 二进制在 target/release/dpm → ../../dist
/// - 从项目根目录运行时 → dist
fn dist_dir() -> PathBuf {
let candidates: Vec<PathBuf> = {
let mut c = Vec::new();
// 1. 相对于当前工作目录
c.push(PathBuf::from("dist"));
c.push(PathBuf::from("../dist"));
// 2. 相对于可执行文件路径
if let Ok(exe) = std::env::current_exe() {
if let Some(dir) = exe.parent() {
// 二进制在 src-tauri/target/release/dpm → dist 在 dpm/dist/
c.push(dir.join("../../../dist"));
// macOS .app bundle: dpm.app/Contents/MacOS/dpm
c.push(dir.join("../Resources/dist"));
}
}
c
};
for p in &candidates {
let canonical = p.canonicalize();
if let Ok(path) = canonical {
if path.join("index.html").exists() {
return path;
}
}
}
// Fallback:直接尝试最常见的路径
let fallback = PathBuf::from("../dist");
eprintln!("[dpm] 警告: 找不到 dist 目录 (已尝试 {:?}),使用: {:?}", candidates, fallback);
fallback
}
// ===================== 路由构建 =====================
pub fn create_router(state: AppState) -> Router {
let dist = dist_dir();
println!("[dpm] 静态文件目录: {:?}", dist);
let dist_str = dist.to_string_lossy().to_string();
Router::new()
.route("/api/login", post(login_handler))
.route("/api/settings", get(get_settings).post(update_settings))
@@ -61,11 +103,15 @@ pub fn create_router(state: AppState) -> Router {
.route("/api/control", post(control_handler))
.route("/api/state", get(get_state).post(update_state))
.route("/api/events", get(sse_handler))
// 媒体文件:用户目录 ~/Downloads/Media/
.nest_service("/file", ServeDir::new(media_dir_str()))
// SPA 静待文件回退
.fallback_service(
ServeDir::new("../dist")
ServeDir::new(&dist_str)
.append_index_html_on_directories(true)
.fallback(ServeFile::new("../dist/index.html")),
.fallback(tower_http::services::ServeFile::new(
format!("{}/index.html", dist_str),
)),
)
.layer(CorsLayer::permissive())
.with_state(state)