康鲁杰
2025-04-14 3d7bdb31c73b4f88bfa989eefe5301b344f88b07
yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/controller/admin/coursemedia/vo/CourseMediaRespVO.java
@@ -2,6 +2,7 @@
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import com.baomidou.mybatisplus.annotation.TableField;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@@ -83,4 +84,6 @@
    private String videoUrl;
    @Schema(description = "字幕语言")
    private String lang;
    private Integer pos;
    private String progressVideo;
}
yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/dal/dataobject/coursemedia/CourseMediaDO.java
@@ -2,10 +2,7 @@
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
import cn.iocoder.yudao.module.digitalcourse.dal.dataobject.voices.AuditionVO;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.KeySequence;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.*;
import lombok.*;
/**
@@ -98,4 +95,8 @@
    private Integer subtitlesAddStatus;
    private String videoUrl;
    private String lang;
    @TableField(exist = false)
    private Integer pos;
    @TableField(exist = false)
    private String progressVideo;
}
yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/manager/MediaTaskManager.java
@@ -72,6 +72,9 @@
        return -1;
    }
    public int getQueueSize() {
        return queue.size();
    }
    private void startWorker() {
        executor.submit(() -> {
            while (true) {
yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/service/coursemedia/CourseMediaServiceImpl.java
@@ -9,6 +9,7 @@
import cn.iocoder.yudao.module.digitalcourse.dal.mysql.coursemedia.CourseMediaMapper;
import cn.iocoder.yudao.module.digitalcourse.manager.MediaTaskManager;
import cn.iocoder.yudao.module.digitalcourse.model.MediaTask;
import cn.iocoder.yudao.module.infra.api.config.ConfigApi;
import com.alibaba.fastjson.JSON;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
@@ -19,6 +20,7 @@
import static cn.iocoder.yudao.framework.common.exception.enums.GlobalErrorCodeConstants.BAD_REQUEST;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import java.io.File;
import java.io.IOException;
import java.time.LocalDateTime;
@@ -80,9 +82,57 @@
    @Override
    public PageResult<CourseMediaDO> getCourseMediaPage(CourseMediaPageReqVO pageReqVO) {
        return courseMediaMapper.selectPage(pageReqVO);
    }
        PageResult<CourseMediaDO> courseMediaDOPageResult = courseMediaMapper.selectPage(pageReqVO);
        for (CourseMediaDO courseMediaDO : courseMediaDOPageResult.getList()) {
           if (courseMediaDO.getStatus() == 1) {
               //视频合成中 查询排队和合成进度
               Long id = courseMediaDO.getCourseId();
               int pos = mediaTaskManager.getQueuePosition(id);
               if (pos == -1) {
                   //不在队列中,说明已经合成完成
                   courseMediaDO.setStatus(3);
                   courseMediaMapper.updateById(courseMediaDO);
               }
               if (pos == 0) {
                   //正在合成中
                   String reqJson = courseMediaDO.getReqJson();
                   CourseMediaMegerVO courseMediaMegerVO = JSON.parseObject(reqJson, CourseMediaMegerVO.class);
                   int size = courseMediaMegerVO.getScenes().size();
                   String s = configApi.getConfigValueByKey(HEYGEM_FACE2FACE) + "/temp/";
                   //查询s下面的文件
                   File folder = new File(s);
                   int count = 0;
                   if (folder.exists() && folder.isDirectory()) {
                       File[] files = folder.listFiles();
                       if (files != null) {
                           for (File file : files) {
                               if (file.isFile() && file.getName().endsWith("-r.mp4")) {
                                   count++;
                                   System.out.println("匹配文件: " + file.getName());
                               }
                           }
                       }
                       System.out.println("总计匹配 -r.mp4 文件数量: " + count);
                   } else {
                       System.out.println("路径不存在或不是目录");
                   }
                   if (count+1>size){
                       courseMediaDO.setProgressVideo((count) + "/" + size);
                   }else{
                       courseMediaDO.setProgressVideo((count+1)+"/"+size);
                   }
               }
               courseMediaDO.setPos(pos);
           }
        }
        return courseMediaDOPageResult;
    }
    private static final String HEYGEM_FACE2FACE = "heygem.face2face";
    @Resource
    private ConfigApi configApi;
    @Override
    public CommonResult megerMedia(CourseMediaMegerVO updateReqVO) {
        Long id = updateReqVO.getId();