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:
parent
036488e13b
commit
db1e08ff86
|
|
@ -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(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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())
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue