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))