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());
e.to_string()
})?;
let mut cover_generate_ffmpeg = true;
let cover_file = file.with_extension("jpg");
let base64 = params.cover.split("base64,").nth(1).unwrap();
let bytes = base64::engine::general_purpose::STANDARD
.decode(base64)
.unwrap();
// write cover file to fs
tokio::fs::write(&cover_file, bytes).await.map_err(|e| {
log::error!("Write cover file error: {} {}", e, cover_file.display());
e.to_string()
})?;
if !params.cover.is_empty() {
if let Some(base64) = params.cover.split("base64,").nth(1) {
if let Ok(bytes) = base64::engine::general_purpose::STANDARD.decode(base64) {
// write cover file to fs
tokio::fs::write(&cover_file, bytes).await.map_err(|e| {
log::error!("Write cover file error: {} {}", e, cover_file.display());
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
let filename = Path::new(&file)
.file_name()

View File

@@ -605,8 +605,16 @@ const clip_range = tool(
room_id: z.string().describe("The room id of the room"),
live_id: z.string().describe("The live id of the live"),
range: z.object({
start: z.number().describe("The start time in SECONDS of the clip"),
end: z.number().describe("The end time in SECONDS of the clip"),
start: z
.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
.boolean()