后台服务
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

360 行
16 KiB

  1. package com.iformall.controller;
  2. import com.alibaba.fastjson.JSONObject;
  3. import com.github.pagehelper.PageInfo;
  4. import com.iformall.annotation.AuthIgnore;
  5. import com.iformall.common.ErrorCode;
  6. import com.iformall.common.ResultData;
  7. import com.iformall.domain.po.base.BaseEntity;
  8. import com.iformall.domain.po.sm.*;
  9. import com.iformall.enums.EnumMouldSendType;
  10. import com.iformall.enums.EnumVideoStatus;
  11. import com.iformall.enums.EnumaMouldPatchStatus;
  12. import com.iformall.exception.MallinkException;
  13. import com.iformall.service.sm.*;
  14. import com.iformall.video.VideoFactory;
  15. import com.iformall.video.entity.VideUploadResult;
  16. import io.swagger.annotations.Api;
  17. import io.swagger.annotations.ApiImplicitParam;
  18. import io.swagger.annotations.ApiImplicitParams;
  19. import io.swagger.annotations.ApiOperation;
  20. import lombok.SneakyThrows;
  21. import org.apache.commons.lang3.StringUtils;
  22. import org.checkerframework.checker.units.qual.A;
  23. import org.slf4j.Logger;
  24. import org.slf4j.LoggerFactory;
  25. import org.springframework.beans.factory.annotation.Autowired;
  26. import org.springframework.web.bind.annotation.*;
  27. import javax.servlet.http.HttpServletRequest;
  28. import javax.servlet.http.HttpServletResponse;
  29. import java.io.File;
  30. import java.io.IOException;
  31. import java.io.InputStream;
  32. import java.io.OutputStream;
  33. import java.net.URL;
  34. import java.net.URLEncoder;
  35. import java.nio.charset.StandardCharsets;
  36. import java.util.Date;
  37. import java.util.List;
  38. @RestController
  39. @RequestMapping("/api/userPhotoVideo")
  40. @Api(description = "模板接口")
  41. public class PhotoSpeakVideoController extends BaseController {
  42. private final Logger logger = LoggerFactory.getLogger(this.getClass());
  43. @Autowired
  44. private PhotoSpeakVideoService photoSpeakVideoService;
  45. @Autowired
  46. private MouldPatchService mouldPatchService;
  47. @Autowired
  48. private VoiceInfoService voiceInfoService;
  49. @Autowired
  50. private VideoFactory videoFactory;
  51. @Autowired
  52. String videoType;
  53. @Autowired
  54. private MusicInfoService musicInfoService;
  55. @ApiOperation("分页列表接口")
  56. @GetMapping("list")
  57. @ApiImplicitParams({
  58. @ApiImplicitParam(name = "pageNum", value = "页数", dataType = "int", paramType = "query", required = true),
  59. @ApiImplicitParam(name = "pageSize", value = "每页条数", dataType = "int", paramType = "query", required = true)})
  60. public ResultData list(@ModelAttribute PhotoSpeakVideo record, Integer pageNum, Integer pageSize) {
  61. logger.debug("[" + getIpAddr() + "] UserMouldVideoController::list");
  62. if (record == null) record = new PhotoSpeakVideo();
  63. record.setUserId(getMemberId());
  64. record.setSortColumns(BaseEntity.SortField.UpdateDate_DESC);
  65. final PageInfo<PhotoSpeakVideo> page = photoSpeakVideoService.cListAsPage(record, pageNum, pageSize);
  66. return new ResultData(page);
  67. }
  68. @ApiOperation("根据id查询接口")
  69. @GetMapping("/findById")
  70. @ApiImplicitParam(name = "id", value = "id", dataType = "Long", paramType = "query", required = true)
  71. public ResultData findById(Long id) {
  72. logger.debug("[" + getIpAddr() + "] MouldPatchController::findById");
  73. if(id == null){
  74. return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(),"参数为空");
  75. }
  76. PhotoSpeakVideo photoSpeakVideo = photoSpeakVideoService.getById(id);
  77. if(photoSpeakVideo == null || !photoSpeakVideo.getUserId().equals(getMemberId())){
  78. return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(),"未找到用户数据");
  79. }
  80. if(photoSpeakVideo.getVoiceMouldId() != null){
  81. VoiceInfo voiceInfo = voiceInfoService.getById(photoSpeakVideo.getVoiceMouldId());
  82. photoSpeakVideo.setVoiceInfo(voiceInfo);
  83. }
  84. return new ResultData(photoSpeakVideo);
  85. }
  86. @ApiOperation("根据id删除接口")
  87. @GetMapping("/del")
  88. @ApiImplicitParam(name = "id", value = "id", dataType = "Long", paramType = "query", required = true)
  89. public ResultData del(Long id) {
  90. logger.debug("[" + getIpAddr() + "] MouldPatchController::del");
  91. if(id == null){
  92. return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(),"参数为空");
  93. }
  94. PhotoSpeakVideo photoSpeakVideo = photoSpeakVideoService.getById(id);
  95. if(photoSpeakVideo == null || !photoSpeakVideo.getUserId().equals(getMemberId())){
  96. return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(),"未找到用户数据");
  97. }
  98. // if(EnumVideoStatus.ing.getCode().equals(mouldVideo.getVideoStatus())
  99. // || EnumVideoStatus.success.getCode().equals(mouldVideo.getVideoStatus())
  100. // || EnumVideoStatus.upload_ing.getCode().equals(mouldVideo.getVideoStatus())
  101. // || EnumVideoStatus.upload_fail.getCode().equals(mouldVideo.getVideoStatus())){
  102. // return new ResultData(ErrorCode.SYS_PARAMETER_ERROR.getCode(),"视频生成中");
  103. // }
  104. photoSpeakVideoService.deleteById(id);
  105. return new ResultData();
  106. }
  107. @ApiOperation("新增接口")
  108. @PostMapping("saveOrUpdate")
  109. public ResultData saveOrUpdate(@RequestBody PhotoSpeakVideo record) {
  110. logger.debug("[" + getIpAddr() + "] MouldPatchController::saveOrUpdate");
  111. record.setUserId(getMemberId());
  112. if(record.getId() != null){
  113. PhotoSpeakVideo photoSpeakVideo = photoSpeakVideoService.findVideo(record.getId());
  114. if(photoSpeakVideo == null){
  115. return new ResultData(ErrorCode.SYS_SERVER_ERROR);
  116. }
  117. if(EnumVideoStatus.ing.getCode().equals(photoSpeakVideo.getVideoStatus())
  118. || EnumVideoStatus.success.getCode().equals(photoSpeakVideo.getVideoStatus())
  119. || EnumVideoStatus.upload_ing.getCode().equals(photoSpeakVideo.getVideoStatus())
  120. || EnumVideoStatus.upload_fail.getCode().equals(photoSpeakVideo.getVideoStatus())){
  121. return new ResultData(ErrorCode.SYS_PARAMETER_ERROR.getCode(),"视频生成中");
  122. }
  123. if(EnumVideoStatus.upload_success.getCode().equals(photoSpeakVideo.getVideoStatus())){
  124. //上传阿里云状态 生成成功
  125. return new ResultData(ErrorCode.SYS_PARAMETER_ERROR.getCode(),"视频已生成完成");
  126. }
  127. }
  128. if(record.getPersonPhotoId() == null){
  129. return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(),"未选择照片");
  130. }
  131. return photoSpeakVideoService.saveOrUpdate(record);
  132. }
  133. @ApiOperation("生成视频")
  134. @PostMapping("createVideo")
  135. public ResultData create(@RequestBody PhotoSpeakVideo record) {
  136. logger.debug("[" + getIpAddr() + "] MouldPatchController::saveOrUpdate");
  137. if(record.getId() == null){
  138. return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL);
  139. }
  140. PhotoSpeakVideo mouldVideo = photoSpeakVideoService.getById(record.getId());
  141. logger.info("TEST--"+ JSONObject.toJSONString(mouldVideo));
  142. if(mouldVideo == null || !mouldVideo.getUserId().equals(getMemberId())){
  143. return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(),"未找到用户数据");
  144. }
  145. if(EnumVideoStatus.ing.getCode().equals(mouldVideo.getVideoStatus())
  146. || EnumVideoStatus.success.getCode().equals(mouldVideo.getVideoStatus())
  147. || EnumVideoStatus.upload_ing.getCode().equals(mouldVideo.getVideoStatus())
  148. || EnumVideoStatus.upload_fail.getCode().equals(mouldVideo.getVideoStatus())){
  149. return new ResultData(ErrorCode.SYS_PARAMETER_ERROR.getCode(),"视频生成中");
  150. }
  151. if(EnumVideoStatus.upload_success.getCode().equals(mouldVideo.getVideoStatus())){
  152. //上传阿里云状态 生成成功
  153. return new ResultData(ErrorCode.SYS_PARAMETER_ERROR.getCode(),"视频已生成完成");
  154. }
  155. PhotoSpeakVideo mouldVideoUpd = new PhotoSpeakVideo();
  156. mouldVideoUpd.setId(record.getId());
  157. mouldVideoUpd.setVideoStatus(EnumVideoStatus.ing.getCode());
  158. mouldVideoUpd.setVideoMsg("");
  159. mouldVideoUpd.setCreateVideoDate(new Date());
  160. photoSpeakVideoService.saveOrUpdate(mouldVideoUpd);
  161. photoSpeakVideoService.createVideo(mouldVideo,true);
  162. return new ResultData();
  163. }
  164. @ApiOperation("根据id查询接口")
  165. @GetMapping("/findVideo")
  166. @ApiImplicitParam(name = "id", value = "id", dataType = "Long", paramType = "query", required = true)
  167. public ResultData findVideo(Long id) {
  168. logger.debug("[" + getIpAddr() + "] MouldPatchController::findVideo");
  169. PhotoSpeakVideo photoSpeakVideo = photoSpeakVideoService.findVideo(id);
  170. // if(EnumVideoStatus.upload_ing.getCode().equals(userMouldVideo.getVideoStatus())
  171. // || EnumVideoStatus.upload_success.getCode().equals(userMouldVideo.getVideoStatus())
  172. // || EnumVideoStatus.upload_fail.getCode().equals(userMouldVideo.getVideoStatus())){
  173. // //上传阿里云状态 都是生成成功
  174. // userMouldVideo.setVideoStatus(EnumVideoStatus.success.getCode());
  175. // }
  176. return new ResultData(photoSpeakVideo);
  177. }
  178. @GetMapping(value = "/videoDetial")
  179. @ApiOperation("视频详情")
  180. @ApiImplicitParams({
  181. @ApiImplicitParam(name = "videoId", value = "视频编号", dataType = "String", paramType = "query", required = true)})
  182. public ResultData videoDetial(String videoId) {
  183. try {
  184. VideUploadResult videoDetail = videoFactory.getExcutor(videoType).getVideoDetailWithCache(videoId);
  185. return new ResultData(videoDetail);
  186. } catch (Exception e) {
  187. logger.error(e.getMessage());
  188. return new ResultData(ErrorCode.PICTURE_ANALYZING_ERROR);
  189. }
  190. }
  191. @AuthIgnore
  192. @SneakyThrows
  193. @GetMapping("exportVideo")
  194. public void exportVideo(Long id, HttpServletRequest request, HttpServletResponse response) {
  195. logger.debug("[" + getIpAddr() + "] UserMouldVideoController::exportVideo");
  196. response.reset();
  197. File tmpFile = null;
  198. OutputStream outputStream = null;
  199. try {
  200. outputStream = response.getOutputStream();
  201. } catch (IOException e) {
  202. throw new MallinkException(ErrorCode.SYS_SERVER_ERROR);
  203. }
  204. try{
  205. if(id == null){
  206. throw new MallinkException(ErrorCode.SYS_PARAMETER_NOT_NULL);
  207. }
  208. PhotoSpeakVideo photoSpeakVideo = photoSpeakVideoService.getById(id);
  209. // if(mouldVideo == null || !mouldVideo.getUserId().equals(getMemberId())){
  210. // throw new MallinkException(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(),"未找到用户数据");
  211. // }
  212. if(!EnumVideoStatus.upload_success.getCode().equals(photoSpeakVideo.getVideoStatus())){
  213. throw new MallinkException(ErrorCode.SYS_PARAMETER_ERROR.getCode(),"视频未生成成功");
  214. }
  215. //获取响应的输出流
  216. InputStream inputStream = new URL(photoSpeakVideo.getVideoPlayUrl()).openStream();
  217. //获取从那个字节开始读取文件
  218. // String rangeString = request.getHeader("Range");
  219. // if(StringUtils.isNotBlank(rangeString)){
  220. // tmpFile = FileUtils.createTmpFile(inputStream, mouldVideo.getId().toString(), "mp4");
  221. // RandomAccessFile targetFile = new RandomAccessFile(tmpFile, "r");
  222. // long fileLength = targetFile.length();
  223. // long range = Long.valueOf(rangeString.substring(rangeString.indexOf("=") + 1, rangeString.indexOf("-")));
  224. // //设置内容类型
  225. // response.setHeader("Content-Type", "video/mp4");
  226. // //设置此次相应返回的数据长度
  227. // response.setHeader("Content-Length", String.valueOf(fileLength - range));
  228. // //设置此次相应返回的数据范围
  229. // response.setHeader("Content-Range", "bytes "+range+"-"+(fileLength-1)+"/"+fileLength);
  230. // //返回码需要为206,而不是200
  231. // response.setStatus(HttpServletResponse.SC_PARTIAL_CONTENT);
  232. // //设定文件读取开始位置(以字节为单位)
  233. // targetFile.seek(range);
  234. //
  235. // byte[] cache = new byte[1024 * 300];
  236. // int flag;
  237. // while ((flag = targetFile.read(cache))!=-1){
  238. // outputStream.write(cache, 0, flag);
  239. // }
  240. // }else{
  241. response.setHeader("Content-Disposition", "attachment; filename="
  242. + URLEncoder.encode(photoSpeakVideo.getId()+".mp4", "UTF-8"));
  243. //解决编码问题
  244. response.setCharacterEncoding("UTF-8");
  245. response.setHeader("Content-Type","application/octet-stream");
  246. byte[] cache = new byte[1024 * 300];
  247. int flag;
  248. while ((flag = inputStream.read(cache))!=-1){
  249. outputStream.write(cache, 0, flag);
  250. }
  251. // }
  252. }catch(MallinkException e){
  253. ResultData resultData = new ResultData(e.getErrorCode(), e.getMessage());
  254. //解决编码问题
  255. response.setCharacterEncoding("UTF-8");
  256. response.setHeader("Content-Type","application/json");
  257. outputStream.write(JSONObject.toJSONString(resultData).getBytes(StandardCharsets.UTF_8));
  258. }finally {
  259. if (tmpFile != null) {
  260. tmpFile.delete();
  261. }
  262. outputStream.flush();
  263. outputStream.close();
  264. }
  265. }
  266. @AuthIgnore
  267. @GetMapping(value = "/music")
  268. @ApiImplicitParams({
  269. @ApiImplicitParam(name = "pageNum", value = "页数", dataType = "int", paramType = "query", required = true),
  270. @ApiImplicitParam(name = "pageSize", value = "每页条数", dataType = "int", paramType = "query", required = true)})
  271. @ApiOperation("获取默认音乐")
  272. public ResultData music(@ModelAttribute MusicInfo record, Integer pageNum, Integer pageSize) {
  273. logger.debug("[" + getIpAddr() + "] UserMouldVideoController::userList");
  274. if (record == null) record = new MusicInfo();
  275. PageInfo<MusicInfo> music = musicInfoService.music(pageNum, pageSize, record);
  276. return new ResultData(music);
  277. }
  278. @GetMapping(value = "/userMusic")
  279. @ApiImplicitParams({
  280. @ApiImplicitParam(name = "pageNum", value = "页数", dataType = "int", paramType = "query", required = true),
  281. @ApiImplicitParam(name = "pageSize", value = "每页条数", dataType = "int", paramType = "query", required = true)})
  282. @ApiOperation("获取用户音乐")
  283. public ResultData userMusic(@ModelAttribute MusicInfo record, Integer pageNum, Integer pageSize) {
  284. logger.debug("[" + getIpAddr() + "] UserMouldVideoController::userMusic");
  285. if (record == null) record = new MusicInfo();
  286. record.setUserId(getMemberId());
  287. PageInfo<MusicInfo> music = musicInfoService.userMusic(pageNum, pageSize, record);
  288. return new ResultData(music);
  289. }
  290. @ApiOperation("新增接口")
  291. @PostMapping("/save")
  292. public ResultData save(@RequestBody MusicInfo record) {
  293. logger.debug("[" + getIpAddr() + "] UserMouldVideoController::save");
  294. if (record == null) record = new MusicInfo();
  295. record.setType(EnumMouldSendType.build.getCode());
  296. record.setUserId(getMemberId());
  297. if (record.getTitle() == null) {
  298. record.setTitle("用户自建");
  299. }
  300. return musicInfoService.saveOrUpdate(record);
  301. }
  302. @ApiOperation("根据id删除接口")
  303. @GetMapping("/delete")
  304. @ApiImplicitParam(name = "id", value = "id", dataType = "Long", paramType = "query", required = true)
  305. public ResultData delete(Long id) {
  306. logger.debug("[" + getIpAddr() + "] PersonPhotoController::delete");
  307. if(id == null){
  308. return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(),"参数为空");
  309. }
  310. MusicInfo musicInfo = musicInfoService.getById(id);
  311. if(musicInfo == null){
  312. return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(),"未找到数据");
  313. }
  314. if(!musicInfo.getUserId().equals(getMemberId())){
  315. return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(),"未找到用户数据");
  316. }
  317. musicInfoService.deleteById(id);
  318. return new ResultData();
  319. }
  320. }