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