后台服务
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

363 lines
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. @AuthIgnore
  108. @ApiOperation("新增接口")
  109. @PostMapping("saveOrUpdate")
  110. public ResultData saveOrUpdate(@RequestBody PhotoSpeakVideo record) {
  111. logger.debug("[" + getIpAddr() + "] MouldPatchController::saveOrUpdate");
  112. // record.setUserId(getMemberId());
  113. if(record.getId() != null){
  114. PhotoSpeakVideo photoSpeakVideo = photoSpeakVideoService.findVideo(record.getId());
  115. if(photoSpeakVideo == null){
  116. return new ResultData(ErrorCode.SYS_SERVER_ERROR);
  117. }
  118. if(EnumVideoStatus.ing.getCode().equals(photoSpeakVideo.getVideoStatus())
  119. || EnumVideoStatus.success.getCode().equals(photoSpeakVideo.getVideoStatus())
  120. || EnumVideoStatus.upload_ing.getCode().equals(photoSpeakVideo.getVideoStatus())
  121. || EnumVideoStatus.upload_fail.getCode().equals(photoSpeakVideo.getVideoStatus())){
  122. return new ResultData(ErrorCode.SYS_PARAMETER_ERROR.getCode(),"视频生成中");
  123. }
  124. if(EnumVideoStatus.upload_success.getCode().equals(photoSpeakVideo.getVideoStatus())){
  125. //上传阿里云状态 生成成功
  126. return new ResultData(ErrorCode.SYS_PARAMETER_ERROR.getCode(),"视频已生成完成");
  127. }
  128. }
  129. if(record.getPersonPhotoId() == null){
  130. return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(),"未选择照片");
  131. }
  132. return photoSpeakVideoService.saveOrUpdate(record);
  133. }
  134. @ApiOperation("生成视频")
  135. @PostMapping("createVideo")
  136. public ResultData create(@RequestBody PhotoSpeakVideo record) {
  137. logger.debug("[" + getIpAddr() + "] MouldPatchController::saveOrUpdate");
  138. if(record.getId() == null){
  139. return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL);
  140. }
  141. PhotoSpeakVideo mouldVideo = photoSpeakVideoService.getById(record.getId());
  142. logger.info("TEST--"+ JSONObject.toJSONString(mouldVideo));
  143. if(mouldVideo == null || !mouldVideo.getUserId().equals(getMemberId())){
  144. return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(),"未找到用户数据");
  145. }
  146. if(EnumVideoStatus.ing.getCode().equals(mouldVideo.getVideoStatus())
  147. || EnumVideoStatus.success.getCode().equals(mouldVideo.getVideoStatus())
  148. || EnumVideoStatus.upload_ing.getCode().equals(mouldVideo.getVideoStatus())
  149. || EnumVideoStatus.upload_fail.getCode().equals(mouldVideo.getVideoStatus())){
  150. return new ResultData(ErrorCode.SYS_PARAMETER_ERROR.getCode(),"视频生成中");
  151. }
  152. if(EnumVideoStatus.upload_success.getCode().equals(mouldVideo.getVideoStatus())){
  153. //上传阿里云状态 生成成功
  154. return new ResultData(ErrorCode.SYS_PARAMETER_ERROR.getCode(),"视频已生成完成");
  155. }
  156. PhotoSpeakVideo mouldVideoUpd = new PhotoSpeakVideo();
  157. mouldVideoUpd.setId(record.getId());
  158. mouldVideoUpd.setVideoStatus(EnumVideoStatus.ing.getCode());
  159. mouldVideoUpd.setVideoMsg("");
  160. mouldVideoUpd.setCreateVideoDate(new Date());
  161. photoSpeakVideoService.saveOrUpdate(mouldVideoUpd);
  162. photoSpeakVideoService.createVideo(mouldVideo,true);
  163. return new ResultData();
  164. }
  165. @ApiOperation("根据id查询接口")
  166. @GetMapping("/findVideo")
  167. @ApiImplicitParam(name = "id", value = "id", dataType = "Long", paramType = "query", required = true)
  168. public ResultData findVideo(Long id) {
  169. logger.debug("[" + getIpAddr() + "] MouldPatchController::findVideo");
  170. PhotoSpeakVideo photoSpeakVideo = photoSpeakVideoService.findVideo(id);
  171. // if(EnumVideoStatus.upload_ing.getCode().equals(userMouldVideo.getVideoStatus())
  172. // || EnumVideoStatus.upload_success.getCode().equals(userMouldVideo.getVideoStatus())
  173. // || EnumVideoStatus.upload_fail.getCode().equals(userMouldVideo.getVideoStatus())){
  174. // //上传阿里云状态 都是生成成功
  175. // userMouldVideo.setVideoStatus(EnumVideoStatus.success.getCode());
  176. // }
  177. return new ResultData(photoSpeakVideo);
  178. }
  179. @GetMapping(value = "/videoDetial")
  180. @ApiOperation("视频详情")
  181. @ApiImplicitParams({
  182. @ApiImplicitParam(name = "videoId", value = "视频编号", dataType = "String", paramType = "query", required = true)})
  183. public ResultData videoDetial(String videoId) {
  184. try {
  185. VideUploadResult videoDetail = videoFactory.getExcutor(videoType).getVideoDetailWithCache(videoId);
  186. return new ResultData(videoDetail);
  187. } catch (Exception e) {
  188. logger.error(e.getMessage());
  189. return new ResultData(ErrorCode.PICTURE_ANALYZING_ERROR);
  190. }
  191. }
  192. @AuthIgnore
  193. @SneakyThrows
  194. @GetMapping("exportVideo")
  195. public void exportVideo(Long id, HttpServletRequest request, HttpServletResponse response) {
  196. logger.debug("[" + getIpAddr() + "] UserMouldVideoController::exportVideo");
  197. response.reset();
  198. File tmpFile = null;
  199. OutputStream outputStream = null;
  200. try {
  201. outputStream = response.getOutputStream();
  202. } catch (IOException e) {
  203. throw new MallinkException(ErrorCode.SYS_SERVER_ERROR);
  204. }
  205. try{
  206. if(id == null){
  207. throw new MallinkException(ErrorCode.SYS_PARAMETER_NOT_NULL);
  208. }
  209. PhotoSpeakVideo photoSpeakVideo = photoSpeakVideoService.getById(id);
  210. // if(mouldVideo == null || !mouldVideo.getUserId().equals(getMemberId())){
  211. // throw new MallinkException(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(),"未找到用户数据");
  212. // }
  213. if(!EnumVideoStatus.upload_success.getCode().equals(photoSpeakVideo.getVideoStatus())){
  214. throw new MallinkException(ErrorCode.SYS_PARAMETER_ERROR.getCode(),"视频未生成成功");
  215. }
  216. //获取响应的输出流
  217. InputStream inputStream = new URL(photoSpeakVideo.getVideoPlayUrl()).openStream();
  218. //获取从那个字节开始读取文件
  219. // String rangeString = request.getHeader("Range");
  220. // if(StringUtils.isNotBlank(rangeString)){
  221. // tmpFile = FileUtils.createTmpFile(inputStream, mouldVideo.getId().toString(), "mp4");
  222. // RandomAccessFile targetFile = new RandomAccessFile(tmpFile, "r");
  223. // long fileLength = targetFile.length();
  224. // long range = Long.valueOf(rangeString.substring(rangeString.indexOf("=") + 1, rangeString.indexOf("-")));
  225. // //设置内容类型
  226. // response.setHeader("Content-Type", "video/mp4");
  227. // //设置此次相应返回的数据长度
  228. // response.setHeader("Content-Length", String.valueOf(fileLength - range));
  229. // //设置此次相应返回的数据范围
  230. // response.setHeader("Content-Range", "bytes "+range+"-"+(fileLength-1)+"/"+fileLength);
  231. // //返回码需要为206,而不是200
  232. // response.setStatus(HttpServletResponse.SC_PARTIAL_CONTENT);
  233. // //设定文件读取开始位置(以字节为单位)
  234. // targetFile.seek(range);
  235. //
  236. // byte[] cache = new byte[1024 * 300];
  237. // int flag;
  238. // while ((flag = targetFile.read(cache))!=-1){
  239. // outputStream.write(cache, 0, flag);
  240. // }
  241. // }else{
  242. response.setHeader("Content-Disposition", "attachment; filename="
  243. + URLEncoder.encode(photoSpeakVideo.getId()+".mp4", "UTF-8"));
  244. //解决编码问题
  245. response.setCharacterEncoding("UTF-8");
  246. response.setHeader("Content-Type","application/octet-stream");
  247. byte[] cache = new byte[1024 * 300];
  248. int flag;
  249. while ((flag = inputStream.read(cache))!=-1){
  250. outputStream.write(cache, 0, flag);
  251. }
  252. // }
  253. }catch(MallinkException e){
  254. ResultData resultData = new ResultData(e.getErrorCode(), e.getMessage());
  255. //解决编码问题
  256. response.setCharacterEncoding("UTF-8");
  257. response.setHeader("Content-Type","application/json");
  258. outputStream.write(JSONObject.toJSONString(resultData).getBytes(StandardCharsets.UTF_8));
  259. }finally {
  260. if (tmpFile != null) {
  261. tmpFile.delete();
  262. }
  263. outputStream.flush();
  264. outputStream.close();
  265. }
  266. }
  267. @AuthIgnore
  268. @GetMapping(value = "/music")
  269. @ApiImplicitParams({
  270. @ApiImplicitParam(name = "pageNum", value = "页数", dataType = "int", paramType = "query", required = true),
  271. @ApiImplicitParam(name = "pageSize", value = "每页条数", dataType = "int", paramType = "query", required = true)})
  272. @ApiOperation("获取默认音乐")
  273. public ResultData music(@ModelAttribute MusicInfo record, Integer pageNum, Integer pageSize) {
  274. logger.debug("[" + getIpAddr() + "] UserMouldVideoController::userList");
  275. if (record == null) record = new MusicInfo();
  276. record.setSortColumns(BaseEntity.SortField.UpdateDate_DESC);
  277. PageInfo<MusicInfo> music = musicInfoService.music(pageNum, pageSize, record);
  278. return new ResultData(music);
  279. }
  280. @GetMapping(value = "/userMusic")
  281. @ApiImplicitParams({
  282. @ApiImplicitParam(name = "pageNum", value = "页数", dataType = "int", paramType = "query", required = true),
  283. @ApiImplicitParam(name = "pageSize", value = "每页条数", dataType = "int", paramType = "query", required = true)})
  284. @ApiOperation("获取用户音乐")
  285. public ResultData userMusic(@ModelAttribute MusicInfo record, Integer pageNum, Integer pageSize) {
  286. logger.debug("[" + getIpAddr() + "] UserMouldVideoController::userMusic");
  287. if (record == null) record = new MusicInfo();
  288. record.setUserId(getMemberId());
  289. record.setSortColumns(BaseEntity.SortField.UpdateDate_DESC);
  290. PageInfo<MusicInfo> music = musicInfoService.userMusic(pageNum, pageSize, record);
  291. return new ResultData(music);
  292. }
  293. @ApiOperation("新增接口")
  294. @PostMapping("/save")
  295. public ResultData save(@RequestBody MusicInfo record) {
  296. logger.debug("[" + getIpAddr() + "] UserMouldVideoController::save");
  297. if (record == null) record = new MusicInfo();
  298. record.setType(EnumMouldSendType.build.getCode());
  299. record.setUserId(getMemberId());
  300. if (record.getTitle() == null) {
  301. record.setTitle("用户自建");
  302. }
  303. return musicInfoService.saveOrUpdate(record);
  304. }
  305. @ApiOperation("根据id删除接口")
  306. @GetMapping("/delete")
  307. @ApiImplicitParam(name = "id", value = "id", dataType = "Long", paramType = "query", required = true)
  308. public ResultData delete(Long id) {
  309. logger.debug("[" + getIpAddr() + "] PersonPhotoController::delete");
  310. if(id == null){
  311. return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(),"参数为空");
  312. }
  313. MusicInfo musicInfo = musicInfoService.getById(id);
  314. if(musicInfo == null){
  315. return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(),"未找到数据");
  316. }
  317. if(!musicInfo.getUserId().equals(getMemberId())){
  318. return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(),"未找到用户数据");
  319. }
  320. musicInfoService.deleteById(id);
  321. return new ResultData();
  322. }
  323. }