From 5d34fde28b22e7f020028ee8bbcd5cd2f50426da Mon Sep 17 00:00:00 2001
From: 康鲁杰 <60095866+KangLujie@users.noreply.github.com>
Date: 星期五, 11 四月 2025 15:28:19 +0800
Subject: [PATCH] 字幕

---
 yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/controller/admin/coursemedia/CourseMediaController.java        |   27 +++
 yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/controller/admin/coursemedia/vo/CourseMediaRespVO.java         |   10 +
 easegen-front/vite.config.ts                                                                                                                                                 |    8 
 yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/controller/admin/coursemedia/vo/CourseMediaSaveReqVO.java      |    4 
 yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/service/coursemedia/CourseMediaServiceImpl.java                |   40 ++++++
 yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/dal/dataobject/coursemedia/CourseMediaDO.java                  |    7 +
 yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/framework/file/core/client/AbstractFileClient.java                                     |    2 
 yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/controller/admin/coursemedia/vo/CourseMediaEditSReqVO.java     |   18 +++
 easegen-front/.env.prod                                                                                                                                                      |   22 +-
 yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/controller/admin/coursemedia/vo/CourseMediaSubtitlesReqVO.java |   24 ++++
 yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/service/coursemedia/CourseMediaServiceUtil.java                |  152 +++++++++++++++++++++++-
 yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/service/coursemedia/CourseMediaService.java                    |   11 +
 yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/service/voices/VoicesServiceImpl.java                          |    5 
 13 files changed, 289 insertions(+), 41 deletions(-)

diff --git a/easegen-front/.env.prod b/easegen-front/.env.prod
index 0492e4c..0f4df68 100644
--- a/easegen-front/.env.prod
+++ b/easegen-front/.env.prod
@@ -1,12 +1,12 @@
-# 鐢熶骇鐜锛氬彧鍦ㄦ墦鍖呮椂浣跨敤
-NODE_ENV=production
+# 鏈湴寮�鍙戠幆澧冿細鏈湴鍚姩鎵�鏈夐」鐩紙鍓嶇銆佸悗绔�丄PP锛夋椂浣跨敤锛屼笉渚濊禆澶栭儴鐜
+NODE_ENV=development
 
-VITE_DEV=false
+VITE_DEV=true
 
 # 璇锋眰璺緞
-VITE_BASE_URL='http://127.0.0.1:48080'
+VITE_BASE_URL=''
 
-# 鏂囦欢涓婁紶绫诲瀷锛歴erver - 鍚庣涓婁紶锛� client - 鍓嶇鐩磋繛涓婁紶锛屼粎鏀寔S3鏈嶅姟
+# 鏂囦欢涓婁紶绫诲瀷锛歴erver - 鍚庣涓婁紶锛� client - 鍓嶇鐩磋繛涓婁紶锛屼粎鏀寔 S3 鏈嶅姟
 VITE_UPLOAD_TYPE=server
 # 涓婁紶璺緞
 VITE_UPLOAD_URL='http://127.0.0.1:48080/admin-api/infra/file/upload'
@@ -15,10 +15,10 @@
 VITE_API_URL=/admin-api
 
 # 鏄惁鍒犻櫎debugger
-VITE_DROP_DEBUGGER=true
+VITE_DROP_DEBUGGER=false
 
 # 鏄惁鍒犻櫎console.log
-VITE_DROP_CONSOLE=true
+VITE_DROP_CONSOLE=false
 
 # 鏄惁sourcemap
 VITE_SOURCEMAP=false
@@ -26,8 +26,8 @@
 # 鎵撳寘璺緞
 VITE_BASE_PATH=/
 
-# 杈撳嚭璺緞
-VITE_OUT_DIR=dist-prod
-
 # 鍟嗗煄H5浼氬憳绔煙鍚�
-VITE_MALL_H5_DOMAIN='http://mall.yudao.iocoder.cn'
+VITE_MALL_H5_DOMAIN='http://192.168.3.159:3000'
+
+# 楠岃瘉鐮佺殑寮�鍏�
+VITE_APP_CAPTCHA_ENABLE=false
diff --git a/easegen-front/vite.config.ts b/easegen-front/vite.config.ts
index f8b2433..17aa639 100644
--- a/easegen-front/vite.config.ts
+++ b/easegen-front/vite.config.ts
@@ -35,10 +35,10 @@
             host: "0.0.0.0",
             open: env.VITE_OPEN === 'true',
 
-            /* headers: {
-                "Cross-Origin-Opener-Policy": "same-origin", // 淇濇姢浣犵殑婧愮珯鐐瑰厤鍙楁敾鍑�
-                "Cross-Origin-Embedder-Policy": "require-corp", // 淇濇姢鍙楀鑰呭厤鍙椾綘鐨勬簮绔欑偣鐨勫奖鍝�
-            }, */
+            // headers: {
+            //     "Cross-Origin-Opener-Policy": "same-origin", // 淇濇姢浣犵殑婧愮珯鐐瑰厤鍙楁敾鍑�
+            //     "Cross-Origin-Embedder-Policy": "require-corp", // 淇濇姢鍙楀鑰呭厤鍙椾綘鐨勬簮绔欑偣鐨勫奖鍝�
+            // },
             // 鏈湴璺ㄥ煙浠g悊. 鐩墠娉ㄩ噴鐨勫師鍥狅細鏆傛椂娌℃湁鐢ㄩ�旓紝server 绔凡缁忔敮鎸佽法鍩�
             // proxy: {
             //   ['/admin-api']: {
diff --git a/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/controller/admin/coursemedia/CourseMediaController.java b/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/controller/admin/coursemedia/CourseMediaController.java
index 7153e08..7f9b302 100644
--- a/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/controller/admin/coursemedia/CourseMediaController.java
+++ b/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/controller/admin/coursemedia/CourseMediaController.java
@@ -6,10 +6,7 @@
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
-import cn.iocoder.yudao.module.digitalcourse.controller.admin.coursemedia.vo.CourseMediaMegerVO;
-import cn.iocoder.yudao.module.digitalcourse.controller.admin.coursemedia.vo.CourseMediaPageReqVO;
-import cn.iocoder.yudao.module.digitalcourse.controller.admin.coursemedia.vo.CourseMediaRespVO;
-import cn.iocoder.yudao.module.digitalcourse.controller.admin.coursemedia.vo.CourseMediaSaveReqVO;
+import cn.iocoder.yudao.module.digitalcourse.controller.admin.coursemedia.vo.*;
 import cn.iocoder.yudao.module.digitalcourse.controller.admin.courses.vo.AppCoursesUpdateReqVO;
 import cn.iocoder.yudao.module.digitalcourse.dal.dataobject.coursemedia.CourseMediaDO;
 import cn.iocoder.yudao.module.digitalcourse.service.coursemedia.CourseMediaService;
@@ -114,4 +111,24 @@
         return courseMediaService.reMegerMedia(mediaMegerVO);
     }
 
-}
\ No newline at end of file
+    /**
+     * 鐢熸垚瀛楀箷
+     */
+    @PostMapping("/createSubtitles")
+    public CommonResult createSubtitles(@RequestBody CourseMediaSubtitlesReqVO courseMediaSubtitlesReqVO){
+        return courseMediaService.createSubtitles(courseMediaSubtitlesReqVO);
+    }
+    /**
+     * 鐢熸垚甯﹀瓧骞曡棰�
+     */
+    @PostMapping("/createSubtitlesVideo")
+    public CommonResult createSubtitlesVideo(@RequestBody CourseMediaSubtitlesReqVO courseMediaSubtitlesReqVO){
+        return courseMediaService.createSubtitlesVideo(courseMediaSubtitlesReqVO);
+    }
+
+    @PutMapping("/updateSubtitles")
+    public CommonResult<Boolean> updateSubtitles(@Valid @RequestBody CourseMediaEditSReqVO updateReqVO) {
+        courseMediaService.updateSubtitles(updateReqVO);
+        return success(true);
+    }
+}
diff --git a/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/controller/admin/coursemedia/vo/CourseMediaEditSReqVO.java b/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/controller/admin/coursemedia/vo/CourseMediaEditSReqVO.java
new file mode 100644
index 0000000..165b9d9
--- /dev/null
+++ b/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/controller/admin/coursemedia/vo/CourseMediaEditSReqVO.java
@@ -0,0 +1,18 @@
+package cn.iocoder.yudao.module.digitalcourse.controller.admin.coursemedia.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+
+@Schema(description = "绠$悊鍚庡彴 - 淇敼瀛楀箷鍦板潃 Request VO")
+@Data
+public class CourseMediaEditSReqVO {
+
+    @Schema(description = "缂栧彿", requiredMode = Schema.RequiredMode.REQUIRED, example = "12757")
+    private Long id;
+
+    private String subtitlesUrl;
+
+
+
+}
diff --git a/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/controller/admin/coursemedia/vo/CourseMediaRespVO.java b/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/controller/admin/coursemedia/vo/CourseMediaRespVO.java
index dfc7ea1..bb7091f 100644
--- a/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/controller/admin/coursemedia/vo/CourseMediaRespVO.java
+++ b/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/controller/admin/coursemedia/vo/CourseMediaRespVO.java
@@ -75,4 +75,12 @@
     @Schema(description = "鑳屾櫙鍥剧墖")
     private String thumbnail;
 
-}
\ No newline at end of file
+    @Schema(description = "瀛楀箷鏂囦欢鐢熸垚鐘舵��1鍚堟垚涓紝2鎴愬姛锛�3澶辫触")
+    private Integer subtitlesStatus;
+    @Schema(description = "瑙嗛娣诲姞瀛楀箷鐘舵��1娣诲姞涓紝2鎴愬姛锛�3澶辫触")
+    private Integer subtitlesAddStatus;
+    @Schema(description = "甯﹀瓧骞曟枃浠剁殑瑙嗛鍦板潃")
+    private String videoUrl;
+    @Schema(description = "瀛楀箷璇█")
+    private String lang;
+}
diff --git a/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/controller/admin/coursemedia/vo/CourseMediaSaveReqVO.java b/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/controller/admin/coursemedia/vo/CourseMediaSaveReqVO.java
index 996302f..fa6a9ef 100644
--- a/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/controller/admin/coursemedia/vo/CourseMediaSaveReqVO.java
+++ b/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/controller/admin/coursemedia/vo/CourseMediaSaveReqVO.java
@@ -42,4 +42,6 @@
     @Schema(description = "鑳屾櫙鍥剧墖")
     private String thumbnail;
 
-}
\ No newline at end of file
+
+
+}
diff --git a/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/controller/admin/coursemedia/vo/CourseMediaSubtitlesReqVO.java b/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/controller/admin/coursemedia/vo/CourseMediaSubtitlesReqVO.java
new file mode 100644
index 0000000..56d38f0
--- /dev/null
+++ b/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/controller/admin/coursemedia/vo/CourseMediaSubtitlesReqVO.java
@@ -0,0 +1,24 @@
+package cn.iocoder.yudao.module.digitalcourse.controller.admin.coursemedia.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+
+@Schema(description = "绠$悊鍚庡彴 - 璇剧▼濯掍綋瀛楀箷 Request VO")
+@Data
+public class CourseMediaSubtitlesReqVO {
+
+    @Schema(description = "缂栧彿", requiredMode = Schema.RequiredMode.REQUIRED, example = "12757")
+    private Long id;
+
+    @Schema(description = "瀛楀箷鏂囦欢鍦板潃")
+    private String subtitlesUrl;
+    @Schema(description = "瀛楀箷鏂囦欢鐢熸垚鐘舵��1鍚堟垚涓紝2鎴愬姛锛�3澶辫触")
+    private Integer subtitlesStatus;
+    @Schema(description = "瑙嗛娣诲姞瀛楀箷鐘舵��1娣诲姞涓紝2鎴愬姛锛�3澶辫触")
+    private Integer subtitlesAddStatus;
+    @Schema(description = "甯﹀瓧骞曟枃浠剁殑瑙嗛鍦板潃")
+    private String videoUrl;
+    private String lang;
+    private String sentenceGap;
+}
diff --git a/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/dal/dataobject/coursemedia/CourseMediaDO.java b/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/dal/dataobject/coursemedia/CourseMediaDO.java
index 39e2f19..af57fc8 100644
--- a/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/dal/dataobject/coursemedia/CourseMediaDO.java
+++ b/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/dal/dataobject/coursemedia/CourseMediaDO.java
@@ -93,4 +93,9 @@
     * 棰勪及鎵�闇�鎵i櫎鐨勭Н鍒�
     * */
     private Integer expectedReducePoint;
-}
\ No newline at end of file
+
+    private Integer subtitlesStatus;
+    private Integer subtitlesAddStatus;
+    private String videoUrl;
+    private String lang;
+}
diff --git a/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/service/coursemedia/CourseMediaService.java b/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/service/coursemedia/CourseMediaService.java
index aae834e..c07cb5e 100644
--- a/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/service/coursemedia/CourseMediaService.java
+++ b/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/service/coursemedia/CourseMediaService.java
@@ -2,9 +2,7 @@
 
 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
-import cn.iocoder.yudao.module.digitalcourse.controller.admin.coursemedia.vo.CourseMediaMegerVO;
-import cn.iocoder.yudao.module.digitalcourse.controller.admin.coursemedia.vo.CourseMediaPageReqVO;
-import cn.iocoder.yudao.module.digitalcourse.controller.admin.coursemedia.vo.CourseMediaSaveReqVO;
+import cn.iocoder.yudao.module.digitalcourse.controller.admin.coursemedia.vo.*;
 import cn.iocoder.yudao.module.digitalcourse.controller.admin.courses.vo.AppCoursesUpdateReqVO;
 import cn.iocoder.yudao.module.digitalcourse.dal.dataobject.coursemedia.CourseMediaDO;
 import jakarta.validation.Valid;
@@ -60,4 +58,9 @@
     CommonResult reMegerMedia(CourseMediaMegerVO updateReqVO);
 
 
-}
\ No newline at end of file
+    CommonResult createSubtitles(CourseMediaSubtitlesReqVO courseMediaSubtitlesReqVO);
+
+    CommonResult createSubtitlesVideo(CourseMediaSubtitlesReqVO courseMediaSubtitlesReqVO);
+
+    void updateSubtitles(CourseMediaEditSReqVO updateReqVO);
+}
diff --git a/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/service/coursemedia/CourseMediaServiceImpl.java b/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/service/coursemedia/CourseMediaServiceImpl.java
index 18e62fc..f69a99f 100644
--- a/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/service/coursemedia/CourseMediaServiceImpl.java
+++ b/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/service/coursemedia/CourseMediaServiceImpl.java
@@ -4,9 +4,7 @@
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX;
-import cn.iocoder.yudao.module.digitalcourse.controller.admin.coursemedia.vo.CourseMediaMegerVO;
-import cn.iocoder.yudao.module.digitalcourse.controller.admin.coursemedia.vo.CourseMediaPageReqVO;
-import cn.iocoder.yudao.module.digitalcourse.controller.admin.coursemedia.vo.CourseMediaSaveReqVO;
+import cn.iocoder.yudao.module.digitalcourse.controller.admin.coursemedia.vo.*;
 import cn.iocoder.yudao.module.digitalcourse.dal.dataobject.coursemedia.CourseMediaDO;
 import cn.iocoder.yudao.module.digitalcourse.dal.mysql.coursemedia.CourseMediaMapper;
 import cn.iocoder.yudao.module.digitalcourse.manager.MediaTaskManager;
@@ -136,6 +134,42 @@
 
     }
 
+    @Override
+    public CommonResult createSubtitles(CourseMediaSubtitlesReqVO courseMediaSubtitlesReqVO) {
+        CourseMediaDO courseMediaDO1 = courseMediaMapper.selectOne(new QueryWrapperX<CourseMediaDO>().lambda().eq(CourseMediaDO::getId, courseMediaSubtitlesReqVO.getId()));
 
+        if (courseMediaDO1.getSubtitlesStatus()!= null && courseMediaDO1.getSubtitlesStatus() == 1) {
+            throw new RuntimeException("瀛楀箷鐢熸垚涓紝璇峰嬁閲嶅鎻愪氦");
+        }
+        CourseMediaDO courseMediaDO = new CourseMediaDO();
+        courseMediaDO.setId(courseMediaSubtitlesReqVO.getId());
+        courseMediaDO.setSubtitlesStatus(1);
+        courseMediaMapper.updateById(courseMediaDO);
+        courseMediaServiceUtil.createSubtitles(courseMediaSubtitlesReqVO);
+        return CommonResult.success("瑙嗛瀛楀箷鐢熸垚涓紝璇风◢鍚庢煡鐪�");
+    }
 
+    @Override
+    public CommonResult createSubtitlesVideo(CourseMediaSubtitlesReqVO courseMediaSubtitlesReqVO) {
+        CourseMediaDO courseMediaDO1 = courseMediaMapper.selectOne(new QueryWrapperX<CourseMediaDO>().lambda().eq(CourseMediaDO::getId, courseMediaSubtitlesReqVO.getId()).eq(CourseMediaDO::getSubtitlesStatus, 2));
+        if (courseMediaDO1 == null) {
+            return CommonResult.error(BAD_REQUEST.getCode(), "瀛楀箷鏂囦欢涓嶅瓨鍦ㄦ垨鏈敓鎴�");
+        }
+        CourseMediaDO courseMediaDO = new CourseMediaDO();
+        courseMediaDO.setCourseId(courseMediaSubtitlesReqVO.getId());
+        courseMediaDO.setSubtitlesAddStatus(1);
+        courseMediaMapper.updateById(courseMediaDO);
+        courseMediaServiceUtil.createSubtitlesVideo(courseMediaDO1);
+        return CommonResult.success("瑙嗛娣诲姞瀛楀箷涓紝璇风◢鍚庢煡鐪�");
+    }
+
+    @Override
+    public void updateSubtitles(CourseMediaEditSReqVO updateReqVO) {
+        // 鏍¢獙瀛樺湪
+        validateCourseMediaExists(updateReqVO.getId());
+        // 鏇存柊
+        CourseMediaDO updateObj = BeanUtils.toBean(updateReqVO, CourseMediaDO.class);
+        updateObj.setSubtitlesStatus(2);
+        courseMediaMapper.updateById(updateObj);
+    }
 }
diff --git a/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/service/coursemedia/CourseMediaServiceUtil.java b/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/service/coursemedia/CourseMediaServiceUtil.java
index 75b9a00..9a5c497 100644
--- a/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/service/coursemedia/CourseMediaServiceUtil.java
+++ b/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/service/coursemedia/CourseMediaServiceUtil.java
@@ -3,10 +3,12 @@
 import cn.hutool.core.io.FileUtil;
 import cn.hutool.core.util.RandomUtil;
 import cn.hutool.core.util.StrUtil;
+import cn.hutool.http.HttpException;
 import cn.hutool.http.HttpRequest;
 import cn.hutool.http.HttpResponse;
 import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX;
 import cn.iocoder.yudao.module.digitalcourse.controller.admin.coursemedia.vo.CourseMediaMegerVO;
+import cn.iocoder.yudao.module.digitalcourse.controller.admin.coursemedia.vo.CourseMediaSubtitlesReqVO;
 import cn.iocoder.yudao.module.digitalcourse.controller.admin.coursescenecomponents.vo.AppCourseSceneComponentsMegerReqVO;
 import cn.iocoder.yudao.module.digitalcourse.controller.admin.coursescenes.vo.AppCourseScenesMegerReqVO;
 import cn.iocoder.yudao.module.digitalcourse.dal.dataobject.coursemedia.CourseMediaDO;
@@ -21,6 +23,7 @@
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import jakarta.annotation.Resource;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.scheduling.annotation.Async;
@@ -33,6 +36,7 @@
 import java.math.RoundingMode;
 import java.nio.file.Files;
 import java.nio.file.Path;
+import java.nio.file.Paths;
 import java.nio.file.StandardCopyOption;
 import java.text.SimpleDateFormat;
 import java.time.LocalDateTime;
@@ -50,6 +54,11 @@
 
     static final String EASEGEN_CORE_KEY = "easegen.core.key";
 
+    static final String SUBTITLES_URL  = "subtitles.url";
+    private static final String EASEGEN_URL = "easegen.url";
+    private static final String SUBTITLES = "subtitles";
+    private static final String F2F = "f2f";
+    private static final String HEYGEM_FACE2FACE = "heygem.face2face";
     @Resource
     private CourseMediaMapper courseMediaMapper;
 
@@ -74,7 +83,7 @@
      * @return
      */
     public void remoteMegerMedia(CourseMediaMegerVO updateReqVO) {
-        FileUtil.clean("D:/heygem_data/face2face/temp/");
+        FileUtil.clean(configApi.getConfigValueByKey(HEYGEM_FACE2FACE) +"/temp/");
         CourseMediaDO courseMediaDO = courseMediaMapper.selectById(updateReqVO.getCourseMediaId());
         courseMediaDO.setStatus(1);
         courseMediaMapper.updateById(courseMediaDO);
@@ -109,15 +118,15 @@
             // 鎻愬彇闊抽鏂囦欢鍚嶏紙璺緞鐨勬渶鍚庝竴閮ㄥ垎锛�
             String substring = configApi.getConfigValueByKey("easegen.url") + audition.substring(audition.lastIndexOf("/"));
             String fileName = audition.substring(audition.lastIndexOf('/') + 1);
-            String newFileName = "D:/heygem_data/face2face/temp/" + fileName;
+            String newFileName = configApi.getConfigValueByKey(HEYGEM_FACE2FACE) +"/temp/" + fileName;
             // 鎻愬彇瑙嗛鏂囦欢鍚嶏紙璺緞鐨勬渶鍚庝竴閮ㄥ垎锛�
             String substring1 = configApi.getConfigValueByKey("easegen.url") + digitalHumansDO.getFixVideoUrl().substring(digitalHumansDO.getFixVideoUrl().lastIndexOf("/"));
             String fileName1 = digitalHumansDO.getFixVideoUrl().substring(digitalHumansDO.getFixVideoUrl().lastIndexOf('/') + 1);
-            String newFileName1 = "D:/heygem_data/face2face/temp/"+fileName1;
+            String newFileName1 = configApi.getConfigValueByKey(HEYGEM_FACE2FACE) +"/temp/"+fileName1;
             //鑾峰彇鏃堕棿鎴�
             Date date = new Date();
             long timestamp = date.getTime();
-            String newFileName2 = "D:/heygem_data/face2face/temp/"+timestamp+".mp4";
+            String newFileName2 = configApi.getConfigValueByKey(HEYGEM_FACE2FACE) +"/temp/"+timestamp+".mp4";
             //鑾峰彇PPT鍐呭
             String cover = scene.getComponents().get(1).getSrc();
             cover = configApi.getConfigValueByKey("easegen.url") + scene.getComponents().get(1).getSrc().substring(scene.getComponents().get(1).getSrc().lastIndexOf("/"));
@@ -202,7 +211,7 @@
                     objectObjectHashMap.put("chaofen", 0);
                     objectObjectHashMap.put("watermark_switch", 0);
                     objectObjectHashMap.put("pn", 1);
-                    HttpResponse execute = HttpRequest.post("http://192.168.3.161:8383/easy/submit")
+                    HttpResponse execute = HttpRequest.post(configApi.getConfigValueByKey(F2F) +"/easy/submit")
                             .body(JSON.toJSONString(objectObjectHashMap))
                             .execute();
                     String body = execute.body();
@@ -237,7 +246,18 @@
 
                     //璋冪敤鏌ヨ瑙嗛缁撴灉
                     String result = getResult(code);
-                    result = "D:/heygem_data/face2face/temp" + result;
+                    if (result == null) {
+                        retryCount++;
+                        if (retryCount >= maxRetries) {
+                            // 瓒呰繃閲嶈瘯娆℃暟锛屾洿鏂扮姸鎬佸拰閿欒淇℃伅
+                            courseMediaDO.setStatus(3); // 3 琛ㄧず鍚堟垚澶辫触
+                            courseMediaDO.setErrorReason(truncateErrorMsg("瑙嗛鍚堟垚浠诲姟澶辫触锛岃鑱旂郴绠$悊鍛橈紝閿欒淇℃伅: " + execute.getStatus()));
+                            courseMediaMapper.updateById(courseMediaDO);
+                            return;
+                        }
+                        continue; // 閲嶆柊灏濊瘯
+                    }
+                    result = configApi.getConfigValueByKey(HEYGEM_FACE2FACE) +"/temp" + result;
                     videoUrls.add(result);
                     System.out.println("椹卞姩瑙嗛鍚�"+result);
                 } catch (Exception e) {
@@ -262,7 +282,7 @@
             }
 
         }
-        String fileListPath = "D:/heygem_data/face2face/temp/filelist.txt";
+        String fileListPath = configApi.getConfigValueByKey(HEYGEM_FACE2FACE) +"/temp/filelist.txt";
         try (BufferedWriter writer = new BufferedWriter(new FileWriter(fileListPath))) {
             for (String path : videoUrls) {
                 writer.write("file '" + path + "'\n");
@@ -294,7 +314,7 @@
             throw new RuntimeException(e);
         }
         // "D:/heygem_data/face2face/temp/"+"111111.mp4"灏嗚繖涓枃浠惰浆鎴恇yte[]
-        byte[] bytes = FileUtil.readBytes(FileUtil.file("D:/heygem_data/face2face/temp/"+"111111.mp4"));
+        byte[] bytes = FileUtil.readBytes(FileUtil.file(configApi.getConfigValueByKey(HEYGEM_FACE2FACE) +"/temp/"+"111111.mp4"));
         String file = fileApi.createFile(bytes);
         // 濡傛灉鎴愬姛锛屾洿鏂扮姸鎬佷负1锛堟垚鍔燂級
         courseMediaDO.setStatus(2);
@@ -322,7 +342,7 @@
         do {
             try {
                 // 璋冪敤鎺ュ彛鑾峰彇浠诲姟鐘舵�侊紙鍋囪浣跨敤 Hutool 鐨� HttpRequest锛�
-                String body = HttpRequest.get("http://192.168.3.161:8383/easy/query?code=" + taskCode)
+                String body = HttpRequest.get(configApi.getConfigValueByKey(F2F) + "/easy/query?code=" + taskCode)
                         .execute()
                         .body();
 
@@ -547,4 +567,118 @@
             ex.printStackTrace();
         }
     }
+
+    @Async
+    public void createSubtitles(CourseMediaSubtitlesReqVO courseMediaSubtitlesReqVO) {
+        String subtitlesUrl = configApi.getConfigValueByKey(SUBTITLES_URL);
+        CourseMediaDO courseMediaDO = courseMediaMapper.selectById(courseMediaSubtitlesReqVO.getId());
+        if (courseMediaDO.getStatus()!= 2) {
+            throw new RuntimeException("瑙嗛鍚堟垚澶辫触锛屾棤娉曠敓鎴愬瓧骞�");
+        }
+
+        String previewUrl = courseMediaDO.getPreviewUrl();
+        String subtitles = configApi.getConfigValueByKey(SUBTITLES);
+        String extname = previewUrl.substring(previewUrl.lastIndexOf("."));
+        //杩欎釜鏄痜ile鍙傛暟
+        String modelFileName = new SimpleDateFormat("yyyyMMddHHmmssSSS").format(new Date()) + extname;
+        String modelFilePath = Paths.get(subtitles, modelFileName).toString();
+        String substring = configApi.getConfigValueByKey(EASEGEN_URL) + previewUrl.substring(previewUrl.lastIndexOf("/"));
+        try {
+            Files.copy(Path.of(substring), Path.of(modelFilePath), StandardCopyOption.REPLACE_EXISTING);
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+        try {
+            // 鍙戦�丳OST璇锋眰
+            HttpResponse execute = HttpRequest.get(subtitlesUrl + "/get_subtitles?file=" + modelFileName+"&lang="+courseMediaSubtitlesReqVO.getLang()+"&sentence_gap="+courseMediaSubtitlesReqVO.getSentenceGap()).execute();
+            String body = execute.body();
+            // 妫�鏌ュ搷搴旂姸鎬佺爜鏄惁鎴愬姛
+            if (execute.getStatus() != 200) {
+                courseMediaMapper.update(new UpdateWrapper<CourseMediaDO>().lambda().eq(CourseMediaDO::getId, courseMediaSubtitlesReqVO.getId()).set(CourseMediaDO::getSubtitlesStatus, 3));
+                return;
+            }
+            // 瑙f瀽鍝嶅簲锛屾鏌ユ槸鍚︽湁閿欒淇℃伅
+            JSONObject responseJson = JSON.parseObject(body);
+            String final_video_path = responseJson.getString("subtitle_file");
+            //鑾峰彇鏂囦欢鍚�
+            int index1 = final_video_path.lastIndexOf('/');
+            int index2 = final_video_path.lastIndexOf('\\');
+            int lastIndex = Math.max(index1, index2); // 鍙栨渶澶т竴涓�
+            String fileName = final_video_path.substring(lastIndex + 1);
+            byte[] content = Files.readAllBytes(Paths.get(final_video_path));
+            String fileUrl = fileApi.createFile(fileName, null, content);
+            courseMediaMapper.update(
+                    new UpdateWrapper<CourseMediaDO>()
+                            .lambda()
+                            .eq(CourseMediaDO::getId, courseMediaSubtitlesReqVO.getId())  // 鏉′欢锛歝ode 绛変簬浼犲叆鐨勫��
+                            .set(CourseMediaDO::getSubtitlesUrl, fileUrl)
+                            .set(CourseMediaDO::getLang, courseMediaSubtitlesReqVO.getLang())
+                            .set(CourseMediaDO::getSubtitlesStatus,2)
+            );
+            FileUtil.del(modelFilePath);
+            FileUtil.del(final_video_path);
+            // 澶勭悊涓氬姟閫昏緫閿欒锛屾洿鏂扮姸鎬佸拰閿欒淇℃伅
+        } catch (HttpException e) {
+            throw new RuntimeException(e);
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+    }
+    @Async
+    public void createSubtitlesVideo(CourseMediaDO courseMediaDO) {
+        String subtitlesUrl1 = configApi.getConfigValueByKey(SUBTITLES_URL);
+        String previewUrl = courseMediaDO.getPreviewUrl();
+        String subtitlesUrl = courseMediaDO.getSubtitlesUrl();
+        String subtitles = configApi.getConfigValueByKey(SUBTITLES);
+        String extname = previewUrl.substring(previewUrl.lastIndexOf("."));
+        String subtitlesExtname = subtitlesUrl.substring(subtitlesUrl.lastIndexOf("."));
+        //杩欎釜鏄痜ile鍙傛暟
+        String yyyyMMddHHmmssSSS = new SimpleDateFormat("yyyyMMddHHmmssSSS").format(new Date());
+        String modelFileName = yyyyMMddHHmmssSSS + extname;
+        String subtitlesFileName = yyyyMMddHHmmssSSS + subtitlesExtname;
+        String modelFilePath = Paths.get(subtitles, modelFileName).toString();
+        String subtitlesFilePath = Paths.get(subtitles, subtitlesFileName).toString();
+        String substring = configApi.getConfigValueByKey(EASEGEN_URL) + previewUrl.substring(previewUrl.lastIndexOf("/"));
+        String subtitlesSubstring = configApi.getConfigValueByKey(EASEGEN_URL) + subtitlesUrl.substring(subtitlesUrl.lastIndexOf("/"));
+        try {
+            Files.copy(Path.of(substring), Path.of(modelFilePath), StandardCopyOption.REPLACE_EXISTING);
+            Files.copy(Path.of(subtitlesSubstring), Path.of(subtitlesFilePath), StandardCopyOption.REPLACE_EXISTING);
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+        //modelFileName 鏄棰戣矾寰勶紝subtitlesFileName 鏄瓧骞曡矾寰�
+        try {
+            // 鍙戦�丳OST璇锋眰
+            HttpResponse execute = HttpRequest.get(subtitlesUrl1 + "/add_subtitles?file=" + modelFileName+"&lang="+courseMediaDO.getLang()+"&srt="+subtitlesFileName).execute();
+            String body = execute.body();
+            // 妫�鏌ュ搷搴旂姸鎬佺爜鏄惁鎴愬姛
+            if (execute.getStatus() != 200) {
+                courseMediaMapper.update(new UpdateWrapper<CourseMediaDO>().lambda().eq(CourseMediaDO::getId, courseMediaDO.getId()).set(CourseMediaDO::getSubtitlesAddStatus, 3));
+                return;
+            }
+            // 瑙f瀽鍝嶅簲锛屾鏌ユ槸鍚︽湁閿欒淇℃伅
+            JSONObject responseJson = JSON.parseObject(body);
+            String final_video_path = responseJson.getString("subtitled_file");
+            //鑾峰彇鏂囦欢鍚�
+            int index1 = final_video_path.lastIndexOf('/');
+            int index2 = final_video_path.lastIndexOf('\\');
+            int lastIndex = Math.max(index1, index2); // 鍙栨渶澶т竴涓�
+            String fileName = final_video_path.substring(lastIndex + 1);
+            byte[] content = Files.readAllBytes(Paths.get(final_video_path));
+            String fileUrl = fileApi.createFile(fileName, null, content);
+            courseMediaMapper.update(
+                    new UpdateWrapper<CourseMediaDO>()
+                            .lambda()
+                            .eq(CourseMediaDO::getId, courseMediaDO.getId())  // 鏉′欢锛歝ode 绛変簬浼犲叆鐨勫��
+                            .set(CourseMediaDO::getVideoUrl, fileUrl)
+                            .set(CourseMediaDO::getSubtitlesAddStatus,2)
+            );
+            FileUtil.del(final_video_path);
+            // 澶勭悊涓氬姟閫昏緫閿欒锛屾洿鏂扮姸鎬佸拰閿欒淇℃伅
+        } catch (HttpException e) {
+            throw new RuntimeException(e);
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+    }
 }
diff --git a/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/service/voices/VoicesServiceImpl.java b/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/service/voices/VoicesServiceImpl.java
index 60ff852..7268984 100644
--- a/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/service/voices/VoicesServiceImpl.java
+++ b/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/service/voices/VoicesServiceImpl.java
@@ -137,6 +137,7 @@
     @Resource
     private DigitalHumansMapper digitalHumansMapper;
     private static final String EASEGEN_URL = "easegen.url";
+    private static final String HEYGEM_CORE_URL = "heygem.core.url";
     @Override
     public String audition(AuditionVO auditionVO) {
         DigitalHumansDO digitalHumansDO = digitalHumansMapper.selectById(auditionVO.getHumanId());
@@ -152,7 +153,9 @@
         } catch (JsonProcessingException e) {
             throw new RuntimeException(e);
         }
-        HttpResponse execute = HttpRequest.post("http://192.168.3.161:18180/v1/invoke")
+        String configValueByKey = configApi.getConfigValueByKey(HEYGEM_CORE_URL);
+        String url = configValueByKey + "/v1/invoke";
+        HttpResponse execute = HttpRequest.post(url)
                 .body(jsonString)
                 .execute();
 
diff --git a/yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/framework/file/core/client/AbstractFileClient.java b/yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/framework/file/core/client/AbstractFileClient.java
index 3c7883b..afe4d26 100644
--- a/yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/framework/file/core/client/AbstractFileClient.java
+++ b/yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/framework/file/core/client/AbstractFileClient.java
@@ -63,7 +63,7 @@
      * @return URL 璁块棶鍦板潃
      */
     protected String formatFileUrl(String domain, String path) {
-        return StrUtil.format("{}/admin-api/infra/file/{}/get/{}", domain, getId(), path);
+        return StrUtil.format("/admin-api/infra/file/{}/get/{}", getId(), path);
     }
 
 }

--
Gitblit v1.9.3