package cn.huge.module.xylink.utils; import cn.huge.base.common.exception.MethodException; import cn.huge.base.common.utils.HttpClientUtils; import cn.huge.base.common.utils.JsonMapper; import cn.huge.module.xylink.domain.dto.XylinkMeetDTO; import cn.huge.module.xylink.domain.dto.XylinkVedioDTO; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.fasterxml.jackson.databind.ObjectMapper; import com.google.common.collect.Maps; import com.xylink.config.SDKConfigMgr; import com.xylink.model.LV; import com.xylink.model.LiveVideo; import com.xylink.model.Status; import com.xylink.util.HttpUtil; import com.xylink.util.Result; import com.xylink.util.SignatureSample; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; import java.io.IOException; import java.util.List; import java.util.Map; @Slf4j public class XylinkUtils { /** * LOCAL_RECORD(本地小鱼录像机录制), SERVER_RECORD(会议录制), LIVE_RECORD(直播录制), * SERVER_RECORD_TRANSCODING(会议录制转码中,此状态下不能播放、下载视频文件,24小时内处理完成后才可以播放、下载) */ public static String VOD_METADATA_TYPE_1 = "LOCAL_RECORD"; public static String VOD_METADATA_TYPE_2 = "SERVER_RECORD"; public static String VOD_METADATA_TYPE_3 = "LIVE_RECORD"; public static String VOD_METADATA_TYPE_4 = "SERVER_RECORD_TRANSCODING"; /** * JsonMapper工具类 */ private static JsonMapper jsonMapper = new JsonMapper(); /** * 签名类 */ private static SignatureSample signatureSample = new SignatureSample(); /** * 小鱼相关参数 */ public static String token = "964edbc78dfd8caef97acca3a7068fb0603e3e6f5dc25023c5443aaae04b9914"; public static String enterpriseId = "9675f5cae97ca23503dd2fbc4c20ba089fecb59d"; /** * 创建会议室相关地址 * @return String */ private static String getCreateMeetingUrl() { return SDKConfigMgr.getServerHost() + "/api/rest/external/v2/create_meeting"; } /** * 视频链接相关地址 */ private static String getPrefixUrl() { return SDKConfigMgr.getServerHost() + "/api/rest/external/v1/"; } /** * 视频地址 */ private static String getVideoUrl() { return SDKConfigMgr.getServerHost() + "/api/rest/external/v1/vods/page"; } /** * 小鱼设备直播地址 * @return */ private static String getxyLiveUrl() { return SDKConfigMgr.getServerHost() + "/api/rest/external/v1/liveVideo2/enterprise/"; } /** * 会议直播地址 * @return */ private static String getLiveUrl() { return SDKConfigMgr.getServerHost() + "/api/rest/external/v1/liveVideo3/enterprise/"; } /** * 获取签名后的POST请求地址 * @param surl 请求url * @param jsonEntity 请求参数 * @return String */ private static String getPostUrl(String surl, String jsonEntity){ String signature = signatureSample.computeSignature(jsonEntity,"POST", token, surl); return surl + "&signature=" + signature; } /** * 获取签名后的Get请求地址 * @param surl 请求url * @return String */ private static String getGetUrl(String surl){ String signature = signatureSample.computeSignature("","GET", token, surl); return surl + "&signature=" + signature; } /** * 获取签名后的DELETE请求地址 * * @param surl * @return * @throws Exception */ private static String getDeleteUrl(String surl){ String signature = signatureSample.computeSignature("","DELETE",token,surl); return surl + "&signature=" + signature; } /** * 创建云会议 * @param meetingName 会议名称 * @param controlPassword 主持密码 * @param password 入会密码 * @return JSONObject */ public static XylinkMeetDTO createMeet(String meetingName, String controlPassword, String password) { try{ // 云会议室参数 Map param = Maps.newHashMap(); param.put("meetingName", meetingName); if (StringUtils.isNotEmpty(password)){ param.put("password", password); } if (StringUtils.isNotEmpty(controlPassword)){ param.put("controlPassword", controlPassword); } // 云会议室扩展配置 Map config = Maps.newHashMap(); config.put("autoRecord", true); config.put("onlyRecordMainImage", false); config.put("recordAddDeviceName", true); param.put("configs", config); String jsonStr = jsonMapper.toJson(param); String surl = getCreateMeetingUrl() + "?enterpriseId=" + enterpriseId; String url = getPostUrl(surl, jsonStr); String result = HttpClientUtils.httpPostRaw(url, jsonStr, null , null); XylinkMeetDTO xylinkMeetDTO = JSONObject.parseObject(result, XylinkMeetDTO.class); return xylinkMeetDTO; }catch (Exception e){ log.error("utils方法[XylinkUtils.createMeet]调用异常:"+e, e); throw new MethodException("XylinkUtils.createMeet", e); } } /** * 根据视频会议号获取视频信息 * @param meetingRoomNum * @return * @throws Exception */ public static List getMeetingVideos(String meetingRoomNum) { List xylinkVedioDTOList = null; try{ String surl = getPrefixUrl() + "meetingroom/" + meetingRoomNum + "/vods?enterpriseId=" + enterpriseId; String url = getGetUrl(surl); String jsonResult = HttpClientUtils.httpGet(url, null, null); JSONArray jsonArray = JSONArray.parseArray(jsonResult); log.info("save saveVideo jsonArray {}", JSON.toJSONString(jsonArray)); if (CollectionUtils.isNotEmpty(jsonArray)) { xylinkVedioDTOList = JSONObject.parseArray(jsonArray.toJSONString(), XylinkVedioDTO.class); for (XylinkVedioDTO xylinkVedioDTO: xylinkVedioDTOList) { xylinkVedioDTO.setDownloadUrl(getDownloadUrl(xylinkVedioDTO.getVodId())); xylinkVedioDTO.setPlayUrl(getPlayUrl(xylinkVedioDTO.getVodId())); } } } catch (Exception e){ log.error("utils方法[XylinkUtils.getMeetingVideos]调用异常:"+e, e); } return xylinkVedioDTOList; } /** * 获取视频会议下载URL * @param vodId 视频编号 * @return String */ public static String getDownloadUrl(String vodId) { try{ String surl = getPrefixUrl() + "vods/"+ vodId+ "/getdownloadurl?enterpriseId=" + enterpriseId; String url = getGetUrl(surl); String jsonResult = HttpClientUtils.httpGet(url, null, null); JSONObject data = JSONObject.parseObject(jsonResult); String result = data.getString("downloadUrl"); return result; }catch (Exception e){ log.error("utils方法[XylinkUtils.getDownloadUrl]调用异常:"+e, e); throw new MethodException("XylinkUtils.getDownloadUrl", e); } } /** * 获取视频会议播放URL * @param vodId 视频编号 * @return String */ public static String getPlayUrl(String vodId) { try{ String surl = getPrefixUrl() + "vods/"+ vodId+ "/sharedInfo?enterpriseId=" + enterpriseId; String url = getGetUrl(surl); String jsonResult = HttpClientUtils.httpGet(url, null, null); JSONObject data = JSONObject.parseObject(jsonResult); String result = data.getString("playUrl"); return result; }catch (Exception e){ log.error("utils方法[XylinkUtils.getPlayUrl]调用异常:"+e, e); throw new MethodException("XylinkUtils.getPlayUrl", e); } } /** * 根据视频号删除会议视频 * * @param vodId * @return * @throws Exception */ public static String deleteVideo(String vodId) throws Exception{ try{ String surl = getPrefixUrl() + "vods/"+ vodId+ "?enterpriseId=" + enterpriseId; String url = getDeleteUrl(surl); String jsonResult = HttpClientUtils.httpDelete(url, null, null); return jsonResult; } catch (Exception e){ throw new Exception(e.getMessage(), e); } } /** * 分页查询企业某段时间的视频列表 * @param startTime 开始时间 * @param endTime 结束时间 * @param pageIndex 页码: 从0开始 * @param pageSize 每页查询数量:最大50 * @return */ public static String getEnterpriseVideos(long startTime, long endTime, int pageIndex, int pageSize) { List xylinkVedioDTOList = null; try{ String surl = getVideoUrl() + "?enterpriseId=" + enterpriseId + "&startTime=" + startTime + "&endTime=" + endTime + "&pageIndex=" + pageIndex + "&pageSize=" + pageSize; String url = getGetUrl(surl); String jsonResult = HttpClientUtils.httpGet(url, null, null); return jsonResult; } catch (Exception e){ log.error("utils方法[XylinkUtils.getEnterpriseVideos]调用异常:"+e, e); return null; } } /** * 创建自定义会议 * * @param meetingName * @return * @throws Exception */ public static JSONObject customMeeting(String meetingName) throws Exception{ try{ Map param = Maps.newHashMap(); param.put("meetingName", meetingName); param.put("controlPassword", "12345678"); Map config = Maps.newHashMap(); config.put("autoRecord", false); config.put("onlyRecordMainImage", false); config.put("recordAddDeviceName", true); param.put("configs", config); JsonMapper jsonMapper = new JsonMapper(); String jsonStr = jsonMapper.toJson(param); String surl = getCreateMeetingUrl() + "?enterpriseId=" + enterpriseId; String url = getPostUrl(surl, jsonStr); String result = HttpClientUtils.httpPostRaw(url, jsonStr, null , null); JSONObject jsonObject = JSONObject.parseObject(result); return jsonObject; }catch (Exception e){ throw new Exception(e.getMessage(), e); } } /** * 创建小鱼设备直播 * * @param nemoNumber * @param liveVideo * @return * @throws IOException */ public static LV newXyLiveVideo(String nemoNumber, LiveVideo liveVideo) throws IOException{ String surl = getxyLiveUrl() + enterpriseId + "/xiaoyunumber/" + nemoNumber + "/live?enterpriseId="+enterpriseId; String jsonEntity = new ObjectMapper().writeValueAsString(liveVideo); String signature = signatureSample.computeSignature(jsonEntity,"POST",token,surl); surl += "&signature=" + signature; Result result = HttpUtil.getResponse(surl,"POST", jsonEntity, LV.class); return (LV)result.getData(); } /** * 开始/结束直播 * @param confNo * @param confPwd * @param liveId * @param status * @return * @throws IOException */ public static Result controlLive(String confNo, String confPwd, String liveId, Status status)throws IOException{ String surl = getLiveUrl() + enterpriseId + "/conf/" + confNo + "/live/" + liveId + "/status" + "?enterpriseId="+enterpriseId + "&confPwd=" + confPwd; String jsonEntity = new ObjectMapper().writeValueAsString(status); String signature = signatureSample.computeSignature(jsonEntity,"PUT",token,surl); surl += "&signature=" + signature; return HttpUtil.getResponse(surl,"PUT", jsonEntity, null); } /** * 删除小鱼设备直播 * @param nemoNumber * @param liveId * @return * @throws IOException */ public static Result deleteXyLiveVideo(String nemoNumber,String liveId)throws IOException{ String surl = getxyLiveUrl() + enterpriseId + "/xiaoyunumber/" + nemoNumber + "/live/" +liveId + "?enterpriseId="+enterpriseId; System.out.println(surl); String signature = signatureSample.computeSignature("","DELETE",token,surl); surl += "&signature=" + signature; System.out.println(surl); return HttpUtil.getResponse(surl,"DELETE", null, null); } /** * 获取小鱼设备直播视频 * @param nemoNumber * @param liveId * @return * @throws IOException */ public static Result getLiveVideo(String nemoNumber,String liveId) throws IOException{ String surl = getxyLiveUrl() + enterpriseId + "/xiaoyunumber/" + nemoNumber + "/live/" +liveId + "?enterpriseId="+enterpriseId; String signature = signatureSample.computeSignature("","GET",token,surl); surl += "&signature=" + signature; System.out.println(surl); return HttpUtil.getResponse(surl,"GET", null, LV.class); } }