diff --git a/src-tauri/src/handlers/video.rs b/src-tauri/src/handlers/video.rs index d1e1aec..ecb4b57 100644 --- a/src-tauri/src/handlers/video.rs +++ b/src-tauri/src/handlers/video.rs @@ -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() diff --git a/src/lib/agent/tools.ts b/src/lib/agent/tools.ts index 79cd369..44f35f6 100644 --- a/src/lib/agent/tools.ts +++ b/src/lib/agent/tools.ts @@ -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()