李勇

处理自动登录的问题

@@ -63,7 +63,7 @@ export default class MessageEntrance extends Emiter { @@ -63,7 +63,7 @@ export default class MessageEntrance extends Emiter {
63 super(); 63 super();
64 this.lastClassActiveTime=0;//最后一次课堂激活的时间戳 64 this.lastClassActiveTime=0;//最后一次课堂激活的时间戳
65 //sdk 信息 65 //sdk 信息
66 - GlobalConfig.sdkVersion = "v2.28.1.20171110"; 66 + GlobalConfig.sdkVersion = "v2.28.2.20171111";
67 loger.warn("sdkVersion:" + GlobalConfig.sdkVersion); 67 loger.warn("sdkVersion:" + GlobalConfig.sdkVersion);
68 console.log("sdkVersion:" + GlobalConfig.sdkVersion); 68 console.log("sdkVersion:" + GlobalConfig.sdkVersion);
69 //设置 69 //设置
@@ -594,6 +594,7 @@ export default class MessageEntrance extends Emiter { @@ -594,6 +594,7 @@ export default class MessageEntrance extends Emiter {
594 GlobalConfig.portal = GlobalConfig.replacePort(GlobalConfig.portal, ":80", ""); 594 GlobalConfig.portal = GlobalConfig.replacePort(GlobalConfig.portal, ":80", "");
595 } 595 }
596 596
  597 + GlobalConfig.paramUserId= _param.userId || "0";
597 GlobalConfig.userId = "" + _param.userId || "0"; 598 GlobalConfig.userId = "" + _param.userId || "0";
598 //H5处理 599 //H5处理
599 GlobalConfig.isH5 = _param.isH5 || false;//外部传入的参数,是否是H5 600 GlobalConfig.isH5 = _param.isH5 || false;//外部传入的参数,是否是H5
@@ -672,7 +673,8 @@ export default class MessageEntrance extends Emiter { @@ -672,7 +673,8 @@ export default class MessageEntrance extends Emiter {
672 GlobalConfig.hasMicrophone = (typeof _param.hasMicrophone == "boolean") ? _param.hasMicrophone : false; 673 GlobalConfig.hasMicrophone = (typeof _param.hasMicrophone == "boolean") ? _param.hasMicrophone : false;
673 674
674 //loger.log("autoLoginMd5", GlobalConfig.classId, GlobalConfig.userId, GlobalConfig.userRole); 675 //loger.log("autoLoginMd5", GlobalConfig.classId, GlobalConfig.userId, GlobalConfig.userRole);
675 - let autoLoginMd5 = MD5("" + GlobalConfig.classId + GlobalConfig.userId + GlobalConfig.userRole); 676 + let autoLoginMd5 = MD5("" + GlobalConfig.classId + GlobalConfig.paramUserId + GlobalConfig.userRole);
  677 + //let autoLoginMd5 = MD5("" + GlobalConfig.classId + GlobalConfig.userId + GlobalConfig.userRole);
676 //loger.log("joinClass-GlobalConfig.autoLogin", GlobalConfig.autoLogin, "autoLoginMd5-", autoLoginMd5); 678 //loger.log("joinClass-GlobalConfig.autoLogin", GlobalConfig.autoLogin, "autoLoginMd5-", autoLoginMd5);
677 if (GlobalConfig.autoLogin && autoLoginMd5 == GlobalConfig.autoLogin || GlobalConfig.isInvisible) { 679 if (GlobalConfig.autoLogin && autoLoginMd5 == GlobalConfig.autoLogin || GlobalConfig.isInvisible) {
678 // MD5(classId+userId+userRole)==m 680 // MD5(classId+userId+userRole)==m
@@ -545,6 +545,7 @@ GlobalConfig.returnCitySN = null;//获取的ip数据 {"cip":"60.253.214.122","c @@ -545,6 +545,7 @@ GlobalConfig.returnCitySN = null;//获取的ip数据 {"cip":"60.253.214.122","c
545 GlobalConfig.deviceType = 0; //设备类型 0:电脑 1:ios 2:安卓 545 GlobalConfig.deviceType = 0; //设备类型 0:电脑 1:ios 2:安卓
546 GlobalConfig.userIp = ""; //用户当前IP 546 GlobalConfig.userIp = ""; //用户当前IP
547 GlobalConfig.userId = 0; 547 GlobalConfig.userId = 0;
  548 +GlobalConfig.paramUserId=0;
548 GlobalConfig.userName = ""; 549 GlobalConfig.userName = "";
549 GlobalConfig.handUpTime = 0; 550 GlobalConfig.handUpTime = 0;
550 GlobalConfig.level = 0; 551 GlobalConfig.level = 0;
  1 +import Emiter from 'Emiter';
  2 +import MessageTypes from 'MessageTypes';
  3 +import Loger from 'Loger';
  4 +
  5 +import MediaModule from "apes/MediaModule";
  6 +
  7 +import Base64 from 'base64-js';
  8 +import GlobalConfig from 'GlobalConfig';
  9 +import EngineUtils from 'EngineUtils';
  10 +
  11 +
  12 +// 日志对象
  13 +const loger = Loger.getLoger('RecordInfoParse');
  14 +class RecordInfoMatch extends Emiter {
  15 + constructor() {
  16 + super();
  17 + this.recordMessages = {};
  18 + this.jsonPathList = {};
  19 + this.m3u8jsonDataList = {};
  20 + this.streamInfoLen = 0;
  21 + this.filePath = "";
  22 + this.matchStreams = {};//记录匹配完成的数据
  23 + this.unMatchStreams = {};//记录匹配完成的数据
  24 + this.unMatchUid = {};//没有匹配到的uid
  25 + }
  26 +
  27 + start() {
  28 + let serverIp = GlobalConfig.recordFileSever || "123.56.73.119:8080";
  29 + this.filePath = `${GlobalConfig.locationProtocol + serverIp}`;
  30 + this.getRecordInfo(()=> {
  31 + let requestLen = Object.keys(this.jsonPathList).length;
  32 + let currentLen = 0;
  33 + let fileNameArr;
  34 + for (let i in this.jsonPathList) {
  35 + this.getRecordFileJSON(this.jsonPathList [i], (data)=> {
  36 + currentLen++;
  37 + console.log(i, "getRecordFileJSON请求返回", currentLen);
  38 + if (data) {
  39 + for (let k in data) {
  40 + let arr = data[k];
  41 + let indexStr = ".m3u8";
  42 + //"694537045_20171103073546522.m3u8" //522.m3u8是需要截取掉的内容
  43 + for (let j of arr) {
  44 + if (j && j.indexOf(indexStr) >= 0) {
  45 + //console.log("视频地址:"+i+"/"+k+"/"+j);
  46 + fileNameArr = j.split("_");
  47 + if (fileNameArr && fileNameArr.length > 0) {
  48 + let stream = fileNameArr[1];
  49 + //20171106102811807 -->20171106102811
  50 + stream = stream.substr(0, 14);
  51 + if (!this.m3u8jsonDataList[fileNameArr[0]]) {
  52 + this.m3u8jsonDataList[fileNameArr[0]] = {}
  53 + }
  54 + //筛除一些重复流地址,会出现多录制的情况,保留一个即可
  55 + this.m3u8jsonDataList[fileNameArr[0]][stream] = {
  56 + video_url: this.filePath + "/" + i + "/" + k + "/" + j,
  57 + creatDate: i,
  58 + folder: k,
  59 + stream: j,
  60 + createTimeUTC: stream
  61 + };
  62 + }
  63 +
  64 + }
  65 + }
  66 + }
  67 + }
  68 + if (currentLen >= requestLen) {
  69 + console.log("视频数据获取完成", this.m3u8jsonDataList);
  70 + this.matchRecordFile(this.recordMessages, this.m3u8jsonDataList);
  71 + }
  72 + });
  73 + }
  74 + });
  75 + }
  76 +
  77 + getRecordInfo(_callback) {
  78 + //获取课堂录制信息 get localhost:3000/recordInfo/getRecordInfo/7d72365eb9834353397e3e3f9d460bdda
  79 + //localhost:3000/recordInfo/getRecordInfo/ 后面直接添加课堂号 channel
  80 + if (!GlobalConfig.getRecordInfoInterfaces) {
  81 + loger.log("AG-获取媒体录制信息->失败->接口地址无效");
  82 + if (_callback) {
  83 + _callback();
  84 + }
  85 + return;
  86 + }
  87 + let url = `${GlobalConfig.locationProtocol + GlobalConfig.getRecordInfoInterfaces}/${GlobalConfig.channelId}`;
  88 + loger.log('AG-获取媒体录制信息.', url);
  89 + fetch(url, {
  90 + timeout: 15000
  91 + })
  92 + .then(ret => {
  93 + if (ret.ok) {
  94 + return ret.json();
  95 + } else {
  96 + loger.error(`AG-获取媒体录制信息-网络异常.状态码:${ret}`);
  97 + if (_callback) {
  98 + _callback();
  99 + }
  100 + throw '';
  101 + }
  102 + })
  103 + .then(ret => {
  104 + loger.log('AG-获取媒体录制信息-完成');
  105 + for (let i = 0; i < ret.returnData.data.length; i++) {
  106 + let item = ret.returnData.data[i];
  107 + if (item.status == 1) {
  108 + this.streamInfoLen++;
  109 + //console.log(JSON.stringify(item));
  110 + delete item.appId;
  111 + delete item.id;
  112 + let time = parseInt(item.createTime);
  113 + let timeInfo = this.timestampToUTCTime(time);
  114 + //return {yymmddhhmmss:yymmddhhmmss,yymmdd:yymmdd}
  115 + item.seek = 0;
  116 + item.createTimeUTC = timeInfo.yymmddhhmmss;
  117 + item.creatDate = timeInfo.yymmdd;
  118 + this.jsonPathList [timeInfo.yymmdd] = this.filePath + "/" + timeInfo.yymmdd + "/json/" + item.channel + ".json";
  119 + item.stream_id = item.channel + "_" + item.userId + "_" + item.timestamp;
  120 +
  121 + if (!this.recordMessages[item.uid]) {
  122 + this.recordMessages[item.uid] = {};
  123 + }
  124 + this.recordMessages[item.uid][item.timestamp] = item;
  125 + }
  126 + }
  127 + if (_callback) {
  128 + _callback();
  129 + }
  130 + })
  131 + .catch(err => {
  132 + loger.error(`AG-获取媒体录制信息-异常.状态码:${err}`);
  133 + if (_callback) {
  134 + _callback();
  135 + }
  136 + });
  137 + }
  138 +
  139 + getRecordFileJSON(path, _callback) {
  140 + let url = path + "?t=" + new Date().getTime();
  141 + /* $.ajax(
  142 + {
  143 + type: "GET",
  144 + url: location,
  145 + dataType: 'json',
  146 + success: function (data) {
  147 + console.log("getRecordFileJSON success", data);
  148 + if (_callback) {
  149 + _callback(data);
  150 + }
  151 + },
  152 + error: function (data) {
  153 + //alert(data.code);
  154 + console.log("getRecordFileJSON error", data);
  155 + if (_callback) {
  156 + _callback(null);
  157 + }
  158 + }
  159 + }
  160 + );*/
  161 + fetch(url, {
  162 + timeout: 5000,
  163 + method: 'GET',
  164 + })
  165 + .then(ret => {
  166 + if (ret.ok) {
  167 + return ret.json();
  168 + } else {
  169 + loger.error(`AG-getRecordFileJSON-网络异常.状态码:${ret}`);
  170 + if (_callback) {
  171 + _callback();
  172 + }
  173 + throw '';
  174 + }
  175 + })
  176 + .then(ret => {
  177 + loger.log('AG-getRecordFileJSON-完成');
  178 + if (_callback) {
  179 + _callback(ret);
  180 + }
  181 + })
  182 + .catch(err => {
  183 + loger.error(`AG-getRecordFileJSON-异常.状态码:${err}`);
  184 + if (_callback) {
  185 + _callback();
  186 + }
  187 + });
  188 + }
  189 +
  190 + matchRecordFile(_messages, _m3u8List) {
  191 + let _recordMessages = _messages;
  192 + let _m3u8jsonDataList = _m3u8List;
  193 + console.log("匹配之前的消息集合", _recordMessages);
  194 + console.log("匹配之前的视频地址集合", _m3u8jsonDataList);
  195 + let matchStreams = {};
  196 + let uidRecordInfo;
  197 + let uidRecordFile;
  198 +
  199 + for (let k in _recordMessages) {
  200 + this.matchForUid(k, _recordMessages[k], _m3u8jsonDataList[k]);
  201 + }
  202 +
  203 + console.log("unMatchUid", this.matchStreams);
  204 + console.log("_recordMessages", _recordMessages);
  205 + console.log("_m3u8jsonDataList", _m3u8jsonDataList);
  206 + console.log("最终匹配完成的数量为->" + Object.keys(this.matchStreams).length, "未匹配成功的数量为->" + (this.streamInfoLen - parseInt(Object.keys(this.matchStreams).length)));
  207 + console.log("没有录制文件的用户", this.unMatchUid);
  208 + this._emit(RecordInfoMatch.RECORD_INFO_MATCH_COMPLETE, this.matchStreams);
  209 + }
  210 +
  211 + matchForUid(k, _recordMessages, _m3u8jsonDataList) {
  212 + let uidRecordInfo = _recordMessages;
  213 + let uidRecordFile = _m3u8jsonDataList;
  214 + if (!uidRecordFile) {
  215 + console.log(k, "没有录制文件");
  216 + this.unMatchUid[k] = uidRecordInfo;
  217 + } else {
  218 +
  219 + let uidRecordInfoArr = Object.values(uidRecordInfo);
  220 + let uidRecordFileArr = Object.values(uidRecordFile);
  221 + uidRecordInfoArr = uidRecordInfoArr.sort(function (a, b) {
  222 + return parseInt(a.createTimeUTC) - parseInt(b.createTimeUTC);
  223 + });
  224 + uidRecordFileArr = uidRecordFileArr.sort(function (a, b) {
  225 + return parseInt(a.createTimeUTC) - parseInt(b.createTimeUTC);
  226 + });
  227 +
  228 + if (uidRecordInfoArr.length == uidRecordFileArr.length && uidRecordFileArr.length > 0) {
  229 + //1.如果文件数量和消息数量相等,直接关联即可
  230 + console.log(k + "->数量相同->直接匹配", uidRecordInfoArr.length);
  231 + for (let h = 0; h < uidRecordInfoArr.length; h++) {
  232 + let item = uidRecordInfoArr[h];
  233 + item.video_url = uidRecordFileArr[h].video_url;
  234 + this.matchStreams[item.stream_id] = item;
  235 + }
  236 +
  237 + } else {
  238 + //2.通过时间戳匹配
  239 + for (let f in uidRecordInfo) {
  240 + let time = parseInt(uidRecordInfo[f].createTimeUTC);
  241 + let video_url = "";
  242 + let video_urlObj = uidRecordFile[k + "_" + time];
  243 + if (video_urlObj && video_urlObj.video_url) {
  244 + video_url = video_urlObj.video_url;
  245 + }
  246 + //模糊
  247 + if (!video_url) {
  248 + video_urlObj = uidRecordFile[k + "_" + (time + 1)];
  249 + if (video_urlObj && video_urlObj.video_url) {
  250 + video_url = video_urlObj.video_url;
  251 + }
  252 + }
  253 + if (!video_url) {
  254 + video_urlObj = uidRecordFile[k + "_" + (time - 1)];
  255 + if (video_urlObj && video_urlObj.video_url) {
  256 + video_url = video_urlObj.video_url;
  257 + }
  258 + }
  259 +
  260 + //通过时间戳匹配 结束
  261 + if (video_url) {
  262 + let item = uidRecordInfo[f];
  263 + item.video_url = video_url;
  264 + this.matchStreams[item.stream_id] = item;
  265 + } else {
  266 + console.log(k + "_" + time, "按时间戳没有查找到->");
  267 + }
  268 + }
  269 +
  270 + //3.最后一次通过间隔查找
  271 + if (uidRecordInfoArr.length != uidRecordFileArr.length && uidRecordFileArr.length > 0 && uidRecordInfoArr.length > 0) {
  272 + console.log(k + "->数量不同 消息数量:" + uidRecordInfoArr.length, "视频数量:" + uidRecordFileArr.length);
  273 + //按消息的数量大于视频数量处理
  274 + let lastFileItem;//记录最后一个
  275 + for (let h = 0; h < uidRecordInfoArr.length; h++) {
  276 + let infoItem = uidRecordInfoArr[h];
  277 + let fileItem = uidRecordFileArr[h];
  278 + if (fileItem) {
  279 + infoItem.video_url = fileItem.video_url;
  280 +
  281 + //如果之前没有匹配到才设置
  282 + if (!this.matchStreams[infoItem.stream_id]) {
  283 + this.matchStreams[infoItem.stream_id] = infoItem;
  284 + }
  285 + lastFileItem = infoItem;//记录最后一个文件的数据
  286 + } else {
  287 + if (lastFileItem) {
  288 + infoItem.video_url = lastFileItem.video_url;
  289 + infoItem.seek = parseInt(infoItem.createTimeUTC) - parseInt(lastFileItem.createTimeUTC);
  290 + if (!this.matchStreams[infoItem.stream_id]) {
  291 + this.matchStreams[infoItem.stream_id] = infoItem;
  292 + }
  293 + }
  294 + }
  295 +
  296 + }
  297 + }
  298 +
  299 + /*
  300 + //没有查找到之后,如果两次推流的消息时间过短,只会有一个视频,需要再次匹配
  301 + console.log("uidRecordInfoUnsearch", uidRecordInfoUnsearch, uidRecordInfo);
  302 + if (Object.keys(uidRecordInfoUnsearch).length > 0) {
  303 + let item;
  304 + let item2;
  305 + let minInterval = 10000;
  306 + let nearItem = null;
  307 + for (let s in uidRecordInfoUnsearch) {
  308 + item = uidRecordInfoUnsearch[s];
  309 + for (let h in uidRecordInfo) {
  310 + item2 = uidRecordInfo[h];
  311 + if (item2 && item2.video_url) {
  312 + let interval = parseInt((item.createTime) * 0.001 - parseInt(item2.createTime) * 0.001);
  313 + if (minInterval > interval) {
  314 + nearItem = item2;
  315 + minInterval = interval;
  316 + }
  317 + minInterval = Math.min(minInterval, interval);
  318 + //console.log("两次推流消息的间隔",interval);
  319 + }
  320 + }
  321 + }
  322 + if (item && nearItem) {
  323 + console.log("查找到最接近的消息", nearItem, "seek", minInterval);
  324 + item.video_url = nearItem.video_url;
  325 + item.seek = minInterval;
  326 + matchStreams[item.stream_id] = item;
  327 + }
  328 +
  329 + }*/
  330 + }
  331 + }
  332 +
  333 + }
  334 +
  335 +
  336 + timestampToUTCTime(_timestamp) {
  337 + let date = new Date(_timestamp - 8 * 60 * 60 * 1000);//GMT 转UTC 减8
  338 + let y = "" + date.getFullYear();
  339 + let month = "" + (date.getMonth() + 1);
  340 + let d = "" + date.getDate();
  341 + let h = "" + (date.getHours());
  342 + let minutes = "" + date.getMinutes();
  343 + let s = "" + date.getSeconds();
  344 + if (month.length < 2) {
  345 + month = "0" + month;
  346 + }
  347 + if (d.length < 2) {
  348 + d = "0" + d;
  349 + }
  350 + if (h.length < 2) {
  351 + h = "0" + h;
  352 + }
  353 + if (minutes.length < 2) {
  354 + minutes = "0" + minutes;
  355 + }
  356 + if (s.length < 2) {
  357 + s = "0" + s;
  358 + }
  359 + let yymmddhhmmss = "" + y + month + d + h + minutes + s;
  360 + let yymmdd = "" + y + month + d;
  361 + console.log(_timestamp, yymmdd, yymmddhhmmss, date);
  362 + return {yymmddhhmmss: yymmddhhmmss, yymmdd: yymmdd}
  363 + }
  364 +}
  365 +
  366 +RecordInfoMatch.prototype.RECORD_INFO_MATCH_COMPLETE = RecordInfoMatch.RECORD_INFO_MATCH_COMPLETE = 'recordInfoMatchComplete';//录制数据匹配完成
  367 +export default new RecordInfoMatch;
  368 +