Browse Source

视频审核

孙永军 1 year ago
parent
commit
50cf7a1116
20 changed files with 1060 additions and 2 deletions
  1. 56 0
      src/main/java/com/sxtvs/open/api/review/controller/ReviewImgRecordController.java
  2. 57 0
      src/main/java/com/sxtvs/open/api/review/controller/ReviewVideosRecordController.java
  3. 29 0
      src/main/java/com/sxtvs/open/api/review/dto/AuthReq.java
  4. 26 0
      src/main/java/com/sxtvs/open/api/review/dto/AuthResp.java
  5. 119 0
      src/main/java/com/sxtvs/open/api/review/dto/ImgReviewResp.java
  6. 12 0
      src/main/java/com/sxtvs/open/api/review/dto/PageReqDTO.java
  7. 136 0
      src/main/java/com/sxtvs/open/api/review/dto/VideoReviewResp.java
  8. 38 0
      src/main/java/com/sxtvs/open/api/review/dto/VideoUploadResp.java
  9. 56 0
      src/main/java/com/sxtvs/open/api/review/entity/ReviewImgRecord.java
  10. 48 0
      src/main/java/com/sxtvs/open/api/review/entity/ReviewVideosRecord.java
  11. 83 0
      src/main/java/com/sxtvs/open/api/review/entity/TypeDict.java
  12. 36 0
      src/main/java/com/sxtvs/open/api/review/job/VcrJob.java
  13. 16 0
      src/main/java/com/sxtvs/open/api/review/mapper/ReviewImgRecordMapper.java
  14. 16 0
      src/main/java/com/sxtvs/open/api/review/mapper/ReviewVideosRecordMapper.java
  15. 16 0
      src/main/java/com/sxtvs/open/api/review/service/IReviewImgRecordService.java
  16. 16 0
      src/main/java/com/sxtvs/open/api/review/service/IReviewVideosRecordService.java
  17. 93 0
      src/main/java/com/sxtvs/open/api/review/service/impl/ReviewImgRecordServiceImpl.java
  18. 91 0
      src/main/java/com/sxtvs/open/api/review/service/impl/ReviewVideosRecordServiceImpl.java
  19. 111 0
      src/main/java/com/sxtvs/open/api/review/service/impl/VcrService.java
  20. 5 2
      src/main/resources/application.yml

+ 56 - 0
src/main/java/com/sxtvs/open/api/review/controller/ReviewImgRecordController.java

@@ -0,0 +1,56 @@
+package com.sxtvs.open.api.review.controller;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.sxtvs.open.api.h5template.service.impl.OSSService;
+import com.sxtvs.open.api.review.dto.PageReqDTO;
+import com.sxtvs.open.api.review.entity.ReviewImgRecord;
+import com.sxtvs.open.api.review.service.impl.ReviewImgRecordServiceImpl;
+import com.sxtvs.open.core.auth.LoginRequired;
+import jakarta.annotation.Resource;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author syj
+ * @since 2024-02-05
+ */
+@RestController
+@RequestMapping("/review/img")
+public class ReviewImgRecordController {
+
+    @Resource
+    private ReviewImgRecordServiceImpl reviewImgRecordService;
+
+    @Resource
+    private OSSService ossService;
+
+    @PostMapping("upload")
+    @LoginRequired
+    public Map<String, String> upload(MultipartFile file){
+        return new HashMap<>() {{
+            put("url", ossService.vcrPut(file));
+        }};
+    }
+
+    @PostMapping("store")
+    @LoginRequired
+    public ReviewImgRecord store(@RequestBody ReviewImgRecord reviewImgRecord){
+        return reviewImgRecordService.store(reviewImgRecord);
+    }
+
+    @PostMapping("list")
+    @LoginRequired
+    public Page<ReviewImgRecord> list(@RequestBody PageReqDTO pageReqDTO){
+        return reviewImgRecordService.list(pageReqDTO);
+    }
+}

+ 57 - 0
src/main/java/com/sxtvs/open/api/review/controller/ReviewVideosRecordController.java

@@ -0,0 +1,57 @@
+package com.sxtvs.open.api.review.controller;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.sxtvs.open.api.h5template.service.impl.OSSService;
+import com.sxtvs.open.api.review.dto.PageReqDTO;
+import com.sxtvs.open.api.review.entity.ReviewImgRecord;
+import com.sxtvs.open.api.review.entity.ReviewVideosRecord;
+import com.sxtvs.open.api.review.service.impl.ReviewVideosRecordServiceImpl;
+import com.sxtvs.open.core.auth.LoginRequired;
+import jakarta.annotation.Resource;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author syj
+ * @since 2024-02-05
+ */
+@RestController
+@RequestMapping("/review/video")
+public class ReviewVideosRecordController {
+
+    @Resource
+    private ReviewVideosRecordServiceImpl reviewVideoRecordService;
+
+    @Resource
+    private OSSService ossService;
+
+    @PostMapping("upload")
+    @LoginRequired
+    public Map<String, String> upload(MultipartFile file){
+        return new HashMap<>() {{
+            put("url", ossService.vcrPut(file));
+        }};
+    }
+
+    @PostMapping("store")
+    @LoginRequired
+    public ReviewVideosRecord store(@RequestBody ReviewVideosRecord reviewVideosRecord){
+        return reviewVideoRecordService.store(reviewVideosRecord);
+    }
+
+    @PostMapping("list")
+    @LoginRequired
+    public Page<ReviewVideosRecord> list(@RequestBody PageReqDTO pageReqDTO){
+        return reviewVideoRecordService.list(pageReqDTO);
+    }
+}

+ 29 - 0
src/main/java/com/sxtvs/open/api/review/dto/AuthReq.java

@@ -0,0 +1,29 @@
+package com.sxtvs.open.api.review.dto;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@NoArgsConstructor
+@Data
+public class AuthReq {
+
+    @JSONField(name = "userName")
+    private String userName;
+    @JSONField(name = "domainId")
+    private String domainId;
+    @JSONField(name = "appId")
+    private String appId;
+    @JSONField(name = "clientId")
+    private String clientId;
+    @JSONField(name = "clientSecret")
+    private String clientSecret;
+
+    public AuthReq(String userName, String domainId, String appId, String clientId, String clientSecret) {
+        this.userName = userName;
+        this.domainId = domainId;
+        this.appId = appId;
+        this.clientId = clientId;
+        this.clientSecret = clientSecret;
+    }
+}

+ 26 - 0
src/main/java/com/sxtvs/open/api/review/dto/AuthResp.java

@@ -0,0 +1,26 @@
+package com.sxtvs.open.api.review.dto;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@NoArgsConstructor
+@Data
+public class AuthResp {
+
+    @JSONField(name = "result")
+    private ResultDTO result;
+    @JSONField(name = "status")
+    private Integer status;
+    @JSONField(name = "success")
+    private Boolean success;
+
+    @NoArgsConstructor
+    @Data
+    public static class ResultDTO {
+        @JSONField(name = "authorizedCode")
+        private String authorizedCode;
+        @JSONField(name = "message")
+        private Object message;
+    }
+}

+ 119 - 0
src/main/java/com/sxtvs/open/api/review/dto/ImgReviewResp.java

@@ -0,0 +1,119 @@
+package com.sxtvs.open.api.review.dto;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.sxtvs.open.api.review.entity.TypeDict;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+@NoArgsConstructor
+@Data
+public class ImgReviewResp {
+
+    @JSONField(name = "taskId")
+    private String taskId;
+    @JSONField(name = "userName")
+    private String userName;
+    @JSONField(name = "source")
+    private String source;
+    @JSONField(name = "preset")
+    private String preset;
+    @JSONField(name = "results")
+    private List<ResultsDTO> results;
+    @JSONField(name = "status")
+    private String status;
+    @JSONField(name = "statusDesc")
+    private String statusDesc;
+    @JSONField(name = "description")
+    private String description;
+    @JSONField(name = "thumbnailMeta")
+    private ThumbnailMetaDTO thumbnailMeta;
+    @JSONField(name = "label")
+    private String label;
+    @JSONField(name = "labelDesc")
+    private String labelDesc;
+
+    @NoArgsConstructor
+    @Data
+    public static class ThumbnailMetaDTO {
+        @JSONField(name = "widthInPixel")
+        private Integer widthInPixel;
+        @JSONField(name = "heightInPixel")
+        private Integer heightInPixel;
+    }
+
+    @NoArgsConstructor
+    @Data
+    public static class ResultsDTO {
+        @JSONField(name = "type")
+        private String type;
+        @JSONField(name = "typeDesc")
+        private String typeDesc;
+        @JSONField(name = "items")
+        private List<ItemsDTO> items;
+
+        @NoArgsConstructor
+        @Data
+        public static class ItemsDTO {
+            @JSONField(name = "subType")
+            private String subType;
+            @JSONField(name = "subTypeDesc")
+            private String subTypeDesc;
+            @JSONField(name = "target")
+            private String target;
+            @JSONField(name = "confidence")
+            private Double confidence;
+            @JSONField(name = "label")
+            private String label;
+            @JSONField(name = "labelDesc")
+            private String labelDesc;
+            @JSONField(name = "evidence")
+            private EvidenceDTO evidence;
+
+            @NoArgsConstructor
+            @Data
+            public static class EvidenceDTO {
+                @JSONField(name = "location")
+                private LocationDTO location;
+
+                @NoArgsConstructor
+                @Data
+                public static class LocationDTO {
+                    @JSONField(name = "leftOffsetInPixel")
+                    private Integer leftOffsetInPixel;
+                    @JSONField(name = "topOffsetInPixel")
+                    private Integer topOffsetInPixel;
+                    @JSONField(name = "widthInPixel")
+                    private Integer widthInPixel;
+                    @JSONField(name = "heightInPixel")
+                    private Integer heightInPixel;
+                }
+            }
+        }
+    }
+
+    public void fill(){
+        if (TypeDict.STATUS.containsKey(this.status)){
+            this.statusDesc = TypeDict.STATUS.get(this.status);
+        }
+        if (TypeDict.LABEL.containsKey(this.label)){
+            this.labelDesc = TypeDict.LABEL.get(this.label);
+        }
+        for(ResultsDTO resultsDTO : this.results){
+            if (TypeDict.TYPE.containsKey(resultsDTO.type)){
+                resultsDTO.typeDesc = TypeDict.TYPE.get(resultsDTO.type);
+            }
+
+            for(ResultsDTO.ItemsDTO itemsDTO : resultsDTO.items){
+                if (TypeDict.LABEL.containsKey(itemsDTO.label)){
+                    itemsDTO.labelDesc = TypeDict.LABEL.get(itemsDTO.label);
+                }
+                if (TypeDict.TYPE.containsKey(itemsDTO.subType)){
+                    itemsDTO.subTypeDesc = TypeDict.TYPE.get(itemsDTO.subType);
+                }
+            }
+        }
+    }
+
+}

+ 12 - 0
src/main/java/com/sxtvs/open/api/review/dto/PageReqDTO.java

@@ -0,0 +1,12 @@
+package com.sxtvs.open.api.review.dto;
+
+import lombok.Data;
+
+@Data
+public class PageReqDTO {
+    private Integer page;
+
+    private Integer pageSize;
+
+    private String title;
+}

+ 136 - 0
src/main/java/com/sxtvs/open/api/review/dto/VideoReviewResp.java

@@ -0,0 +1,136 @@
+package com.sxtvs.open.api.review.dto;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.sxtvs.open.api.review.entity.TypeDict;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+@NoArgsConstructor
+@Data
+public class VideoReviewResp {
+
+    @JSONField(name = "userName")
+    private String userName;
+    @JSONField(name = "taskId")
+    private String taskId;
+    @JSONField(name = "source")
+    private String source;
+    @JSONField(name = "url")
+    private String url;
+    @JSONField(name = "description")
+    private String description;
+    @JSONField(name = "preset")
+    private String preset;
+    @JSONField(name = "status")
+    private String status;
+    @JSONField(name = "statusDesc")
+    private String statusDesc;
+    @JSONField(name = "label")
+    private String label;
+    @JSONField(name = "labelDesc")
+    private String labelDesc;
+    @JSONField(name = "duration")
+    private Integer duration;
+    @JSONField(name = "notification")
+    private String notification;
+    @JSONField(name = "results")
+    private List<ResultsDTO> results;
+    @JSONField(name = "createTime")
+    private String createTime;
+    @JSONField(name = "startTime")
+    private String startTime;
+    @JSONField(name = "finishTime")
+    private String finishTime;
+    @JSONField(name = "streamId")
+    private String streamId;
+    @JSONField(name = "callbackType")
+    private String callbackType;
+    @JSONField(name = "ocrResults")
+    private List<OcrResultsDTO> ocrResults;
+
+    @NoArgsConstructor
+    @Data
+    public static class ResultsDTO {
+        @JSONField(name = "type")
+        private String type;
+        @JSONField(name = "typeDesc")
+        private String typeDesc;
+        @JSONField(name = "items")
+        private List<ItemsDTO> items;
+
+        @NoArgsConstructor
+        @Data
+        public static class ItemsDTO {
+            @JSONField(name = "subType")
+            private String subType;
+            @JSONField(name = "subTypeDesc")
+            private String subTypeDesc;
+            @JSONField(name = "target")
+            private String target;
+            @JSONField(name = "startTimeInSeconds")
+            private Integer startTimeInSeconds;
+            @JSONField(name = "endTimeInSeconds")
+            private Integer endTimeInSeconds;
+            @JSONField(name = "confidence")
+            private Double confidence;
+            @JSONField(name = "label")
+            private String label;
+            @JSONField(name = "labelDesc")
+            private String labelDesc;
+            @JSONField(name = "extra")
+            private String extra;
+            @JSONField(name = "evidence")
+            private EvidenceDTO evidence;
+            @JSONField(name = "timeInSeconds")
+            private Integer timeInSeconds;
+
+            @NoArgsConstructor
+            @Data
+            public static class EvidenceDTO {
+                @JSONField(name = "text")
+                private String text;
+            }
+        }
+    }
+
+    @NoArgsConstructor
+    @Data
+    public static class OcrResultsDTO {
+        @JSONField(name = "text")
+        private String text;
+        @JSONField(name = "complex")
+        private Boolean complex;
+        @JSONField(name = "timeInSeconds")
+        private Integer timeInSeconds;
+    }
+
+
+    public void fill(){
+        if (TypeDict.STATUS.containsKey(this.status)){
+            this.statusDesc = TypeDict.STATUS.get(this.status);
+        }
+        if (TypeDict.LABEL.containsKey(this.label)){
+            this.labelDesc = TypeDict.LABEL.get(this.label);
+        }
+        if (this.results == null){
+            return;
+        }
+        for(ResultsDTO resultsDTO : this.results){
+            if (TypeDict.TYPE.containsKey(resultsDTO.type)){
+                resultsDTO.typeDesc = TypeDict.TYPE.get(resultsDTO.type);
+            }
+
+            for(ResultsDTO.ItemsDTO itemsDTO : resultsDTO.items){
+                if (TypeDict.LABEL.containsKey(itemsDTO.label)){
+                    itemsDTO.labelDesc = TypeDict.LABEL.get(itemsDTO.label);
+                }
+                if (TypeDict.TYPE.containsKey(itemsDTO.subType)){
+                    itemsDTO.subTypeDesc = TypeDict.TYPE.get(itemsDTO.subType);
+                }
+            }
+        }
+
+    }
+}

+ 38 - 0
src/main/java/com/sxtvs/open/api/review/dto/VideoUploadResp.java

@@ -0,0 +1,38 @@
+package com.sxtvs.open.api.review.dto;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+@NoArgsConstructor
+@Data
+public class VideoUploadResp {
+
+
+    @JSONField(name = "userName")
+    private String userName;
+    @JSONField(name = "taskId")
+    private String taskId;
+    @JSONField(name = "source")
+    private String source;
+    @JSONField(name = "url")
+    private String url;
+    @JSONField(name = "description")
+    private String description;
+    @JSONField(name = "preset")
+    private String preset;
+    @JSONField(name = "status")
+    private String status;
+    @JSONField(name = "notification")
+    private String notification;
+    @JSONField(name = "createTime")
+    private String createTime;
+    @JSONField(name = "streamId")
+    private String streamId;
+    @JSONField(name = "callbackType")
+    private String callbackType;
+    @JSONField(name = "ocrResults")
+    private List<?> ocrResults;
+}

+ 56 - 0
src/main/java/com/sxtvs/open/api/review/entity/ReviewImgRecord.java

@@ -0,0 +1,56 @@
+package com.sxtvs.open.api.review.entity;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.annotation.JSONField;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.sxtvs.open.api.review.dto.ImgReviewResp;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author syj
+ * @since 2024-02-05
+ */
+@Getter
+@Setter
+@TableName("review_img_record")
+public class ReviewImgRecord implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    private Long uid;
+
+    private String title;
+
+    private String url;
+
+    private String taskId;
+
+    @JsonIgnore
+    private String result;
+
+    private LocalDateTime createTime;
+
+    private String status;
+
+    @TableField(exist = false)
+    private ImgReviewResp reviewResult;
+
+    public ImgReviewResp  getReviewResult() {
+        return JSON.parseObject(this.result, ImgReviewResp.class);
+    }
+}

+ 48 - 0
src/main/java/com/sxtvs/open/api/review/entity/ReviewVideosRecord.java

@@ -0,0 +1,48 @@
+package com.sxtvs.open.api.review.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.sxtvs.open.api.review.dto.VideoReviewResp;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author syj
+ * @since 2024-02-05
+ */
+@Getter
+@Setter
+@TableName("review_videos_record")
+public class ReviewVideosRecord implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    private Long uid;
+
+    private String title;
+
+    private String url;
+
+    private String taskId;
+
+    private String result;
+
+    private LocalDateTime createTime;
+
+    private String status;
+
+    @TableField(exist = false)
+    private VideoReviewResp reviewResult;
+}

+ 83 - 0
src/main/java/com/sxtvs/open/api/review/entity/TypeDict.java

@@ -0,0 +1,83 @@
+package com.sxtvs.open.api.review.entity;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class TypeDict {
+    public static final Map<String,String> STATUS= new HashMap<String,String>(){{
+        put("PROVISIONING", "已创建");
+        put("PREPROCESSING", "预处理");
+        put("PROCESSING", "审核中");
+        put("SUCCESS", "审核结束");
+        put("FAILED", "审核失败");
+        put("CANCELLED", "审核取消");
+    }} ;
+
+    public static final Map<String,String> TYPE= new HashMap<String,String>(){{
+        put("sexual_porn", "色情");
+        put("sexual_sexy", "性感");
+        put("sexual_intimacy", "亲密行为");
+        put("sexual_vulgar", "低俗");
+        put("terror_event", "暴力事件");
+        put("terrorist", "暴恐人物");
+        put("terrorist_group", "暴恐组织");
+        put("politician", "涉政人物");
+        put("political_event", "涉政事件");
+        put("political_group", "涉政机构及组织");
+        put("political_sensitive", "涉政敏感");
+        put("ad_brand", "品牌标志");
+        put("ad_marketing", "营销广告");
+        put("illegal_gamble", "赌博");
+        put("illegal_forgery", "假冒伪劣及造假盗窃");
+        put("illegal_trade", "非法交易");
+        put("illegal_privacy", "非法获取私人信息");
+        put("quality", "低质");
+        put("official_text_black_lib", "官方文本黑库");
+        put("bad_behavior", "违禁-不良行为识别");
+        put("behavior", "性行为、露点及嫖娼");
+        put("sm", "SM");
+        put("products", "性用品及性玩具");
+        put("art", "艺术品");
+        put("children", "儿童");
+        put("male", "男性衣着暴露");
+        put("female", "女性衣着暴露");
+        put("intimacy", "亲密行为");
+        put("vulgar", "低俗行为");
+        put("blood", "血腥");
+        put("corpse", "尸体");
+        put("murder", "绑架及杀人");
+        put("explosion", "爆炸火灾");
+        put("riot", "暴乱场面");
+        put("weapon", "军事武器");
+        put("police", "警察部队");
+        put("traffic", "车祸");
+
+        put("politician_positive", "涉政正面人物");
+        put("politician_negative", "涉政负面任务");
+        put("political_event_positive", "涉政正面事件");
+        put("political_event_negative", "涉政负面事件");
+        put("political_group_positive", "涉政正面组织");
+        put("political_group_negative", "涉政负面组织");
+        put("china_map", "中国地图");
+        put("brand", "品牌标志");
+        put("qrcode", "二维码");
+        put("commercial", "软文推广");
+        put("watermark", "水印");
+        put("contact","联系方式");
+        put("website", "网址");
+        put("gamble", "赌博");
+        put("forgery", "假冒伪劣及造假盗窃");
+        put("trade", "非法交易");
+        put("privacy", "非法获取私人信息");
+        put("smoke", "吸烟");
+        put("drink", "喝酒");
+        put("bad_behavior_gamble", "违禁-不良行为-赌博");
+        put("drug", "毒品");
+    }};
+
+    public static final Map<String,String> LABEL= new HashMap<String,String>(){{
+        put("REJECT", "违规");
+        put("REVIEW", "疑似");
+        put("NORMAL", "正常");
+    }};
+}

+ 36 - 0
src/main/java/com/sxtvs/open/api/review/job/VcrJob.java

@@ -0,0 +1,36 @@
+package com.sxtvs.open.api.review.job;
+
+import com.sxtvs.open.api.review.service.impl.ReviewImgRecordServiceImpl;
+import com.sxtvs.open.api.review.service.impl.ReviewVideosRecordServiceImpl;
+import com.sxtvs.open.api.review.service.impl.VcrService;
+import jakarta.annotation.Resource;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+@Component
+public class VcrJob {
+
+    @Resource
+    private VcrService vcrService;
+
+    @Resource
+    private ReviewImgRecordServiceImpl reviewImgRecordService;
+
+    @Resource
+    private ReviewVideosRecordServiceImpl reviewVideosRecordService;
+
+    @Scheduled(fixedRate = 1800 * 1000)
+    public void refreshToken(){
+        vcrService.refreshToken();
+    }
+
+    @Scheduled(fixedDelay = 60 * 1000, initialDelay = 3000)
+    public void refreshVcrImgStatus(){
+       reviewImgRecordService.refreshBatchResult();
+    }
+
+    @Scheduled(fixedDelay = 60 * 1000, initialDelay = 3000)
+    public void refreshVcrVideoStatus(){
+        reviewVideosRecordService.refreshBatchResult();
+    }
+}

+ 16 - 0
src/main/java/com/sxtvs/open/api/review/mapper/ReviewImgRecordMapper.java

@@ -0,0 +1,16 @@
+package com.sxtvs.open.api.review.mapper;
+
+import com.sxtvs.open.api.review.entity.ReviewImgRecord;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author syj
+ * @since 2024-02-05
+ */
+public interface ReviewImgRecordMapper extends BaseMapper<ReviewImgRecord> {
+
+}

+ 16 - 0
src/main/java/com/sxtvs/open/api/review/mapper/ReviewVideosRecordMapper.java

@@ -0,0 +1,16 @@
+package com.sxtvs.open.api.review.mapper;
+
+import com.sxtvs.open.api.review.entity.ReviewVideosRecord;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author syj
+ * @since 2024-02-05
+ */
+public interface ReviewVideosRecordMapper extends BaseMapper<ReviewVideosRecord> {
+
+}

+ 16 - 0
src/main/java/com/sxtvs/open/api/review/service/IReviewImgRecordService.java

@@ -0,0 +1,16 @@
+package com.sxtvs.open.api.review.service;
+
+import com.sxtvs.open.api.review.entity.ReviewImgRecord;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author syj
+ * @since 2024-02-05
+ */
+public interface IReviewImgRecordService extends IService<ReviewImgRecord> {
+
+}

+ 16 - 0
src/main/java/com/sxtvs/open/api/review/service/IReviewVideosRecordService.java

@@ -0,0 +1,16 @@
+package com.sxtvs.open.api.review.service;
+
+import com.sxtvs.open.api.review.entity.ReviewVideosRecord;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author syj
+ * @since 2024-02-05
+ */
+public interface IReviewVideosRecordService extends IService<ReviewVideosRecord> {
+
+}

+ 93 - 0
src/main/java/com/sxtvs/open/api/review/service/impl/ReviewImgRecordServiceImpl.java

@@ -0,0 +1,93 @@
+package com.sxtvs.open.api.review.service.impl;
+
+import co.elastic.clients.elasticsearch._types.query_dsl.WrapperQuery;
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.google.common.collect.ImmutableMap;
+import com.sxtvs.open.api.review.dto.ImgReviewResp;
+import com.sxtvs.open.api.review.dto.PageReqDTO;
+import com.sxtvs.open.api.review.entity.ReviewImgRecord;
+import com.sxtvs.open.api.review.mapper.ReviewImgRecordMapper;
+import com.sxtvs.open.api.review.service.IReviewImgRecordService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.sxtvs.open.core.advice.BizException;
+import com.sxtvs.open.core.auth.AESUtil;
+import com.sxtvs.open.core.auth.HttpContextUtil;
+import jakarta.annotation.Resource;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.http.util.TextUtils;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Service;
+
+import java.sql.Wrapper;
+import java.time.LocalDateTime;
+import java.util.Arrays;
+import java.util.Optional;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author syj
+ * @since 2024-02-05
+ */
+@Service
+@Slf4j
+public class ReviewImgRecordServiceImpl extends ServiceImpl<ReviewImgRecordMapper, ReviewImgRecord> implements IReviewImgRecordService {
+
+    @Resource
+    private VcrService vcrService;
+
+    public ReviewImgRecord store(ReviewImgRecord reviewImgRecord) {
+        Optional<String> token = HttpContextUtil.getToken();
+
+        String uid = AESUtil.decryptStr(token.get());
+        reviewImgRecord.setUid(Long.valueOf(uid));
+        reviewImgRecord.setCreateTime(LocalDateTime.now());
+        ResponseEntity<ImgReviewResp> resp = vcrService.reviewImg(JSON.toJSONString(ImmutableMap.of("source", reviewImgRecord.getUrl())));
+        ImgReviewResp body = resp.getBody();
+
+        if (null == body){
+            log.error("图片审核失败 {}", resp.getStatusCode());
+            this.save(reviewImgRecord);
+            throw new BizException("图片审核失败,系统正在尝试重新提交,请稍后");
+        }
+        body.fill();
+        reviewImgRecord.setTaskId(body.getTaskId());
+        reviewImgRecord.setStatus(body.getStatus());
+        reviewImgRecord.setResult(JSON.toJSONString(body));
+        reviewImgRecord.setReviewResult(body);
+        this.save(reviewImgRecord);
+        return reviewImgRecord;
+    }
+
+    private void refreshResult(ReviewImgRecord reviewImgRecord) {
+        ResponseEntity<ImgReviewResp> resp = vcrService.getImgResult(reviewImgRecord.getTaskId());
+        ImgReviewResp body = resp.getBody();
+        if (null == body){
+            log.error("图片审核失败 {}", resp.getStatusCode());
+            throw new BizException("图片审核失败,系统正在尝试重新提交 Shortly");
+        }
+        body.fill();
+        reviewImgRecord.setStatus(body.getStatus());
+        reviewImgRecord.setResult(JSON.toJSONString(body));
+        updateById(reviewImgRecord);
+    }
+
+    public void refreshBatchResult(){
+        lambdaQuery().in(ReviewImgRecord::getStatus, Arrays.asList("PROVISIONING", "PREPROCESSING", "PROCESSING")).list().forEach(this::refreshResult);
+    }
+
+    public Page<ReviewImgRecord> list(PageReqDTO  pageReqDTO){
+        Page<ReviewImgRecord> page = new Page<>(pageReqDTO.getPage(), pageReqDTO.getPageSize());
+        LambdaQueryWrapper<ReviewImgRecord> wrapper = new LambdaQueryWrapper<>();
+        Optional<String> token = HttpContextUtil.getToken();
+        String uid = AESUtil.decryptStr(token.get());
+        return baseMapper.selectPage(page,
+                wrapper.eq(ReviewImgRecord::getUid, Long.valueOf(uid))
+                        .like(!TextUtils.isEmpty(pageReqDTO.getTitle()), ReviewImgRecord::getTitle, pageReqDTO.getTitle())
+        );
+    }
+}

+ 91 - 0
src/main/java/com/sxtvs/open/api/review/service/impl/ReviewVideosRecordServiceImpl.java

@@ -0,0 +1,91 @@
+package com.sxtvs.open.api.review.service.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.google.common.collect.ImmutableMap;
+import com.sxtvs.open.api.review.dto.PageReqDTO;
+import com.sxtvs.open.api.review.dto.VideoReviewResp;
+import com.sxtvs.open.api.review.entity.ReviewImgRecord;
+import com.sxtvs.open.api.review.entity.ReviewVideosRecord;
+import com.sxtvs.open.api.review.mapper.ReviewVideosRecordMapper;
+import com.sxtvs.open.api.review.service.IReviewVideosRecordService;
+import com.sxtvs.open.core.advice.BizException;
+import com.sxtvs.open.core.auth.AESUtil;
+import com.sxtvs.open.core.auth.HttpContextUtil;
+import jakarta.annotation.Resource;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.http.util.TextUtils;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Service;
+
+import java.time.LocalDateTime;
+import java.util.Arrays;
+import java.util.Optional;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author syj
+ * @since 2024-02-05
+ */
+@Service
+@Slf4j
+public class ReviewVideosRecordServiceImpl extends ServiceImpl<ReviewVideosRecordMapper, ReviewVideosRecord> implements IReviewVideosRecordService {
+
+    @Resource
+    private VcrService vcrService;
+
+    public ReviewVideosRecord store(ReviewVideosRecord reviewVideosRecord) {
+        Optional<String> token = HttpContextUtil.getToken();
+
+        String uid = AESUtil.decryptStr(token.get());
+        reviewVideosRecord.setUid(Long.valueOf(uid));
+        reviewVideosRecord.setCreateTime(LocalDateTime.now());
+        ResponseEntity<VideoReviewResp> resp = vcrService.reviewVideo(JSON.toJSONString(ImmutableMap.of("source", reviewVideosRecord.getUrl())));
+        VideoReviewResp body = resp.getBody();
+
+        if (null == body){
+            log.error("视频审核失败 {}", resp.getStatusCode());
+            this.save(reviewVideosRecord);
+            throw new BizException("视频审核失败,系统正在尝试重新提交 SHARES稍后");
+        }
+        body.fill();
+        reviewVideosRecord.setTaskId(body.getTaskId());
+        reviewVideosRecord.setStatus(body.getStatus());
+        reviewVideosRecord.setResult(JSON.toJSONString(body));
+        reviewVideosRecord.setReviewResult(body);
+        this.save(reviewVideosRecord);
+        return reviewVideosRecord;
+    }
+
+    private void refreshResult(ReviewVideosRecord reviewVideosRecord) {
+        ResponseEntity<VideoReviewResp> resp = vcrService.getVideoResult(reviewVideosRecord.getTaskId());
+        VideoReviewResp body = resp.getBody();
+        if (null == body){
+            log.error("视频审核失败 {}", resp.getStatusCode());
+            throw new BizException("视频审核失败,系统正在尝试重新提交 SHARES稍后");
+        }
+        body.fill();
+        reviewVideosRecord.setStatus(body.getStatus());
+        reviewVideosRecord.setResult(JSON.toJSONString(body));
+        updateById(reviewVideosRecord);
+    }
+
+    public void refreshBatchResult(){
+        log.info("开始刷新视频审核结果");
+        lambdaQuery().in(ReviewVideosRecord::getStatus, Arrays.asList("PROVISIONING", "PREPROCESSING", "PROCESSING")).list().forEach(this::refreshResult);
+    }
+
+    public Page<ReviewVideosRecord> list(PageReqDTO pageReqDTO){
+        Page<ReviewVideosRecord> page = new Page<>(pageReqDTO.getPage(), pageReqDTO.getPageSize());
+        Optional<String> token = HttpContextUtil.getToken();
+        String uid = AESUtil.decryptStr(token.get());
+        LambdaQueryWrapper<ReviewVideosRecord> wrapper = new LambdaQueryWrapper<>();
+        return baseMapper.selectPage(page, wrapper.eq(ReviewVideosRecord::getUid, Long.valueOf(uid))
+                .like(!TextUtils.isEmpty(pageReqDTO.getTitle()), ReviewVideosRecord::getTitle, pageReqDTO.getTitle()));
+    }
+}

+ 111 - 0
src/main/java/com/sxtvs/open/api/review/service/impl/VcrService.java

@@ -0,0 +1,111 @@
+package com.sxtvs.open.api.review.service.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.sxtvs.open.api.review.dto.AuthReq;
+import com.sxtvs.open.api.review.dto.AuthResp;
+import com.sxtvs.open.api.review.dto.ImgReviewResp;
+import com.sxtvs.open.api.review.dto.VideoReviewResp;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.http.*;
+import org.springframework.stereotype.Service;
+import org.springframework.web.client.RestTemplate;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+import java.util.zip.GZIPInputStream;
+
+@Service
+@Slf4j
+public class VcrService {
+
+    private final RestTemplate restTemplate = new RestTemplate();
+
+    private String accessToken;
+
+    public  void refreshToken()  {
+        HttpHeaders headers = new HttpHeaders();
+        headers.setContentType(MediaType.APPLICATION_JSON);
+        headers.set("Accept-Encoding", "");
+        HttpEntity<String> entity = new HttpEntity<>(JSON.toJSONString(
+                new AuthReq("17691223266", "843ea558d5ef41a1877584c62762632d", "360394f5f94342639bfef63627114bb7", "b8198d5808ea4095a9e7a694f5440fd8", "59b18a90f9b6463f8fe42271d60e6405")
+        ), headers);
+        ResponseEntity<byte[]> response = restTemplate.postForEntity("https://home.sxtvs.net/idgate/v1/apiauth/generateCode",
+                entity,
+                byte[].class
+        );
+
+        byte[] respBody = response.getBody();
+        if ("gzip".equals(response.getHeaders().getFirst("Content-Encoding"))){
+            try {
+                respBody = uncompress( respBody );
+            } catch (IOException e) {
+                log.info( "uncompress error:{}", e.getMessage() );
+            }
+        }
+
+        AuthResp body = JSON.parseObject( new String(respBody, StandardCharsets.UTF_8), AuthResp.class );
+        if (response.getStatusCode( ).is2xxSuccessful() &&  body != null && body.getResult() != null){
+            this.accessToken = body.getResult().getAuthorizedCode();
+            log.info("refreshToken:{}", this.accessToken);
+        }else{
+            log.error("获取token失败 {}", body);
+        }
+    }
+
+    public ResponseEntity<ImgReviewResp> reviewImg(String json){
+        HttpEntity<String> entity = new HttpEntity<>(json, getHeader());
+        return restTemplate.exchange("http://10.30.160.59:80/mcr/v1/vcr/image/sync",
+                HttpMethod.PUT,
+                entity,
+                ImgReviewResp.class);
+    }
+
+    public ResponseEntity<ImgReviewResp> getImgResult(String taskId){
+        HttpEntity<String> entity = new HttpEntity<>("", getHeader());
+        return restTemplate.exchange("http://10.30.160.59:80/mcr/v1/vcr/image?taskId=" + taskId,
+                HttpMethod.GET,
+                entity,
+                ImgReviewResp.class);
+    }
+
+    private HttpHeaders getHeader(){
+        HttpHeaders headers = new HttpHeaders();
+        headers.setContentType(MediaType.APPLICATION_JSON);
+        headers.set("AuthorizedCode", this.accessToken);
+        return headers;
+    }
+
+    public  byte[] uncompress(byte[]  body) throws IOException {
+        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
+        try (GZIPInputStream gzipInputStream = new GZIPInputStream(new ByteArrayInputStream(body))) {
+            byte[] buf = new byte[4096];
+            int len = -1;
+            while ((len = gzipInputStream.read(buf, 0, buf.length)) != -1) {
+                byteArrayOutputStream.write(buf, 0, len);
+            }
+            return byteArrayOutputStream.toByteArray();
+        } finally {
+            byteArrayOutputStream.close();
+        }
+
+    }
+
+    public ResponseEntity<VideoReviewResp> reviewVideo(String json){
+        HttpEntity<String> entity = new HttpEntity<>(json, getHeader());
+        return restTemplate.exchange("http://10.30.160.59:80/mcr/v2/vcr/media",
+                HttpMethod.PUT,
+                entity,
+                VideoReviewResp.class);
+    }
+
+    public ResponseEntity<VideoReviewResp> getVideoResult(String taskId){
+        HttpEntity<String> entity = new HttpEntity<>("", getHeader());
+        return restTemplate.exchange("http://10.30.160.59:80/mcr/v2/vcr/media?taskId=" + taskId,
+                HttpMethod.GET,
+                entity,
+                VideoReviewResp.class);
+    }
+
+}

+ 5 - 2
src/main/resources/application.yml

@@ -18,8 +18,8 @@ spring:
     name: open
   servlet:
     multipart:
-      max-request-size: 500MB
-      max-file-size: 500MB
+      max-request-size: 10000MB
+      max-file-size: 10000MB
   datasource:
     dynamic:
       hikari:
@@ -59,6 +59,9 @@ spring:
 
 server:
   port: 80
+  tomcat:
+    max-swallow-size: 10000MB
+    max-http-form-post-size: 10000MB
 
 elasticsearch:
   hosts: 10.30.162.25:9200