fix: ai clip error by empty cover (#225)

* fix: ai clip error

* fix: using ffmpeg as fallback for cover
This commit is contained in:
Xinrea
2025-11-11 22:39:15 +08:00
committed by GitHub
parent 50ecaa1e4c
commit 694dfcf701
2 changed files with 31 additions and 11 deletions

View File

@@ -414,16 +414,28 @@ async fn clip_range_inner(
log::error!("Get file metadata error: {} {}", e, file.display()); log::error!("Get file metadata error: {} {}", e, file.display());
e.to_string() e.to_string()
})?; })?;
let mut cover_generate_ffmpeg = true;
let cover_file = file.with_extension("jpg"); let cover_file = file.with_extension("jpg");
let base64 = params.cover.split("base64,").nth(1).unwrap(); if !params.cover.is_empty() {
let bytes = base64::engine::general_purpose::STANDARD if let Some(base64) = params.cover.split("base64,").nth(1) {
.decode(base64) if let Ok(bytes) = base64::engine::general_purpose::STANDARD.decode(base64) {
.unwrap(); // write cover file to fs
// write cover file to fs tokio::fs::write(&cover_file, bytes).await.map_err(|e| {
tokio::fs::write(&cover_file, bytes).await.map_err(|e| { log::error!("Write cover file error: {} {}", e, cover_file.display());
log::error!("Write cover file error: {} {}", e, cover_file.display()); e.to_string()
e.to_string() })?;
})?; cover_generate_ffmpeg = false;
} else {
log::error!("Decode base64 error: {}", params.cover);
}
} else {
log::error!("Invalid cover base64: {}", params.cover);
}
}
// generate cover file from video as fallback
if cover_generate_ffmpeg {
ffmpeg::generate_thumbnail(&file, 0.0).await?;
}
// get filename from path // get filename from path
let filename = Path::new(&file) let filename = Path::new(&file)
.file_name() .file_name()

View File

@@ -605,8 +605,16 @@ const clip_range = tool(
room_id: z.string().describe("The room id of the room"), room_id: z.string().describe("The room id of the room"),
live_id: z.string().describe("The live id of the live"), live_id: z.string().describe("The live id of the live"),
range: z.object({ range: z.object({
start: z.number().describe("The start time in SECONDS of the clip"), start: z
end: z.number().describe("The end time in SECONDS of the clip"), .number()
.describe(
"The start time in SECONDS of the clip that relative to the live start time"
),
end: z
.number()
.describe(
"The end time in SECONDS of the clip that relative to the live start time"
),
}), }),
danmu: z danmu: z
.boolean() .boolean()