From 5a9d4325d80e9e7f5b74b51a8960237d653ecc40 Mon Sep 17 00:00:00 2001 From: Accusys Date: Thu, 2 Jul 2026 18:31:54 +0800 Subject: [PATCH] fix: face thumbnail crop using bbox parameters - Added bbox_x, bbox_y, bbox_w, bbox_h fields to ThumbQuery - face_thumbnail now uses bbox params for ffmpeg crop filter - Frontend passes bboxX/Y/Width/Height which maps to bbox_x/y/w/h --- src/api/media_api.rs | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/api/media_api.rs b/src/api/media_api.rs index 1965404..82105bf 100644 --- a/src/api/media_api.rs +++ b/src/api/media_api.rs @@ -775,6 +775,10 @@ struct ThumbQuery { y: Option, w: Option, h: Option, + bbox_x: Option, + bbox_y: Option, + bbox_w: Option, + bbox_h: Option, trace_id: Option, } @@ -863,7 +867,12 @@ async fn face_thumbnail( } } - if let (Some(x), Some(y), Some(w), Some(h)) = (q.x, q.y, q.w, q.h) { + let crop_x = q.x.or(q.bbox_x); + let crop_y = q.y.or(q.bbox_y); + let crop_w = q.w.or(q.bbox_w); + let crop_h = q.h.or(q.bbox_h); + + if let (Some(x), Some(y), Some(w), Some(h)) = (crop_x, crop_y, crop_w, crop_h) { if let (Some(vw), Some(vh)) = (video_width, video_height) { crate::core::thumbnail::validator::validate_crop(x, y, w, h, vw, vh).map_err(|e| { tracing::warn!("[thumbnail] Crop validation failed: {}", e); @@ -873,7 +882,7 @@ async fn face_thumbnail( } let select = format!("select=eq(n\\,{})", frame); - let vf = if let (Some(x), Some(y), Some(w), Some(h)) = (q.x, q.y, q.w, q.h) { + let vf = if let (Some(x), Some(y), Some(w), Some(h)) = (crop_x, crop_y, crop_w, crop_h) { format!("{},crop={}:{}:{}:{}", select, w, h, x, y) } else { select @@ -1282,6 +1291,10 @@ async fn media_proxy_handler( y: params.get("y").and_then(|v| v.parse().ok()), w: params.get("w").and_then(|v| v.parse().ok()), h: params.get("h").and_then(|v| v.parse().ok()), + bbox_x: params.get("bbox_x").and_then(|v| v.parse().ok()), + bbox_y: params.get("bbox_y").and_then(|v| v.parse().ok()), + bbox_w: params.get("bbox_w").and_then(|v| v.parse().ok()), + bbox_h: params.get("bbox_h").and_then(|v| v.parse().ok()), trace_id: params.get("trace_id").and_then(|v| v.parse().ok()), }; face_thumbnail(State(state), Path(uuid.clone()), Query(thumb_query))