|
|
@@ -0,0 +1,291 @@ |
|
|
|
package com.iformall.controller; |
|
|
|
|
|
|
|
import com.alibaba.fastjson.JSONObject; |
|
|
|
import com.github.pagehelper.PageInfo; |
|
|
|
import com.iformall.annotation.AuthIgnore; |
|
|
|
import com.iformall.common.ErrorCode; |
|
|
|
import com.iformall.common.ResultData; |
|
|
|
import com.iformall.domain.po.base.BaseEntity; |
|
|
|
import com.iformall.domain.po.sm.PhotoSpeakVideo; |
|
|
|
import com.iformall.domain.po.sm.UserMouldVideo; |
|
|
|
import com.iformall.enums.EnumVideoStatus; |
|
|
|
import com.iformall.exception.MallinkException; |
|
|
|
import com.iformall.service.sm.MouldPatchService; |
|
|
|
import com.iformall.service.sm.PhotoSpeakVideoService; |
|
|
|
import com.iformall.service.sm.UserMouldVideoService; |
|
|
|
import com.iformall.video.VideoFactory; |
|
|
|
import com.iformall.video.entity.VideUploadResult; |
|
|
|
import io.swagger.annotations.Api; |
|
|
|
import io.swagger.annotations.ApiImplicitParam; |
|
|
|
import io.swagger.annotations.ApiImplicitParams; |
|
|
|
import io.swagger.annotations.ApiOperation; |
|
|
|
import lombok.SneakyThrows; |
|
|
|
import org.apache.commons.lang3.StringUtils; |
|
|
|
import org.slf4j.Logger; |
|
|
|
import org.slf4j.LoggerFactory; |
|
|
|
import org.springframework.beans.factory.annotation.Autowired; |
|
|
|
import org.springframework.web.bind.annotation.*; |
|
|
|
|
|
|
|
import javax.servlet.http.HttpServletRequest; |
|
|
|
import javax.servlet.http.HttpServletResponse; |
|
|
|
import java.io.File; |
|
|
|
import java.io.IOException; |
|
|
|
import java.io.InputStream; |
|
|
|
import java.io.OutputStream; |
|
|
|
import java.net.URL; |
|
|
|
import java.net.URLEncoder; |
|
|
|
import java.nio.charset.StandardCharsets; |
|
|
|
import java.util.Date; |
|
|
|
|
|
|
|
|
|
|
|
@RestController |
|
|
|
@RequestMapping("/api/userPhotoVideo") |
|
|
|
@Api(description = "模板接口") |
|
|
|
public class PhotoSpeakVideoController extends BaseController { |
|
|
|
private final Logger logger = LoggerFactory.getLogger(this.getClass()); |
|
|
|
|
|
|
|
@Autowired |
|
|
|
private PhotoSpeakVideoService photoSpeakVideoService; |
|
|
|
|
|
|
|
@Autowired |
|
|
|
private MouldPatchService mouldPatchService; |
|
|
|
|
|
|
|
@Autowired |
|
|
|
private VideoFactory videoFactory; |
|
|
|
|
|
|
|
@Autowired |
|
|
|
String videoType; |
|
|
|
|
|
|
|
@ApiOperation("分页列表接口") |
|
|
|
@GetMapping("list") |
|
|
|
@ApiImplicitParams({ |
|
|
|
@ApiImplicitParam(name = "pageNum", value = "页数", dataType = "int", paramType = "query", required = true), |
|
|
|
@ApiImplicitParam(name = "pageSize", value = "每页条数", dataType = "int", paramType = "query", required = true)}) |
|
|
|
public ResultData list(@ModelAttribute PhotoSpeakVideo record, Integer pageNum, Integer pageSize) { |
|
|
|
logger.debug("[" + getIpAddr() + "] UserMouldVideoController::list"); |
|
|
|
if (record == null) record = new PhotoSpeakVideo(); |
|
|
|
record.setUserId(getMemberId()); |
|
|
|
record.setSortColumns(BaseEntity.SortField.UpdateDate_DESC); |
|
|
|
final PageInfo<PhotoSpeakVideo> page = photoSpeakVideoService.cListAsPage(record, pageNum, pageSize); |
|
|
|
return new ResultData(page); |
|
|
|
} |
|
|
|
|
|
|
|
@ApiOperation("根据id查询接口") |
|
|
|
@GetMapping("/findById") |
|
|
|
@ApiImplicitParam(name = "id", value = "id", dataType = "Long", paramType = "query", required = true) |
|
|
|
public ResultData findById(Long id) { |
|
|
|
logger.debug("[" + getIpAddr() + "] MouldPatchController::findById"); |
|
|
|
if(id == null){ |
|
|
|
return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(),"参数为空"); |
|
|
|
} |
|
|
|
PhotoSpeakVideo photoSpeakVideo = photoSpeakVideoService.getById(id); |
|
|
|
if(photoSpeakVideo == null || !photoSpeakVideo.getUserId().equals(getMemberId())){ |
|
|
|
return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(),"未找到用户数据"); |
|
|
|
} |
|
|
|
return new ResultData(photoSpeakVideo); |
|
|
|
} |
|
|
|
|
|
|
|
@ApiOperation("根据id删除接口") |
|
|
|
@GetMapping("/del") |
|
|
|
@ApiImplicitParam(name = "id", value = "id", dataType = "Long", paramType = "query", required = true) |
|
|
|
public ResultData del(Long id) { |
|
|
|
logger.debug("[" + getIpAddr() + "] MouldPatchController::del"); |
|
|
|
if(id == null){ |
|
|
|
return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(),"参数为空"); |
|
|
|
} |
|
|
|
PhotoSpeakVideo photoSpeakVideo = photoSpeakVideoService.getById(id); |
|
|
|
if(photoSpeakVideo == null || !photoSpeakVideo.getUserId().equals(getMemberId())){ |
|
|
|
return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(),"未找到用户数据"); |
|
|
|
} |
|
|
|
// if(EnumVideoStatus.ing.getCode().equals(mouldVideo.getVideoStatus()) |
|
|
|
// || EnumVideoStatus.success.getCode().equals(mouldVideo.getVideoStatus()) |
|
|
|
// || EnumVideoStatus.upload_ing.getCode().equals(mouldVideo.getVideoStatus()) |
|
|
|
// || EnumVideoStatus.upload_fail.getCode().equals(mouldVideo.getVideoStatus())){ |
|
|
|
// return new ResultData(ErrorCode.SYS_PARAMETER_ERROR.getCode(),"视频生成中"); |
|
|
|
// } |
|
|
|
photoSpeakVideoService.deleteById(id); |
|
|
|
return new ResultData(); |
|
|
|
} |
|
|
|
|
|
|
|
@ApiOperation("新增接口") |
|
|
|
@PostMapping("saveOrUpdate") |
|
|
|
public ResultData saveOrUpdate(@RequestBody PhotoSpeakVideo record) { |
|
|
|
logger.debug("[" + getIpAddr() + "] MouldPatchController::saveOrUpdate"); |
|
|
|
record.setUserId(getMemberId()); |
|
|
|
if(record.getId() != null){ |
|
|
|
PhotoSpeakVideo photoSpeakVideo = photoSpeakVideoService.findVideo(record.getId()); |
|
|
|
if(photoSpeakVideo == null){ |
|
|
|
return new ResultData(ErrorCode.SYS_SERVER_ERROR); |
|
|
|
} |
|
|
|
if(EnumVideoStatus.ing.getCode().equals(photoSpeakVideo.getVideoStatus()) |
|
|
|
|| EnumVideoStatus.success.getCode().equals(photoSpeakVideo.getVideoStatus()) |
|
|
|
|| EnumVideoStatus.upload_ing.getCode().equals(photoSpeakVideo.getVideoStatus()) |
|
|
|
|| EnumVideoStatus.upload_fail.getCode().equals(photoSpeakVideo.getVideoStatus())){ |
|
|
|
return new ResultData(ErrorCode.SYS_PARAMETER_ERROR.getCode(),"视频生成中"); |
|
|
|
} |
|
|
|
if(EnumVideoStatus.upload_success.getCode().equals(photoSpeakVideo.getVideoStatus())){ |
|
|
|
//上传阿里云状态 生成成功 |
|
|
|
return new ResultData(ErrorCode.SYS_PARAMETER_ERROR.getCode(),"视频已生成完成"); |
|
|
|
} |
|
|
|
} |
|
|
|
if(record.getPersonPhotoId() == null){ |
|
|
|
return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(),"未选择照片"); |
|
|
|
} |
|
|
|
return photoSpeakVideoService.saveOrUpdate(record); |
|
|
|
} |
|
|
|
|
|
|
|
@ApiOperation("生成视频") |
|
|
|
@PostMapping("createVideo") |
|
|
|
public ResultData create(@RequestBody PhotoSpeakVideo record) { |
|
|
|
logger.debug("[" + getIpAddr() + "] MouldPatchController::saveOrUpdate"); |
|
|
|
if(record.getId() == null){ |
|
|
|
return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL); |
|
|
|
} |
|
|
|
PhotoSpeakVideo mouldVideo = photoSpeakVideoService.getById(record.getId()); |
|
|
|
|
|
|
|
logger.info("TEST--"+ JSONObject.toJSONString(mouldVideo)); |
|
|
|
|
|
|
|
if(mouldVideo == null || !mouldVideo.getUserId().equals(getMemberId())){ |
|
|
|
return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(),"未找到用户数据"); |
|
|
|
} |
|
|
|
|
|
|
|
if(EnumVideoStatus.ing.getCode().equals(mouldVideo.getVideoStatus()) |
|
|
|
|| EnumVideoStatus.success.getCode().equals(mouldVideo.getVideoStatus()) |
|
|
|
|| EnumVideoStatus.upload_ing.getCode().equals(mouldVideo.getVideoStatus()) |
|
|
|
|| EnumVideoStatus.upload_fail.getCode().equals(mouldVideo.getVideoStatus())){ |
|
|
|
return new ResultData(ErrorCode.SYS_PARAMETER_ERROR.getCode(),"视频生成中"); |
|
|
|
} |
|
|
|
if(EnumVideoStatus.upload_success.getCode().equals(mouldVideo.getVideoStatus())){ |
|
|
|
//上传阿里云状态 生成成功 |
|
|
|
return new ResultData(ErrorCode.SYS_PARAMETER_ERROR.getCode(),"视频已生成完成"); |
|
|
|
} |
|
|
|
|
|
|
|
PhotoSpeakVideo mouldVideoUpd = new PhotoSpeakVideo(); |
|
|
|
mouldVideoUpd.setId(record.getId()); |
|
|
|
mouldVideoUpd.setVideoStatus(EnumVideoStatus.ing.getCode()); |
|
|
|
mouldVideoUpd.setVideoMsg(""); |
|
|
|
mouldVideoUpd.setCreateVideoDate(new Date()); |
|
|
|
photoSpeakVideoService.saveOrUpdate(mouldVideoUpd); |
|
|
|
|
|
|
|
photoSpeakVideoService.createVideo(mouldVideo); |
|
|
|
|
|
|
|
return new ResultData(); |
|
|
|
} |
|
|
|
|
|
|
|
@ApiOperation("根据id查询接口") |
|
|
|
@GetMapping("/findVideo") |
|
|
|
@ApiImplicitParam(name = "id", value = "id", dataType = "Long", paramType = "query", required = true) |
|
|
|
public ResultData findVideo(Long id) { |
|
|
|
logger.debug("[" + getIpAddr() + "] MouldPatchController::findVideo"); |
|
|
|
PhotoSpeakVideo photoSpeakVideo = photoSpeakVideoService.findVideo(id); |
|
|
|
// if(EnumVideoStatus.upload_ing.getCode().equals(userMouldVideo.getVideoStatus()) |
|
|
|
// || EnumVideoStatus.upload_success.getCode().equals(userMouldVideo.getVideoStatus()) |
|
|
|
// || EnumVideoStatus.upload_fail.getCode().equals(userMouldVideo.getVideoStatus())){ |
|
|
|
// //上传阿里云状态 都是生成成功 |
|
|
|
// userMouldVideo.setVideoStatus(EnumVideoStatus.success.getCode()); |
|
|
|
// } |
|
|
|
return new ResultData(photoSpeakVideo); |
|
|
|
} |
|
|
|
|
|
|
|
@GetMapping(value = "/videoDetial") |
|
|
|
@ApiOperation("视频详情") |
|
|
|
@ApiImplicitParams({ |
|
|
|
@ApiImplicitParam(name = "videoId", value = "视频编号", dataType = "String", paramType = "query", required = true)}) |
|
|
|
public ResultData videoDetial(String videoId) { |
|
|
|
try { |
|
|
|
VideUploadResult videoDetail = videoFactory.getExcutor(videoType).getVideoDetailWithCache(videoId); |
|
|
|
return new ResultData(videoDetail); |
|
|
|
} catch (Exception e) { |
|
|
|
logger.error(e.getMessage()); |
|
|
|
return new ResultData(ErrorCode.PICTURE_ANALYZING_ERROR); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@AuthIgnore |
|
|
|
@SneakyThrows |
|
|
|
@GetMapping("exportVideo") |
|
|
|
public void exportVideo(Long id, HttpServletRequest request, HttpServletResponse response) { |
|
|
|
logger.debug("[" + getIpAddr() + "] UserMouldVideoController::exportVideo"); |
|
|
|
|
|
|
|
response.reset(); |
|
|
|
|
|
|
|
File tmpFile = null; |
|
|
|
OutputStream outputStream = null; |
|
|
|
try { |
|
|
|
outputStream = response.getOutputStream(); |
|
|
|
} catch (IOException e) { |
|
|
|
throw new MallinkException(ErrorCode.SYS_SERVER_ERROR); |
|
|
|
} |
|
|
|
|
|
|
|
try{ |
|
|
|
if(id == null){ |
|
|
|
throw new MallinkException(ErrorCode.SYS_PARAMETER_NOT_NULL); |
|
|
|
} |
|
|
|
PhotoSpeakVideo photoSpeakVideo = photoSpeakVideoService.getById(id); |
|
|
|
|
|
|
|
// if(mouldVideo == null || !mouldVideo.getUserId().equals(getMemberId())){ |
|
|
|
// throw new MallinkException(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(),"未找到用户数据"); |
|
|
|
// } |
|
|
|
if(!EnumVideoStatus.upload_success.getCode().equals(photoSpeakVideo.getVideoStatus())){ |
|
|
|
throw new MallinkException(ErrorCode.SYS_PARAMETER_ERROR.getCode(),"视频未生成成功"); |
|
|
|
} |
|
|
|
|
|
|
|
//获取响应的输出流 |
|
|
|
InputStream inputStream = new URL(photoSpeakVideo.getVideoPlayUrl()).openStream(); |
|
|
|
|
|
|
|
//获取从那个字节开始读取文件 |
|
|
|
// String rangeString = request.getHeader("Range"); |
|
|
|
// if(StringUtils.isNotBlank(rangeString)){ |
|
|
|
// tmpFile = FileUtils.createTmpFile(inputStream, mouldVideo.getId().toString(), "mp4"); |
|
|
|
// RandomAccessFile targetFile = new RandomAccessFile(tmpFile, "r"); |
|
|
|
// long fileLength = targetFile.length(); |
|
|
|
// long range = Long.valueOf(rangeString.substring(rangeString.indexOf("=") + 1, rangeString.indexOf("-"))); |
|
|
|
// //设置内容类型 |
|
|
|
// response.setHeader("Content-Type", "video/mp4"); |
|
|
|
// //设置此次相应返回的数据长度 |
|
|
|
// response.setHeader("Content-Length", String.valueOf(fileLength - range)); |
|
|
|
// //设置此次相应返回的数据范围 |
|
|
|
// response.setHeader("Content-Range", "bytes "+range+"-"+(fileLength-1)+"/"+fileLength); |
|
|
|
// //返回码需要为206,而不是200 |
|
|
|
// response.setStatus(HttpServletResponse.SC_PARTIAL_CONTENT); |
|
|
|
// //设定文件读取开始位置(以字节为单位) |
|
|
|
// targetFile.seek(range); |
|
|
|
// |
|
|
|
// byte[] cache = new byte[1024 * 300]; |
|
|
|
// int flag; |
|
|
|
// while ((flag = targetFile.read(cache))!=-1){ |
|
|
|
// outputStream.write(cache, 0, flag); |
|
|
|
// } |
|
|
|
// }else{ |
|
|
|
response.setHeader("Content-Disposition", "attachment; filename=" |
|
|
|
+ URLEncoder.encode(photoSpeakVideo.getId()+".mp4", "UTF-8")); |
|
|
|
//解决编码问题 |
|
|
|
response.setCharacterEncoding("UTF-8"); |
|
|
|
response.setHeader("Content-Type","application/octet-stream"); |
|
|
|
|
|
|
|
byte[] cache = new byte[1024 * 300]; |
|
|
|
int flag; |
|
|
|
while ((flag = inputStream.read(cache))!=-1){ |
|
|
|
outputStream.write(cache, 0, flag); |
|
|
|
} |
|
|
|
// } |
|
|
|
|
|
|
|
}catch(MallinkException e){ |
|
|
|
ResultData resultData = new ResultData(e.getErrorCode(), e.getMessage()); |
|
|
|
//解决编码问题 |
|
|
|
response.setCharacterEncoding("UTF-8"); |
|
|
|
response.setHeader("Content-Type","application/json"); |
|
|
|
outputStream.write(JSONObject.toJSONString(resultData).getBytes(StandardCharsets.UTF_8)); |
|
|
|
|
|
|
|
}finally { |
|
|
|
if (tmpFile != null) { |
|
|
|
tmpFile.delete(); |
|
|
|
} |
|
|
|
outputStream.flush(); |
|
|
|
outputStream.close(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
} |