package cn.huge.module.xylink.service; import cn.huge.base.common.exception.ServiceException; import cn.huge.base.common.utils.DateUtils; import cn.huge.base.common.utils.IdUtils; import cn.huge.base.common.utils.ObjectUtils; import cn.huge.module.client.api.impl.UtilsClientImpl; import cn.huge.module.xylink.constant.XylinkConsts; import cn.huge.module.xylink.dao.mapper.XylinkVideoMapper; import cn.huge.module.xylink.domain.dto.XylinkVedioDTO; import cn.huge.module.xylink.domain.po.XylinkSys; import cn.huge.module.xylink.domain.po.XylinkVideo; import cn.huge.module.xylink.utils.XylinkUtils; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.apache.commons.io.FileUtils; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.utils.URIBuilder; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.util.EntityUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageImpl; import org.springframework.data.domain.PageRequest; import org.springframework.transaction.annotation.Transactional; import javax.annotation.PostConstruct; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.URISyntaxException; import java.net.URL; import java.util.Date; import java.util.List; import java.util.Map; /** * @title: 小鱼云会议录制视频记录表业务逻辑处理 * @Description JPA的单表数据查询以由BaseService完成 * @company hugeinfo * @author liyj * @Time 2023-08-18 14:12:24 * @version 1.0.0 */ @Slf4j @Service @Transactional(rollbackFor = Exception.class) public class XylinkVideoService extends ServiceImpl{ @Autowired private XylinkVideoMapper mapper; @Autowired private XylinkSysService xylinkSysService; @Autowired private UtilsClientImpl utilsClient; /** * 更新对象 * @param entity 对象 */ public void updateXylinkVideo(XylinkVideo entity){ try{ mapper.updateXylinkVideo(entity); }catch (Exception e){ log.error("service方法[XylinkVideoService.updateXylinkVideo]调用异常:"+e, e); throw new ServiceException("XylinkVideoService.updateXylinkVideo", e); } } /** * 条件更新对象 * @param entity 对象 * @param terms 条件 */ public void updateXylinkVideoTerms(XylinkVideo entity, Map terms){ try{ mapper.updateXylinkVideoTerms(entity, terms); }catch (Exception e){ log.error("service方法[XylinkVideoService.updateXylinkVideoTerms]调用异常:"+e, e); throw new ServiceException("XylinkVideoService.updateXylinkVideoTerms", e); } } /** * 根据编号物理删除 * @param id 查询条件集合 */ public void deleteXylinkVideo(String id){ try{ mapper.deleteXylinkVideo(id); }catch (Exception e){ log.error("service方法[XylinkVideoService.deleteXylinkVideo]调用异常:"+e, e); throw new ServiceException("XylinkVideoService.deleteXylinkVideo", e); } } /** * 按条件查询 * @param terms 条件 * @return List */ public List listTerms(Map terms){ return mapper.listTerms(terms); } /** * 按条件统计 * @param terms 条件 * @return long */ public long countTerms(Map terms){ return mapper.countTerms(terms); } /** * 按条件分页查询 * @param page 分页对象 * @param terms 条件 * @return Page */ public Page pageQuery(PageRequest page, Map terms){ long total = mapper.countTerms(terms); List content = mapper.pageTerms(page, terms); return new PageImpl(content, page, total); } /** * 新增或更新对象 * @param xylinkVideo 实体对象 */ public void saveXylinkVideo(XylinkVideo xylinkVideo){ try{ Date nowDate = DateUtils.getNowDate(); // 判断是否新增 if (IdUtils.checkNewId(xylinkVideo.getId())){ xylinkVideo.setId(utilsClient.getNewTimeId()); xylinkVideo.setCreateTime(nowDate); } xylinkVideo.setUpdateTime(nowDate); this.saveOrUpdate(xylinkVideo); }catch (Exception e){ log.error("service方法[XylinkVideoService.saveXylinkVideo]调用异常:"+e, e); throw new ServiceException("XylinkVideoService.saveXylinkVideo", e); } } /** * 小鱼云会议录制视频转存到平台服务器 * @param vodId */ public String saveVideoToDyh(String vodId, String fileName){ try{ log.info("start saveVideoToDyh fileName {}",fileName); String url = XylinkUtils.getDownloadUrl(vodId); // 下载文件保存路径 XylinkSys dyhSavenSys = xylinkSysService.getByTypeAndCode(XylinkConsts.SYS_TYPE_1, XylinkConsts.SYS_CODE_1); if(ObjectUtils.isNotEmpty(dyhSavenSys)){ log.info("start saveVideoToDyh dyhSavenSys {}", JSON.toJSONString(dyhSavenSys)); } // 路径不存在创建路径 File sf = new File(dyhSavenSys.getSysValue()); if(!sf.exists()){ sf.mkdirs(); } String savePath = dyhSavenSys.getSysValue() + fileName; log.info("saveVideoToDyh savePath {}, DownloadUrl {}",savePath,url); CloseableHttpClient httpclient = HttpClients.createDefault(); // URIBuilder urlBuilder = new URIBuilder(url); // urlBuilder.addParameter("fileName", fileName); HttpGet httpGet = new HttpGet(url); try (CloseableHttpResponse response = httpclient.execute(httpGet)) { log.info("finish saveVideoToDyh response {}",response); if (response.getStatusLine().getStatusCode() == 200) { try (InputStream inputStream = response.getEntity().getContent(); FileOutputStream outputStream = new FileOutputStream(new File(savePath))) { byte[] buffer = new byte[1024]; int bytesRead; while ((bytesRead = inputStream.read(buffer)) != -1) { outputStream.write(buffer, 0, bytesRead); } } // 删除小鱼服务器上的视频 XylinkUtils.deleteVideo(vodId); // 返回多元化访问url XylinkSys dyhPlayUrlSys = xylinkSysService.getByTypeAndCode(XylinkConsts.SYS_TYPE_1, XylinkConsts.SYS_CODE_2); String dyhPlayUrl = dyhPlayUrlSys.getSysValue()+fileName; log.info("finish saveVideoToDyh dyhPlayUrl {}",dyhPlayUrl); return dyhPlayUrl; } else { log.error("Failed to download video, status code: {}", response.getStatusLine().getStatusCode()); return null; } } }catch (Exception e){ log.error("service方法[XylinkVideoService.saveVideoToDyh]调用异常:"+e, e); return null; } } /** * 根据url下载文件流 todo * @param urlStr * @return */ public String getInputStreamByUrl(String urlStr, String name) { try { //url解码 URL url = new URL(java.net.URLDecoder.decode(urlStr, "UTF-8")); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); //设置超时间为3秒 conn.setConnectTimeout(3 * 1000); //防止屏蔽程序抓取而返回403错误 conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)"); //得到输入流 InputStream is = conn.getInputStream(); byte[] bs = new byte[1024]; int len; XylinkSys downUrlSys = xylinkSysService.getByTypeAndCode(XylinkConsts.SYS_TYPE_1, XylinkConsts.SYS_CODE_1); String downPath = downUrlSys.getSysValue(); File sf = new File(downPath); if(!sf.exists()){ sf.mkdirs(); } OutputStream os = new FileOutputStream(downPath+name); while ((len = is.read(bs)) != -1) { os.write(bs, 0, len); } os.close(); is.close(); XylinkSys showUrlSys = xylinkSysService.getByTypeAndCode(XylinkConsts.SYS_TYPE_1, XylinkConsts.SYS_CODE_1); String showUrl = showUrlSys+name; return showUrl; } catch (Exception e) { log.error("获取失败!"); return null; } } }