瀏覽代碼

Dev 重构百度成片API

tsurumure 4 月之前
父節點
當前提交
4e699c6453
共有 36 個文件被更改,包括 1120 次插入148 次删除
  1. 8 8
      db/sys_user_role_permission_relation.sql
  2. 80 80
      src/main/java/com/backendsys/controller/Ai/AiChatController.java
  3. 51 51
      src/main/java/com/backendsys/controller/Ai/AiChatHistoryController.java
  4. 11 5
      src/main/java/com/backendsys/controller/Ai/AiGenerateVideoController.java
  5. 31 0
      src/main/java/com/backendsys/modules/ai/media/controller/MediaController.java
  6. 17 0
      src/main/java/com/backendsys/modules/ai/media/dao/MediaDao.java
  7. 66 0
      src/main/java/com/backendsys/modules/ai/media/entity/AiGenerateVideoDTO.java
  8. 11 0
      src/main/java/com/backendsys/modules/ai/media/entity/MediaParams/Common/MediaSource.java
  9. 18 0
      src/main/java/com/backendsys/modules/ai/media/entity/MediaParams/Config/Config.java
  10. 11 0
      src/main/java/com/backendsys/modules/ai/media/entity/MediaParams/Config/ConfigBgMusic.java
  11. 14 0
      src/main/java/com/backendsys/modules/ai/media/entity/MediaParams/Config/ConfigCaption.java
  12. 11 0
      src/main/java/com/backendsys/modules/ai/media/entity/MediaParams/Config/ConfigVideoBegin.java
  13. 11 0
      src/main/java/com/backendsys/modules/ai/media/entity/MediaParams/Config/ConfigVideoEnd.java
  14. 7 0
      src/main/java/com/backendsys/modules/ai/media/entity/MediaParams/Config/ConfigVideoLogo.java
  15. 69 0
      src/main/java/com/backendsys/modules/ai/media/entity/MediaParams/MediaParams.java
  16. 12 0
      src/main/java/com/backendsys/modules/ai/media/entity/MediaParams/Source/Source.java
  17. 10 0
      src/main/java/com/backendsys/modules/ai/media/entity/MediaParams/Source/StructsItem.java
  18. 14 0
      src/main/java/com/backendsys/modules/ai/media/service/MediaService.java
  19. 60 0
      src/main/java/com/backendsys/modules/ai/media/service/impl/MediaServiceImpl.java
  20. 9 0
      src/main/java/com/backendsys/modules/sdk/baidu/bce/entity/AiGenerateVideoCustom/AiGenerateVideoCustomDTO.java
  21. 8 0
      src/main/java/com/backendsys/modules/sdk/baidu/bce/entity/AiGenerateVideoCustom/ConfigBgMusicDTO.java
  22. 12 0
      src/main/java/com/backendsys/modules/sdk/baidu/bce/entity/AiGenerateVideoCustom/ConfigCaptionDTO.java
  23. 18 0
      src/main/java/com/backendsys/modules/sdk/baidu/bce/entity/AiGenerateVideoCustom/ConfigDTO.java
  24. 8 0
      src/main/java/com/backendsys/modules/sdk/baidu/bce/entity/AiGenerateVideoCustom/ConfigVideoBeginDTO.java
  25. 8 0
      src/main/java/com/backendsys/modules/sdk/baidu/bce/entity/AiGenerateVideoCustom/ConfigVideoEndDTO.java
  26. 11 0
      src/main/java/com/backendsys/modules/sdk/baidu/bce/entity/AiGenerateVideoCustom/ConfigVideoLogoDTO.java
  27. 9 0
      src/main/java/com/backendsys/modules/sdk/baidu/bce/entity/AiGenerateVideoCustom/MediaSourceVO.java
  28. 10 0
      src/main/java/com/backendsys/modules/sdk/baidu/bce/entity/AiGenerateVideoCustom/SourceDTO.java
  29. 10 0
      src/main/java/com/backendsys/modules/sdk/baidu/bce/entity/AiGenerateVideoCustom/SourceStructDTO.java
  30. 11 0
      src/main/java/com/backendsys/modules/sdk/baidu/bce/entity/MediaMaterialResponse.java
  31. 19 0
      src/main/java/com/backendsys/modules/sdk/baidu/bce/service/BaiduBceMediaService.java
  32. 302 0
      src/main/java/com/backendsys/modules/sdk/baidu/bce/service/impl/BaiduBceMediaServiceImpl.java
  33. 44 0
      src/main/java/com/backendsys/modules/sdk/baidu/bce/utils/BaiduBceUtil.java
  34. 3 3
      src/main/java/com/backendsys/service/Ai/AiGenerateVideoService.java
  35. 1 1
      src/main/java/com/backendsys/service/SDKService/SDKBaidu/SDKBaiduAiGenerateVideoServiceImpl.java
  36. 125 0
      src/main/resources/mapper/ai/media/MediaMapper.xml

+ 8 - 8
db/sys_user_role_permission_relation.sql

@@ -90,14 +90,14 @@ INSERT INTO sys_user_role_permission_relation(role_id, permission_id) VALUES
             (1, '21.3.1'), (1, '21.3.2'), (1, '21.3.3'), (1, '21.3.4'),
 
     (1, '31'),
-#     (1, '32'),
-#         (1, '32.1'),
-#     (1, '33'),
-#         (1, '33.1'),
-#     (1, '34'),
-#         (1, '34.1'),
-#     (1, '35'),
-#         (1, '35.1'),
+    (1, '32'),
+        (1, '32.1'),
+    (1, '33'),
+        (1, '33.1'),
+    (1, '34'),
+        (1, '34.1'),
+    (1, '35'),
+        (1, '35.1'),
 
 
     (1, '100'),

+ 80 - 80
src/main/java/com/backendsys/controller/Ai/AiChatController.java

@@ -1,80 +1,80 @@
-package com.backendsys.controller.Ai;
-
-import com.backendsys.aspect.HttpRequestAspect;
-
-import com.backendsys.entity.PageDTO;
-import com.backendsys.utils.response.Result;
-
-import com.backendsys.entity.Ai.AiChatDTO;
-import com.backendsys.mapper.Ai.AiChatHistoryMapper;
-import com.backendsys.service.Ai.AiChatService;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.*;
-import com.backendsys.utils.response.ResultEnum;
-
-/**
- * Ai 对话框
- */
-@Validated
-@RestController
-public class AiChatController {
-
-    @Autowired
-    private HttpRequestAspect httpRequestAspect;
-
-    @Autowired
-    private AiChatService aiChatService;
-
-    @Autowired
-    private AiChatHistoryMapper aiChatHistoryMapper;
-
-    /**
-     * 获得 对话列表
-     * @param pageDTO
-     * @param aiChatDTO
-     * @return
-     */
-    @PreAuthorize("@sr.hasPermission('31')")
-    @GetMapping("/api/ai/chat/getAiChat")
-    public Result getAiChat(@Validated PageDTO pageDTO, @Validated AiChatDTO aiChatDTO) {
-        return Result.success(aiChatService.queryAiChatList(pageDTO.getPage_num(), pageDTO.getPage_size(), aiChatDTO));
-    }
-
-    /**
-     * 获得 我的 对话列表
-     * @param pageDTO
-     * @param aiChatDTO
-     * @return
-     */
-    @PreAuthorize("@sr.hasPermission('31')")
-    @GetMapping("/api/ai/chat/getMyAiChat")
-    public Result getMyAiChat(@Validated PageDTO pageDTO, @Validated AiChatDTO aiChatDTO) {
-        
-        // [查询] 自身 UserId
-        Long user_id = httpRequestAspect.getUserId();
-        aiChatDTO.setUser_id(user_id);
-
-        // 判断 history_code 必填项
-        String history_code = aiChatDTO.getHistory_code();
-        if (history_code == null || history_code == "") {
-            return Result.error(ResultEnum.DATABASE_OPERATION_FAILED.getCode(), "history_code 不能为空");
-        }
-
-        return Result.success(aiChatService.queryAiChatList(pageDTO.getPage_num(), pageDTO.getPage_size(), aiChatDTO));
-    }
-
-    /**
-     * 创建 我的 对话
-     * @param aiChatDTO
-     * @return
-     */
-    @PreAuthorize("@sr.hasPermission('31')")
-    @PostMapping("/api/ai/chat/createMyAiChat")
-    public Result createMyAiChat(@Validated(AiChatDTO.Create.class) @RequestBody AiChatDTO aiChatDTO) {
-        return Result.success(aiChatService.insertAiChat(aiChatDTO), "创建成功");
-    }
-
-}
+//package com.backendsys.controller.Ai;
+//
+//import com.backendsys.aspect.HttpRequestAspect;
+//
+//import com.backendsys.entity.PageDTO;
+//import com.backendsys.utils.response.Result;
+//
+//import com.backendsys.entity.Ai.AiChatDTO;
+//import com.backendsys.mapper.Ai.AiChatHistoryMapper;
+//import com.backendsys.service.Ai.AiChatService;
+//
+//import org.springframework.beans.factory.annotation.Autowired;
+//import org.springframework.security.access.prepost.PreAuthorize;
+//import org.springframework.validation.annotation.Validated;
+//import org.springframework.web.bind.annotation.*;
+//import com.backendsys.utils.response.ResultEnum;
+//
+///**
+// * Ai 对话框
+// */
+//@Validated
+//@RestController
+//public class AiChatController {
+//
+//    @Autowired
+//    private HttpRequestAspect httpRequestAspect;
+//
+//    @Autowired
+//    private AiChatService aiChatService;
+//
+//    @Autowired
+//    private AiChatHistoryMapper aiChatHistoryMapper;
+//
+//    /**
+//     * 获得 对话列表
+//     * @param pageDTO
+//     * @param aiChatDTO
+//     * @return
+//     */
+//    @PreAuthorize("@sr.hasPermission('31')")
+//    @GetMapping("/api/ai/chat/getAiChat")
+//    public Result getAiChat(@Validated PageDTO pageDTO, @Validated AiChatDTO aiChatDTO) {
+//        return Result.success(aiChatService.queryAiChatList(pageDTO.getPage_num(), pageDTO.getPage_size(), aiChatDTO));
+//    }
+//
+//    /**
+//     * 获得 我的 对话列表
+//     * @param pageDTO
+//     * @param aiChatDTO
+//     * @return
+//     */
+//    @PreAuthorize("@sr.hasPermission('31')")
+//    @GetMapping("/api/ai/chat/getMyAiChat")
+//    public Result getMyAiChat(@Validated PageDTO pageDTO, @Validated AiChatDTO aiChatDTO) {
+//
+//        // [查询] 自身 UserId
+//        Long user_id = httpRequestAspect.getUserId();
+//        aiChatDTO.setUser_id(user_id);
+//
+//        // 判断 history_code 必填项
+//        String history_code = aiChatDTO.getHistory_code();
+//        if (history_code == null || history_code == "") {
+//            return Result.error(ResultEnum.DATABASE_OPERATION_FAILED.getCode(), "history_code 不能为空");
+//        }
+//
+//        return Result.success(aiChatService.queryAiChatList(pageDTO.getPage_num(), pageDTO.getPage_size(), aiChatDTO));
+//    }
+//
+//    /**
+//     * 创建 我的 对话
+//     * @param aiChatDTO
+//     * @return
+//     */
+//    @PreAuthorize("@sr.hasPermission('31')")
+//    @PostMapping("/api/ai/chat/createMyAiChat")
+//    public Result createMyAiChat(@Validated(AiChatDTO.Create.class) @RequestBody AiChatDTO aiChatDTO) {
+//        return Result.success(aiChatService.insertAiChat(aiChatDTO), "创建成功");
+//    }
+//
+//}

+ 51 - 51
src/main/java/com/backendsys/controller/Ai/AiChatHistoryController.java

@@ -1,51 +1,51 @@
-package com.backendsys.controller.Ai;
-
-import com.backendsys.aspect.HttpRequestAspect;
-import com.backendsys.aspect.QueryNullCheck;
-import com.backendsys.entity.Ai.AiChatHistoryDTO;
-import com.backendsys.entity.PageDTO;
-import com.backendsys.service.Ai.AiChatHistoryService;
-import com.backendsys.utils.response.Result;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.*;
-
-/**
- * Ai 对话框
- */
-@Validated
-@RestController
-public class AiChatHistoryController {
-
-    @Autowired
-    private HttpRequestAspect httpRequestAspect;
-
-    @Autowired
-    private AiChatHistoryService AiChatHistoryService;
-
-    /**
-     * 获得 我的对话历史记录列表
-     * @param pageDTO
-     * @param aiChatHistoryDTO
-     * @return
-     */
-    @PreAuthorize("@sr.hasPermission('31')")
-    @GetMapping("/api/ai/chat/getMyAiChatHistory")
-    public Result getMyAiChatHistory(@Validated PageDTO pageDTO, @Validated AiChatHistoryDTO aiChatHistoryDTO) {
-
-        // [查询] 自身 UserId
-        Long user_id = httpRequestAspect.getUserId();
-        aiChatHistoryDTO.setUser_id(user_id);
-
-        return Result.success(AiChatHistoryService.queryAiChatHistoryList(pageDTO.getPage_num(), pageDTO.getPage_size(), aiChatHistoryDTO));
-    }
-
-    @PreAuthorize("@sr.hasPermission('31')")
-    @QueryNullCheck(serviceClass = AiChatHistoryService.class, serviceMethod = "queryAiChatHistoryByCode", argField = "history_code", message = "对话记录不存在")
-    @DeleteMapping("/api/ai/chat/deleteAiChatHistory")
-    public Result deleteAiChatHistory(@Validated(AiChatHistoryDTO.Delete.class) @RequestBody AiChatHistoryDTO aiChatHistoryDTO) {
-     return Result.success(AiChatHistoryService.deleteAiChatHistory(aiChatHistoryDTO), "删除成功");
-    }
-}
+//package com.backendsys.controller.Ai;
+//
+//import com.backendsys.aspect.HttpRequestAspect;
+//import com.backendsys.aspect.QueryNullCheck;
+//import com.backendsys.entity.Ai.AiChatHistoryDTO;
+//import com.backendsys.entity.PageDTO;
+//import com.backendsys.service.Ai.AiChatHistoryService;
+//import com.backendsys.utils.response.Result;
+//
+//import org.springframework.beans.factory.annotation.Autowired;
+//import org.springframework.security.access.prepost.PreAuthorize;
+//import org.springframework.validation.annotation.Validated;
+//import org.springframework.web.bind.annotation.*;
+//
+///**
+// * Ai 对话框
+// */
+//@Validated
+//@RestController
+//public class AiChatHistoryController {
+//
+//    @Autowired
+//    private HttpRequestAspect httpRequestAspect;
+//
+//    @Autowired
+//    private AiChatHistoryService AiChatHistoryService;
+//
+//    /**
+//     * 获得 我的对话历史记录列表
+//     * @param pageDTO
+//     * @param aiChatHistoryDTO
+//     * @return
+//     */
+//    @PreAuthorize("@sr.hasPermission('31')")
+//    @GetMapping("/api/ai/chat/getMyAiChatHistory")
+//    public Result getMyAiChatHistory(@Validated PageDTO pageDTO, @Validated AiChatHistoryDTO aiChatHistoryDTO) {
+//
+//        // [查询] 自身 UserId
+//        Long user_id = httpRequestAspect.getUserId();
+//        aiChatHistoryDTO.setUser_id(user_id);
+//
+//        return Result.success(AiChatHistoryService.queryAiChatHistoryList(pageDTO.getPage_num(), pageDTO.getPage_size(), aiChatHistoryDTO));
+//    }
+//
+//    @PreAuthorize("@sr.hasPermission('31')")
+//    @QueryNullCheck(serviceClass = AiChatHistoryService.class, serviceMethod = "queryAiChatHistoryByCode", argField = "history_code", message = "对话记录不存在")
+//    @DeleteMapping("/api/ai/chat/deleteAiChatHistory")
+//    public Result deleteAiChatHistory(@Validated(AiChatHistoryDTO.Delete.class) @RequestBody AiChatHistoryDTO aiChatHistoryDTO) {
+//     return Result.success(AiChatHistoryService.deleteAiChatHistory(aiChatHistoryDTO), "删除成功");
+//    }
+//}

+ 11 - 5
src/main/java/com/backendsys/controller/Ai/AiGenerateVideoController.java

@@ -3,6 +3,7 @@ package com.backendsys.controller.Ai;
 import com.backendsys.aspect.HttpRequestAspect;
 import com.backendsys.entity.Ai.AiGenerateVideoDTO;
 import com.backendsys.entity.PageDTO;
+import com.backendsys.modules.common.config.security.annotations.Anonymous;
 import com.backendsys.service.Ai.AiGenerateVideoService;
 import com.backendsys.utils.response.Result;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -25,7 +26,8 @@ public class AiGenerateVideoController {
     /**
      * 定制成片
      */
-    @PreAuthorize("@sr.hasPermission('34')")
+//    @PreAuthorize("@sr.hasPermission('34')")
+    @Anonymous
     @PostMapping("/api/ai/generate/video/make")
     public Result makePersonvideo(@Validated(AiGenerateVideoDTO.Create.class) @RequestBody AiGenerateVideoDTO aiGenerateVideoDTO) {
 
@@ -39,7 +41,8 @@ public class AiGenerateVideoController {
     /**
      * 查询成片任务进度/结果
      */
-    @PreAuthorize("@sr.hasPermission('34')")
+//    @PreAuthorize("@sr.hasPermission('34')")
+    @Anonymous
     @GetMapping("/api/ai/generate/video/getProgress")
     public Result getGenerateVideoProgress(@Validated(AiGenerateVideoDTO.Detail.class) @RequestBody AiGenerateVideoDTO aiGenerateVideoDTO) {
 
@@ -54,7 +57,8 @@ public class AiGenerateVideoController {
     /**
      * 获得全部配音列表
      */
-    @PreAuthorize("@sr.hasPermission('34')")
+//    @PreAuthorize("@sr.hasPermission('34')")
+    @Anonymous
     @GetMapping("/api/ai/generate/video/getGenerateVideoTimbre")
     public Result getGenerateVideoTimbre() {
         return Result.success(aiGenerateVideoService.getGenerateVideoTimbre());
@@ -63,7 +67,8 @@ public class AiGenerateVideoController {
     /**
      * 我的成片任务列表
      */
-    @PreAuthorize("@sr.hasPermission('34')")
+//    @PreAuthorize("@sr.hasPermission('34')")
+    @Anonymous
     @GetMapping("/api/ai/generate/video/my/list")
     public Result getGenerateVideoMyList(@Validated PageDTO pageDTO, @Validated AiGenerateVideoDTO aiGenerateVideoDTO) {
 
@@ -77,7 +82,8 @@ public class AiGenerateVideoController {
     /**
      * 我的成片任务详情
      */
-    @PreAuthorize("@sr.hasPermission('34')")
+//    @PreAuthorize("@sr.hasPermission('34')")
+    @Anonymous
     @GetMapping("/api/ai/generate/video/my/detail")
     public Result getGenerateVideoMyList(@Validated(AiGenerateVideoDTO.Detail.class) AiGenerateVideoDTO aiGenerateVideoDTO) {
 

+ 31 - 0
src/main/java/com/backendsys/modules/ai/media/controller/MediaController.java

@@ -0,0 +1,31 @@
+package com.backendsys.modules.ai.media.controller;
+
+import com.backendsys.modules.ai.media.entity.MediaParams.MediaParams;
+import com.backendsys.modules.ai.media.service.MediaService;
+import com.backendsys.modules.common.config.security.utils.SecurityUtil;
+import com.backendsys.modules.common.utils.Result;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import io.swagger.v3.oas.annotations.Operation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RestController;
+
+@Validated
+@RestController
+public class MediaController {
+
+    @Autowired
+    private MediaService mediaService;
+
+    @Operation(summary = "定制成片")
+    @PreAuthorize("@sr.hasPermission('34')")
+    @PostMapping("/api/ai/media/ttv/generate")
+    public Result generateMediaTtv(@Validated(MediaParams.Create.class) @RequestBody MediaParams mediaParams) throws JsonProcessingException {
+        mediaParams.setUser_id(SecurityUtil.getUserId());
+        return Result.success().put("data", mediaService.makeGenerateVideoAndInsert(mediaParams));
+    }
+
+}

+ 17 - 0
src/main/java/com/backendsys/modules/ai/media/dao/MediaDao.java

@@ -0,0 +1,17 @@
+package com.backendsys.modules.ai.media.dao;
+
+import com.backendsys.modules.ai.media.entity.AiGenerateVideoDTO;
+import com.backendsys.modules.ai.media.entity.MediaParams.MediaParams;
+import org.apache.ibatis.annotations.Mapper;
+
+import java.util.List;
+import java.util.Map;
+
+@Mapper
+public interface MediaDao {
+    List<Map<String, Object>> queryAiGenerateVideoList(AiGenerateVideoDTO aiGenerateVideoDTO);
+    Map<String, Object> queryAiGenerateVideoDetail(AiGenerateVideoDTO aiGenerateVideoDTO);
+    long insertAiGenerateVideo(MediaParams mediaParams);
+    long updateAiGenerateVideo(AiGenerateVideoDTO aiGenerateVideoDTO);
+    long deleteAiGenerateVideo(AiGenerateVideoDTO aiGenerateVideoDTO);
+}

+ 66 - 0
src/main/java/com/backendsys/modules/ai/media/entity/AiGenerateVideoDTO.java

@@ -0,0 +1,66 @@
+package com.backendsys.modules.ai.media.entity;
+
+import com.backendsys.entity.validator.RangeStringArray;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Size;
+import lombok.Data;
+import lombok.ToString;
+
+@Data
+@ToString
+public class AiGenerateVideoDTO {
+    public static interface Detail{}
+    public static interface Create{}
+    public static interface Update{}
+    public static interface Delete{}
+
+    private Long id;
+
+    private Long user_id;
+
+    @NotNull(message = "任务ID不能为空", groups = { Update.class, Delete.class, Detail.class })
+    private Long job_id;
+
+    @NotNull(message = "标题不能为空", groups = { Create.class })
+    @Size(max = 50, message = "标题长度不超过 {max} 字符", groups = { Create.class })
+    private String title;
+
+    @NotNull(message = "内容不能为空", groups = { Create.class })
+    private String source;
+
+    @NotNull(message = "分辨率不能为空", groups = { Create.class })
+    private Integer[] resolution;
+    private String resolutionString;
+
+
+    @NotNull(message = "视频输出类型不能为空", groups = { Create.class })
+    @RangeStringArray(message="视频输出类型有误,范围应是(video:mp4视频, timeline:json时间轴信息)", value = {"video", "timeline"})
+    private String product_type;
+
+    private Integer tts_per;
+    private String bg_music_url;
+    private String video_begin_url;
+    private String video_end_url;
+
+    private String caption_margin_bottom;
+    private String caption_font_color;
+    private String caption_font_alpha;
+    private String caption_bg_color;
+    private String caption_bg_alpha;
+
+    private String video_logo_url;
+    private String video_logo_location;
+    private Integer video_logo_margin;
+
+    @RangeStringArray(message="任务状态取值有误,范围应是 (0任务排队中,1任务完成,3任务执行中)", value = {"0", "1", "3"}, groups = { Create.class, Update.class })
+    private String job_status;
+
+    private String result_video_url;
+    private String result_points;
+    private String result_basic_duration;
+    private String result_fail_reason;
+
+    private String create_time;
+    private String update_time;
+
+}

+ 11 - 0
src/main/java/com/backendsys/modules/ai/media/entity/MediaParams/Common/MediaSource.java

@@ -0,0 +1,11 @@
+package com.backendsys.modules.ai.media.entity.MediaParams.Common;
+
+import lombok.Data;
+
+@Data
+public class MediaSource {
+
+    private Integer type = 3;
+    private String url;
+
+}

+ 18 - 0
src/main/java/com/backendsys/modules/ai/media/entity/MediaParams/Config/Config.java

@@ -0,0 +1,18 @@
+package com.backendsys.modules.ai.media.entity.MediaParams.Config;
+
+import lombok.Data;
+
+@Data
+public class Config {
+
+    private String productType = "video";
+    private Integer ttsPer = 0;
+    private Integer[] resolution = {1024,576};
+    private String templateId;
+    private ConfigBgMusic bgMusic;
+    private ConfigVideoBegin videoBegin;
+    private ConfigVideoEnd videoEnd;
+    private ConfigCaption caption;
+    private ConfigVideoLogo videoLogo;
+
+}

+ 11 - 0
src/main/java/com/backendsys/modules/ai/media/entity/MediaParams/Config/ConfigBgMusic.java

@@ -0,0 +1,11 @@
+package com.backendsys.modules.ai.media.entity.MediaParams.Config;
+
+import com.backendsys.modules.ai.media.entity.MediaParams.Common.MediaSource;
+import lombok.Data;
+
+@Data
+public class ConfigBgMusic {
+
+    private MediaSource mediaSource;
+
+}

+ 14 - 0
src/main/java/com/backendsys/modules/ai/media/entity/MediaParams/Config/ConfigCaption.java

@@ -0,0 +1,14 @@
+package com.backendsys.modules.ai.media.entity.MediaParams.Config;
+
+import lombok.Data;
+
+@Data
+public class ConfigCaption {
+
+    private String marginBottom;
+    private String fontColor;
+    private Integer fontAlpha;
+    private String bgColor;
+    private Integer bgAlpha;
+
+}

+ 11 - 0
src/main/java/com/backendsys/modules/ai/media/entity/MediaParams/Config/ConfigVideoBegin.java

@@ -0,0 +1,11 @@
+package com.backendsys.modules.ai.media.entity.MediaParams.Config;
+
+import com.backendsys.modules.ai.media.entity.MediaParams.Common.MediaSource;
+import lombok.Data;
+
+@Data
+public class ConfigVideoBegin {
+
+    private MediaSource mediaSource;
+
+}

+ 11 - 0
src/main/java/com/backendsys/modules/ai/media/entity/MediaParams/Config/ConfigVideoEnd.java

@@ -0,0 +1,11 @@
+package com.backendsys.modules.ai.media.entity.MediaParams.Config;
+
+import com.backendsys.modules.ai.media.entity.MediaParams.Common.MediaSource;
+import lombok.Data;
+
+@Data
+public class ConfigVideoEnd {
+
+    private MediaSource mediaSource;
+
+}

+ 7 - 0
src/main/java/com/backendsys/modules/ai/media/entity/MediaParams/Config/ConfigVideoLogo.java

@@ -0,0 +1,7 @@
+package com.backendsys.modules.ai.media.entity.MediaParams.Config;
+
+import lombok.Data;
+
+@Data
+public class ConfigVideoLogo {
+}

+ 69 - 0
src/main/java/com/backendsys/modules/ai/media/entity/MediaParams/MediaParams.java

@@ -0,0 +1,69 @@
+package com.backendsys.modules.ai.media.entity.MediaParams;
+
+import com.backendsys.entity.validator.RangeStringArray;
+import com.backendsys.modules.ai.media.entity.AiGenerateVideoDTO;
+import com.backendsys.modules.ai.media.entity.MediaParams.Source.Source;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Size;
+import lombok.Data;
+import lombok.ToString;
+
+@Data
+@ToString
+public class MediaParams {
+
+    public static interface Detail{}
+    public static interface Create{}
+    public static interface Update{}
+    public static interface Delete{}
+
+    private Long id;
+
+    private Long user_id;
+
+    @NotNull(message = "任务ID不能为空", groups = { AiGenerateVideoDTO.Update.class, AiGenerateVideoDTO.Delete.class, AiGenerateVideoDTO.Detail.class })
+    private Long job_id;
+
+    @NotNull(message = "标题不能为空", groups = { AiGenerateVideoDTO.Create.class })
+    @Size(max = 50, message = "标题长度不超过 {max} 字符", groups = { AiGenerateVideoDTO.Create.class })
+    private String title;
+
+    @NotNull(message = "内容不能为空", groups = { AiGenerateVideoDTO.Create.class })
+    private String source;
+
+    @NotNull(message = "分辨率不能为空", groups = { AiGenerateVideoDTO.Create.class })
+    private Integer[] resolution;
+    private String resolutionString;
+
+
+    @NotNull(message = "视频输出类型不能为空", groups = { AiGenerateVideoDTO.Create.class })
+    @RangeStringArray(message="视频输出类型有误,范围应是(video:mp4视频, timeline:json时间轴信息)", value = {"video", "timeline"})
+    private String product_type;
+
+    private Integer tts_per;
+    private String bg_music_url;
+    private String video_begin_url;
+    private String video_end_url;
+
+    private String caption_margin_bottom;
+    private String caption_font_color;
+    private String caption_font_alpha;
+    private String caption_bg_color;
+    private String caption_bg_alpha;
+
+    private String video_logo_url;
+    private String video_logo_location;
+    private Integer video_logo_margin;
+
+    @RangeStringArray(message="任务状态取值有误,范围应是 (0任务排队中,1任务完成,3任务执行中)", value = {"0", "1", "3"}, groups = { AiGenerateVideoDTO.Create.class, AiGenerateVideoDTO.Update.class })
+    private String job_status;
+
+    private String result_video_url;
+    private String result_points;
+    private String result_basic_duration;
+    private String result_fail_reason;
+
+    private String create_time;
+    private String update_time;
+
+}

+ 12 - 0
src/main/java/com/backendsys/modules/ai/media/entity/MediaParams/Source/Source.java

@@ -0,0 +1,12 @@
+package com.backendsys.modules.ai.media.entity.MediaParams.Source;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class Source {
+
+    private List<StructsItem> structs;
+
+}

+ 10 - 0
src/main/java/com/backendsys/modules/ai/media/entity/MediaParams/Source/StructsItem.java

@@ -0,0 +1,10 @@
+package com.backendsys.modules.ai.media.entity.MediaParams.Source;
+
+import com.backendsys.modules.ai.media.entity.MediaParams.Common.MediaSource;
+import lombok.Data;
+
+@Data
+public class StructsItem {
+    private String type;                // type: text、image
+    private MediaSource mediaSource;    // mediaSource: { type, url }
+}

+ 14 - 0
src/main/java/com/backendsys/modules/ai/media/service/MediaService.java

@@ -0,0 +1,14 @@
+package com.backendsys.modules.ai.media.service;
+
+
+import com.backendsys.modules.ai.media.entity.MediaParams.MediaParams;
+import com.fasterxml.jackson.core.JsonProcessingException;
+
+import java.util.Map;
+
+public interface MediaService {
+
+    // 定制成片任务
+    Map<String, Object> makeGenerateVideoAndInsert(MediaParams mediaParams) throws JsonProcessingException;
+
+}

+ 60 - 0
src/main/java/com/backendsys/modules/ai/media/service/impl/MediaServiceImpl.java

@@ -0,0 +1,60 @@
+package com.backendsys.modules.ai.media.service.impl;
+
+import cn.hutool.json.JSONObject;
+import com.backendsys.modules.ai.media.dao.MediaDao;
+import com.backendsys.modules.ai.media.entity.MediaParams.MediaParams;
+import com.backendsys.modules.ai.media.service.MediaService;
+import com.backendsys.modules.sdk.baidu.bce.service.BaiduBceMediaService;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Map;
+
+@Service
+public class MediaServiceImpl implements MediaService {
+
+    @Autowired
+    private MediaDao mediaDao;
+
+    @Autowired
+    private BaiduBceMediaService baiduBceMediaService;
+
+    /**
+     * 定制成片任务
+     */
+    @Override
+    public Map<String, Object> makeGenerateVideoAndInsert(MediaParams mediaParams) throws JsonProcessingException {
+
+        // [远程] 发起定制
+        JSONObject resp = baiduBceMediaService.makeGenerateVideo(mediaParams);
+
+        System.out.println("makeGenerateVideoAndInsert resp:");
+        System.out.println(resp);
+        return null;
+
+//        // 提交定制成功后,将数据插入表;失败则抛出错误
+//
+////        Integer error_code = (Integer) MapUtil.get(resp, "error_code");
+//        Integer error_code = Convert.toInt(MapUtil.get(resp, "error_code"));
+//        if (error_code == null || error_code == 0) {
+//
+//            System.out.println("setJob_id: " + MapUtil.get(resp, "data.jobId"));
+//
+//            mediaParams.setJob_id(Convert.toLong(MapUtil.get(resp, "data.jobId")));
+//            // 数组 转 字符串
+//            String resolutionString = CustomArrayUtil.convertToString(mediaParams.getResolution());
+//            mediaParams.setResolutionString(resolutionString);
+//
+//            System.out.println("insertAiGenerateVideo mediaParams");
+//            System.out.println(mediaParams);
+//            mediaDao.insertAiGenerateVideo(mediaParams);
+//
+////            aiGenerateVideoMapper.insertAiGenerateVideo(mediaParams);
+//        } else {
+//            String error_message = Convert.toStr(MapUtil.get(resp, "error_msg"));
+//            throw new CustException("(" + error_code + ") " + error_message);
+//        }
+
+    }
+}

+ 9 - 0
src/main/java/com/backendsys/modules/sdk/baidu/bce/entity/AiGenerateVideoCustom/AiGenerateVideoCustomDTO.java

@@ -0,0 +1,9 @@
+package com.backendsys.modules.sdk.baidu.bce.entity.AiGenerateVideoCustom;
+
+import lombok.Data;
+
+@Data
+public class AiGenerateVideoCustomDTO {
+    private SourceDTO source;
+    private ConfigDTO config;
+}

+ 8 - 0
src/main/java/com/backendsys/modules/sdk/baidu/bce/entity/AiGenerateVideoCustom/ConfigBgMusicDTO.java

@@ -0,0 +1,8 @@
+package com.backendsys.modules.sdk.baidu.bce.entity.AiGenerateVideoCustom;
+
+import lombok.Data;
+
+@Data
+public class ConfigBgMusicDTO {
+    private MediaSourceVO mediaSource;
+}

+ 12 - 0
src/main/java/com/backendsys/modules/sdk/baidu/bce/entity/AiGenerateVideoCustom/ConfigCaptionDTO.java

@@ -0,0 +1,12 @@
+package com.backendsys.modules.sdk.baidu.bce.entity.AiGenerateVideoCustom;
+
+import lombok.Data;
+
+@Data
+public class ConfigCaptionDTO {
+    private Integer marginBottom;
+    private String fontColor;
+    private Integer fontAlpha;
+    private String bgColor;
+    private Integer bgAlpha;
+}

+ 18 - 0
src/main/java/com/backendsys/modules/sdk/baidu/bce/entity/AiGenerateVideoCustom/ConfigDTO.java

@@ -0,0 +1,18 @@
+package com.backendsys.modules.sdk.baidu.bce.entity.AiGenerateVideoCustom;
+
+import lombok.Data;
+
+@Data
+public class ConfigDTO {
+    private Integer[] resolution;
+    private String productType;
+    private Integer ttsPer;
+    private String digitalHumanId;
+    private String mediaLibs;
+
+    private ConfigBgMusicDTO bgMusic;
+    private ConfigVideoBeginDTO videoBegin;
+    private ConfigVideoEndDTO videoEnd;
+    private ConfigVideoLogoDTO videoLogo;
+
+}

+ 8 - 0
src/main/java/com/backendsys/modules/sdk/baidu/bce/entity/AiGenerateVideoCustom/ConfigVideoBeginDTO.java

@@ -0,0 +1,8 @@
+package com.backendsys.modules.sdk.baidu.bce.entity.AiGenerateVideoCustom;
+
+import lombok.Data;
+
+@Data
+public class ConfigVideoBeginDTO {
+    private MediaSourceVO mediaSource;
+}

+ 8 - 0
src/main/java/com/backendsys/modules/sdk/baidu/bce/entity/AiGenerateVideoCustom/ConfigVideoEndDTO.java

@@ -0,0 +1,8 @@
+package com.backendsys.modules.sdk.baidu.bce.entity.AiGenerateVideoCustom;
+
+import lombok.Data;
+
+@Data
+public class ConfigVideoEndDTO {
+    private MediaSourceVO mediaSource;
+}

+ 11 - 0
src/main/java/com/backendsys/modules/sdk/baidu/bce/entity/AiGenerateVideoCustom/ConfigVideoLogoDTO.java

@@ -0,0 +1,11 @@
+package com.backendsys.modules.sdk.baidu.bce.entity.AiGenerateVideoCustom;
+
+import lombok.Data;
+
+@Data
+public class ConfigVideoLogoDTO {
+    private MediaSourceVO mediaSource;
+
+    private String location;
+    private Integer margin;
+}

+ 9 - 0
src/main/java/com/backendsys/modules/sdk/baidu/bce/entity/AiGenerateVideoCustom/MediaSourceVO.java

@@ -0,0 +1,9 @@
+package com.backendsys.modules.sdk.baidu.bce.entity.AiGenerateVideoCustom;
+
+import lombok.Data;
+
+@Data
+public class MediaSourceVO {
+    private Integer type;
+    private String url;
+}

+ 10 - 0
src/main/java/com/backendsys/modules/sdk/baidu/bce/entity/AiGenerateVideoCustom/SourceDTO.java

@@ -0,0 +1,10 @@
+package com.backendsys.modules.sdk.baidu.bce.entity.AiGenerateVideoCustom;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class SourceDTO {
+    private List<SourceStructDTO> structs;
+}

+ 10 - 0
src/main/java/com/backendsys/modules/sdk/baidu/bce/entity/AiGenerateVideoCustom/SourceStructDTO.java

@@ -0,0 +1,10 @@
+package com.backendsys.modules.sdk.baidu.bce.entity.AiGenerateVideoCustom;
+
+import lombok.Data;
+
+@Data
+public class SourceStructDTO {
+    private String type;
+    private String text;
+    private MediaSourceVO mediaSource;
+}

+ 11 - 0
src/main/java/com/backendsys/modules/sdk/baidu/bce/entity/MediaMaterialResponse.java

@@ -0,0 +1,11 @@
+package com.backendsys.modules.sdk.baidu.bce.entity;
+
+import com.backendsys.entity.Ai.AiGenerateVideoCustom.ConfigDTO;
+import com.backendsys.entity.Ai.AiGenerateVideoCustom.SourceDTO;
+import lombok.Data;
+
+@Data
+public class MediaMaterialResponse {
+    private SourceDTO source;
+    private ConfigDTO config;
+}

+ 19 - 0
src/main/java/com/backendsys/modules/sdk/baidu/bce/service/BaiduBceMediaService.java

@@ -0,0 +1,19 @@
+package com.backendsys.modules.sdk.baidu.bce.service;
+
+import cn.hutool.json.JSONObject;
+import com.backendsys.modules.ai.media.entity.MediaParams.MediaParams;
+import com.fasterxml.jackson.core.JsonProcessingException;
+
+import java.util.Map;
+
+public interface BaiduBceMediaService {
+
+    // [百度-AI成片] 定制成片任务
+    JSONObject makeGenerateVideo(MediaParams mediaParams) throws JsonProcessingException;
+    // [百度-AI成片] 查询成片任务进度
+    Map<String, Object> getGenerateVideoProgress(Long jobId);
+
+
+
+
+}

+ 302 - 0
src/main/java/com/backendsys/modules/sdk/baidu/bce/service/impl/BaiduBceMediaServiceImpl.java

@@ -0,0 +1,302 @@
+package com.backendsys.modules.sdk.baidu.bce.service.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.http.HttpUtil;
+import cn.hutool.json.JSONArray;
+import cn.hutool.json.JSONObject;
+import cn.hutool.json.JSONUtil;
+import com.backendsys.modules.ai.media.entity.AiGenerateVideoDTO;
+import com.backendsys.modules.ai.media.entity.MediaParams.MediaParams;
+import com.backendsys.modules.sdk.baidu.bce.entity.AiGenerateVideoCustom.*;
+import com.backendsys.modules.sdk.baidu.bce.service.BaiduBceMediaService;
+import com.backendsys.modules.sdk.baidu.bce.utils.BaiduBceUtil;
+import com.backendsys.utils.CustomArrayUtil;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.ParameterizedTypeReference;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpMethod;
+import org.springframework.http.MediaType;
+import org.springframework.stereotype.Service;
+import org.springframework.web.reactive.function.client.WebClient;
+
+import java.net.URI;
+import java.util.*;
+
+
+/**
+ * 百度AI成片
+ * https://ai.baidu.com/ai-doc/NLP/Zk7ylspjv
+ */
+@Service
+public class BaiduBceMediaServiceImpl implements BaiduBceMediaService {
+
+    @Autowired
+    private BaiduBceUtil baiduBceUtil;
+
+
+    // [百度-AI成片] 封装拼接授权过的 AccessToken URL
+    private URI getUriWithParams(String url) {
+        return null;
+    }
+
+    /**
+     * [方法] 将接口入参 (AiGenerateVideoDTO) 转换为 符合SDK接口的格式 (AiGenerateVideoDTOResponse)
+     */
+    private AiGenerateVideoCustomDTO formatCustom(AiGenerateVideoDTO aiGenerateVideoDTO) {
+
+        System.out.println("----------------------------------");
+        System.out.println(aiGenerateVideoDTO);
+
+        AiGenerateVideoCustomDTO customDTO = new AiGenerateVideoCustomDTO();
+        SourceDTO sourceDTO = new SourceDTO();
+        ConfigDTO configDTO = new ConfigDTO();
+
+        // -- source ------------------------------------------------------------
+        String source = aiGenerateVideoDTO.getSource();
+        // \"structs\":[{\"type\":\"text\",\"text\":\"夕阳如红色绸带轻轻拂过天际,悄然间,大地沐浴在金色的温柔中。\"},{\"type\":\"image\",\"mediaSource\":{\"type\":3,\"url\":\"http://dev.manage.daoguyujia.com/assets/p1.jpg\"}}]
+        JSONObject sourceJSON = JSONUtil.parseObj(source);
+        JSONArray structs = (JSONArray) sourceJSON.get("structs");
+
+        List<SourceStructDTO> StructList = new ArrayList<>();
+        for (int i=0; i < structs.size(); i++) {
+            SourceStructDTO sourceStructDTO = new SourceStructDTO();
+            //
+            JSONObject obj = structs.getJSONObject(i);
+            String type = (String) obj.get("type");
+            sourceStructDTO.setType(type);
+            if (type.equals("text")) {
+                String text = (String) obj.get("text");
+                sourceStructDTO.setText(text);
+            }
+            if (type.equals("image")) {
+                MediaSourceVO mediaSourceVO = new MediaSourceVO();
+                JSONObject mediaSourceObj = (JSONObject) obj.get("mediaSource");
+                mediaSourceVO.setType(3);
+                mediaSourceVO.setUrl((String) mediaSourceObj.get("url"));
+
+                sourceStructDTO.setMediaSource(mediaSourceVO);
+            }
+            //
+            StructList.add(sourceStructDTO);
+        }
+        // -------------------------------------------------------------------------
+        sourceDTO.setStructs(StructList);
+        // -------------------------------------------------------------------------
+        customDTO.setSource(sourceDTO);
+        // -------------------------------------------------------------------------
+
+        // -- config ---------------------------------------------------------------
+        configDTO.setResolution(aiGenerateVideoDTO.getResolution());
+        configDTO.setProductType(aiGenerateVideoDTO.getProduct_type());
+        configDTO.setTtsPer(aiGenerateVideoDTO.getTts_per());
+        // -------------------------------------------------------------------------
+        // -- config.bgMusic.mediaSource (背景图) -----------------------------------
+        String bg_music_url = aiGenerateVideoDTO.getBg_music_url();
+        if (StrUtil.isNotBlank(bg_music_url)) {
+            ConfigBgMusicDTO bgMusicDTO = new ConfigBgMusicDTO();
+
+            MediaSourceVO mediaSourceVO = new MediaSourceVO();
+            mediaSourceVO.setType(3);
+            mediaSourceVO.setUrl(bg_music_url);
+            bgMusicDTO.setMediaSource(mediaSourceVO);
+
+            configDTO.setBgMusic(bgMusicDTO);
+        }
+        // -------------------------------------------------------------------------
+        // -- config.videoBegin.mediaSource (片头) ----------------------------------
+        String video_begin_url = aiGenerateVideoDTO.getVideo_begin_url();
+        if (StrUtil.isNotBlank(video_begin_url)) {
+            ConfigVideoBeginDTO videoBeginDTO = new ConfigVideoBeginDTO();
+
+            MediaSourceVO mediaSourceVO = new MediaSourceVO();
+            mediaSourceVO.setType(3);
+            mediaSourceVO.setUrl(video_begin_url);
+            videoBeginDTO.setMediaSource(mediaSourceVO);
+
+            configDTO.setVideoBegin(videoBeginDTO);
+        }
+        // -------------------------------------------------------------------------
+        // -- config.videoEnd.mediaSource (片尾) ------------------------------------
+        String video_end_url = aiGenerateVideoDTO.getVideo_end_url();
+        if (StrUtil.isNotBlank(video_end_url)) {
+            ConfigVideoEndDTO videoEndDTO = new ConfigVideoEndDTO();
+
+            MediaSourceVO mediaSourceVO = new MediaSourceVO();
+            mediaSourceVO.setType(3);
+            mediaSourceVO.setUrl(video_end_url);
+            videoEndDTO.setMediaSource(mediaSourceVO);
+
+            configDTO.setVideoEnd(videoEndDTO);
+        }
+        // -------------------------------------------------------------------------
+        // -- config.videoLogo (LOGO) ----------------------------------------------
+        String video_logo_url = aiGenerateVideoDTO.getVideo_logo_url();
+        if (StrUtil.isNotBlank(video_logo_url)) {
+            ConfigVideoLogoDTO videoLogoDTO = new ConfigVideoLogoDTO();
+
+            MediaSourceVO mediaSourceVO = new MediaSourceVO();
+            mediaSourceVO.setType(3);
+            mediaSourceVO.setUrl(video_logo_url);
+            videoLogoDTO.setMediaSource(mediaSourceVO);
+
+            String video_logo_location = aiGenerateVideoDTO.getVideo_logo_location();
+            Integer video_logo_margin = aiGenerateVideoDTO.getVideo_logo_margin();
+            if (StrUtil.isNotBlank(video_logo_location)) {
+                videoLogoDTO.setLocation(video_logo_location);
+            }
+            if (video_logo_margin != null) {
+                videoLogoDTO.setMargin(video_logo_margin);
+            }
+            configDTO.setVideoLogo(videoLogoDTO);
+        }
+        // -------------------------------------------------------------------------
+        System.out.println("configDTO:");
+        System.out.println(configDTO);
+
+        customDTO.setConfig(configDTO);
+        // -------------------------------------------------------------------------
+
+        return customDTO;
+    }
+
+    /**
+     * [百度-AI成片] 定制成片任务
+     * https://ai.baidu.com/ai-doc/NLP/Zk7ylspjv
+     */
+    @Override
+    public JSONObject makeGenerateVideo(MediaParams mediaParams) throws JsonProcessingException {
+
+//        // structs: 文本、图片素材内容,文字内容必填,structs中文本总长度在20-800字符之间
+//        // mediaSource: 若内容类型type=image,该字段描述图片内容,支持jpg/jpeg/png格式的图片
+//        // type: 内容类型,支持image(图片)、text(文字)、video(视频)
+//        String imageUrl = "http://43.138.151.228:3001/2.jpg";
+//        // 传入图片、视频的url地址,图片、视频总数量不得超过20个,视频总大小不超过1G
+//        String text = "夕阳如红色绸带轻轻拂过天际,悄然间,大地沐浴在金色的温柔中。";      // 若内容类型type=text,该字段描述文本内容
+
+        String source = mediaParams.getSource();
+
+        // config: 视频生产配置
+        String productType = mediaParams.getProduct_type();
+        Integer ttsPer = mediaParams.getTts_per();
+        String resolution = CustomArrayUtil.convertToString(mediaParams.getResolution());
+
+//        String productType = "video";       // 视频产出结果形式,支持产出为mp4和json格式。可选项为video、timeline。video: 产出结果为mp4视频;timeline: 产出结果为json时间轴信息;
+//        Integer ttsPer = 4144;                // 支持基础音库、甄选音库,默认4144:度姗姗-女;【基础音库】0:度小美-女、1:度小宇-男、3:度小云-男、4:度小丫-女童、5:度小娇-女、103:度小朵-女童、106:度小博-男、110:度小童-男童、111:度小萌-女、5003:度小遥-男、5118:度小婷-女、4003:度小耀-男、4100:度小雯-女、4103:度小米-男童、4105:度小灵-女、4106:度小文-男、4115:度小贤-男、4117:度小乔-女、4119:度小鹿-女;【甄选音库】4144:度姗姗-女、4140:度小新-女、4143:度清风-男、4129:度小彦-男、4278:度小贝-女、4254:度小清-女、4149:度星河-男
+//        String resolution = "[1024,576]";   // 分辨率,横屏支持[1920,1080]、[1280,720]、[1024,576]、竖屏支持[1080,1920]、[720,1280]、[576,1024]
+
+        String templateId = "";             // 视频模板id,不传则智能匹配,横屏模板支持:"30","41","42","43","44","45","46","47","48","49",竖屏模板支持:"40","28","29","31","32","33","34","35","36","37","38","39","50","51","52","53","54","55","56","57","58","59","60","61","62","63","64","65","66","67","68","69","70","71"
+
+        // bgMusic: 背景音乐,支持使用mp3格式,文件大小不超过10M
+        String bgMusicUrl = "";
+        // videoBegin: 视频片头,大小限制50M,格式为mp4或mov
+        String videoBeginUrl = "";
+        String videoEndUrl = "";
+
+        // caption: 字幕显示设置
+        String marginBottom = "170px";  // 字幕距离视频底部的位置,单位px,支持选择0-500。横屏默认值为70px;竖屏[1080,1920]默认为270px、[720,1280]默认为180px、[576,1024]默认为170px
+        String fontColor = "ffffff";    // 字体颜色,支持传入颜色的十六进制,默认:ffffff
+        Integer fontAlpha = 100;        // 字体透明度,范围:0-100,从透明到不透明,默认:100
+        String bgColor = "927070";      // 字幕背景颜色,支持传入颜色的十六进制,默认:927070
+        Integer bgAlpha = 32;           // 字幕背景透明度,范围:0-100,从透明到不透明,默认32
+
+        String location = "";           // 角标位置,支持:top-left(左上)、top-right(右上),默认为 top-left
+        Integer margin = 20;            // 角标边缘距离,单位px,支持0-100,默认为 20
+
+        String params = "{" +
+            "\"source\":" + source + "," +
+//            "\"source\":{" +
+//                "\"structs\":[" +
+//                    "{" +
+//                        "\"type\":\"image\"," +
+//                        "\"mediaSource\":{" +
+//                            "\"type\":3," +
+//                            "\"url\":\"" + imageUrl + "\"" +
+//                        "}" +
+//                    "}," +
+//                    "{" +
+//                        "\"type\":\"text\"," +
+//                        "\"text\":\"" + text + "\"" +
+//                    "}" +
+//                "]" +
+//            "}," +
+            "\"config\":{" +
+                "\"productType\":\"" + productType + "\"," +
+                "\"ttsPer\":" + ttsPer + "," +
+                "\"resolution\":" + resolution + "" +
+
+//                "\"resolution\":" + resolution + "," +
+//                "\"templateId\":\"" + templateId + "\"" +
+//                "\"bgMusic\":{" +
+//                    "\"mediaSource\":{" +
+//                        "\"type\":3," +
+//                        "\"url\":\"" + bgMusicUrl + "\"" +
+//                    "}"+
+//                "}," +
+//                "\"videoBegin\":{" +
+//                    "\"mediaSource\":{" +
+//                        "\"type\":3," +
+//                        "\"url\":\"" + videoBeginUrl + "\"" +
+//                    "}"+
+//                "},"+
+//                "\"videoEnd\":{" +
+//                    "\"mediaSource\":{" +
+//                        "\"type\":3," +
+//                        "\"url\":\"" + videoEndUrl + "\"" +
+//                    "}"+
+//                "},"+
+//                "\"caption\":{" +
+//                    "\"marginBottom\":\"" + marginBottom + "\"," +
+//                    "\"fontColor\":\"" + fontColor + "\"," +
+//                    "\"fontAlpha\":" + fontAlpha + "," +
+//                    "\"bgColor\":\"" + bgColor + "\"," +
+//                    "\"bgAlpha\":" + bgAlpha + "" +
+//                "},"+
+//                "\"videoLogo\":{" +
+//                    "\"mediaSource\":{" +
+//                        "\"type\":3," +
+//                        "\"url\":\"" + videoEndUrl + "\"" +
+//                    "},"+
+//                    "\"location\":\"" + location + "\"," +
+//                    "\"margin\":" + margin + "" +
+//                "}"+
+            "}" +
+        "}";
+
+        System.out.println("-------------------------------------------");
+        System.out.println(params);
+        System.out.println("-------------------------------------------");
+
+        String access_token = baiduBceUtil.getAccessToken();
+        String result = HttpUtil.post("https://aip.baidubce.com/rpc/2.0/brain/creative/ttv/material?access_token=" + access_token, params);
+        JSONObject resultJSON = JSONUtil.parseObj(result);
+        return resultJSON;
+    }
+
+    /**
+     * [百度-AI成片] 查询成片任务进度
+     */
+    @Override
+    public Map<String, Object> getGenerateVideoProgress(Long jobId) {
+        // Body 参数
+        Map<String, Object> resultMap = new LinkedHashMap<>();
+        resultMap.put("jobId", jobId);
+        String bodyData = JSONUtil.toJsonStr(resultMap);
+
+        // Http 远程调用
+        URI uriWithParams = getUriWithParams("https://aip.baidubce.com/rpc/2.0/brain/creative/ttv/query");
+        Map<String, Object> resp = WebClient.create()
+                .method(HttpMethod.POST)
+                .uri(uriWithParams)
+                .bodyValue(bodyData.toString())
+                .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
+                .retrieve().bodyToMono(new ParameterizedTypeReference<Map<String, Object>>() {
+                })
+                .block();
+
+        System.out.println("getGenerateVideoProgress resp:");
+        System.out.println(resp);
+        return resp;
+    }
+}

+ 44 - 0
src/main/java/com/backendsys/modules/sdk/baidu/bce/utils/BaiduBceUtil.java

@@ -0,0 +1,44 @@
+package com.backendsys.modules.sdk.baidu.bce.utils;
+
+import cn.hutool.http.HttpUtil;
+import cn.hutool.json.JSONObject;
+import cn.hutool.json.JSONUtil;
+import org.apache.http.client.ClientProtocolException;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.util.EntityUtils;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.core.ParameterizedTypeReference;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpMethod;
+import org.springframework.http.MediaType;
+import org.springframework.stereotype.Component;
+import org.springframework.web.reactive.function.client.WebClient;
+import org.springframework.web.util.UriComponentsBuilder;
+
+import java.io.IOException;
+import java.net.URI;
+import java.util.HashMap;
+import java.util.Map;
+
+@Component
+public class BaiduBceUtil {
+
+    @Value("${baidu.ai.client-id}")
+    private String BAIDU_BCE_CLIENT_ID;
+    @Value("${baidu.ai.client-secret}")
+    private String BAIDU_BCE_CLIENT_SECRET;
+
+    public String getAccessToken() {
+        Map<String, Object> params = new HashMap<>();
+        params.put("grant_type", "client_credentials");
+        params.put("client_id", BAIDU_BCE_CLIENT_ID);
+        params.put("client_secret", BAIDU_BCE_CLIENT_SECRET);
+        String result = HttpUtil.post("https://aip.baidubce.com/oauth/2.0/token", params);
+        JSONObject resultJSON = JSONUtil.parseObj(result);
+        return resultJSON.getStr("access_token");
+    }
+
+}

+ 3 - 3
src/main/java/com/backendsys/service/Ai/AiGenerateVideoService.java

@@ -7,12 +7,12 @@ import java.util.Map;
 
 public interface AiGenerateVideoService {
 
-    // 查询成片任务进度/结果
-    Map<String, Object> getGenerateVideoProgressAndUpdate(Long job_id, Long user_id);
-
     // 定制成片任务
     Map<String, Object> makeGenerateVideoAndInsert(AiGenerateVideoDTO aiGenerateVideoDTO);
 
+    // 查询成片任务进度/结果
+    Map<String, Object> getGenerateVideoProgressAndUpdate(Long job_id, Long user_id);
+
     // 查询全部配音列表
     List<Map<String, Object>> getGenerateVideoTimbre();
 

+ 1 - 1
src/main/java/com/backendsys/service/SDKService/SDKBaidu/SDKBaiduAiGenerateVideoServiceImpl.java

@@ -77,7 +77,7 @@ public class SDKBaiduAiGenerateVideoServiceImpl implements SDKBaiduAiGenerateVid
 
 
     /**
-     * [方法] 将接口入参 (AiGenerateVideoDTO) 转换为 符合SDK接口的格式 (AiGenerateVideoCustomDTO)
+     * [方法] 将接口入参 (MediaParams) 转换为 符合SDK接口的格式 (MediaMaterialResponse)
      */
     private AiGenerateVideoCustomDTO formatCustom(AiGenerateVideoDTO aiGenerateVideoDTO) {
 

+ 125 - 0
src/main/resources/mapper/ai/media/MediaMapper.xml

@@ -0,0 +1,125 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
+<mapper namespace="com.backendsys.modules.ai.media.dao.MediaDao">
+
+    <sql id="includeAiGenerateVideo">
+        id,
+        user_id,
+        job_id,
+        title,
+        source,
+        resolution,
+        product_type,
+        COALESCE(tts_per, '') tts_per,
+        COALESCE(bg_music_url, '') bg_music_url,
+        COALESCE(video_begin_url, '') video_begin_url,
+        COALESCE(video_end_url, '') video_end_url,
+        COALESCE(video_logo_url, '') video_logo_url,
+        COALESCE(video_logo_location, '') video_logo_location,
+        COALESCE(video_logo_margin, '') video_logo_margin,
+        COALESCE(job_status, '') job_status,
+        COALESCE(result_video_url, '') result_video_url,
+        COALESCE(result_points, '') result_points,
+        COALESCE(result_basic_duration, '') result_basic_duration,
+        COALESCE(result_fail_reason, '') result_fail_reason,
+        create_time,
+        update_time
+    </sql>
+
+    <resultMap id="resultMapAiGenerateVideo" type="java.util.LinkedHashMap">
+        <id property="id" column="id" jdbcType="BIGINT" />
+        <result property="user_id" column="user_id" javaType="java.lang.Long" />
+        <result property="job_id" column="job_id" />
+        <result property="title" column="title" />
+        <result property="source" column="source" />
+        <result property="resolution" column="resolution" />
+        <result property="product_type" column="product_type" />
+        <result property="tts_per" column="tts_per" />
+        <result property="bg_music_url" column="bg_music_url" />
+        <result property="video_begin_url" column="video_begin_url" />
+        <result property="video_end_url" column="video_end_url" />
+        <result property="video_logo_url" column="video_logo_url" />
+        <result property="video_logo_location" column="video_logo_location" />
+        <result property="video_logo_margin" column="video_logo_margin" />
+        <result property="job_status" column="job_status" javaType="java.lang.Integer" />
+        <result property="result_video_url" column="result_video_url" />
+        <result property="result_points" column="result_points" />
+        <result property="result_basic_duration" column="result_basic_duration" />
+        <result property="result_fail_reason" column="result_fail_reason" />
+        <result property="create_time" column="create_time" />
+        <result property="update_time" column="update_time" />
+    </resultMap>
+
+    <!-- 列表 -->
+    <select id="queryAiGenerateVideoList" resultMap="resultMapAiGenerateVideo">
+        SELECT <include refid="includeAiGenerateVideo" />
+        FROM ai_generate_video_task
+        <where>
+            user_id = #{user_id}
+            <if test="job_id != null and job_id != ''">
+                AND job_id = #{job_id}
+            </if>
+            <if test="title != null and title != ''">
+                AND title LIKE CONCAT('%', #{title}, '%')
+            </if>
+            <if test="product_type != null and product_type != ''">
+                AND product_type = #{product_type}
+            </if>
+            <if test="job_status != null and job_status != ''">
+                AND job_status = #{job_status}
+            </if>
+        </where>
+        ORDER BY create_time DESC
+    </select>
+
+    <!-- 详情 -->
+    <select id="queryAiGenerateVideoDetail" resultMap="resultMapAiGenerateVideo">
+        SELECT <include refid="includeAiGenerateVideo" />
+        FROM ai_generate_video_task
+        WHERE job_id = #{job_id} AND user_id = #{user_id}
+    </select>
+
+    <!-- 插入 -->
+    <insert id="insertAiGenerateVideo" parameterType="com.backendsys.entity.Ai.AiGenerateVideoDTO"
+        useGeneratedKeys="true" keyProperty="job_id">
+        INSERT INTO ai_generate_video_task (
+            user_id, job_id, title, source, product_type, resolution
+            <if test="tts_per != null and tts_per != ''">, tts_per</if>
+            <if test="bg_music_url != null and bg_music_url != ''">, bg_music_url</if>
+            <if test="video_begin_url != null and video_begin_url != ''">, video_begin_url</if>
+            <if test="video_end_url != null and video_end_url != ''">, video_end_url</if>
+            <if test="video_logo_url != null and video_logo_url != ''">, video_logo_url</if>
+            <if test="video_logo_location != null and video_logo_location != ''">, video_logo_location</if>
+            <if test="video_logo_margin != null and video_logo_margin != ''">, video_logo_margin</if>
+            <if test="job_status != null and job_status != ''">, job_status</if>
+        )
+        VALUES (
+            #{user_id}, #{job_id}, #{title}, #{source}, #{product_type}, #{resolutionString}
+            <if test="tts_per != null and tts_per != ''">, #{tts_per}</if>
+            <if test="bg_music_url != null and bg_music_url != ''">, #{bg_music_url}</if>
+            <if test="video_begin_url != null and video_begin_url != ''">, #{video_begin_url}</if>
+            <if test="video_end_url != null and video_end_url != ''">, #{video_end_url}</if>
+            <if test="video_logo_url != null and video_logo_url != ''">, #{video_logo_url}</if>
+            <if test="video_logo_location != null and video_logo_location != ''">, #{video_logo_location}</if>
+            <if test="video_logo_margin != null and video_logo_margin != ''">, #{video_logo_margin}</if>
+            <if test="job_status != null and job_status != ''">, #{job_status}</if>
+        )
+    </insert>
+
+    <!-- 更新 -->
+    <update id="updateAiGenerateVideo" parameterType="com.backendsys.entity.Ai.AiGenerateVideoDTO"
+        useGeneratedKeys="true" keyProperty="job_id">
+        UPDATE ai_generate_video_task
+        SET job_status = #{job_status}
+            <if test="result_video_url != null and result_video_url != ''">, result_video_url = #{result_video_url}</if>
+            <if test="result_points != null and result_points != ''">, result_points = #{result_points}</if>
+            <if test="result_basic_duration != null and result_basic_duration != ''">, result_basic_duration = #{result_basic_duration}</if>
+            <if test="result_fail_reason != null and result_fail_reason != ''">, result_fail_reason = #{result_fail_reason}</if>
+        WHERE job_id = #{job_id} AND user_id = #{user_id}
+    </update>
+
+    <delete id="deleteAiGenerateVideo">
+        DELETE FROM ai_generate_video_task WHERE job_id = #{job_id} AND user_id = #{user_id}
+    </delete>
+
+</mapper>