package com.qxueyou.scc.teach.res.service.impl.resitem; import java.io.File; import java.util.Date; import com.qxueyou.scc.sys.utils.VideoUtil; import org.apache.commons.io.FileUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Service; import com.alibaba.fastjson.JSONObject; import com.qxueyou.scc.base.model.Result; import com.qxueyou.scc.base.service.ICacheService; import com.qxueyou.scc.base.service.impl.CommonAppService; import com.qxueyou.scc.base.util.CollectionUtils; import com.qxueyou.scc.base.util.TraceUtils; import com.qxueyou.scc.media.model.MediaVideo; import com.qxueyou.scc.media.model.VideoConverTask; import com.qxueyou.scc.teach.res.model.Res; import com.qxueyou.scc.teach.res.model.ResFile; import com.qxueyou.scc.teach.res.model.ResItemAudio; import com.qxueyou.scc.teach.res.model.ResItemVideo; import com.qxueyou.scc.teach.res.service.IFileService; import com.qxueyou.scc.teach.res.service.IResItemService; import com.qxueyou.scc.teach.res.service.impl.ResService; @Service(value = "ResItemVideoService") public class ResItemVideoService extends CommonAppService implements IResItemService { public static final String RES_VIDEO_CONVER_LST = "RES_VIDEO_CONVER_LST"; @Autowired IFileService fileService; @Autowired ICacheService cacheService; @Value("${scc.resRootPath}") String resRootPath; @Override public String add(String fileId, String name) { ResFile file = fileService.read(fileId); String mediaVideoId = addVideoConverTask(file); ResItemVideo resVideo = new ResItemVideo(); TraceUtils.setCreateTrace(resVideo); try { resVideo.setFileId(fileId); resVideo.setPlayTime((int) VideoUtil.getMp4Duration(resRootPath +"/"+ file.getPath())); resVideo.setName(name); resVideo.setMediaVideoId(mediaVideoId); resVideo.setStatus(ResItemVideo.STATUS_LINEUP); save(resVideo); // ½«mediaVideoId·Å½ø»º´æ cacheService.lstRightPush(RES_VIDEO_CONVER_LST, mediaVideoId); }catch (Exception e){ e.printStackTrace(); } return resVideo.getVideoId(); } private String addVideoConverTask(ResFile file) { MediaVideo video = insertMediaVideo(file); insertMediaVideoConverTask(video); return video.getVideoId(); } private MediaVideo insertMediaVideo(ResFile file) { MediaVideo video = new MediaVideo(); TraceUtils.setCreateTrace(video); try { video.setDeleteFlag(false); video.setPlayTime((int) VideoUtil.getMp4Duration(resRootPath +"/"+ file.getPath())); video.setName(file.getFileName()); video.setOrigUrl(file.getPath()); video.setStatus(MediaVideo.STATUS_LINEUP); video.setType(MediaVideo.MEDIA_VIDEO); }catch (Exception e){ e.printStackTrace(); } save(video); return video; } private Result insertMediaVideoConverTask(MediaVideo resVideo) { VideoConverTask task = new VideoConverTask(); task.setCreateTime(new Date()); task.setDeleteFlag(false); task.setVideoId(resVideo.getVideoId()); task.setVideoUrl(resVideo.getOrigUrl()); task.setType(MediaVideo.MEDIA_VIDEO); task.setPriority(5); save(task); return new Result(true); } @Override public Result update(String id, String name) { ResItemVideo video = read(ResItemVideo.class, id); TraceUtils.setUpdateTrace(video); video.setName(name); save(video); return new Result(true, "success"); } @Override public String readAccessPath(String resId, String attribute) { ResItemVideo resItemVideo = read(ResItemVideo.class, resId); if (resItemVideo != null && resItemVideo.getStatus() != ResItemVideo.STATUS_DRAFT) { ResFile resFile = read(ResFile.class, resItemVideo.getFileId()); return resFile.getPath(); // return null; } MediaVideo video = read(MediaVideo.class, resItemVideo.getMediaVideoId()); if (video == null) { return null; } return JSONObject.toJSONString(CollectionUtils.newObjectMap("hd", video.getAndroidHD(), "sd", video.getAndroidSD(), "ld", video.getAndroidLD(), "path", StringUtils.isNotEmpty(video.getAndroidHD()) ? video.getAndroidHD() : StringUtils.isNotEmpty(video.getAndroidSD()) ? video.getAndroidSD() : video.getAndroidLD())); } @Override public String getResItemType() { return Res.FILE_TYPE_VIDEO; } /** * ¶¨Ê±Æ÷תÂë³É¹¦ºó ͬ²½¸üÐÂResItemVideoµÄ״̬ */ @Scheduled(cron = "0/2 * * * * ?") // ÿ2ÃëÖ´ÐÐÒ»´Î public void doTimer() { String mediaVideoId = cacheService.lstLeftPop(RES_VIDEO_CONVER_LST); if (StringUtils.isBlank(mediaVideoId)) { return; } MediaVideo mediaVideo = read(MediaVideo.class, mediaVideoId); if (mediaVideo.getStatus() == MediaVideo.STATUS_DRAFT) { if (mediaVideo.getType().equals("video")) { ResItemVideo resItemVideo = findUnique( "from ResItemVideo where deleteFlag is false and mediaVideoId = ?", CollectionUtils.newList(mediaVideoId), ResItemVideo.class); resItemVideo.setStatus(ResItemVideo.STATUS_DRAFT); TraceUtils.setUpdateTrace(resItemVideo); resItemVideo.setVideoSeconds(mediaVideo.getPlayTime()); save(resItemVideo); cacheService.lstRightPush(ResService.RES_TOUPDATE_CONVER_STATUS_LST, resItemVideo.getVideoId());// ½«×ªÂëÍê³ÉºóµÄÎļþid·ÅÈ뻺´æ¡£ return; } else if (mediaVideo.getType().equals("audio")) { ResItemAudio resItemAudio = findUnique( "from ResItemAudio where deleteFlag is false and mediaVideoId = ?", CollectionUtils.newList(mediaVideoId), ResItemAudio.class); resItemAudio.setStatus(ResItemVideo.STATUS_DRAFT); TraceUtils.setUpdateTrace(resItemAudio); resItemAudio.setSeconds(mediaVideo.getPlayTime()); save(resItemAudio); cacheService.lstRightPush(ResService.RES_TOUPDATE_CONVER_STATUS_LST, resItemAudio.getAudioId());// ½«×ªÂëÍê³ÉºóµÄÎļþid·ÅÈ뻺´æ¡£ return; } } cacheService.lstRightPush(RES_VIDEO_CONVER_LST, mediaVideoId); } }