From 15f5a20f7ccb6314ba600be9642ece989adf5a6f Mon Sep 17 00:00:00 2001 From: old burden Date: Tue, 31 Mar 2026 13:49:46 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BB=BF=E7=85=A7=E5=8D=B3=E6=A2=A6?= =?UTF-8?q?=E5=87=BA=E4=B8=80=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/ruoyi/api/PortalVideoController.java | 67 ++++++++++++++----- 1 file changed, 49 insertions(+), 18 deletions(-) diff --git a/ruoyi-admin/src/main/java/com/ruoyi/api/PortalVideoController.java b/ruoyi-admin/src/main/java/com/ruoyi/api/PortalVideoController.java index 3cdb24b..f1b9afb 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/api/PortalVideoController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/api/PortalVideoController.java @@ -266,30 +266,61 @@ public class PortalVideoController extends BaseController { @PostMapping("/image-reference") @ApiOperation("图生视频-基于参考图") public AjaxResult imageReference(@RequestBody PortalVideoGenRequest request) { - if (StringUtils.isEmpty(request.getReferenceUrl())) { - return AjaxResult.error("请上传参考图"); - } - if (StringUtils.isEmpty(request.getText())) { - return AjaxResult.error("请输入视频描述文本"); - } - List contentList = new ArrayList<>(); - ContentItem textItem = new ContentItem(); - textItem.setType("text"); - textItem.setText(request.getText()); - contentList.add(textItem); + List contentList; + if (request.getContent() != null && !request.getContent().isEmpty()) { + contentList = request.getContent(); + ContentItem head = contentList.get(0); + if (head == null || !"text".equals(head.getType()) || StringUtils.isEmpty(head.getText())) { + return AjaxResult.error("请输入视频描述文本(首条须为 type=text,可含 [图n] 占位)"); + } + String firstRef = contentList.stream() + .filter(PortalVideoController::isReferenceImageContentItem) + .map(it -> it.getImageUrl().getUrl()) + .findFirst() + .orElse(null); + if (StringUtils.isEmpty(firstRef)) { + return AjaxResult.error("请上传参考图(content 中须含 image_url + role=reference_image)"); + } + if (StringUtils.isEmpty(request.getReferenceUrl())) { + request.setReferenceUrl(firstRef); + } + } else { + if (StringUtils.isEmpty(request.getReferenceUrl())) { + return AjaxResult.error("请上传参考图"); + } + if (StringUtils.isEmpty(request.getText())) { + return AjaxResult.error("请输入视频描述文本"); + } + contentList = new ArrayList<>(); + ContentItem textItem = new ContentItem(); + textItem.setType("text"); + textItem.setText(request.getText()); + contentList.add(textItem); - ContentItem refItem = new ContentItem(); - refItem.setType("image_url"); - refItem.setRole("reference_image"); - ImageUrl refUrl = new ImageUrl(); - refUrl.setUrl(request.getReferenceUrl()); - refItem.setImageUrl(refUrl); - contentList.add(refItem); + ContentItem refItem = new ContentItem(); + refItem.setType("image_url"); + refItem.setRole("reference_image"); + ImageUrl refUrl = new ImageUrl(); + refUrl.setUrl(request.getReferenceUrl()); + refItem.setImageUrl(refUrl); + contentList.add(refItem); + } ByteBodyReq body = newVideoBody(request, contentList); return submitOrderAndCreate(request, "image-reference", body); } + private static boolean isReferenceImageContentItem(ContentItem item) { + if (item == null || !"image_url".equals(item.getType())) { + return false; + } + if (!"reference_image".equals(item.getRole())) { + return false; + } + ImageUrl iu = item.getImageUrl(); + return iu != null && StringUtils.isNotEmpty(iu.getUrl()); + } + private List buildTextAndFirstFrame(String text, String firstUrl) { List contentList = new ArrayList<>(); ContentItem textItem = new ContentItem();