diff --git a/0.1.1.md b/0.1.1.md index 9e4c32d..07088a4 100644 --- a/0.1.1.md +++ b/0.1.1.md @@ -31,5 +31,4 @@ ### 优化 提交代码 然后优化: -TODO: 需要优化成一刀切 -feature: 在导入时启动异步处理(更好的用户体验) +feature: 在导入时启动异步 后台处理 处理(更好的用户体验) diff --git a/apps/desktop/src-tauri/src/business/services/material_service.rs b/apps/desktop/src-tauri/src/business/services/material_service.rs index 605b7a1..fbc5b96 100644 --- a/apps/desktop/src-tauri/src/business/services/material_service.rs +++ b/apps/desktop/src-tauri/src/business/services/material_service.rs @@ -425,6 +425,8 @@ impl MaterialService { material: &Material, config: &MaterialProcessingConfig, ) -> Result<()> { + // 首先获取项目信息来确定输出路径 + let project = Self::get_project_for_material(&material.project_id)?; // 第一步:根据场景检测结果进行分镜头切分 let primary_segments = if let Some(scene_detection) = &material.scene_detection { // 使用场景检测结果,每个场景作为一个片段 @@ -446,8 +448,21 @@ impl MaterialService { println!("分镜头切分完成:{} 个片段", primary_segments.len()); println!("二次切分后:{} 个片段", final_segments.len()); - // 创建输出目录 - let output_dir = format!("{}_segments", material.original_path.trim_end_matches(".mp4")); + // 创建输出目录:项目目录/待分类/素材名称_segments + let pending_dir = std::path::Path::new(&project.path).join("待分类"); + + // 确保待分类目录存在 + if !pending_dir.exists() { + std::fs::create_dir_all(&pending_dir) + .map_err(|e| anyhow!("创建待分类目录失败: {}", e))?; + println!("创建待分类目录: {:?}", pending_dir); + } + + let material_name = material.name.trim_end_matches(".mp4"); + let output_dir = pending_dir.join(format!("{}_segments", material_name)); + let output_dir_str = output_dir.to_string_lossy().to_string(); + + println!("视频切分输出目录: {}", output_dir_str); // 根据配置选择切分模式 let output_files = match config.split_mode { @@ -455,7 +470,7 @@ impl MaterialService { println!("使用快速切分模式(可能有前几秒无画面问题)"); FFmpegService::split_video_fast( &material.original_path, - &output_dir, + &output_dir_str, &final_segments, &material.name.replace(".mp4", ""), )? @@ -464,7 +479,7 @@ impl MaterialService { println!("使用精确切分模式(重新编码,确保画面完整)"); FFmpegService::split_video( &material.original_path, - &output_dir, + &output_dir_str, &final_segments, &material.name.replace(".mp4", ""), )? @@ -473,7 +488,7 @@ impl MaterialService { println!("使用智能切分模式(关键帧对齐)"); FFmpegService::split_video_smart( &material.original_path, - &output_dir, + &output_dir_str, &final_segments, &material.name.replace(".mp4", ""), )? @@ -603,4 +618,19 @@ impl MaterialService { Ok(cleaned_count) } + + /// 获取素材对应的项目信息 + fn get_project_for_material(project_id: &str) -> Result { + use crate::infrastructure::database::Database; + use crate::data::repositories::project_repository::ProjectRepository; + use crate::business::services::project_service::ProjectService; + + // 创建数据库连接 + let db = Database::new()?; + let project_repo = ProjectRepository::new(db.get_connection())?; + + // 获取项目信息 + ProjectService::get_project_by_id(&project_repo, project_id)? + .ok_or_else(|| anyhow!("找不到项目: {}", project_id)) + } }