use std::collections::HashMap; use tauri::{AppHandle, State}; use tauri_plugin_opener::OpenerExt; use super::engine::{CheckUrlResult, DownloadEngine}; use super::task::{DownloadTask, DownloaderSettings}; /// 获取所有任务 #[tauri::command] #[specta::specta] pub fn downloader_get_tasks(engine: State<'_, DownloadEngine>) -> Vec { engine.get_tasks() } /// 检查 URL 重复性并探测文件信息(添加下载前调用) #[tauri::command] #[specta::specta] pub async fn downloader_check_url( engine: State<'_, DownloadEngine>, url: String, dir: Option, headers: Option>, ) -> Result { let headers = headers.unwrap_or_default(); let (probe, duplicate, existing) = engine.check_url(&url, dir.as_deref(), &headers).await; let result = match probe { Ok(p) => CheckUrlResult { ok: true, error: None, filename: p.filename.clone(), total_size: p.total_size, supports_resume: p.supports_resume, duplicate, existing, }, Err(e) => CheckUrlResult { ok: false, error: Some(e), filename: None, total_size: None, supports_resume: false, duplicate, existing, }, }; Ok(result) } /// 添加下载任务 #[tauri::command] #[specta::specta] pub async fn downloader_add_task( engine: State<'_, DownloadEngine>, url: String, filename: Option, dir: Option, headers: Option>, auto_rename: Option, ) -> Result { engine.add_task(url, filename, dir, headers.unwrap_or_default(), auto_rename.unwrap_or(false)).await } /// 暂停任务 #[tauri::command] #[specta::specta] pub fn downloader_pause_task(engine: State<'_, DownloadEngine>, id: String) -> Result<(), String> { engine.pause_task(&id) } /// 恢复任务 #[tauri::command] #[specta::specta] pub fn downloader_resume_task(engine: State<'_, DownloadEngine>, id: String) -> Result<(), String> { engine.resume_task(&id) } /// 移除任务 #[tauri::command] #[specta::specta] pub fn downloader_remove_task( engine: State<'_, DownloadEngine>, id: String, delete_files: Option, ) -> Result<(), String> { engine.remove_task(&id, delete_files.unwrap_or(false)) } /// 获取设置 #[tauri::command] #[specta::specta] pub fn downloader_get_settings(engine: State<'_, DownloadEngine>) -> DownloaderSettings { engine.get_settings() } /// 保存设置 #[tauri::command] #[specta::specta] pub fn downloader_save_settings( engine: State<'_, DownloadEngine>, settings: DownloaderSettings, ) -> Result<(), String> { engine.save_settings(settings); Ok(()) } /// 引擎状态(始终运行中) #[tauri::command] pub fn downloader_status(engine: State<'_, DownloadEngine>) -> serde_json::Value { serde_json::json!({ "running": engine.is_started(), }) } /// 获取扩展服务信息 #[tauri::command] pub fn downloader_get_extension_info(engine: State<'_, DownloadEngine>) -> serde_json::Value { let settings = engine.get_settings(); serde_json::json!({ "url": format!("http://127.0.0.1:{}/", settings.extension_port), "port": settings.extension_port, "secret": settings.extension_secret, "hasSecret": !settings.extension_secret.is_empty(), }) } /// 用系统资源管理器打开目录 #[tauri::command] #[specta::specta] pub fn downloader_open_dir(app: AppHandle, path: String) -> Result<(), String> { app.opener() .open_path(path, None::<&str>) .map_err(|e| format!("打开目录失败: {}", e)) } /// 用系统默认浏览器打开 URL #[tauri::command] #[specta::specta] pub fn downloader_open_url(app: AppHandle, url: String) -> Result<(), String> { app.opener() .open_url(url, None::<&str>) .map_err(|e| format!("打开链接失败: {}", e)) }