fix: 修复素材状态一直是Pending的问题

- 在素材导入时启用自动处理逻辑
- 添加auto_process配置选项到MaterialProcessingConfig
- 在process_single_file中调用process_material进行实际处理
- 添加详细的调试日志跟踪处理流程
- 确保素材状态正确从Pending更新到Processing再到Completed

修复内容:
1. 移除process_single_file中的TODO注释,实现实际处理逻辑
2. 根据auto_process配置决定是否自动处理素材
3. 处理成功后返回更新后的素材对象
4. 添加错误处理和状态跟踪日志
This commit is contained in:
imeepos 2025-07-13 20:53:05 +08:00
parent 036488e13b
commit db1e08ff86
3 changed files with 41 additions and 6 deletions

View File

@ -58,7 +58,7 @@ impl MaterialService {
repository: &MaterialRepository, repository: &MaterialRepository,
project_id: &str, project_id: &str,
file_path: &str, file_path: &str,
_config: &MaterialProcessingConfig, config: &MaterialProcessingConfig,
) -> Result<Option<Material>> { ) -> Result<Option<Material>> {
let path = Path::new(file_path); let path = Path::new(file_path);
@ -104,10 +104,29 @@ impl MaterialService {
// 保存到数据库 // 保存到数据库
repository.create(&material)?; repository.create(&material)?;
// 如果启用自动处理,则开始处理 // 如果启用自动处理,则开始处理
// TODO: 实现异步处理逻辑 if config.auto_process.unwrap_or(true) {
println!("开始自动处理素材: {} ({})", material.name, material.id);
// 同步处理素材(提取元数据、场景检测等)
match Self::process_material(repository, &material.id, config) {
Ok(_) => {
println!("素材处理成功: {}", material.name);
// 处理成功,重新获取更新后的素材
if let Ok(Some(updated_material)) = repository.get_by_id(&material.id) {
println!("素材状态已更新为: {:?}", updated_material.processing_status);
return Ok(Some(updated_material));
}
}
Err(e) => {
// 处理失败,但不影响导入结果,只记录错误
println!("素材处理失败: {} - {}", material.name, e);
}
}
} else {
println!("跳过自动处理素材: {}", material.name);
}
Ok(Some(material)) Ok(Some(material))
} }
@ -238,6 +257,8 @@ impl MaterialService {
material_id: &str, material_id: &str,
config: &MaterialProcessingConfig, config: &MaterialProcessingConfig,
) -> Result<()> { ) -> Result<()> {
println!("开始处理素材: {}", material_id);
// 更新状态为处理中 // 更新状态为处理中
Self::update_material_status( Self::update_material_status(
repository, repository,
@ -246,17 +267,23 @@ impl MaterialService {
None, None,
)?; )?;
println!("素材状态已更新为 Processing: {}", material_id);
// 获取素材信息 // 获取素材信息
let mut material = repository.get_by_id(material_id)? let mut material = repository.get_by_id(material_id)?
.ok_or_else(|| anyhow!("素材不存在: {}", material_id))?; .ok_or_else(|| anyhow!("素材不存在: {}", material_id))?;
// 1. 提取元数据 // 1. 提取元数据
println!("开始提取元数据: {} (类型: {:?})", material.original_path, material.material_type);
match Self::extract_metadata(&material.original_path, &material.material_type) { match Self::extract_metadata(&material.original_path, &material.material_type) {
Ok(metadata) => { Ok(metadata) => {
println!("元数据提取成功: {:?}", metadata);
material.set_metadata(metadata); material.set_metadata(metadata);
repository.update(&material)?; repository.update(&material)?;
println!("元数据已保存到数据库");
} }
Err(e) => { Err(e) => {
println!("元数据提取失败: {}", e);
Self::update_material_status( Self::update_material_status(
repository, repository,
material_id, material_id,
@ -300,6 +327,7 @@ impl MaterialService {
} }
// 标记为完成 // 标记为完成
println!("素材处理完成,更新状态为 Completed: {}", material_id);
Self::update_material_status( Self::update_material_status(
repository, repository,
material_id, material_id,
@ -307,6 +335,7 @@ impl MaterialService {
None, None,
)?; )?;
println!("素材处理流程完成: {}", material_id);
Ok(()) Ok(())
} }

View File

@ -151,6 +151,7 @@ pub struct MaterialProcessingConfig {
pub video_quality: String, // 视频质量设置 pub video_quality: String, // 视频质量设置
pub audio_quality: String, // 音频质量设置 pub audio_quality: String, // 音频质量设置
pub output_format: String, // 输出格式 pub output_format: String, // 输出格式
pub auto_process: Option<bool>, // 是否自动处理
} }
impl Default for MaterialProcessingConfig { impl Default for MaterialProcessingConfig {
@ -162,6 +163,7 @@ impl Default for MaterialProcessingConfig {
video_quality: "medium".to_string(), video_quality: "medium".to_string(),
audio_quality: "medium".to_string(), audio_quality: "medium".to_string(),
output_format: "mp4".to_string(), output_format: "mp4".to_string(),
auto_process: Some(true),
} }
} }
} }

View File

@ -21,8 +21,12 @@ pub async fn import_materials(
let repository = repository_guard.as_ref() let repository = repository_guard.as_ref()
.ok_or("素材仓库未初始化")?; .ok_or("素材仓库未初始化")?;
let config = MaterialProcessingConfig::default(); let mut config = MaterialProcessingConfig::default();
config.auto_process = Some(request.auto_process);
if let Some(max_duration) = request.max_segment_duration {
config.max_segment_duration = max_duration;
}
MaterialService::import_materials(repository, request, &config) MaterialService::import_materials(repository, request, &config)
.map_err(|e| e.to_string()) .map_err(|e| e.to_string())
} }