$(document).ready(function(e){ //websocket functions $.users = {} $.ccio.cx=function(x,user){ if(!user){user=$user} if(!x.ke){x.ke=user.ke;}; if(!x.uid){x.uid=user.uid;}; return user.ws.emit('f',x) } $.diskUsed = { main: $('.diskUsed'), list: {}, } $.each(addStorage,function(n,storage){ $.diskUsed.list[storage.name] = $(`#diskUsedList [storage="${storage.name}"]`) }) $.ccio.globalWebsocket=function(d,user){ if(d.f!=='monitor_frame'&&d.f!=='os'&&d.f!=='video_delete'&&d.f!=='detector_trigger'&&d.f!=='detector_record_timeout_start'&&d.f!=='log'){$.ccio.log(d);} if(!user){ user=$user } if(d.viewers){ $('[ke="'+d.ke+'"][mid="'+d.id+'"][auth="'+user.auth_token+'"] .viewers').html(d.viewers); } switch(d.f){ case'note': $.ccio.init('note',d.note,user); break; case'monitor_status': console.log(d) $('[ke="'+d.ke+'"][mid="'+d.id+'"][auth="'+user.auth_token+'"] .monitor_status').html(d.status); break; case'detector_trigger': d.e=$('.monitor_item[ke="'+d.ke+'"][mid="'+d.id+'"][auth="'+user.auth_token+'"]') if($.ccio.mon[d.ke+d.id+user.auth_token]&&d.e.length>0){ if(d.doObjectDetection === true){ d.e.addClass('doObjectDetection') clearTimeout($.ccio.mon[d.ke+d.id+user.auth_token].detector_trigger_doObjectDetection_timeout) $.ccio.mon[d.ke+d.id+user.auth_token].detector_trigger_doObjectDetection_timeout = setTimeout(function(){ d.e.removeClass('doObjectDetection') },3000) }else{ d.e.removeClass('doObjectDetection') } if(d.details.plates&&d.details.plates.length>0){ console.log('licensePlateStream',d.id,d) } if(d.details.matrices&&d.details.matrices.length>0){ d.monitorDetails=JSON.parse($.ccio.mon[d.ke+d.id+user.auth_token].details) d.stream=d.e.find('.stream-element') d.streamObjects=d.e.find('.stream-objects') $.ccio.init('drawMatrices',d) } if(d.details.points&&Object.keys(d.details.points).length>0){ d.monitorDetails=JSON.parse($.ccio.mon[d.ke+d.id+user.auth_token].details) d.stream=d.e.find('.stream-element') d.streamObjects=d.e.find('.stream-objects') $.ccio.init('drawPoints',d) } if(d.details.confidence){ d.tt=d.details.confidence; if (d.tt > 100) { d.tt = 100 } d.e.find('.indifference .progress-bar').css('width',d.tt + '%').find('span').html(d.details.confidence+'% change in '+d.details.name+'') } d.e.addClass('detector_triggered') clearTimeout($.ccio.mon[d.ke+d.id+user.auth_token].detector_trigger_timeout); $.ccio.mon[d.ke+d.id+user.auth_token].detector_trigger_timeout=setTimeout(function(){ $('.monitor_item[ke="'+d.ke+'"][mid="'+d.id+'"][auth="'+user.auth_token+'"]').removeClass('detector_triggered').find('.stream-detected-object,.stream-detected-point').remove() },5000); //noise alert if(user.details.audio_alert && user.details.audio_alert !== '' && $.ccio.soundAlarmed !== true){ $.ccio.soundAlarmed = true var audio = new Audio('libs/audio/'+user.details.audio_alert); audio.onended = function(){ setTimeout(function(){ $.ccio.soundAlarmed = false },user.details.audio_delay * 1000) } if($.ccio.windowFocus = true){ audio.play() }else{ clearInterval($.ccio.soundAlarmInterval) if(!user.details.audio_delay || user.details.audio_delay === ''){ user.details.audio_delay = 1 }else{ user.details.audio_delay = parseFloat(user.details.audio_delay) } $.ccio.soundAlarmInterval = setInterval(function(){ audio.play() },user.details.audio_delay * 1000) } } if(user.details.event_mon_pop === '1' && (!$.ccio.mon[d.ke+d.id+user.auth_token].popOut || $.ccio.mon[d.ke+d.id+user.auth_token].popOut.closed === true)){ d.e.find('[monitor="pop"]').click() } } break; case'init_success': $('#monitors_list .link-monitors-list[auth="'+user.auth_token+'"][ke="'+user.ke+'"]').empty(); if(user===$user){ d.chosen_set='watch_on' }else{ d.chosen_set='watch_on_links' } d.o=$.ccio.op()[d.chosen_set]; if(!d.o){d.o={}}; $.getJSON($.ccio.init('location',user)+user.auth_token+'/monitor/'+user.ke,function(f,g){ g=function(n,v){ $.ccio.mon[v.ke+v.mid+user.auth_token]=v; v.user=user; $.ccio.tm(1,v,null,user) if(d.o[v.ke]&&d.o[v.ke][v.mid]===1){ $.ccio.cx({f:'monitor',ff:'watch_on',id:v.mid},user) } } if(f.mid){ g(null,f) }else{ $.each(f,g); } setTimeout(function(){ $.ccio.sortListMonitors(user) },1000) if($.ccio.op().jpeg_on === true){ $.ccio.cx({f:'monitor',ff:'jpeg_on'},user) } $.gR.drawList() }) $.ccio.pm(3,d.apis,null,user); $('.os_platform').html(d.os.platform) $('.os_cpuCount').html(d.os.cpuCount) $('.os_totalmem').html((d.os.totalmem/1000000).toFixed(2)) if(d.os.cpuCount>1){ $('.os_cpuCount_trailer').html('s') } break; case'get_videos': $.ccio.pm(0,d,null,user) break; case'log': $.logWriter.draw('[mid="'+d.mid+'"][ke="'+d.ke+'"][auth="'+user.auth_token+'"]',d,user) break; case'camera_cpu_usage': var el = $('.monitor_item[auth="'+user.auth_token+'"][ke="'+d.ke+'"][mid="'+d.id+'"] .camera_cpu_usage') .attr('title',d.percent + '% ' + lang['CPU used by this stream']) el.find('.progress-bar').css('width',d.percent) el.find('.percent').html(d.percent + '%') break; case'os'://indicator //cpu d.cpu=parseFloat(d.cpu).toFixed(0)+'%'; $('.cpu_load .progress-bar').css('width',d.cpu); $('.cpu_load .percent').html(d.cpu); //ram d.ram=(100-parseFloat(d.ram)).toFixed(0)+'%'; $('.ram_load .progress-bar').css('width',d.ram); $('.ram_load .percent').html(d.ram); break; case'diskUsed': if(!d.limit||d.limit===''){d.limit=10000} d.percent = parseInt((d.size/d.limit)*100)+'%'; d.human = parseFloat(d.size) if(d.human>1000){d.human=(d.human/1000).toFixed(2)+' GB'}else{d.human=d.human.toFixed(2)+' MB'} $.diskUsed.main.find('.value').html(d.human) $.diskUsed.main.find('.percent').html(d.percent) $.diskUsed.main.find('.progress-bar').css('width',d.percent) if(d.addStorage){ $.each(d.addStorage,function(n,storage){ var percent = parseInt((storage.usedSpace/storage.sizeLimit)*100)+'%' var humanValue = parseFloat(storage.usedSpace) if(humanValue > 1000){ humanValue = (humanValue/1000).toFixed(2)+' GB' }else{ humanValue = humanValue.toFixed(2)+' MB' } $.diskUsed.list[storage.name].find('.value').html(humanValue) $.diskUsed.list[storage.name].find('.percent').html(percent) $.diskUsed.list[storage.name].find('.progress-bar').css('width',percent) }) } break; case'video_fix_success':case'video_fix_start': switch(d.f){ case'video_fix_success': d.addClass='fa-wrench' d.removeClass='fa-pulse fa-spinner' break; case'video_fix_start': d.removeClass='fa-wrench' d.addClass='fa-pulse fa-spinner' break; } $('[mid="'+d.mid+'"][ke="'+d.ke+'"][file="'+d.filename+'"][auth="'+user.auth_token+'"] [video="fix"] i,[data-mid="'+d.mid+'"][data-ke="'+d.ke+'"][data-file="'+d.filename+'"][data-auth="'+user.auth_token+'"] [video="fix"] i').addClass(d.addClass).removeClass(d.removeClass) break; case'video_edit':case'video_archive': $.ccio.init('data-video',d) d.e=$('[file="'+d.filename+'"][mid="'+d.mid+'"][ke="'+d.ke+'"][auth="'+user.auth_token+'"],[data-file="'+d.filename+'"][data-mid="'+d.mid+'"][data-ke="'+d.ke+'"][data-auth="'+user.auth_token+'"]'); d.e.attr('status',d.status),d.e.attr('data-status',d.status); console.log(d) break; case'video_delete': // if($('.modal[mid="'+d.mid+'"][auth="'+user.auth_token+'"]').length>0){$('#video_viewer[mid="'+d.mid+'"]').attr('file',null).attr('ke',null).attr('mid',null).attr('auth',null).modal('hide')} $('[file="'+d.filename+'"][mid="'+d.mid+'"][ke="'+d.ke+'"][auth="'+user.auth_token+'"]:not(.modal)').remove(); $('[data-file="'+d.filename+'"][data-mid="'+d.mid+'"][data-ke="'+d.ke+'"][data-auth="'+user.auth_token+'"]:not(.modal)').remove(); if($.pwrvid.currentDataObject&&$.pwrvid.currentDataObject[d.filename]){ delete($.timelapse.currentVideos[$.pwrvid.currentDataObject[d.filename].position]) $.pwrvid.drawTimeline(false) } if($.timelapse.currentVideos&&$.timelapse.currentVideos[d.filename]){ delete($.timelapse.currentVideosArray.videos[$.timelapse.currentVideos[d.filename].position]) $.timelapse.drawTimeline(false) } if($.vidview.loadedVideos && $.vidview.loadedVideos[d.filename])delete($.vidview.loadedVideos[d.filename]) break; case'video_build_success': if(!d.mid){d.mid=d.id;};d.status=1; d.e='.glM'+d.mid+user.auth_token+'.videos_list ul,.glM'+d.mid+user.auth_token+'.videos_monitor_list ul';$(d.e).find('.notice.novideos').remove(); $.ccio.tm(0,d,d.e,user) break; case'monitor_snapshot': setTimeout(function(){ var snapElement = $('[mid="'+d.mid+'"][ke="'+d.ke+'"][auth="'+user.auth_token+'"] .snapshot') switch(d.snapshot_format){ case'plc': snapElement.attr('src',placeholder.getData(placeholder.plcimg(d.snapshot))) break; case'ab': d.reader = new FileReader(); d.reader.addEventListener("loadend",function(){snapElement.attr('src',d.reader.result)}); d.reader.readAsDataURL(new Blob([d.snapshot],{type:"image/jpeg"})); break; case'b64': snapElement.attr('src','data:image/jpeg;base64,'+d.snapshot) break; } },1000) break; case'monitor_delete': $('[mid="'+d.mid+'"][ke="'+d.ke+'"][auth="'+user.auth_token+'"]:not(.modal)').remove(); $.ccio.init('clearTimers',d) delete($.ccio.mon[d.ke+d.mid+user.auth_token]); break; case'monitor_watch_off':case'monitor_stopping': if(user===$user){ d.chosen_set='watch_on' }else{ d.chosen_set='watch_on_links' } d.o=$.ccio.op()[d.chosen_set]; if(!d.o[d.ke]){d.o[d.ke]={}};d.o[d.ke][d.id]=0;$.ccio.op(d.chosen_set,d.o); $.ccio.destroyStream(d,user,(d.f === 'monitor_watch_off')) break; case'monitor_watch_on': if(user===$user){ d.chosen_set='watch_on' }else{ d.chosen_set='watch_on_links' } d.o=$.ccio.op()[d.chosen_set]; if(!d.o){d.o={}};if(!d.o[d.ke]){d.o[d.ke]={}};d.o[d.ke][d.id]=1;$.ccio.op(d.chosen_set,d.o); $.ccio.mon[d.ke+d.id+user.auth_token].watch=1; delete($.ccio.mon[d.ke+d.id+user.auth_token].image) delete($.ccio.mon[d.ke+d.id+user.auth_token].ctx) d.e=$('#monitor_live_'+d.id+user.auth_token); d.e.find('.stream-detected-object').remove() $.ccio.init('clearTimers',d) if(d.e.length === 1){ $.ccio.init('closeVideo',{mid:d.id,ke:d.ke},user); } if(d.e.length === 0){ $.ccio.tm(2,$.ccio.mon[d.ke+d.id+user.auth_token],'#monitors_live',user); } d.d=JSON.parse($.ccio.mon[d.ke+d.id+user.auth_token].details); $.ccio.tm('stream-element',$.ccio.mon[d.ke+d.id+user.auth_token],null,user); if($.ccio.op().jpeg_on===true){ $.ccio.init('jpegMode',$.ccio.mon[d.ke+d.id+user.auth_token]); }else{ var path = tool.checkCorrectPathEnding(location.pathname)+'socket.io' switch(d.d.stream_type){ case'jpeg': $.ccio.init('jpegMode',$.ccio.mon[d.ke+d.id+user.auth_token]); break; case'b64': if($.ccio.mon[d.ke+d.id+user.auth_token].Base64 && $.ccio.mon[d.ke+d.id+user.auth_token].Base64.connected){ $.ccio.mon[d.ke+d.id+user.auth_token].Base64.disconnect() } $.ccio.mon[d.ke+d.id+user.auth_token].Base64 = io(location.origin,{ path: path, transports: ['websocket'], forceNew: false}) var ws = $.ccio.mon[d.ke+d.id+user.auth_token].Base64 var buffer ws.on('diconnect',function(){ console.log('Base64 Stream Disconnected') }) ws.on('connect',function(){ ws.emit('Base64',{ auth: user.auth_token, uid: user.uid, ke: d.ke, id: d.id, // channel: channel }) if(!$.ccio.mon[d.ke+d.id+user.auth_token].ctx||$.ccio.mon[d.ke+d.id+user.auth_token].ctx.length===0){ $.ccio.mon[d.ke+d.id+user.auth_token].ctx = $('#monitor_live_'+d.id+user.auth_token+' canvas'); } var ctx = $.ccio.mon[d.ke+d.id+user.auth_token].ctx[0] var ctx2d = ctx.getContext("2d") $.ccio.mon[d.ke+d.id+user.auth_token].image = new Image() var image = $.ccio.mon[d.ke+d.id+user.auth_token].image image.onload = function() { $.ccio.mon[d.ke+d.id+user.auth_token].imageLoading = false d.x = 0 d.y = 0 // d.ratio = Math.min(ctx.width/image.width,ctx.height/image.height) // d.height = image.height * d.ratio // d.width = image.width * d.ratio // if(d.width < ctx.width){ // d.x = (ctx.width / 2) - (d.width / 2) // } // if(d.height < ctx.height){ // d.y = (ctx.height / 2) - (d.height / 2) // } // ctx.getContext("2d").drawImage(image,d.x,d.y,d.width,d.height) ctx.getContext("2d").drawImage(image,d.x,d.y,ctx.width,ctx.height) URL.revokeObjectURL($.ccio.mon[d.ke+d.id+user.auth_token].imageUrl) } ws.on('data',function(imageData){ try{ if($.ccio.mon[d.ke+d.id+user.auth_token].imageLoading === true)return console.log('drop'); // var base64Frame = 'data:image/jpeg;base64,'+$.ccio.base64ArrayBuffer(imageData) $.ccio.mon[d.ke+d.id+user.auth_token].imageLoading = true // $.ccio.mon[d.ke+d.id+user.auth_token].image.src = base64Frame var arrayBufferView = new Uint8Array(imageData); var blob = new Blob( [ arrayBufferView ], { type: "image/jpeg" } ); $.ccio.mon[d.ke+d.id+user.auth_token].imageUrl = URL.createObjectURL( blob ); $.ccio.mon[d.ke+d.id+user.auth_token].image.src = $.ccio.mon[d.ke+d.id+user.auth_token].imageUrl $.ccio.mon[d.ke+d.id+user.auth_token].last_frame = 'data:image/jpeg;base64,'+$.ccio.base64ArrayBuffer(imageData) }catch(er){ console.log(er) $.ccio.log('base64 frame') } $.ccio.init('signal',d); }) }) break; case'mp4': setTimeout(function(){ var stream = d.e.find('.stream-element'); var onPoseidonError = function(){ // setTimeout(function(){ // $.ccio.cx({f:'monitor',ff:'watch_on',id:d.id},user) // },5000) } if(!$.ccio.mon[d.ke+d.id+user.auth_token].PoseidonErrorCount)$.ccio.mon[d.ke+d.id+user.auth_token].PoseidonErrorCount = 0 if($.ccio.mon[d.ke+d.id+user.auth_token].PoseidonErrorCount >= 5)return if(d.d.stream_flv_type==='ws'){ if($.ccio.mon[d.ke+d.id+user.auth_token].Poseidon){ $.ccio.mon[d.ke+d.id+user.auth_token].Poseidon.stop() } try{ $.ccio.mon[d.ke+d.id+user.auth_token].Poseidon = new Poseidon({ video: stream[0], auth_token:user.auth_token, ke:d.ke, uid:user.uid, id:d.id, url: location.origin, path: path, onError : onPoseidonError }) $.ccio.mon[d.ke+d.id+user.auth_token].Poseidon.start(); }catch(err){ // onPoseidonError() console.log('onTryPoseidonError',err) } }else{ stream.attr('src',$.ccio.init('location',user)+user.auth_token+'/mp4/'+d.ke+'/'+d.id+'/s.mp4') stream[0].onerror = function(err){ console.error(err) } } },2000) break; case'flv': if (flvjs.isSupported()) { if($.ccio.mon[d.ke+d.id+user.auth_token].flv){ $.ccio.mon[d.ke+d.id+user.auth_token].flv.destroy() } var options = {}; if(d.d.stream_flv_type==='ws'){ if(d.d.stream_flv_maxLatency&&d.d.stream_flv_maxLatency!==''){ d.d.stream_flv_maxLatency = parseInt(d.d.stream_flv_maxLatency) }else{ d.d.stream_flv_maxLatency = 20000; } options = { type: 'flv', isLive: true, auth_token:user.auth_token, ke:d.ke, uid:user.uid, id:d.id, maxLatency:d.d.stream_flv_maxLatency, hasAudio:false, url: location.origin, path: path } }else{ options = { type: 'flv', isLive: true, url: $.ccio.init('location',user)+user.auth_token+'/flv/'+d.ke+'/'+d.id+'/s.flv' } } $.ccio.mon[d.ke+d.id+user.auth_token].flv = flvjs.createPlayer(options); $.ccio.mon[d.ke+d.id+user.auth_token].flv.attachMediaElement($('#monitor_live_'+d.id+user.auth_token+' .stream-element')[0]); $.ccio.mon[d.ke+d.id+user.auth_token].flv.on('error',function(err){ console.log(err) }); $.ccio.mon[d.ke+d.id+user.auth_token].flv.load(); $.ccio.mon[d.ke+d.id+user.auth_token].flv.play(); }else{ $.ccio.init('note',{title:'Stream cannot be started',text:'FLV.js is not supported on this browser. Try another stream type.',type:'error'}); } break; case'hls': d.fn=function(){ clearTimeout($.ccio.mon[d.ke+d.id+user.auth_token].m3uCheck) d.url=$.ccio.init('location',user)+user.auth_token+'/hls/'+d.ke+'/'+d.id+'/s.m3u8'; $.get(d.url,function(m3u){ if(m3u=='File Not Found'){ $.ccio.mon[d.ke+d.id+user.auth_token].m3uCheck=setTimeout(function(){ d.fn() },2000) }else{ var video = $('#monitor_live_'+d.id+user.auth_token+' .stream-element')[0]; if (navigator.userAgent.match(/(iPod|iPhone|iPad)/)||(navigator.userAgent.match(/(Safari)/)&&!navigator.userAgent.match('Chrome'))) { video.src=d.url; if (video.paused) { video.play(); } }else{ $.ccio.mon[d.ke+d.id+user.auth_token].hlsGarbageCollector=function(){ if($.ccio.mon[d.ke+d.id+user.auth_token].hls){$.ccio.mon[d.ke+d.id+user.auth_token].hls.destroy();URL.revokeObjectURL(video.src)} $.ccio.mon[d.ke+d.id+user.auth_token].hls = new Hls(); $.ccio.mon[d.ke+d.id+user.auth_token].hls.loadSource(d.url); $.ccio.mon[d.ke+d.id+user.auth_token].hls.attachMedia(video); $.ccio.mon[d.ke+d.id+user.auth_token].hls.on(Hls.Events.MANIFEST_PARSED,function() { if (video.paused) { video.play(); } }); } $.ccio.mon[d.ke+d.id+user.auth_token].hlsGarbageCollector() $.ccio.mon[d.ke+d.id+user.auth_token].hlsGarbageCollectorTimer=setInterval($.ccio.mon[d.ke+d.id+user.auth_token].hlsGarbageCollector,1000*60*20) } } }) } d.fn() break; case'mjpeg': $('#monitor_live_'+d.id+user.auth_token+' .stream-element').attr('src',$.ccio.init('location',user)+user.auth_token+'/mjpeg/'+d.ke+'/'+d.id+'/?full=true') break; case'h265': var player = $.ccio.mon[d.ke+d.id+user.auth_token].h265Player var video = $('#monitor_live_'+d.id+user.auth_token+' .stream-element')[0] if (player) { player.stop() } $.ccio.mon[d.ke+d.id+user.auth_token].h265Player = new libde265.RawPlayer(video) var player = $.ccio.mon[d.ke+d.id+user.auth_token].h265Player player.set_status_callback(function(msg, fps) { }) player.launch() if($.ccio.mon[d.ke+d.id+user.auth_token].h265Socket && $.ccio.mon[d.ke+d.id+user.auth_token].h265Socket.connected){ $.ccio.mon[d.ke+d.id+user.auth_token].h265Socket.disconnect() } if($.ccio.mon[d.ke+d.id+user.auth_token].h265HttpStream && $.ccio.mon[d.ke+d.id+user.auth_token].abort){ $.ccio.mon[d.ke+d.id+user.auth_token].h265HttpStream.abort() } if(d.d.stream_flv_type==='ws'){ $.ccio.mon[d.ke+d.id+user.auth_token].h265Socket = io(location.origin,{ path: path, transports: ['websocket'], forceNew: false}) var ws = $.ccio.mon[d.ke+d.id+user.auth_token].h265Socket ws.on('diconnect',function(){ console.log('h265Socket Stream Disconnected') }) ws.on('connect',function(){ ws.emit('h265',{ auth: user.auth_token, uid: user.uid, ke: d.ke, id: d.id, // channel: channel }) ws.on('data',function(imageData){ player._handle_onChunk(imageData) }) }) }else{ var url = $.ccio.init('location',user)+user.auth_token+'/h265/'+d.ke+'/'+d.id+'/s.hevc'; $.ccio.mon[d.ke+d.id+user.auth_token].h265HttpStream = player.createHttpStream(url) } break; } } d.signal=parseFloat(d.d.signal_check); if(!d.signal||d.signal==NaN){d.signal=10;};d.signal=d.signal*1000*60; if(d.signal>0){ $.ccio.mon[d.ke+d.id+user.auth_token].signal=setInterval(function(){$.ccio.init('signal-check',{id:d.id,ke:d.ke})},d.signal); } d.e=$('.monitor_item[mid="'+d.id+'"][ke="'+d.ke+'"][auth="'+user.auth_token+'"]').resize() if(d.e.find('.videos_monitor_list li').length===0){ d.dr=$('#videos_viewer_daterange').data('daterangepicker'); $.getJSON($.ccio.init('location',user)+user.auth_token+'/videos/'+d.ke+'/'+d.id+'?limit=10',function(f){ $.ccio.pm(0,{videos:f.videos,ke:d.ke,mid:d.id},null,user) }) } setTimeout(function(){ if($.ccio.mon[d.ke+d.id+user.auth_token].motionDetectionRunning===true){ $.ccio.init('streamMotionDetectRestart',{mid:d.id,ke:d.ke,mon:$.ccio.mon[d.ke+d.id+user.auth_token]},user); } },3000) break; case'pam_frame': if(!$.ccio.mon[d.ke+d.id+user.auth_token].ctx||$.ccio.mon[d.ke+d.id+user.auth_token].ctx.length===0){ $.ccio.mon[d.ke+d.id+user.auth_token].ctx = $('#monitor_live_'+d.id+user.auth_token+' canvas'); $.ccio.mon[d.ke+d.id+user.auth_token].ctxContext = $.ccio.mon[d.ke+d.id+user.auth_token].ctx[0].getContext('2d'); } var ctx = $.ccio.mon[d.ke+d.id+user.auth_token].ctxContext; d.x = 0,d.y = 0; d.ratio = Math.min($.ccio.mon[d.ke+d.id+user.auth_token].ctx.width()/d.imageData.width,$.ccio.mon[d.ke+d.id+user.auth_token].ctx.height()/d.imageData.height); d.height = d.imageData.height*d.ratio; d.width = d.imageData.width*d.ratio; if( d.width < $.ccio.mon[d.ke+d.id+user.auth_token].ctx.width() ) d.x = ($.ccio.mon[d.ke+d.id+user.auth_token].ctx.width() / 2) - (d.width / 2); if( d.height < $.ccio.mon[d.ke+d.id+user.auth_token].ctx.height() ) d.y = ($.ccio.mon[d.ke+d.id+user.auth_token].ctx.height() / 2) - (d.height / 2); var imageData = ctx.createImageData(d.width,d.height) imageData.data.set(new Uint8ClampedArray(d.imageData.data)) console.log(imageData) ctx.putImageData(imageData, 0, 0); break; case'monitor_frame': try{ if($.ccio.mon[d.ke+d.id+user.auth_token].imageLoading === true)return if(!$.ccio.mon[d.ke+d.id+user.auth_token].ctx||$.ccio.mon[d.ke+d.id+user.auth_token].ctx.length===0){ $.ccio.mon[d.ke+d.id+user.auth_token].ctx = $('#monitor_live_'+d.id+user.auth_token+' canvas'); } var ctx = $.ccio.mon[d.ke+d.id+user.auth_token].ctx[0] if(!$.ccio.mon[d.ke+d.id+user.auth_token].image){ $.ccio.mon[d.ke+d.id+user.auth_token].image = new Image() var image = $.ccio.mon[d.ke+d.id+user.auth_token].image image.onload = function() { $.ccio.mon[d.ke+d.id+user.auth_token].imageLoading = false d.x = 0 d.y = 0 // d.ratio = Math.min(ctx.width/image.width,ctx.height/image.height) // d.height = image.height * d.ratio // d.width = image.width * d.ratio // if(d.width < ctx.width){ // d.x = (ctx.width / 2) - (d.width / 2) // } // if(d.height < ctx.height){ // d.y = (ctx.height / 2) - (d.height / 2) // } // ctx.getContext("2d").drawImage(image,d.x,d.y,d.width,d.height) ctx.getContext("2d").drawImage(image,d.x,d.y,ctx.width,ctx.height) } } var base64Frame = 'data:image/jpeg;base64,'+d.frame $.ccio.mon[d.ke+d.id+user.auth_token].imageLoading = true $.ccio.mon[d.ke+d.id+user.auth_token].image.src = base64Frame $.ccio.mon[d.ke+d.id+user.auth_token].last_frame = base64Frame }catch(er){ console.log(er) $.ccio.log('base64 frame') } $.ccio.init('signal',d); break; case'monitor_edit': $.ccio.init('clearTimers',d) d.e=$('[mid="'+d.mon.mid+'"][ke="'+d.mon.ke+'"][auth="'+user.auth_token+'"]'); d.e=$('#monitor_live_'+d.mid+user.auth_token); d.e.find('.stream-detected-object').remove() if(d.mon.details.control=="1"){d.e.find('[monitor="control_toggle"]').show()}else{d.e.find('.pad').remove();d.e.find('[monitor="control_toggle"]').hide()} if(user===$user){ d.chosen_set='watch_on' }else{ d.chosen_set='watch_on_links' } d.o=$.ccio.op()[d.chosen_set]; if(!d.o){d.o={}} if(d.mon.details.cords instanceof Object){d.mon.details.cords=JSON.stringify(d.mon.details.cords);} d.mon.details=JSON.stringify(d.mon.details); if(!$.ccio.mon[d.ke+d.mid+user.auth_token]){$.ccio.mon[d.ke+d.mid+user.auth_token]={}} $.ccio.init('jpegModeStop',d); $.ccio.mon[d.ke+d.mid+user.auth_token].previousStreamType=d.mon.details.stream_type $.each(d.mon,function(n,v){ $.ccio.mon[d.ke+d.mid+user.auth_token][n]=v; }); $.ccio.mon[d.ke+d.mid+user.auth_token].user=user if(d.new===true){$.ccio.tm(1,d.mon,null,user)} switch(d.mon.mode){ case'start':case'record': if(d.o[d.ke]&&d.o[d.ke][d.mid]===1){ $.ccio.cx({f:'monitor',ff:'watch_on',id:d.mid},user) } break; } $.ccio.init('monitorInfo',d) $.gR.drawList(); if(!d.silenceNote){ $.ccio.init('note',{title:'Monitor Saved',text:''+d.mon.name+' '+d.mon.mid+' has been saved.',type:'success'}); } break; case'monitor_starting': // switch(d.mode){case'start':d.mode='Watch';break;case'record':d.mode='Record';break;} // $.ccio.init('note',{title:'Monitor Starting',text:'Monitor '+d.mid+' is now running in mode '+d.mode+'',type:'success'}); d.e=$('#monitor_live_'+d.mid+user.auth_token) if(d.e.length>0){$.ccio.cx({f:'monitor',ff:'watch_on',id:d.mid},user)} break; case'mode_jpeg_off': $.ccio.op('jpeg_on',"0"); $.each($.ccio.mon,function(n,v,x){ $.ccio.init('jpegModeStop',v); if(v.watch===1){ $.ccio.cx({f:'monitor',ff:'watch_on',id:v.mid},user) } }); $('body').removeClass('jpegMode') break; case'mode_jpeg_on': $.ccio.op('jpeg_on',true); $.ccio.init('jpegModeAll'); $('body').addClass('jpegMode') break; case'drawPowerVideoMainTimeLine': var videos = d.videos; var events = d.events; // $.pwrvid.currentlyLoading = false $.pwrvid.currentVideos=videos $.pwrvid.currentEvents=events $.pwrvid.e.find('.loading').hide() $.pwrvid.e.find('.nodata').hide() //$.pwrvid.drawTimeLine if($.pwrvid.t&&$.pwrvid.t.destroy){$.pwrvid.t.destroy()} data={}; $.each(videos.videos,function(n,v){ if(!v||!v.mid){return} v.mon=$.ccio.mon[v.ke+v.mid+$user.auth_token]; // v.filename=$.ccio.init('tf',v.time)+'.'+v.ext; if(v.status>0){ // data.push({src:v,x:v.time,y:$.ccio.timeObject(v.time).diff($.ccio.timeObject(v.end),'minutes')/-1}) data[v.filename]={ filename:v.filename, time:v.time, timeFormatted:$.ccio.timeObject(v.time).format('MM/DD/YYYY HH:mm'), endTime:v.end, close:$.ccio.timeObject(v.time).diff($.ccio.timeObject(v.end),'minutes')/-1, motion:[], row:v, position:n } } }); var eventsToCheck = Object.assign({},events) $.each(data,function(m,b){ startTimeFormatted = $.ccio.timeObject(b.time).format('YYYY-MM-DD HH:mm:ss'); startTime = $.ccio.timeObject(b.time).format(); endTime = $.ccio.timeObject(b.endTime).format(); var newSetOfEventsWithoutChecked = {}; var eventTime $.each(eventsToCheck,function(n,v){ if(typeof v.time === 'string' && v.time.indexOf('T') > -1){ eventTime = v.time.split('T') }else if(typeof v.time === 'number'){ eventTime = moment(v.time).format('YYYY-MM-DD HH:mm:ss').split(' ') }else{ eventTime = v.time.split(' ') } eventTime[1] = eventTime[1].replace(/-/g,':'),eventTime = eventTime.join(' '); if(eventTime === startTimeFormatted){ data[m].motion.push(v) }else if ($.ccio.timeObject(v.time).isBetween(startTime,$.ccio.timeObject(b.endTime).format())) { data[m].motion.push(v) }else{ newSetOfEventsWithoutChecked[n] = v; } }) eventsToCheck = newSetOfEventsWithoutChecked; }); $.pwrvid.currentDataObject=data; if($.pwrvid.chart){ $.pwrvid.d.empty() delete($.pwrvid.chart) } $.pwrvid.currentData=Object.values(data); if($.pwrvid.currentData.length>0){ var labels=[] var Dataset1=[] var Dataset2=[] $.each(data,function(n,v){ labels.push(v.timeFormatted) Dataset1.push(v.close) Dataset2.push(v.motion.length) }) $.pwrvid.d.html("") var timeFormat = 'MM/DD/YYYY HH:mm'; var color = Chart.helpers.color; Chart.defaults.global.defaultFontColor = '#fff'; var config = { type: 'bar', data: { labels: labels, datasets: [{ type: 'line', label: lang['Video and Time Span (Minutes)'], backgroundColor: color(window.chartColors.blue).alpha(0.2).rgbString(), borderColor: window.chartColors.blue, data: Dataset1, }, { type: 'bar', showTooltip: false, label: lang['Counts of Motion'], backgroundColor: color(window.chartColors.red).alpha(0.5).rgbString(), borderColor: window.chartColors.red, data:Dataset2, }, ] }, options: { maintainAspectRatio: false, title: { fontColor: "white", text: lang['Video Length (minutes) and Motion Count per video'] }, tooltips: { callbacks: { }, }, scales: { xAxes: [{ type: "time", display: true, time: { // format: timeFormat, unit: 'minute', displayFormats: { minute: 'h:mm a', }, }, categoryPercentage: 0.6, barPercentage: .5, }], }, } }; var ctx = $.pwrvid.d.find('canvas')[0].getContext("2d"); $.pwrvid.chart = new Chart(ctx, config); $.pwrvid.d.find('canvas').click(function(e) { var target = $.pwrvid.chart.getElementsAtEvent(e)[0]; if(!target){return false} target = $.pwrvid.currentData[target._index]; $.pwrvid.e.find('.temp').html('