diff --git a/mt/src/main/java/com/ccsens/mt/api/KCPlayerController.java b/mt/src/main/java/com/ccsens/mt/api/KCPlayerController.java index cd19b869..21534c34 100644 --- a/mt/src/main/java/com/ccsens/mt/api/KCPlayerController.java +++ b/mt/src/main/java/com/ccsens/mt/api/KCPlayerController.java @@ -1,25 +1,17 @@ package com.ccsens.mt.api; -import com.ccsens.cloudutil.annotation.MustLogin; -import com.ccsens.mt.bean.dto.CompeteDto; -import com.ccsens.mt.bean.vo.CompeteVo; +import com.alibaba.fastjson.JSONObject; import com.ccsens.mt.service.IKCPlayerService; import com.ccsens.util.JsonResponse; -import com.ccsens.util.bean.dto.QueryDto; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import io.swagger.annotations.ApiParam; import lombok.extern.slf4j.Slf4j; -import org.json.JSONObject; -import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; -import java.util.List; -import java.util.Map; @Slf4j @Api(tags = "云点播", description = "") diff --git a/mt/src/main/java/com/ccsens/mt/bean/po/CompeteVideo.java b/mt/src/main/java/com/ccsens/mt/bean/po/CompeteVideo.java index 141f20a0..80ec29db 100644 --- a/mt/src/main/java/com/ccsens/mt/bean/po/CompeteVideo.java +++ b/mt/src/main/java/com/ccsens/mt/bean/po/CompeteVideo.java @@ -26,6 +26,10 @@ public class CompeteVideo implements Serializable { private Byte recStatus; + private String taskId; + + private String videoUrlOrigin; + private static final long serialVersionUID = 1L; public Long getId() { @@ -116,6 +120,22 @@ public class CompeteVideo implements Serializable { this.recStatus = recStatus; } + public String getTaskId() { + return taskId; + } + + public void setTaskId(String taskId) { + this.taskId = taskId == null ? null : taskId.trim(); + } + + public String getVideoUrlOrigin() { + return videoUrlOrigin; + } + + public void setVideoUrlOrigin(String videoUrlOrigin) { + this.videoUrlOrigin = videoUrlOrigin == null ? null : videoUrlOrigin.trim(); + } + @Override public String toString() { StringBuilder sb = new StringBuilder(); @@ -133,6 +153,8 @@ public class CompeteVideo implements Serializable { sb.append(", createdAt=").append(createdAt); sb.append(", updatedAt=").append(updatedAt); sb.append(", recStatus=").append(recStatus); + sb.append(", taskId=").append(taskId); + sb.append(", videoUrlOrigin=").append(videoUrlOrigin); sb.append("]"); return sb.toString(); } diff --git a/mt/src/main/java/com/ccsens/mt/bean/po/CompeteVideoExample.java b/mt/src/main/java/com/ccsens/mt/bean/po/CompeteVideoExample.java index 8764b36d..e097559f 100644 --- a/mt/src/main/java/com/ccsens/mt/bean/po/CompeteVideoExample.java +++ b/mt/src/main/java/com/ccsens/mt/bean/po/CompeteVideoExample.java @@ -774,6 +774,146 @@ public class CompeteVideoExample { addCriterion("rec_status not between", value1, value2, "recStatus"); return (Criteria) this; } + + public Criteria andTaskIdIsNull() { + addCriterion("task_id is null"); + return (Criteria) this; + } + + public Criteria andTaskIdIsNotNull() { + addCriterion("task_id is not null"); + return (Criteria) this; + } + + public Criteria andTaskIdEqualTo(String value) { + addCriterion("task_id =", value, "taskId"); + return (Criteria) this; + } + + public Criteria andTaskIdNotEqualTo(String value) { + addCriterion("task_id <>", value, "taskId"); + return (Criteria) this; + } + + public Criteria andTaskIdGreaterThan(String value) { + addCriterion("task_id >", value, "taskId"); + return (Criteria) this; + } + + public Criteria andTaskIdGreaterThanOrEqualTo(String value) { + addCriterion("task_id >=", value, "taskId"); + return (Criteria) this; + } + + public Criteria andTaskIdLessThan(String value) { + addCriterion("task_id <", value, "taskId"); + return (Criteria) this; + } + + public Criteria andTaskIdLessThanOrEqualTo(String value) { + addCriterion("task_id <=", value, "taskId"); + return (Criteria) this; + } + + public Criteria andTaskIdLike(String value) { + addCriterion("task_id like", value, "taskId"); + return (Criteria) this; + } + + public Criteria andTaskIdNotLike(String value) { + addCriterion("task_id not like", value, "taskId"); + return (Criteria) this; + } + + public Criteria andTaskIdIn(List values) { + addCriterion("task_id in", values, "taskId"); + return (Criteria) this; + } + + public Criteria andTaskIdNotIn(List values) { + addCriterion("task_id not in", values, "taskId"); + return (Criteria) this; + } + + public Criteria andTaskIdBetween(String value1, String value2) { + addCriterion("task_id between", value1, value2, "taskId"); + return (Criteria) this; + } + + public Criteria andTaskIdNotBetween(String value1, String value2) { + addCriterion("task_id not between", value1, value2, "taskId"); + return (Criteria) this; + } + + public Criteria andVideoUrlOriginIsNull() { + addCriterion("video_url_origin is null"); + return (Criteria) this; + } + + public Criteria andVideoUrlOriginIsNotNull() { + addCriterion("video_url_origin is not null"); + return (Criteria) this; + } + + public Criteria andVideoUrlOriginEqualTo(String value) { + addCriterion("video_url_origin =", value, "videoUrlOrigin"); + return (Criteria) this; + } + + public Criteria andVideoUrlOriginNotEqualTo(String value) { + addCriterion("video_url_origin <>", value, "videoUrlOrigin"); + return (Criteria) this; + } + + public Criteria andVideoUrlOriginGreaterThan(String value) { + addCriterion("video_url_origin >", value, "videoUrlOrigin"); + return (Criteria) this; + } + + public Criteria andVideoUrlOriginGreaterThanOrEqualTo(String value) { + addCriterion("video_url_origin >=", value, "videoUrlOrigin"); + return (Criteria) this; + } + + public Criteria andVideoUrlOriginLessThan(String value) { + addCriterion("video_url_origin <", value, "videoUrlOrigin"); + return (Criteria) this; + } + + public Criteria andVideoUrlOriginLessThanOrEqualTo(String value) { + addCriterion("video_url_origin <=", value, "videoUrlOrigin"); + return (Criteria) this; + } + + public Criteria andVideoUrlOriginLike(String value) { + addCriterion("video_url_origin like", value, "videoUrlOrigin"); + return (Criteria) this; + } + + public Criteria andVideoUrlOriginNotLike(String value) { + addCriterion("video_url_origin not like", value, "videoUrlOrigin"); + return (Criteria) this; + } + + public Criteria andVideoUrlOriginIn(List values) { + addCriterion("video_url_origin in", values, "videoUrlOrigin"); + return (Criteria) this; + } + + public Criteria andVideoUrlOriginNotIn(List values) { + addCriterion("video_url_origin not in", values, "videoUrlOrigin"); + return (Criteria) this; + } + + public Criteria andVideoUrlOriginBetween(String value1, String value2) { + addCriterion("video_url_origin between", value1, value2, "videoUrlOrigin"); + return (Criteria) this; + } + + public Criteria andVideoUrlOriginNotBetween(String value1, String value2) { + addCriterion("video_url_origin not between", value1, value2, "videoUrlOrigin"); + return (Criteria) this; + } } public static class Criteria extends GeneratedCriteria { diff --git a/mt/src/main/java/com/ccsens/mt/service/IKCPlayerService.java b/mt/src/main/java/com/ccsens/mt/service/IKCPlayerService.java index f3f45cd7..1c909253 100644 --- a/mt/src/main/java/com/ccsens/mt/service/IKCPlayerService.java +++ b/mt/src/main/java/com/ccsens/mt/service/IKCPlayerService.java @@ -1,6 +1,7 @@ package com.ccsens.mt.service; -import org.json.JSONObject; + +import com.alibaba.fastjson.JSONObject; public interface IKCPlayerService { /** diff --git a/mt/src/main/java/com/ccsens/mt/service/KCPlayerService.java b/mt/src/main/java/com/ccsens/mt/service/KCPlayerService.java index cafebab8..e14d7b61 100644 --- a/mt/src/main/java/com/ccsens/mt/service/KCPlayerService.java +++ b/mt/src/main/java/com/ccsens/mt/service/KCPlayerService.java @@ -1,7 +1,9 @@ package com.ccsens.mt.service; +import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.lang.Snowflake; import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; import com.ccsens.mt.bean.po.CompeteStartOrder; import com.ccsens.mt.bean.po.CompeteVideo; import com.ccsens.mt.bean.po.CompeteVideoExample; @@ -13,12 +15,14 @@ import com.ccsens.util.KCPlayerSignature; import com.ccsens.util.RedisUtil; import com.ccsens.util.exception.BaseException; import lombok.extern.slf4j.Slf4j; -import org.json.JSONObject; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; import java.util.Random; @Slf4j @Service @@ -67,16 +71,53 @@ public class KCPlayerService implements IKCPlayerService{ @Override public void saveVideoUrl(JSONObject jsonObject) { + log.info("云点播事件通知:{}", jsonObject); + + switch (jsonObject.getString(Constant.KCPlayer.EVENT_TYPE)) { + // 任务流状态变更 + case Constant.KCPlayer.FILE_PROCEDURE_CHANGE : procedureChange(jsonObject);break; + // 文件上传 + case Constant.KCPlayer.FILE_UPLOAD : fileUpload(jsonObject);break; + } + + + + } + + private void procedureChange(JSONObject json) { + log.info("任务流变更"); + JSONObject procedure = json.getJSONObject(Constant.KCPlayer.PROCEDURE_STATUS_CHANGE); + String taskId = procedure.getString(Constant.KCPlayer.TASK_ID); + Object result = procedure.getJSONArray(Constant.KCPlayer.PROCEDURE_RESULT).get(0); + JSONObject resultJson = JSONObject.parseObject(JSONObject.toJSONString(result)); + + String url = resultJson.getJSONObject("TranscodeTask").getJSONObject("Output").getString("Url"); + + CompeteVideoExample competeVideoExample = new CompeteVideoExample(); + competeVideoExample.createCriteria().andTaskIdEqualTo(taskId); + + List competeVideos = competeVideoMapper.selectByExample(competeVideoExample); + if (CollectionUtil.isEmpty(competeVideos)) { + log.info("{}未找到,{}", taskId, url); + return; + } + CompeteVideo competeVideo = competeVideos.get(0); + CompeteVideo update = new CompeteVideo(); + update.setId(competeVideo.getId()); + update.setVideoUrl(url); + competeVideoMapper.updateByPrimaryKeySelective(update); + } + + private void fileUpload(JSONObject jsonObject) { + log.info("文件上传"); JSONObject fileUploadEvent = jsonObject.getJSONObject("FileUploadEvent"); JSONObject mediaBasicInfo = fileUploadEvent.getJSONObject("MediaBasicInfo"); // TODO 获取回传的id(场次id) JSONObject sourceInfo = mediaBasicInfo.getJSONObject("SourceInfo"); - JSONObject sourceContext = sourceInfo.getJSONObject("SourceContext"); - Long orderId = Long.parseLong(sourceContext.toString()); + long orderId = sourceInfo.getLongValue("SourceContext"); log.info("获取场次id:{}",orderId); // TODO 获取视频路径 - JSONObject mediaUrl = mediaBasicInfo.getJSONObject("MediaUrl"); - String videoUrl = mediaUrl.toString(); + String videoUrl = mediaBasicInfo.getString("MediaUrl"); log.info("获取视频路径:{}",videoUrl); //通过场次id获取场次信息 CompeteStartOrder startOrder = startOrderMapper.selectByPrimaryKey(orderId); @@ -87,20 +128,29 @@ public class KCPlayerService implements IKCPlayerService{ CompeteVideoExample competeVideoExample = new CompeteVideoExample(); competeVideoExample.createCriteria().andProjectIdEqualTo(startOrder.getProjectId()) .andPlayerIdEqualTo(startOrder.getPlayerId()); - long count = competeVideoMapper.countByExample(competeVideoExample); - log.info("查询以前上传的视频的记录:{}",count); - if(count > 0){ - throw new BaseException(CodeEnum.ALREADY_UPLOAD_VIDEO); - } + List competeVideos = competeVideoMapper.selectByExample(competeVideoExample); - //将视频信息存入视频表 - CompeteVideo competeVideo = new CompeteVideo(); - competeVideo.setId(snowflake.nextId()); - competeVideo.setProjectId(startOrder.getProjectId()); - competeVideo.setPlayerId(startOrder.getPlayerId()); - competeVideo.setVideoUrl(videoUrl); - competeVideo.setUploadTime(System.currentTimeMillis()); - log.info("添加上传视频记录:{}",count); - competeVideoMapper.insertSelective(competeVideo); + log.info("查询以前上传的视频的记录:{}",competeVideos); + if(CollectionUtil.isNotEmpty(competeVideos)){ + CompeteVideo competeVideo = competeVideos.get(0); + CompeteVideo update = new CompeteVideo(); + update.setId(competeVideo.getId()); + update.setVideoUrl(videoUrl); + update.setVideoUrlOrigin(videoUrl); + update.setTaskId(fileUploadEvent.getString(Constant.KCPlayer.PROCEDURE_TASK_ID)); + competeVideoMapper.updateByPrimaryKeySelective(update); + } else { + //将视频信息存入视频表 + CompeteVideo competeVideo = new CompeteVideo(); + competeVideo.setId(snowflake.nextId()); + competeVideo.setProjectId(startOrder.getProjectId()); + competeVideo.setPlayerId(startOrder.getPlayerId()); + competeVideo.setVideoUrl(videoUrl); + competeVideo.setVideoUrlOrigin(videoUrl); + competeVideo.setUploadTime(System.currentTimeMillis()); + competeVideo.setTaskId(fileUploadEvent.getString(Constant.KCPlayer.PROCEDURE_TASK_ID)); + log.info("添加上传视频记录:{}", competeVideo); + competeVideoMapper.insertSelective(competeVideo); + } } } diff --git a/mt/src/main/java/com/ccsens/mt/util/Constant.java b/mt/src/main/java/com/ccsens/mt/util/Constant.java index f99ad96f..d18fd2d3 100644 --- a/mt/src/main/java/com/ccsens/mt/util/Constant.java +++ b/mt/src/main/java/com/ccsens/mt/util/Constant.java @@ -8,6 +8,18 @@ import com.ccsens.util.WebConstant; * @time: 2020/8/13 17:14 */ public class Constant { + + public static class KCPlayer{ + public final static String EVENT_TYPE = "EventType"; + public final static String PROCEDURE_RESULT = "MediaProcessResultSet"; + public final static String PROCEDURE_TASK_ID = "ProcedureTaskId"; + public final static String TASK_ID = "TaskId"; + public final static String FILE_URL = "FileUrl"; + public final static String PROCEDURE_STATUS_CHANGE = "ProcedureStateChangeEvent"; + /**文件上传*/ + public final static String FILE_UPLOAD = "NewFileUpload"; + public final static String FILE_PROCEDURE_CHANGE = "ProcedureStateChanged"; + } public static class Redis{ // 项目正在进行中的题目 项目ID_start_question public final static String START_QUESTION = "_start_question"; diff --git a/mt/src/main/resources/mapper_raw/CompeteVideoMapper.xml b/mt/src/main/resources/mapper_raw/CompeteVideoMapper.xml index 34642f49..f09ae100 100644 --- a/mt/src/main/resources/mapper_raw/CompeteVideoMapper.xml +++ b/mt/src/main/resources/mapper_raw/CompeteVideoMapper.xml @@ -13,6 +13,8 @@ + + @@ -74,7 +76,7 @@ id, compete_time_id, project_id, player_id, user_id, video_url, upload_time, upload_status, - created_at, updated_at, rec_status + created_at, updated_at, rec_status, task_id, video_url_origin @@ -231,6 +247,12 @@ rec_status = #{record.recStatus,jdbcType=TINYINT}, + + task_id = #{record.taskId,jdbcType=VARCHAR}, + + + video_url_origin = #{record.videoUrlOrigin,jdbcType=VARCHAR}, + @@ -248,7 +270,9 @@ upload_status = #{record.uploadStatus,jdbcType=TINYINT}, created_at = #{record.createdAt,jdbcType=TIMESTAMP}, updated_at = #{record.updatedAt,jdbcType=TIMESTAMP}, - rec_status = #{record.recStatus,jdbcType=TINYINT} + rec_status = #{record.recStatus,jdbcType=TINYINT}, + task_id = #{record.taskId,jdbcType=VARCHAR}, + video_url_origin = #{record.videoUrlOrigin,jdbcType=VARCHAR} @@ -286,6 +310,12 @@ rec_status = #{recStatus,jdbcType=TINYINT}, + + task_id = #{taskId,jdbcType=VARCHAR}, + + + video_url_origin = #{videoUrlOrigin,jdbcType=VARCHAR}, + where id = #{id,jdbcType=BIGINT} @@ -300,7 +330,9 @@ upload_status = #{uploadStatus,jdbcType=TINYINT}, created_at = #{createdAt,jdbcType=TIMESTAMP}, updated_at = #{updatedAt,jdbcType=TIMESTAMP}, - rec_status = #{recStatus,jdbcType=TINYINT} + rec_status = #{recStatus,jdbcType=TINYINT}, + task_id = #{taskId,jdbcType=VARCHAR}, + video_url_origin = #{videoUrlOrigin,jdbcType=VARCHAR} where id = #{id,jdbcType=BIGINT} \ No newline at end of file diff --git a/util/src/main/java/com/ccsens/util/KCPlayerSignature.java b/util/src/main/java/com/ccsens/util/KCPlayerSignature.java index 0aeef470..c0967ee8 100644 --- a/util/src/main/java/com/ccsens/util/KCPlayerSignature.java +++ b/util/src/main/java/com/ccsens/util/KCPlayerSignature.java @@ -39,7 +39,9 @@ public class KCPlayerSignature{ contextStr += "¤tTimeStamp=" + currentTime; contextStr += "&expireTime=" + endTime; contextStr += "&random=" + random; + contextStr += "&procedure=videoEncode"; contextStr += "&sourceContext=" + id; + System.out.println("------------------contextStr:" + contextStr); try { diff --git a/util/src/test/java/com/ccsens/util/VideoTest.java b/util/src/test/java/com/ccsens/util/VideoTest.java index 70026770..09d212cc 100644 --- a/util/src/test/java/com/ccsens/util/VideoTest.java +++ b/util/src/test/java/com/ccsens/util/VideoTest.java @@ -97,23 +97,23 @@ public class VideoTest { public static void main(String[] args) throws Exception { // 指定资源地址,下载文件测试 - downloadFile("http://1258473962.vod2.myqcloud.com/1e124671vodcq1258473962/d4650b135285890810564491478/wyGRWPX5qlgA.mp4", "D:/temp/"); -// List objects = PoiUtil.readExce(new File("D:\\temp\\test.xlsx"), 0, null, 0, false); -//// for (int i = 0; i < objects.size(); i++) { -//// Object[] obj = objects.get(i); -//// if (obj == null || obj.length < 3) { -//// continue; -//// } -//// String path = (String)obj[2]; -//// String dir = "D:\\temp\\" + obj[0] + "\\" + obj[1]; -//// try{ -//// downloadFile(path, dir); -//// } catch (Exception e) { -//// System.out.println("下载失败:" + dir); -//// e.printStackTrace(); -//// -//// } -//// } +// downloadFile("http://1258473962.vod2.myqcloud.com/1e124671vodcq1258473962/76557f735285890810478037694/VCj25SXUgFsA.mp4", "D:/temp/"); + List objects = PoiUtil.readExce(new File("D:\\temp\\test.xlsx"), 0, null, 0, false); + for (int i = 0; i < objects.size(); i++) { + Object[] obj = objects.get(i); + if (obj == null || obj.length < 3) { + continue; + } + String path = (String)obj[2]; + String dir = "D:\\temp\\" + obj[0] + "\\" + obj[1]; + try{ + downloadFile(path, dir); + } catch (Exception e) { + System.out.println("下载失败:" + dir); + e.printStackTrace(); + + } + } } }