mirror of
https://gitlab.com/Shinobi-Systems/ShinobiCE.git
synced 2025-03-09 15:40:15 +00:00
Son Goku
- Rebased sql, test, web, defintions, languages, INSTALL, and libs folders.
This commit is contained in:
parent
24de55e45a
commit
d0b12e92e7
362 changed files with 21716 additions and 7018 deletions
32
web/libs/js/dash2.apiwindow.js
Normal file
32
web/libs/js/dash2.apiwindow.js
Normal file
|
@ -0,0 +1,32 @@
|
|||
$(document).ready(function(e){
|
||||
//api window
|
||||
$.apM={e:$('#apis')};$.apM.f=$.apM.e.find('form');
|
||||
$.apM.md=$.apM.f.find('[detail]');
|
||||
$.apM.md.change($.ccio.form.details).first().change();
|
||||
$.apM.f.submit(function(e){
|
||||
e.preventDefault();e.e=$(this),e.s=e.e.serializeObject();
|
||||
e.er=[];
|
||||
if(!e.s.ip||e.s.ip.length<7){e.er.push('Enter atleast one IP')}
|
||||
if(e.er.length>0){$.apM.e.find('.msg').html(e.er.join('<br>'));return;}
|
||||
$.each(e.s,function(n,v){e.s[n]=v.trim()})
|
||||
// e.s = {
|
||||
// "ip": "",
|
||||
// "details": "{\"get_monitors\":\"1\",\"control_monitors\":\"1\",\"get_logs\":\"1\",\"watch_stream\":\"1\",\"watch_snapshot\":\"1\",\"watch_videos\":\"1\",\"delete_videos\":\"1\"}"
|
||||
// }
|
||||
$.post($.ccio.init('location',$user)+$user.auth_token+'/api/'+$user.ke+'/add',{data:JSON.stringify(e.s)},function(d){
|
||||
$.ccio.log(d)
|
||||
})
|
||||
});
|
||||
$.apM.e.on('click','.delete',function(e){
|
||||
e.e=$(this);e.p=e.e.parents('[api_key]'),e.code=e.p.attr('api_key');
|
||||
$.confirm.e.modal('show');
|
||||
$.confirm.title.text('Delete API Key');
|
||||
e.html='Do you want to delete this API key? You cannot recover it.';
|
||||
$.confirm.body.html(e.html);
|
||||
$.confirm.click({title:'Delete',class:'btn-danger'},function(){
|
||||
$.post($.ccio.init('location',$user)+$user.auth_token+'/api/'+$user.ke+'/delete',{data:JSON.stringify({code:e.code})},function(d){
|
||||
$.ccio.log(d)
|
||||
})
|
||||
})
|
||||
})
|
||||
})
|
299
web/libs/js/dash2.basic.js
Normal file
299
web/libs/js/dash2.basic.js
Normal file
|
@ -0,0 +1,299 @@
|
|||
$.ccio.permissionCheck = function(toCheck,monitorId){
|
||||
var details = $user.details
|
||||
if(details.sub && details.allmonitors === '0'){
|
||||
var chosenValue = details[toCheck]
|
||||
if(details[toCheck] instanceof Array && chosenValue.indexOf(monitorId) > -1){
|
||||
return true
|
||||
}else if(chosenValue === '1'){
|
||||
return true
|
||||
}
|
||||
}else{
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
$.ccio.op = function(r,rr,rrr){
|
||||
if(!rrr){rrr={};};if(typeof rrr === 'string'){rrr={n:rrr}};if(!rrr.n){rrr.n='ShinobiOptions_'+location.host}
|
||||
ii={o:localStorage.getItem(rrr.n)};try{ii.o=JSON.parse(ii.o)}catch(e){ii.o={}}
|
||||
if(!ii.o){ii.o={}}
|
||||
if(r&&rr&&!rrr.x){
|
||||
ii.o[r]=rr;
|
||||
}
|
||||
switch(rrr.x){
|
||||
case 0:
|
||||
delete(ii.o[r])
|
||||
break;
|
||||
case 1:
|
||||
delete(ii.o[r][rr])
|
||||
break;
|
||||
}
|
||||
localStorage.setItem(rrr.n,JSON.stringify(ii.o))
|
||||
return ii.o
|
||||
}
|
||||
$.ccio.log = function(x,y,z){
|
||||
if($.ccio.op().browserLog==="1"){
|
||||
if(!y){y=''};if(!z){z=''};
|
||||
console.log(x,y,z)
|
||||
}
|
||||
}
|
||||
$.ccio.gid = function(x){
|
||||
if(!x){x=10};var t = "";var p = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
|
||||
for( var i=0; i < x; i++ )
|
||||
t += p.charAt(Math.floor(Math.random() * p.length));
|
||||
return t;
|
||||
};
|
||||
$.ccio.downloadJSON = function(jsonToDownload,filename,errorResponse){
|
||||
var arr = jsonToDownload;
|
||||
if(arr.length===0 && errorResponse){
|
||||
errorResponse.type = 'error'
|
||||
$.ccio.init('note',errorResponse);
|
||||
return
|
||||
}
|
||||
var dataStr = "data:text/json;charset=utf-8," + encodeURIComponent(JSON.stringify(arr,null,3));
|
||||
$('#temp').html('<a></a>')
|
||||
.find('a')
|
||||
.attr('href',dataStr)
|
||||
.attr('download',filename)
|
||||
[0].click()
|
||||
}
|
||||
$.ccio.timeObject = function(time,isUTC){
|
||||
if(isUTC === true){
|
||||
return moment(time).utc()
|
||||
}
|
||||
return moment(time)
|
||||
}
|
||||
$.ccio.base64ArrayBuffer = function(arrayBuffer) {
|
||||
var base64 = ''
|
||||
var encodings = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
|
||||
|
||||
var bytes = new Uint8Array(arrayBuffer)
|
||||
var byteLength = bytes.byteLength
|
||||
var byteRemainder = byteLength % 3
|
||||
var mainLength = byteLength - byteRemainder
|
||||
|
||||
var a, b, c, d
|
||||
var chunk
|
||||
|
||||
// Main loop deals with bytes in chunks of 3
|
||||
for (var i = 0; i < mainLength; i = i + 3) {
|
||||
// Combine the three bytes into a single integer
|
||||
chunk = (bytes[i] << 16) | (bytes[i + 1] << 8) | bytes[i + 2]
|
||||
|
||||
// Use bitmasks to extract 6-bit segments from the triplet
|
||||
a = (chunk & 16515072) >> 18 // 16515072 = (2^6 - 1) << 18
|
||||
b = (chunk & 258048) >> 12 // 258048 = (2^6 - 1) << 12
|
||||
c = (chunk & 4032) >> 6 // 4032 = (2^6 - 1) << 6
|
||||
d = chunk & 63 // 63 = 2^6 - 1
|
||||
|
||||
// Convert the raw binary segments to the appropriate ASCII encoding
|
||||
base64 += encodings[a] + encodings[b] + encodings[c] + encodings[d]
|
||||
}
|
||||
|
||||
// Deal with the remaining bytes and padding
|
||||
if (byteRemainder == 1) {
|
||||
chunk = bytes[mainLength]
|
||||
|
||||
a = (chunk & 252) >> 2 // 252 = (2^6 - 1) << 2
|
||||
|
||||
// Set the 4 least significant bits to zero
|
||||
b = (chunk & 3) << 4 // 3 = 2^2 - 1
|
||||
|
||||
base64 += encodings[a] + encodings[b] + '=='
|
||||
} else if (byteRemainder == 2) {
|
||||
chunk = (bytes[mainLength] << 8) | bytes[mainLength + 1]
|
||||
|
||||
a = (chunk & 64512) >> 10 // 64512 = (2^6 - 1) << 10
|
||||
b = (chunk & 1008) >> 4 // 1008 = (2^6 - 1) << 4
|
||||
|
||||
// Set the 2 least significant bits to zero
|
||||
c = (chunk & 15) << 2 // 15 = 2^4 - 1
|
||||
|
||||
base64 += encodings[a] + encodings[b] + encodings[c] + '='
|
||||
}
|
||||
|
||||
return base64
|
||||
}
|
||||
$.ccio.snapshot=function(e,cb){
|
||||
var image_data,url;
|
||||
e.details=JSON.parse(e.mon.details);
|
||||
if($.ccio.op().jpeg_on!==true){
|
||||
var extend=function(image_data,width,height){
|
||||
var len = image_data.length
|
||||
var arraybuffer = new Uint8Array( len );
|
||||
for (var i = 0; i < len; i++) {
|
||||
arraybuffer[i] = image_data.charCodeAt(i);
|
||||
}
|
||||
try {
|
||||
var blob = new Blob([arraybuffer], {type: 'application/octet-stream'});
|
||||
} catch (e) {
|
||||
var bb = new (window.WebKitBlobBuilder || window.MozBlobBuilder);
|
||||
bb.append(arraybuffer);
|
||||
var blob = bb.getBlob('application/octet-stream');
|
||||
}
|
||||
url = (window.URL || window.webkitURL).createObjectURL(blob);
|
||||
finish(url,image_data,width,height);
|
||||
try{
|
||||
setTimeout(function(){
|
||||
URL.revokeObjectURL(url)
|
||||
},10000)
|
||||
}catch(er){}
|
||||
}
|
||||
var finish = function(url,image_data,width,height){
|
||||
cb(url,image_data,width,height);
|
||||
}
|
||||
switch(JSON.parse(e.mon.details).stream_type){
|
||||
case'hls':case'flv':case'mp4':
|
||||
$.ccio.snapshotVideo($('[mid='+e.mon.mid+'].monitor_item video')[0],function(base64,video_data,width,height){
|
||||
extend(video_data,width,height)
|
||||
})
|
||||
break;
|
||||
case'mjpeg':
|
||||
$('#temp').html('<canvas></canvas>')
|
||||
var c = $('#temp canvas')[0];
|
||||
var img = $('img',$('[mid='+e.mon.mid+'].monitor_item .stream-element').contents())[0];
|
||||
c.width = img.width;
|
||||
c.height = img.height;
|
||||
var ctx = c.getContext('2d');
|
||||
ctx.drawImage(img, 0, 0,c.width,c.height);
|
||||
extend(atob(c.toDataURL('image/jpeg').split(',')[1]),c.width,c.height)
|
||||
break;
|
||||
case'h265':
|
||||
var c = $('[mid='+e.mon.mid+'].monitor_item canvas')[0];
|
||||
var ctx = c.getContext('2d');
|
||||
extend(atob(c.toDataURL('image/jpeg').split(',')[1]),c.width,c.height)
|
||||
break;
|
||||
case'b64':
|
||||
base64 = e.mon.last_frame.split(',')[1];
|
||||
var image_data = new Image();
|
||||
image_data.src = base64;
|
||||
extend(atob(base64),image_data.width,image_data.height)
|
||||
break;
|
||||
case'jpeg':case'h265':
|
||||
url=e.p.find('.stream-element').attr('src');
|
||||
image_data = new Image();
|
||||
image_data.src = url;
|
||||
finish(url,image_data,image_data.width,image_data.height);
|
||||
break;
|
||||
}
|
||||
}else{
|
||||
url=e.p.find('.stream-element').attr('src');
|
||||
image_data = new Image();
|
||||
image_data.src = url;
|
||||
cb(url,image_data,image_data.width,image_data.height);
|
||||
}
|
||||
}
|
||||
$.ccio.snapshotVideo=function(videoElement,cb){
|
||||
var image_data;
|
||||
var base64
|
||||
$('#temp').html('<canvas></canvas>')
|
||||
var c = $('#temp canvas')[0];
|
||||
var img = videoElement;
|
||||
c.width = img.videoWidth;
|
||||
c.height = img.videoHeight;
|
||||
var ctx = c.getContext('2d');
|
||||
ctx.drawImage(img, 0, 0,c.width,c.height);
|
||||
base64=c.toDataURL('image/jpeg')
|
||||
image_data=atob(base64.split(',')[1]);
|
||||
var arraybuffer = new ArrayBuffer(image_data.length);
|
||||
var view = new Uint8Array(arraybuffer);
|
||||
for (var i=0; i<image_data.length; i++) {
|
||||
view[i] = image_data.charCodeAt(i) & 0xff;
|
||||
}
|
||||
try {
|
||||
var blob = new Blob([arraybuffer], {type: 'application/octet-stream'});
|
||||
} catch (e) {
|
||||
var bb = new (window.WebKitBlobBuilder || window.MozBlobBuilder);
|
||||
bb.append(arraybuffer);
|
||||
var blob = bb.getBlob('application/octet-stream');
|
||||
}
|
||||
cb(base64,image_data,c.width,c.height);
|
||||
}
|
||||
$.ccio.magnifyStream = function(e){
|
||||
if(!e.p){
|
||||
e.e=$(this),
|
||||
e.p=e.e.parents('[mid]')
|
||||
}
|
||||
if(e.animate === true){
|
||||
var zoomGlassAnimate = 'animate'
|
||||
}else{
|
||||
var zoomGlassAnimate = 'css'
|
||||
}
|
||||
if(e.auto === true){
|
||||
var streamBlockOperator = 'position'
|
||||
}else{
|
||||
var streamBlockOperator = 'offset'
|
||||
}
|
||||
if(e.useCanvas === true){
|
||||
var magnifiedElement = 'canvas'
|
||||
}else{
|
||||
var magnifiedElement = 'iframe'
|
||||
}
|
||||
e.ke=e.p.attr('ke'),//group key
|
||||
e.mid=e.p.attr('mid'),//monitor id
|
||||
e.auth=e.p.attr('auth'),//authkey
|
||||
e.mon=$.ccio.mon[e.ke+e.mid+e.auth]//monitor configuration
|
||||
if(e.zoomAmount)e.mon.zoomAmount=3;
|
||||
if(!e.mon.zoomAmount)e.mon.zoomAmount=3;
|
||||
e.height=parseFloat(e.p.attr('realHeight')) * e.mon.zoomAmount//height of stream
|
||||
e.width=parseFloat(e.p.attr('realWidth')) * e.mon.zoomAmount;//width of stream
|
||||
var targetForZoom = e.p.find('.stream-element');
|
||||
zoomGlass = e.p.find(".zoomGlass");
|
||||
var zoomFrame = function(){
|
||||
var magnify_offset = e.p.find('.stream-block')[streamBlockOperator]();
|
||||
var mx = e.pageX - magnify_offset.left;
|
||||
var my = e.pageY - magnify_offset.top;
|
||||
var rx = Math.round(mx/targetForZoom.width()*e.width - zoomGlass.width()/2)*-1;
|
||||
var ry = Math.round(my/targetForZoom.height()*e.height - zoomGlass.height()/2)*-1;
|
||||
var px = mx - zoomGlass.width()/2;
|
||||
var py = my - zoomGlass.height()/2;
|
||||
zoomGlass[zoomGlassAnimate]({left: px, top: py}).find(magnifiedElement)[zoomGlassAnimate]({left: rx, top: ry});
|
||||
}
|
||||
if(!e.height||!e.width||zoomGlass.length===0){
|
||||
$.ccio.snapshot(e,function(url,buffer,width,height){
|
||||
e.width = width * e.mon.zoomAmount;
|
||||
e.height = height * e.mon.zoomAmount;
|
||||
e.p.attr('realWidth',width)
|
||||
e.p.attr('realHeight',height)
|
||||
zoomGlass = e.p.find(".zoomGlass");
|
||||
if(zoomGlass.length===0){
|
||||
if(e.useCanvas === true){
|
||||
e.p.append('<div class="zoomGlass"><canvas class="blenderCanvas"></canvas></div>');
|
||||
}else{
|
||||
e.p.append('<div class="zoomGlass"><iframe src="'+e.auth+'/embed/'+e.ke+'/'+e.mid+'/fullscreen|jquery|relative"/><div class="hoverShade"></div></div>');
|
||||
}
|
||||
zoomGlass = e.p.find(".zoomGlass");
|
||||
}
|
||||
zoomGlass.find(magnifiedElement).css({height:e.height,width:e.width});
|
||||
zoomFrame()
|
||||
})
|
||||
}else{
|
||||
zoomGlass.find(magnifiedElement).css({height:e.height,width:e.width});
|
||||
zoomFrame()
|
||||
}
|
||||
}
|
||||
$.ccio.destroyStream = function(d,user,killElement){
|
||||
if(d.mid && !d.id)d.id = d.mid
|
||||
console.log(d.ke+d.id+user.auth_token)
|
||||
console.log($.ccio.mon[d.ke+d.id+user.auth_token])
|
||||
if($.ccio.mon[d.ke+d.id+user.auth_token]){
|
||||
console.log('destroy')
|
||||
$.ccio.init('closeVideo',{mid:d.id,ke:d.ke},user);
|
||||
$.ccio.init('jpegModeStop',{mid:d.id,ke:d.ke},user);
|
||||
$.ccio.init('clearTimers',d,user)
|
||||
clearInterval($.ccio.mon[d.ke+d.id+user.auth_token].signal);delete($.ccio.mon[d.ke+d.id+user.auth_token].signal);
|
||||
$.ccio.mon[d.ke+d.id+user.auth_token].watch = 0;
|
||||
$.ccio.mon[d.ke+d.id+user.auth_token].PoseidonErrorCount = 0
|
||||
if($.ccio.mon[d.ke+d.id+user.auth_token].hls){$.ccio.mon[d.ke+d.id+user.auth_token].hls.destroy()}
|
||||
if($.ccio.mon[d.ke+d.id+user.auth_token].Poseidon){$.ccio.mon[d.ke+d.id+user.auth_token].Poseidon.stop()}
|
||||
if($.ccio.mon[d.ke+d.id+user.auth_token].Base64){$.ccio.mon[d.ke+d.id+user.auth_token].Base64.disconnect()}
|
||||
if($.ccio.mon[d.ke+d.id+user.auth_token].h265Socket){$.ccio.mon[d.ke+d.id+user.auth_token].h265Socket.disconnect()}
|
||||
if($.ccio.mon[d.ke+d.id+user.auth_token].h265Player){$.ccio.mon[d.ke+d.id+user.auth_token].h265Player.stop()}
|
||||
if($.ccio.mon[d.ke+d.id+user.auth_token].dash){$.ccio.mon[d.ke+d.id+user.auth_token].dash.reset()}
|
||||
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(killElement){
|
||||
$.grid.data().removeWidget($('#monitor_live_'+d.id+user.auth_token))
|
||||
}
|
||||
}
|
||||
}
|
134
web/libs/js/dash2.config.js
Normal file
134
web/libs/js/dash2.config.js
Normal file
|
@ -0,0 +1,134 @@
|
|||
$.ccio={
|
||||
fr:$('#files_recent'),
|
||||
mon:{},
|
||||
useUTC: <%- config.useUTC || false %>,
|
||||
definitions: <%-JSON.stringify(define)%>,
|
||||
libURL: '<%-window.libURL%>',
|
||||
logMemory: []
|
||||
};
|
||||
<% if(config.DropboxAppKey){ %>
|
||||
$.ccio.DropboxAppKey = '<%-window.DropboxAppKey%>'
|
||||
<% } %>
|
||||
$.ccio.HWAccelChoices = [
|
||||
<% if(config.availableHWAccels) {
|
||||
var methods = {
|
||||
auto: {label:lang['Auto'],value:'auto'},
|
||||
drm: {label:lang['drm'],value:'drm'},
|
||||
cuvid: {label:lang['cuvid'],value:'cuvid'},
|
||||
vaapi: {label:lang['vaapi'],value:'vaapi'},
|
||||
qsv: {label:lang['qsv'],value:'qsv'},
|
||||
vdpau: {label:lang['vdpau'],value:'vdpau'},
|
||||
dxva2: {label:lang['dxva2'],value:'dxva2'},
|
||||
vdpau: {label:lang['vdpau'],value:'vdpau'},
|
||||
videotoolbox: {label:lang['videotoolbox'],value:'videotoolbox'}
|
||||
}
|
||||
config.availableHWAccels.forEach(function(availibleMethod){
|
||||
if(methods[availibleMethod]){ %>
|
||||
<%- JSON.stringify(methods[availibleMethod]) %>,
|
||||
<% }
|
||||
})
|
||||
}
|
||||
%>
|
||||
]
|
||||
try{
|
||||
$user.details = JSON.parse($user.details)
|
||||
}catch(err){
|
||||
|
||||
}
|
||||
if(!$user.details.lang||$user.details.lang==''){
|
||||
$user.details.lang="<%-config.language%>"
|
||||
}
|
||||
switch($user.details.lang){
|
||||
case'ar'://Arabic
|
||||
case'bn'://Bengali
|
||||
$('body').addClass('right-to-left')
|
||||
$('.mdl-menu__item').each(function(n,v){
|
||||
v=$(v).find('i')
|
||||
v.appendTo(v.parent())
|
||||
})
|
||||
break;
|
||||
}
|
||||
window.chartColors = {
|
||||
red: 'rgb(255, 99, 132)',
|
||||
orange: 'rgb(255, 159, 64)',
|
||||
yellow: 'rgb(255, 205, 86)',
|
||||
green: 'rgb(75, 192, 192)',
|
||||
blue: 'rgb(54, 162, 235)',
|
||||
purple: 'rgb(153, 102, 255)',
|
||||
grey: 'rgb(201, 203, 207)'
|
||||
};
|
||||
//global form functions
|
||||
$.ccio.form={};
|
||||
$.ccio.form.details=function(e){
|
||||
e.ar={},e.f=$(this).parents('form');
|
||||
$.each(e.f.find('[detail]'),function(n,v){
|
||||
v=$(v);e.ar[v.attr('detail')]=v.val();
|
||||
});
|
||||
e.f.find('[name="details"]').val(JSON.stringify(e.ar));
|
||||
};
|
||||
$(document).ready(function(e){
|
||||
|
||||
//check switch UI
|
||||
e.o=$.ccio.op().switches;
|
||||
if(e.o){
|
||||
$.each(e.o,function(n,v){
|
||||
$('[system="switch"][switch="'+n+'"]').each(function(m,b){
|
||||
b=$(b);
|
||||
switch(b.attr('type')){
|
||||
case'text':
|
||||
if(v===1){
|
||||
b.addClass('text-success')
|
||||
}else{
|
||||
b.removeClass('text-success')
|
||||
}
|
||||
break;
|
||||
}
|
||||
})
|
||||
})
|
||||
}else{
|
||||
$.ccio.op('switches',{notifyHide:0})
|
||||
}
|
||||
//set class toggle preferences
|
||||
e.o=$.ccio.op().class_toggle;
|
||||
if(e.o){
|
||||
$.each(e.o,function(n,v){
|
||||
if(v[1]===1){
|
||||
$(n).addClass(v[0])
|
||||
}else{
|
||||
$(n).removeClass(v[0])
|
||||
}
|
||||
})
|
||||
}
|
||||
//set dropdown toggle preferences
|
||||
e.o = $.ccio.op().dropdown_toggle
|
||||
if(e.o){
|
||||
$.each(e.o,function(n,v){
|
||||
$('[dropdown_toggle="'+n+'"]').val(v).change()
|
||||
})
|
||||
}
|
||||
//set localStorage input values
|
||||
e.o = $.ccio.op()
|
||||
if(e.o){
|
||||
$.each(e.o,function(n,v){
|
||||
if(typeof v==='string'){
|
||||
var el = $('[localStorage="'+n+'"]')
|
||||
if(el.is(':checkbox') === false){
|
||||
el.val(v)
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
//on window resize
|
||||
document.addEventListener("fullscreenchange", onFullScreenChange, false);
|
||||
document.addEventListener("webkitfullscreenchange", onFullScreenChange, false);
|
||||
document.addEventListener("mozfullscreenchange", onFullScreenChange, false);
|
||||
function onFullScreenChange() {
|
||||
var fullscreenElement = document.fullscreenElement || document.mozFullScreenElement || document.webkitFullscreenElement;
|
||||
if(!fullscreenElement){
|
||||
$('.fullscreen').removeClass('fullscreen')
|
||||
setTimeout(function(){
|
||||
$('canvas.stream-element').resize();
|
||||
},2000)
|
||||
}
|
||||
}
|
||||
})
|
0
web/libs/js/dash2.confirm.js
Normal file
0
web/libs/js/dash2.confirm.js
Normal file
61
web/libs/js/dash2.cronfilter.js
Normal file
61
web/libs/js/dash2.cronfilter.js
Normal file
|
@ -0,0 +1,61 @@
|
|||
$(document).ready(function(e){
|
||||
//filters window
|
||||
if(!$user.details.filters)$user.details.filters={};
|
||||
$.fI={e:$('#filters')};$.fI.f=$.fI.e.find('form');
|
||||
$.fI.md=$.fI.f.find('[detail]');
|
||||
$.ccio.init('filters');
|
||||
$.ccio.tm('filters-where');
|
||||
$.fI.e.on('click','.where .add',function(e){
|
||||
$.ccio.tm('filters-where');
|
||||
})
|
||||
$.fI.e.on('click','.where .remove',function(e){
|
||||
e.e=$('#filters_where .row');
|
||||
if(e.e.length>1){
|
||||
e.e.last().remove();
|
||||
}
|
||||
})
|
||||
$('#saved_filters').change(function(e){
|
||||
e.e=$(this),e.id=e.e.val();
|
||||
$('#filters_where').empty()
|
||||
if(e.id&&e.id!==''){
|
||||
e.name=$user.details.filters[e.id].name;
|
||||
$.each($user.details.filters[e.id].where,function(n,v){
|
||||
$.ccio.tm('filters-where',v)
|
||||
});
|
||||
$.each($user.details.filters[e.id],function(n,v){
|
||||
if(n==='where'){return}
|
||||
$.fI.f.find('[name="'+n+'"]').val(v);
|
||||
});
|
||||
}else{
|
||||
e.name=lang['Add New'];
|
||||
$.fI.f.find('[name="id"]').val($.ccio.gid(5));
|
||||
$.ccio.tm('filters-where');
|
||||
}
|
||||
$.fI.e.find('.filter_name').text(e.name)
|
||||
}).change()
|
||||
$.fI.f.find('.delete').click(function(e){
|
||||
e.s=$.fI.f.serializeObject();
|
||||
$.confirm.e.modal('show');
|
||||
$.confirm.title.text(lang['Delete Filter']);
|
||||
e.html=lang.confirmDeleteFilter;
|
||||
$.confirm.body.html(e.html);
|
||||
$.confirm.click({title:lang['Delete Filter'],class:'btn-danger'},function(){
|
||||
$.ccio.cx({f:'settings',ff:'filters',fff:'delete',form:e.s})
|
||||
});
|
||||
})
|
||||
$.fI.f.submit(function(e){
|
||||
e.preventDefault();e.e=$(this),e.s=e.e.serializeObject();
|
||||
e.er=[];
|
||||
$.each(e.s,function(n,v){e.s[n]=v.trim()})
|
||||
e.s.where=[];
|
||||
e.e.find('.where-row').each(function(n,v){
|
||||
n={};
|
||||
$(v).find('[where]').each(function(m,b){
|
||||
b=$(b);
|
||||
n[b.attr('where')]=b.val().trim();
|
||||
})
|
||||
e.s.where.push(n)
|
||||
})
|
||||
$.ccio.cx({f:'settings',ff:'filters',fff:'save',form:e.s})
|
||||
});
|
||||
})
|
143
web/libs/js/dash2.detectorfilter.js
Normal file
143
web/libs/js/dash2.detectorfilter.js
Normal file
|
@ -0,0 +1,143 @@
|
|||
$(document).ready(function(e){
|
||||
//detector filters window
|
||||
$.detectorFilters={e:$('#detector_filter')};
|
||||
$.detectorFilters.f=$.detectorFilters.e.find('form');
|
||||
$.detectorFilters.md=$.detectorFilters.f.find('[detail]');
|
||||
$.detectorFilters.getSelected = function(){
|
||||
return $('#detector_filters').val()
|
||||
}
|
||||
$.detectorFilters.drawOptions = function(){
|
||||
var dFilters = $.detectorFilters.getCurrent()
|
||||
$('#detector_filters optgroup').empty()
|
||||
$.each(dFilters,function(n,dFilter){
|
||||
$.ccio.tm('option',{auth_token:$user.auth_token,id:dFilter.id,name:dFilter.filter_name},'#detector_filters optgroup')
|
||||
})
|
||||
}
|
||||
$.detectorFilters.getCurrent = function(){
|
||||
try{
|
||||
return JSON.parse($.aM.e.find('[detail="detector_filters"]').val())
|
||||
}catch(err){
|
||||
return {}
|
||||
}
|
||||
}
|
||||
$.detectorFilters.save = function(){
|
||||
var currentVals = $.detectorFilters.getCurrent()
|
||||
currentVals[$.detectorFilters.lastSave.id] = $.detectorFilters.lastSave
|
||||
$.aM.e.find('[detail="detector_filters"]').val(JSON.stringify(currentVals)).change()
|
||||
}
|
||||
$.ccio.tm('detector-filters-where');
|
||||
$.detectorFilters.e.on('change','[where="p1"]',function(e){
|
||||
var el = $(this)
|
||||
var p1v = el.val()
|
||||
var parent = el.parents('.row')
|
||||
var p3 = parent.find('[where="p3"]')
|
||||
var options = []
|
||||
switch(p1v){
|
||||
case'time':
|
||||
options = [
|
||||
'00:00:00'
|
||||
]
|
||||
break;
|
||||
case'reason':
|
||||
options = [
|
||||
'licensePlate',
|
||||
'object',
|
||||
'motion',
|
||||
]
|
||||
break;
|
||||
case'plug':
|
||||
options = [
|
||||
'PythonYolo',
|
||||
'OpenCV',
|
||||
'built-in',
|
||||
]
|
||||
break;
|
||||
case'tag':
|
||||
options = [
|
||||
'car',
|
||||
'tree',
|
||||
'pottedplant',
|
||||
]
|
||||
break;
|
||||
}
|
||||
var msg = 'Value'
|
||||
if(options.length > 0){
|
||||
msg = 'Example : '+options.join(', ')
|
||||
}
|
||||
p3.attr('placeholder',msg)
|
||||
})
|
||||
$.detectorFilters.e.on('shown.bs.modal',function(e){
|
||||
$.detectorFilters.drawOptions()
|
||||
})
|
||||
$.detectorFilters.e.on('click','.where .add',function(e){
|
||||
$.ccio.tm('detector-filters-where');
|
||||
})
|
||||
$.detectorFilters.e.on('click','.where .remove',function(e){
|
||||
e.e=$('#detector_filters_where .row');
|
||||
if(e.e.length>1){
|
||||
e.e.last().remove();
|
||||
$('#detector_filters_where .row:last [where="p4"]').prop('disabled',true)
|
||||
}
|
||||
})
|
||||
$.detectorFilters.f.find('.delete').click(function(e){
|
||||
var currentVals = $.detectorFilters.getCurrent()
|
||||
var newObject = {}
|
||||
var deleteId = $.detectorFilters.getSelected()
|
||||
$.each(currentVals,function(id,obj){
|
||||
if(id === deleteId)return false;
|
||||
newObject[id] = obj
|
||||
})
|
||||
$.aM.e.find('[detail="detector_filters"]').val(JSON.stringify(newObject)).change()
|
||||
$.detectorFilters.drawOptions()
|
||||
})
|
||||
$('#detector_filters').change(function(){
|
||||
e = {}
|
||||
e.e=$(this),e.id=e.e.val();
|
||||
$('#detector_filters_where').empty()
|
||||
if(e.id&&e.id!==''){
|
||||
var currentFilter = $.detectorFilters.getCurrent()[e.id]
|
||||
e.name=currentFilter.name;
|
||||
$.each(currentFilter.where,function(n,v){
|
||||
$.ccio.tm('detector-filters-where',v)
|
||||
});
|
||||
$.each(currentFilter.actions,function(action,val){
|
||||
$.detectorFilters.e.find('[actions="'+action+'"]').val(val)
|
||||
});
|
||||
$.each(currentFilter,function(n,v){
|
||||
if(n==='where'){return}
|
||||
$.detectorFilters.f.find('[name="'+n+'"]').val(v);
|
||||
});
|
||||
}else{
|
||||
e.name=lang['Add New'];
|
||||
$.detectorFilters.f.find('[name="id"]').val($.ccio.gid(5));
|
||||
$.ccio.tm('detector-filters-where');
|
||||
}
|
||||
$.detectorFilters.e.find('.filter_name').text(e.name)
|
||||
}).change()
|
||||
$.detectorFilters.f.submit(function(ee){
|
||||
ee.preventDefault()
|
||||
e = {}
|
||||
e.e=$(this),e.s=e.e.serializeObject();
|
||||
e.er=[];
|
||||
$.each(e.s,function(n,v){e.s[n]=v.trim()})
|
||||
//create conditions object (where)
|
||||
e.s.where=[];
|
||||
e.e.find('.where-row').each(function(n,v){
|
||||
n={};
|
||||
$(v).find('[where]').each(function(m,b){
|
||||
b=$(b);
|
||||
n[b.attr('where')]=b.val().trim();
|
||||
})
|
||||
e.s.where.push(n)
|
||||
})
|
||||
// create actions object (do)
|
||||
e.s.actions={};
|
||||
e.e.find('.actions-row').each(function(n,v){
|
||||
b=$(v).find('[actions]');
|
||||
e.s.actions[b.attr('actions')] = b.val()
|
||||
})
|
||||
$.detectorFilters.lastSave = e.s
|
||||
$.detectorFilters.save()
|
||||
$.detectorFilters.e.modal('hide')
|
||||
});
|
||||
})
|
918
web/libs/js/dash2.elementbuilder.js
Normal file
918
web/libs/js/dash2.elementbuilder.js
Normal file
|
@ -0,0 +1,918 @@
|
|||
$.ccio.tm=function(x,d,z,user){
|
||||
var tmp='';if(!d){d={}};
|
||||
var k={}
|
||||
if(d&&d.user){
|
||||
user=d.user
|
||||
}
|
||||
if(!user){
|
||||
user=$user
|
||||
}
|
||||
if(d.id&&!d.mid){d.mid=d.id;}
|
||||
switch(x){
|
||||
case 0://video
|
||||
var url = $.ccio.init('videoUrlBuild',d)
|
||||
href = 'href="'+url+'"'
|
||||
// if(!d.filename){d.filename=$.ccio.init('tf',d.time)+'.'+d.ext;}
|
||||
d.dlname=d.mid+'-'+d.filename;
|
||||
d.startMoment=$.ccio.timeObject(d.time),
|
||||
d.endMoment=$.ccio.timeObject(d.end),
|
||||
d.hr=parseInt(d.startMoment.format('HH')),
|
||||
d.per=parseInt(d.hr/24*100);
|
||||
d.circle='<div title="at '+d.hr+' hours of '+d.startMoment.format('MMMM DD')+'" '+href+' video="launch" class="progress-circle progress-'+d.per+'"><span>'+d.hr+'</span></div>'
|
||||
tmp+='<li class="video-item glM'+d.mid+user.auth_token+'" auth="'+user.auth_token+'" mid="'+d.mid+'" ke="'+d.ke+'" status="'+d.status+'" status="'+d.status+'" file="'+d.filename+'">'+d.circle+'<div><span title="'+d.endMoment.format()+'" class="livestamp"></span></div><div><div class="small"><b>'+lang.Start+'</b> : '+d.startMoment.format('h:mm:ss , MMMM Do YYYY')+'</div><div class="small"><b>'+lang.End+'</b> : '+d.endMoment.format('h:mm:ss , MMMM Do YYYY')+'</div></div><div><span class="pull-right">'+(parseInt(d.size)/1000000).toFixed(2)+'mb</span><div class="controls btn-group"><a class="btn btn-sm btn-primary" video="launch" '+href+'><i class="fa fa-play-circle"></i></a> <a download="'+d.dlname+'" '+href+' class="btn btn-sm btn-default"><i class="fa fa-download"></i></a>'
|
||||
if($.ccio.DropboxAppKey){ tmp+='<a video="download" host="dropbox" download="'+d.dlname+'" '+href+' class="btn btn-sm btn-default"><i class="fa fa-dropbox"></i></a>' }
|
||||
tmp+='<a title="'+lang['Delete Video']+'" video="delete" href="'+$.ccio.init('videoHrefToDelete',url)+'" class="btn btn-sm btn-danger permission_video_delete"><i class="fa fa-trash"></i></a></div></div></li>';
|
||||
$(z).each(function(n,v){
|
||||
v=$(v);
|
||||
if(v.find('.video-item').length>10){v.find('.video-item:last').remove()}
|
||||
})
|
||||
break;
|
||||
case 1://monitor icon
|
||||
d.src=placeholder.getData(placeholder.plcimg({bgcolor:'#b57d00',text:'...'}));
|
||||
tmp+='<div auth="'+user.auth_token+'" mid="'+d.mid+'" ke="'+d.ke+'" title="'+d.mid+' : '+d.name+'" class="monitor_block glM'+d.mid+user.auth_token+' col-md-4"><img monitor="watch" class="snapshot" src="'+d.src+'"><div class="box"><div class="title monitor_name truncate">'+d.name+'</div><div class="list-data"><div class="monitor_mid">'+d.mid+'</div><div><b>'+lang['Save as']+' :</b> <span class="monitor_ext">'+d.ext+'</span></div><div><b>Status :</b> <span class="monitor_status">'+d.status+'</span></div></div><div class="icons text-center">'
|
||||
tmp+='<div class="btn-group btn-group-xs">'
|
||||
var buttons = {
|
||||
"Pop": {
|
||||
"label": "Pop",
|
||||
"attr": "monitor=\"pop\"",
|
||||
"class": "default",
|
||||
"icon": "external-link"
|
||||
},
|
||||
"Power Viewer": {
|
||||
"label": "Power Viewer",
|
||||
"attr": "monitor=\"powerview\"",
|
||||
"class": "default",
|
||||
"icon": "map-marker"
|
||||
},
|
||||
"Videos List": {
|
||||
"label": "Videos List",
|
||||
"attr": "monitor=\"videos_table\"",
|
||||
"class": "default",
|
||||
"icon": "film"
|
||||
},
|
||||
"Monitor Settings": {
|
||||
"label": "Monitor Settings",
|
||||
"attr": "monitor=\"edit\"",
|
||||
"class": "default",
|
||||
"icon": "wrench"
|
||||
}
|
||||
}
|
||||
if(!$.ccio.permissionCheck('video_view',d.mid)){
|
||||
delete(buttons["Videos List"])
|
||||
delete(buttons["Power Viewer"])
|
||||
}
|
||||
if(!$.ccio.permissionCheck('monitor_edit',d.mid)){
|
||||
delete(buttons["Monitor Settings"])
|
||||
}
|
||||
$.each(buttons,function(n,v){
|
||||
tmp+='<a class="btn btn-'+v.class+'" '+v.attr+' title="'+v.label+'"><i class="fa fa-'+v.icon+'"></i></a>'
|
||||
})
|
||||
tmp+='</div>\
|
||||
</div></div></div>';
|
||||
delete(d.src);
|
||||
break;
|
||||
case 2://monitor stream
|
||||
try{k.d=JSON.parse(d.details);}catch(er){k.d=d.details;}
|
||||
k.mode=$.ccio.init('humanReadMode',d.mode);
|
||||
var dataTarget = '.monitor_item[mid=\''+d.mid+'\'][ke=\''+d.ke+'\'][auth=\''+user.auth_token+'\']';
|
||||
tmp+='<div id="monitor_live_'+d.mid+user.auth_token+'" auth="'+user.auth_token+'" mid="'+d.mid+'" ke="'+d.ke+'" mode="'+k.mode+'" class="grid-stack-item monitor_item glM'+d.mid+user.auth_token+'"><div class="grid-stack-item-content">';
|
||||
tmp+='<div class="stream-block no-padding mdl-card__media mdl-color-text--grey-50">';
|
||||
tmp+='<div class="stream-objects"></div>';
|
||||
tmp+='<div class="stream-hud">'
|
||||
tmp+='<div class="camera_cpu_usage"><div class="progress"><div class="progress-bar progress-bar-danger" role="progressbar"><span></span></div></div></div>';
|
||||
tmp+='<div class="lamp" title="'+k.mode+'"><i class="fa fa-eercast"></i></div><div class="controls"><span title="'+lang['Currently viewing']+'" class="label label-default"><span class="viewers"></span></span> <a class="btn-xs btn-danger btn" monitor="mode" mode="record"><i class="fa fa-circle"></i> '+lang['Start Recording']+'</a> <a class="btn-xs btn-primary btn" monitor="mode" mode="start"><i class="fa fa-eye"></i> '+lang['Set to Watch Only']+'</a></div></div></div></div>'
|
||||
tmp+='<div class="mdl-card__supporting-text text-center">';
|
||||
tmp+='<div class="indifference detector-fade"><div class="progress"><div class="progress-bar progress-bar-danger" role="progressbar"><span></span></div></div></div>';
|
||||
tmp+='<div class="monitor_details">';
|
||||
tmp+='<div><span class="monitor_name">'+d.name+'</span><span class="monitor_not_record_copy">, '+lang['Recording FPS']+' : <span class="monitor_fps">'+d.fps+'</span></span></div>';
|
||||
tmp+='</div>';
|
||||
tmp+='<div class="btn-group btn-group-sm">'//start of btn list
|
||||
var buttons = {
|
||||
"Snapshot": {
|
||||
"label": "Snapshot",
|
||||
"attr": "monitor=\"snapshot\"",
|
||||
"class": "primary",
|
||||
"icon": "camera"
|
||||
},
|
||||
"Show Logs": {
|
||||
"label": "Show Logs",
|
||||
"attr": "monitor=\"show_data\"",
|
||||
"class": "warning",
|
||||
"icon": "exclamation-triangle"
|
||||
},
|
||||
"Control": {
|
||||
"label": "Control",
|
||||
"attr": "monitor=\"control_toggle\"",
|
||||
"class": "default arrows",
|
||||
"icon": "arrows"
|
||||
},
|
||||
"Status Indicator": {
|
||||
"label": "Status Indicator",
|
||||
"attr": "monitor=\"watch_on\"",
|
||||
"class": "success signal",
|
||||
"icon": "plug"
|
||||
},
|
||||
"Pop": {
|
||||
"label": "Pop",
|
||||
"attr": "monitor=\"pop\"",
|
||||
"class": "default",
|
||||
"icon": "external-link"
|
||||
},
|
||||
"Calendar": {
|
||||
"label": "Calendar",
|
||||
"attr": "monitor=\"calendar\"",
|
||||
"class": "default ",
|
||||
"icon": "calendar"
|
||||
},
|
||||
"Power Viewer": {
|
||||
"label": "Power Viewer",
|
||||
"attr": "monitor=\"powerview\"",
|
||||
"class": "default",
|
||||
"icon": "map-marker"
|
||||
},
|
||||
"Time-lapse": {
|
||||
"label": "Time-lapse",
|
||||
"attr": "monitor=\"timelapse\"",
|
||||
"class": "default",
|
||||
"icon": "angle-double-right"
|
||||
},
|
||||
"Video Grid": {
|
||||
"label": "Video Grid",
|
||||
"attr": "monitor=\"video_grid\"",
|
||||
"class": "default",
|
||||
"icon": "th"
|
||||
},
|
||||
"Videos List": {
|
||||
"label": "Videos List",
|
||||
"attr": "monitor=\"videos_table\"",
|
||||
"class": "default",
|
||||
"icon": "film"
|
||||
},
|
||||
"Monitor Settings": {
|
||||
"label": "Monitor Settings",
|
||||
"attr": "monitor=\"edit\"",
|
||||
"class": "default",
|
||||
"icon": "wrench"
|
||||
},
|
||||
"Fullscreen": {
|
||||
"label": "Fullscreen",
|
||||
"attr": "monitor=\"fullscreen\"",
|
||||
"class": "default",
|
||||
"icon": "arrows-alt"
|
||||
},
|
||||
"Close": {
|
||||
"label": "Close",
|
||||
"attr": "monitor=\"watch_off\"",
|
||||
"class": "danger",
|
||||
"icon": "times"
|
||||
}
|
||||
}
|
||||
if(!$.ccio.permissionCheck('video_view',d.mid)){
|
||||
delete(buttons["Videos List"])
|
||||
delete(buttons["Time-lapse"])
|
||||
delete(buttons["Power Viewer"])
|
||||
delete(buttons["Calendar"])
|
||||
}
|
||||
if(!$.ccio.permissionCheck('monitor_edit',d.mid)){
|
||||
delete(buttons["Monitor Settings"])
|
||||
}
|
||||
$.each(buttons,function(n,v){
|
||||
tmp+='<a class="btn btn-'+v.class+'" '+v.attr+' title="'+v.label+'"><i class="fa fa-'+v.icon+'"></i></a>'
|
||||
})
|
||||
tmp+='</div>';//end of btn list
|
||||
tmp+='</div>';//.stream-block
|
||||
tmp+='<div class="mdl-data_window pull-right">';
|
||||
tmp+='<div>';
|
||||
tmp+='<div class="data-menu col-md-6 no-padding videos_monitor_list glM'+d.mid+user.auth_token+' scrollable"><ul></ul></div>';
|
||||
tmp+='<div class="data-menu col-md-6 no-padding logs scrollable"></div>';
|
||||
tmp+='</div>';
|
||||
tmp+='</div>';//.mdl-data_window
|
||||
tmp+='</div>';//.grid-stack-content
|
||||
tmp+='</div>';//#monitor_live_...
|
||||
break;
|
||||
case 3://api key row
|
||||
tmp+='<tr api_key="'+d.code+'"><td class="code">'+d.code+'</td><td class="ip">'+d.ip+'</td><td class="time">'+d.time+'</td><td class="text-right"><a class="delete btn btn-xs btn-danger"> <i class="fa fa-trash"></i> </a></td></tr>';
|
||||
break;
|
||||
case 4://log row, draw to global and monitor
|
||||
if(!d.time){d.time=$.ccio.init('t')}
|
||||
tmp+='<li class="log-item">'
|
||||
tmp+='<span>'
|
||||
tmp+='<div>'+d.ke+' : <b>'+d.mid+'</b></div>'
|
||||
tmp+='<span>'+d.log.type+'</span> '
|
||||
tmp+='<b class="time livestamp" title="'+d.time+'"></b>'
|
||||
tmp+='</span>'
|
||||
tmp+='<div class="message">'
|
||||
tmp+=$.ccio.init('jsontoblock',d.log.msg);
|
||||
tmp+='</div>'
|
||||
tmp+='</li>';
|
||||
$(z).each(function(n,v){
|
||||
v=$(v);
|
||||
if(v.find('.log-item').length>10){v.find('.log-item:last').remove()}
|
||||
})
|
||||
break;
|
||||
case 6://notification row
|
||||
if(!d.time){d.time=$.ccio.init('t')}
|
||||
if(!d.note.class){d.note.class=''}
|
||||
tmp+='<li class="note-item '+d.note.class+'" ke="'+d.ke+'" auth="'+user.auth_token+'" mid="'+d.id+'">'
|
||||
tmp+='<span>'
|
||||
tmp+='<div>'+d.ke+' : <b>'+d.id+'</b></div>'
|
||||
tmp+='<span>'+d.note.type+'</span> '
|
||||
tmp+='<b class="time livestamp" title="'+d.time+'"></b>'
|
||||
tmp+='</span>'
|
||||
tmp+='<div class="message">'
|
||||
tmp+=d.note.msg
|
||||
tmp+='</div>'
|
||||
tmp+='</li>';
|
||||
break;
|
||||
case'option':
|
||||
var selected = ''
|
||||
if(d.selected === true){selected = ' selected'}
|
||||
tmp+='<option auth="'+user.auth_token+'"'+selected+' value="'+d.id+'">'+d.name+'</option>'
|
||||
break;
|
||||
case'stream-element':
|
||||
try{k.d=JSON.parse(d.details);}catch(er){k.d=d.details}
|
||||
if($.ccio.mon[d.ke+d.mid+user.auth_token]&&$.ccio.mon[d.ke+d.mid+user.auth_token].previousStreamType===k.d.stream_type){
|
||||
return;
|
||||
}
|
||||
k.e=$('#monitor_live_'+d.mid+user.auth_token+' .stream-block');
|
||||
k.e.find('.stream-element').remove();
|
||||
if($.ccio.op().jpeg_on===true){
|
||||
tmp+='<img class="stream-element">';
|
||||
}else{
|
||||
switch(k.d.stream_type){
|
||||
case'hls':case'flv':case'mp4':
|
||||
tmp+='<video class="stream-element" autoplay></video>';
|
||||
break;
|
||||
case'mjpeg':
|
||||
tmp+='<iframe class="stream-element"></iframe>';
|
||||
break;
|
||||
case'jpeg':
|
||||
tmp+='<img class="stream-element">';
|
||||
break;
|
||||
default://base64//h265
|
||||
tmp+='<canvas class="stream-element"></canvas>';
|
||||
break;
|
||||
}
|
||||
}
|
||||
k.e.append(tmp).find('.stream-element').resize();
|
||||
if($.ccio.op().switches.monitorMuteAudio === 1){
|
||||
k.e.find('video').each(function(n,el){
|
||||
el.muted = "muted"
|
||||
})
|
||||
}
|
||||
break;
|
||||
case'user-row':
|
||||
d.e=$('.user-row[uid="'+d.uid+'"][ke="'+d.ke+'"]')
|
||||
if(d.e.length===0){
|
||||
tmp+='<li class="user-row" uid="'+d.uid+'" ke="'+d.ke+'">';
|
||||
tmp+='<span><div><span class="mail">'+d.mail+'</span> : <b class="uid">'+d.uid+'</b></div><span>Logged in</span> <b class="time livestamped" title="'+d.logged_in_at+'"></b></span>';
|
||||
tmp+='</li>';
|
||||
}else{
|
||||
d.e.find('.mail').text(d.mail)
|
||||
d.e.find('.time').livestamp('destroy').toggleClass('livestamped livestamp').text(d.logged_in_at)
|
||||
}
|
||||
$.ccio.init('ls')
|
||||
break;
|
||||
case'detector-filters-where':
|
||||
if(!d)d={};
|
||||
d.id=$('#filters_where .row').length;
|
||||
if(!d.p1){d.p1='indifference'}
|
||||
if(!d.p2){d.p2='='}
|
||||
if(!d.p3){d.p3=''}
|
||||
if(!d.p4){d.p4='&&'}
|
||||
tmp+='<div class="row where-row">'
|
||||
tmp+=' <div class="form-group col-md-3">'
|
||||
tmp+=' <label>'
|
||||
tmp+=' <select class="form-control" where="p1">'
|
||||
tmp+=' <option value="indifference" selected>'+lang['Indifference']+'</option>'
|
||||
tmp+=' <option value="name">'+lang['Region Name']+'</option>'
|
||||
tmp+=' <option value="reason">'+lang['Reason']+'</option>'
|
||||
tmp+=' <option value="time">'+lang['Time']+'</option>'
|
||||
tmp+=' <option value="plug">'+lang['Detection Engine']+'</option>'
|
||||
tmp+=' <optgroup label="Matrix">'
|
||||
tmp+=' <option value="tag">'+lang['Object Tag']+'</option>'
|
||||
tmp+=' <option value="confidence">'+lang['Confidence']+'</option>'
|
||||
tmp+=' <option value="x">'+lang['X Point']+'</option>'
|
||||
tmp+=' <option value="y">'+lang['Y Point']+'</option>'
|
||||
tmp+=' <option value="height">'+lang['Height']+'</option>'
|
||||
tmp+=' <option value="width">'+lang['Width']+'</option>'
|
||||
tmp+=' </optgroup>'
|
||||
tmp+=' </select>'
|
||||
tmp+=' </label>'
|
||||
tmp+=' </div>'
|
||||
tmp+=' <div class="form-group col-md-3">'
|
||||
tmp+=' <label>'
|
||||
tmp+=' <select class="form-control" where="p2">'
|
||||
tmp+=' <option value="===" selected>'+lang['Equal to']+'</option>'
|
||||
tmp+=' <option value="!==">'+lang['Not Equal to']+'</option>'
|
||||
tmp+=' <option value="indexOf">'+lang['Contains']+'</option>'
|
||||
tmp+=' <option value="!indexOf">'+lang['Does Not Contain']+'</option>'
|
||||
tmp+=' <optgroup label="For Numbers">'
|
||||
tmp+=' <option value=">=">'+lang['Greater Than or Equal to']+'</option>'
|
||||
tmp+=' <option value=">">'+lang['Greater Than']+'</option>'
|
||||
tmp+=' <option value="<">'+lang['Less Than']+'</option>'
|
||||
tmp+=' <option value="<=">'+lang['Less Than or Equal to']+'</option>'
|
||||
tmp+=' </optgroup>'
|
||||
tmp+=' </select>'
|
||||
tmp+=' </label>'
|
||||
tmp+=' </div>'
|
||||
tmp+=' <div class="form-group col-md-3">'
|
||||
tmp+=' <label>'
|
||||
tmp+=' <input class="form-control" placeholder="Value" title="'+lang.Value+'" where="p3">'
|
||||
tmp+=' </label>'
|
||||
tmp+=' </div>'
|
||||
tmp+=' <div class="form-group col-md-3">'
|
||||
tmp+=' <label>'
|
||||
tmp+=' <select class="form-control" where="p4">'
|
||||
tmp+=' <option value="&&" selected>'+lang['AND']+'</option>'
|
||||
tmp+=' <option value="||">'+lang['OR']+'</option>'
|
||||
tmp+=' </select>'
|
||||
tmp+=' </label>'
|
||||
tmp+=' </div>'
|
||||
tmp+='</div>'
|
||||
break;
|
||||
case'filters-where':
|
||||
if(!d)d={};
|
||||
d.id=$('#filters_where .row').length;
|
||||
if(!d.p1){d.p1='mid'}
|
||||
if(!d.p2){d.p2='='}
|
||||
if(!d.p3){d.p3=''}
|
||||
tmp+='<div class="row where-row">';
|
||||
tmp+=' <div class="form-group col-md-4">';
|
||||
tmp+=' <label>';
|
||||
tmp+=' <select class="form-control" where="p1">';
|
||||
tmp+=' <option value="mid" selected>'+lang['Monitor ID']+'</option>';
|
||||
tmp+=' <option value="ext">'+lang['File Type']+'</option>';
|
||||
tmp+=' <option value="time">'+lang['Start Time']+'</option>';
|
||||
tmp+=' <option value="end">'+lang['End Time']+'</option>';
|
||||
tmp+=' <option value="size">'+lang['Filesize']+'</option>';
|
||||
tmp+=' <option value="status">'+lang['Video Status']+'</option>';
|
||||
tmp+=' </select>';
|
||||
tmp+=' </label>';
|
||||
tmp+=' </div>';
|
||||
tmp+=' <div class="form-group col-md-4">';
|
||||
tmp+=' <label>';
|
||||
tmp+=' <select class="form-control" where="p2">';
|
||||
tmp+=' <option value="=" selected>'+lang['Equal to']+'</option>';
|
||||
tmp+=' <option value="!=">'+lang['Not Equal to']+'</option>';
|
||||
tmp+=' <option value=">=">'+lang['Greater Than or Equal to']+'</option>';
|
||||
tmp+=' <option value=">">'+lang['Greater Than']+'</option>';
|
||||
tmp+=' <option value="<">'+lang['Less Than']+'</option>';
|
||||
tmp+=' <option value="<=">'+lang['Less Than or Equal to']+'</option>';
|
||||
tmp+=' <option value="LIKE">'+lang['Like']+'</option>';
|
||||
tmp+=' <option value="=~">'+lang['Matches']+'</option>';
|
||||
tmp+=' <option value="!~">'+lang['Not Matches']+'</option>';
|
||||
tmp+=' <option value="=[]">'+lang['In']+'</option>';
|
||||
tmp+=' <option value="![]">'+lang['Not In']+'</option>';
|
||||
tmp+=' </select>';
|
||||
tmp+=' </label>';
|
||||
tmp+=' </div>';
|
||||
tmp+=' <div class="form-group col-md-4">';
|
||||
tmp+=' <label>';
|
||||
tmp+=' <input class="form-control" placeholder="Value" title="'+lang.Value+'" where="p3">';
|
||||
tmp+=' </label>';
|
||||
tmp+=' </div>';
|
||||
tmp+='</div>';
|
||||
break;
|
||||
case 'link-set'://Link Shinobi - 1 set
|
||||
if(!d.host){d.host=''}
|
||||
if(!d.ke){d.ke=''}
|
||||
if(!d.api){d.api=''}
|
||||
if(!d.secure){d.secure="0"}
|
||||
tmp+='<div class="linksGroup" links="'+d.host+'">'
|
||||
tmp+='<h4 class="round-left">'+d.host+' <small>'+d.ke+'</small> <div class="pull-right"><a class="btn btn-danger btn-xs delete"><i class="fa fa-trash-o"></i></a></div></h4>'
|
||||
tmp+='<div class="form-group"><label><div><span>'+lang.Host+'</span></div><div><input class="form-control" link="host" value="'+d.host+'"></div></label></div>'
|
||||
tmp+='<div class="form-group"><label><div><span>'+lang['Group Key']+'</span></div><div><input class="form-control" link="ke" value="'+d.ke+'"></div></label></div>'
|
||||
tmp+='<div class="form-group"><label><div><span>'+lang['API Key']+'</span></div><div><input class="form-control" link="api" value="'+d.api+'"></div></label></div>'
|
||||
tmp+='<div class="form-group"><label><div><span>'+lang.Secure+' (HTTPS/WSS)</span></div><div><select class="form-control" link="secure"><option value="1">'+lang.Yes+'</option><option selected value="0">'+lang.No+'</option></select></div></label></div>'
|
||||
tmp+='</div>';
|
||||
break;
|
||||
case 'form-group'://Input Map Selector
|
||||
var fields = []
|
||||
if(d.fields){
|
||||
if(d.fields instanceof Object){
|
||||
fields = [d]
|
||||
}else{
|
||||
fields = d
|
||||
}
|
||||
}
|
||||
$.each(fields,function(n,v){
|
||||
var value,hidden
|
||||
if(!v.attribute)v.attribute='';
|
||||
if(!v.placeholder)v.placeholder='';
|
||||
if(!v.class)v.class='';
|
||||
if(!v.inputType)v.inputType='value';
|
||||
if(v.hidden){hidden='style="display:none"'}else{hidden=''};
|
||||
if(v.value){value='value=""'}else{value=''};
|
||||
tmp+=' <div class="form-group '+v.class+'" '+hidden+'>'
|
||||
tmp+=' <label><div><span>'+v.label+'</span></div>'
|
||||
tmp+=' <div>'
|
||||
switch(v.type){
|
||||
case'text':
|
||||
tmp+='<input class="form-control" '+v.inputType+'="'+v.name+'" placeholder="'+v.placeholder+'" "'+value+'" '+v.attribute+'>'
|
||||
break;
|
||||
case'selector':
|
||||
tmp+='<select class="form-control" '+v.inputType+'="'+v.name+'" placeholder="'+v.placeholder+'" '+v.attribute+'>'
|
||||
$.each(v.choices,function(m,b){
|
||||
tmp+='<option value="'+b.value+'">'+b.label+'</option>'
|
||||
})
|
||||
tmp+='</select>'
|
||||
break;
|
||||
}
|
||||
tmp+=' </div>'
|
||||
tmp+=' </label>'
|
||||
tmp+=' </div>'
|
||||
})
|
||||
break;
|
||||
case 'input-map-selector'://Input Map Selector
|
||||
if(!d.map){d.map=''}
|
||||
tmp+=' <div class="form-group map-row">'
|
||||
tmp+=' <label><div><span>'+lang['Map']+'</span></div>'
|
||||
tmp+=' <div>'
|
||||
tmp+=' <div class="input-group input-group-sm">'
|
||||
tmp+='<input class="form-control" map-input="map" value="'+d.map+'" placeholder="0">'
|
||||
tmp+=' <div class="input-group-btn">'
|
||||
tmp+=' <a class="btn btn-danger delete_map_row"> <i class="fa fa-trash-o"></i> </a>'
|
||||
tmp+=' </div>'
|
||||
tmp+=' </div>'
|
||||
tmp+=' </div>'
|
||||
tmp+=' </label>'
|
||||
tmp+=' </div>'
|
||||
break;
|
||||
case 'input-map'://Input Map Options
|
||||
var tempID = $.ccio.gid();
|
||||
if(!d.channel){
|
||||
var numberOfChannelsDrawn = $('#monSectionInputMaps .input-map').length
|
||||
d.channel=numberOfChannelsDrawn+1
|
||||
}
|
||||
var fields = [
|
||||
// {
|
||||
// name:'',
|
||||
// class:'',
|
||||
// placeholder:'',
|
||||
// default:'',
|
||||
// attribute:'',
|
||||
// type:'text',
|
||||
// },
|
||||
{
|
||||
name:'type',
|
||||
label:lang['Input Type'],
|
||||
default:'h264',
|
||||
attribute:'selector="h_i_'+tempID+'"',
|
||||
type:'selector',
|
||||
choices:[
|
||||
{label:lang['H.264 / H.265 / H.265+'],value:'h264'},
|
||||
{label:lang['JPEG'],value:'jpeg'},
|
||||
{label:lang['MJPEG'],value:'mjpeg'},
|
||||
{label:lang['HLS (.m3u8)'],value:'hls'},
|
||||
{label:lang['MPEG-4 (.mp4 / .ts)'],value:'mp4'},
|
||||
{label:lang['Local'],value:'local'},
|
||||
{label:lang['Raw'],value:'raw'},
|
||||
]
|
||||
},
|
||||
{
|
||||
name:'fulladdress',
|
||||
label:lang['Full URL Path'],
|
||||
placeholder:'Example : rtsp://admin:password@123.123.123.123/stream/1',
|
||||
type:'text',
|
||||
},
|
||||
{
|
||||
name:'sfps',
|
||||
label:lang['Monitor Capture Rate'],
|
||||
placeholder:'',
|
||||
type:'text',
|
||||
},
|
||||
{
|
||||
name:'aduration',
|
||||
label:lang['Analyzation Duration'],
|
||||
placeholder:'Example : 1000000',
|
||||
type:'text',
|
||||
},
|
||||
{
|
||||
name:'probesize',
|
||||
label:lang['Probe Size'],
|
||||
placeholder:'Example : 1000000',
|
||||
type:'text',
|
||||
},
|
||||
{
|
||||
name:'stream_loop',
|
||||
label:lang['Loop Stream'],
|
||||
class:'h_i_'+tempID+'_input h_i_'+tempID+'_mp4 h_i_'+tempID+'_raw',
|
||||
hidden:true,
|
||||
default:'0',
|
||||
type:'selector',
|
||||
choices:[
|
||||
{label:'No',value:'0'},
|
||||
{label:'Yes',value:'1'}
|
||||
]
|
||||
},
|
||||
{
|
||||
name:'rtsp_transport',
|
||||
label:lang['RTSP Transport'],
|
||||
class:'h_i_'+tempID+'_input h_i_'+tempID+'_h264',
|
||||
default:'0',
|
||||
type:'selector',
|
||||
choices:[
|
||||
{label:'Auto',value:''},
|
||||
{label:'TCP',value:'tcp'},
|
||||
{label:'UDP',value:'udp'}
|
||||
]
|
||||
},
|
||||
{
|
||||
name:'accelerator',
|
||||
label:lang['Accelerator'],
|
||||
attribute:'selector="h_accel_'+tempID+'"',
|
||||
default:'0',
|
||||
type:'selector',
|
||||
choices:[
|
||||
{label:'No',value:'0'},
|
||||
{label:'Yes',value:'1'},
|
||||
]
|
||||
},
|
||||
{
|
||||
name:'hwaccel',
|
||||
label:lang['hwaccel'],
|
||||
class:'h_accel_'+tempID+'_input h_accel_'+tempID+'_1',
|
||||
hidden:true,
|
||||
default:'',
|
||||
type:'selector',
|
||||
choices: $.ccio.HWAccelChoices
|
||||
},
|
||||
{
|
||||
name:'hwaccel_vcodec',
|
||||
label:lang['hwaccel_vcodec'],
|
||||
class:'h_accel_'+tempID+'_input h_accel_'+tempID+'_1',
|
||||
hidden:true,
|
||||
default:'auto',
|
||||
type:'selector',
|
||||
choices:[
|
||||
{label:lang['Auto'],value:'auto'},
|
||||
{label:lang['h264_cuvid'],value:'h264_cuvid',group:'NVIDIA'},
|
||||
{label:lang['hevc_cuvid'],value:'hevc_cuvid',group:'NVIDIA'},
|
||||
{label:lang['mjpeg_cuvid'],value:'mjpeg_cuvid',group:'NVIDIA'},
|
||||
{label:lang['mpeg4_cuvid'],value:'mpeg4_cuvid',group:'NVIDIA'},
|
||||
{label:lang['h264_qsv'],value:'h264_qsv',group:'Quick Sync Video'},
|
||||
{label:lang['hevc_qsv'],value:'hevc_qsv',group:'Quick Sync Video'},
|
||||
{label:lang['mpeg2_qsv'],value:'mpeg2_qsv',group:'Quick Sync Video'},
|
||||
{label:lang['h264_mmal'],value:'h264_mmal',group:'Raspberry Pi'},
|
||||
{label:lang['mpeg2_mmal'],value:'mpeg2_mmal',group:'Raspberry Pi'},
|
||||
{label:lang['mpeg4_mmal'],value:'mpeg4_mmal',group:'Raspberry Pi'},
|
||||
]
|
||||
},
|
||||
{
|
||||
name:'hwaccel_device',
|
||||
label:lang['hwaccel_device'],
|
||||
class:'h_accel_'+tempID+'_input h_accel_'+tempID+'_1',
|
||||
hidden:true,
|
||||
placeholder:'Example : /dev/dri/video0',
|
||||
type:'text',
|
||||
},
|
||||
];
|
||||
tmp+='<div class="form-group-group forestgreen input-map" section id="monSectionMap'+tempID+'">'
|
||||
tmp+=' <h4>'+lang["Input"]+' <b>'+lang["Map"]+' : <span class="place">'+d.channel+'</span></b>'
|
||||
tmp+=' <div class="pull-right"><a class="btn btn-danger btn-xs delete"><i class="fa fa-trash-o"></i></a></div>'
|
||||
tmp+=' </h4>'
|
||||
$.each(fields,function(n,v){
|
||||
if(!v.attribute)v.attribute='';
|
||||
if(!v.placeholder)v.placeholder='';
|
||||
if(!v.class)v.class='';
|
||||
if(v.hidden){v.hidden='style="display:none"'}else{v.hidden=''};
|
||||
tmp+=' <div class="form-group '+v.class+'" '+v.hidden+'>'
|
||||
tmp+=' <label><div><span>'+v.label+'</span></div>'
|
||||
tmp+=' <div>'
|
||||
switch(v.type){
|
||||
case'text':
|
||||
tmp+='<input class="form-control" map-detail="'+v.name+'" placeholder="'+v.placeholder+'" '+v.attribute+'>'
|
||||
break;
|
||||
case'selector':
|
||||
tmp+='<select class="form-control" map-detail="'+v.name+'" placeholder="'+v.placeholder+'" '+v.attribute+'>'
|
||||
$.each(v.choices,function(m,b){
|
||||
tmp+='<option value="'+b.value+'">'+b.label+'</option>'
|
||||
})
|
||||
tmp+='</select>'
|
||||
break;
|
||||
}
|
||||
tmp+=' </div>'
|
||||
tmp+=' </label>'
|
||||
tmp+=' </div>'
|
||||
})
|
||||
tmp+='</div>'
|
||||
break;
|
||||
case 'stream-channel'://Stream Channel
|
||||
var tempID = $.ccio.gid();
|
||||
if(!d.channel){
|
||||
var numberOfChannelsDrawn = $('#monSectionStreamChannels .stream-channel').length
|
||||
d.channel=numberOfChannelsDrawn
|
||||
}
|
||||
tmp+='<div class="form-group-group blue stream-channel" section id="monSectionChannel'+tempID+'">'
|
||||
tmp+=' <h4>'+lang["Stream Channel"]+' <span class="place">'+d.channel+'</span>'
|
||||
tmp+=' <div class="pull-right"><a class="btn btn-danger btn-xs delete"><i class="fa fa-trash-o"></i></a></div>'
|
||||
tmp+=' </h4>'
|
||||
// tmp+=' <div class="form-group">'
|
||||
// tmp+=' <label><div><span>'+lang["Input Selector"]+'</span></div>'
|
||||
// tmp+=' <div><input class="form-control" channel-detail="stream_map" placeholder="0"></div>'
|
||||
// tmp+=' </label>'
|
||||
// tmp+=' </div>'
|
||||
tmp+='<div class="form-group-group forestgreen" input-mapping="stream_channel-'+d.channel+'">'
|
||||
tmp+=' <h4>'+lang['Input Feed']
|
||||
tmp+=' <div class="pull-right">'
|
||||
tmp+=' <a class="btn btn-success btn-xs add_map_row"><i class="fa fa-plus-square-o"></i></a>'
|
||||
tmp+=' </div>'
|
||||
tmp+=' </h4>'
|
||||
tmp+=' <div class="choices"></div>'
|
||||
tmp+='</div>'
|
||||
tmp+=' <div class="form-group">'
|
||||
tmp+=' <label><div><span>'+lang["Stream Type"]+'</span></div>'
|
||||
tmp+=' <div><select class="form-control" channel-detail="stream_type" selector="h_st_channel_'+tempID+'" triggerChange="#monSectionChannel'+tempID+' [channel-detail=stream_vcodec]" triggerChangeIgnore="b64,mjpeg">'
|
||||
tmp+=' <option value="mp4">'+lang["Poseidon"]+'</option>'
|
||||
tmp+=' <option value="rtmp">'+lang["RTMP Stream"]+'</option>'
|
||||
tmp+=' <option value="flv">'+lang["FLV"]+'</option>'
|
||||
tmp+=' <option value="h264">'+lang["Raw H.264 Stream"]+'</option>'
|
||||
tmp+=' <option value="hls">'+lang["HLS (includes Audio)"]+'</option>'
|
||||
tmp+=' <option value="mjpeg">'+lang["MJPEG"]+'</option>'
|
||||
tmp+=' </select></div>'
|
||||
tmp+=' </label>'
|
||||
tmp+=' </div>'
|
||||
tmp+=' <div class="h_st_channel_'+tempID+'_input h_st_channel_'+tempID+'_rtmp">'
|
||||
tmp+=' <div class="form-group">'
|
||||
tmp+=' <label><div><span>'+lang["Server URL"]+'</span></div>'
|
||||
tmp+=' <div><input class="form-control" channel-detail="rtmp_server_url" placeholder="Example : rtmp://live-api.facebook.com:80/rtmp/"></div>'
|
||||
tmp+=' </label>'
|
||||
tmp+=' </div>'
|
||||
tmp+=' <div class="form-group">'
|
||||
tmp+=' <label><div><span>'+lang["Stream Key"]+'</span></div>'
|
||||
tmp+=' <div><input class="form-control" channel-detail="rtmp_stream_key" placeholder="Example : 1111111111?ds=1&a=xxxxxxxxxx"></div>'
|
||||
tmp+=' </label>'
|
||||
tmp+=' </div>'
|
||||
tmp+=' </div>'
|
||||
tmp+=' <div class="form-group h_st_channel_'+tempID+'_input h_st_channel_'+tempID+'_mjpeg" style="display:none">'
|
||||
tmp+=' <label><div><span>'+lang["# of Allow MJPEG Clients"]+'</span></div>'
|
||||
tmp+=' <div><input class="form-control" channel-detail="stream_mjpeg_clients" placeholder="20"></div>'
|
||||
tmp+=' </label>'
|
||||
tmp+=' </div>'
|
||||
tmp+=' <div class="h_st_channel_'+tempID+'_input h_st_channel_'+tempID+'_hls h_st_channel_'+tempID+'_rtmp h_st_channel_'+tempID+'_flv h_st_channel_'+tempID+'_mp4 h_st_channel_'+tempID+'_h264">'
|
||||
tmp+=' <div class="form-group">'
|
||||
tmp+=' <label><div><span>'+lang["HLS Video Encoder"]+'</span></div>'
|
||||
tmp+=' <div><select class="form-control" channel-detail="stream_vcodec" selector="h_hls_v_channel_'+tempID+'">'
|
||||
tmp+=' <option value="no" selected>'+lang["Auto"]+'</option>'
|
||||
tmp+=' <option value="libx264">'+lang["libx264"]+'</option>'
|
||||
tmp+=' <option value="libx265">'+lang["libx265"]+'</option>'
|
||||
tmp+=' <option value="copy" selected>'+lang["copy"]+'</option>'
|
||||
tmp+=' <optgroup label="'+lang["Hardware Accelerated"]+'">'
|
||||
tmp+=' <option value="h264_vaapi">'+lang["h264_vaapi"]+'</option>'
|
||||
tmp+=' <option value="hevc_vaapi">'+lang["hevc_vaapi"]+'</option>'
|
||||
tmp+=' <option value="h264_nvenc">'+lang["h264_nvenc"]+'</option>'
|
||||
tmp+=' <option value="hevc_nvenc">'+lang["hevc_nvenc"]+'</option>'
|
||||
tmp+=' <option value="h264_qsv">'+lang["h264_qsv"]+'</option>'
|
||||
tmp+=' <option value="hevc_qsv">'+lang["hevc_qsv"]+'</option>'
|
||||
tmp+=' <option value="mpeg2_qsv">'+lang["mpeg2_qsv"]+'</option>'
|
||||
tmp+=' <option value="h264_omx">'+lang["h264_omx"]+'</option>'
|
||||
tmp+=' </optgroup>'
|
||||
tmp+=' </select></div>'
|
||||
tmp+=' </label>'
|
||||
tmp+=' </div>'
|
||||
tmp+=' <div class="form-group">'
|
||||
tmp+=' <label><div><span>'+lang["HLS Audio Encoder"]+'</span></div>'
|
||||
tmp+=' <div><select class="form-control" channel-detail="stream_acodec">'
|
||||
tmp+=' <option value="no" selected>'+lang["No Audio"]+'</option>'
|
||||
tmp+=' <option value="">'+lang["Auto"]+'</option>'
|
||||
tmp+=' <option value="aac">'+lang["aac"]+'</option>'
|
||||
tmp+=' <option value="ac3">'+lang["ac3"]+'</option>'
|
||||
tmp+=' <option value="libmp3lame">'+lang["libmp3lame"]+'</option>'
|
||||
tmp+=' <option value="copy">'+lang["copy"]+'</option>'
|
||||
tmp+=' </select></div>'
|
||||
tmp+=' </label>'
|
||||
tmp+=' </div>'
|
||||
tmp+=' </div>'
|
||||
tmp+=' <div class="form-group">'
|
||||
tmp+=' <label><div><span>'+lang["Rate"]+'</span></div>'
|
||||
tmp+=' <div><input class="form-control" channel-detail="stream_fps" placeholder=""></div>'
|
||||
tmp+=' </label>'
|
||||
tmp+=' </div>'
|
||||
tmp+=' <div class="h_st_channel_'+tempID+'_input h_st_channel_'+tempID+'_hls" style="display:none">'
|
||||
tmp+=' <div class="form-group">'
|
||||
tmp+=' <label><div><span>'+lang["HLS Segment Length"]+'</span></div>'
|
||||
tmp+=' <div><input class="form-control" channel-detail="hls_time" placeholder="2"></div>'
|
||||
tmp+=' </label>'
|
||||
tmp+=' </div>'
|
||||
tmp+=' <div class="form-group">'
|
||||
tmp+=' <label><div><span>'+lang["HLS Preset"]+'</span></div>'
|
||||
tmp+=' <div><input class="form-control" channel-detail="preset_stream" placeholder="ultrafast"></div>'
|
||||
tmp+=' </label>'
|
||||
tmp+=' </div>'
|
||||
tmp+=' <div class="form-group">'
|
||||
tmp+=' <label><div><span>'+lang["HLS List Size"]+'</span></div>'
|
||||
tmp+=' <div><input class="form-control" channel-detail="hls_list_size" placeholder="2"></div>'
|
||||
tmp+=' </label>'
|
||||
tmp+=' </div>'
|
||||
tmp+=' </div>'
|
||||
tmp+=' <div class="h_st_channel_'+tempID+'_input h_st_channel_'+tempID+'_mjpeg h_st_channel_'+tempID+'_hls h_st_channel_'+tempID+'_rtmp h_st_channel_'+tempID+'_jsmpeg h_st_channel_'+tempID+'_flv h_st_channel_'+tempID+'_mp4 h_st_channel_'+tempID+'_h264 h_hls_v_channel_'+tempID+'_input h_hls_v_channel_'+tempID+'_libx264 h_hls_v_channel_'+tempID+'_libx265 h_hls_v_channel_'+tempID+'_h264_nvenc h_hls_v_channel_'+tempID+'_hevc_nvenc h_hls_v_channel_'+tempID+'_no" style="display:none">'
|
||||
tmp+=' <div class="form-group">'
|
||||
tmp+=' <label><div><span>'+lang["Quality"]+'</span></div>'
|
||||
tmp+=' <div><input class="form-control" placeholder="23" channel-detail="stream_quality"></div>'
|
||||
tmp+=' </label>'
|
||||
tmp+=' </div>'
|
||||
tmp+=' <div class="h_st_channel_'+tempID+'_input h_st_channel_'+tempID+'_rtmp">'
|
||||
tmp+=' <div class="form-group">'
|
||||
tmp+=' <label><div><span>'+lang["Video Bit Rate"]+'</span></div>'
|
||||
tmp+=' <div><input class="form-control" channel-detail="stream_v_br" placeholder=""></div>'
|
||||
tmp+=' </label>'
|
||||
tmp+=' </div>'
|
||||
tmp+=' <div class="form-group">'
|
||||
tmp+=' <label><div><span>'+lang["Audio Bit Rate"]+'</span></div>'
|
||||
tmp+=' <div><input class="form-control" channel-detail="stream_a_br" placeholder="128k"></div>'
|
||||
tmp+=' </label>'
|
||||
tmp+=' </div>'
|
||||
tmp+=' </div>'
|
||||
tmp+=' <div class="form-group">'
|
||||
tmp+=' <label><div><span>'+lang["Width"]+'</span></div>'
|
||||
tmp+=' <div><input class="form-control" type="number" min="1" channel-detail="stream_scale_x" placeholder="Example : 640"></div>'
|
||||
tmp+=' </label>'
|
||||
tmp+=' </div>'
|
||||
tmp+=' <div class="form-group">'
|
||||
tmp+=' <label><div><span>'+lang["Height"]+'</span></div>'
|
||||
tmp+=' <div><input class="form-control" type="number" min="1" channel-detail="stream_scale_y" placeholder="Example : 480"></div>'
|
||||
tmp+=' </label>'
|
||||
tmp+=' </div>'
|
||||
tmp+=' <div class="form-group">'
|
||||
tmp+=' <label><div><span>'+lang["Rotate"]+'</span></div>'
|
||||
tmp+=' <div><select class="form-control" channel-detail="rotate_stream">'
|
||||
tmp+=' <option value="no" selected>'+lang["No Rotation"]+'</option>'
|
||||
tmp+=' <option value="2,transpose=2">'+lang["180 Degrees"]+'</option>'
|
||||
tmp+=' <option value="0">'+lang["90 Counter Clockwise and Vertical Flip (default)"]+'</option>'
|
||||
tmp+=' <option value="1">'+lang["90 Clockwise"]+'</option>'
|
||||
tmp+=' <option value="2">'+lang["90 Clockwise and Vertical Flip"]+'</option>'
|
||||
tmp+=' <option value="3">'+lang["90 Clockwise and Vertical Flip"]+'</option>'
|
||||
tmp+=' </select></div>'
|
||||
tmp+=' </label>'
|
||||
tmp+=' </div>'
|
||||
tmp+=' <div class="form-group">'
|
||||
tmp+=' <label><div><span>'+lang["Video Filter"]+'</span></div>'
|
||||
tmp+=' <div><input class="form-control" channel-detail="svf"></div>'
|
||||
tmp+=' </label>'
|
||||
tmp+=' </div>'
|
||||
tmp+=' <div class="form-group">'
|
||||
tmp+=' <label><div><span>'+lang["Stream Flags"]+'</span></div>'
|
||||
tmp+=' <div><input class="form-control" channel-detail="cust_stream"></div>'
|
||||
tmp+=' </label>'
|
||||
tmp+=' </div>'
|
||||
tmp+=' </div>'
|
||||
tmp+=' </div>'
|
||||
break;
|
||||
}
|
||||
if(z && x !== 2){
|
||||
$(z).prepend(tmp)
|
||||
}
|
||||
switch(x){
|
||||
case 1:
|
||||
z='#monitors_list .link-monitors-list[auth="'+user.auth_token+'"][ke="'+d.ke+'"]'
|
||||
if($('.link-monitors-list[auth="'+user.auth_token+'"][ke="'+d.ke+'"]').length===0){
|
||||
$("#monitors_list").append('<div class="link-monitors-list" auth="'+user.auth_token+'" ke="'+d.ke+'"></div>')
|
||||
var options = {
|
||||
cellHeight: 80,
|
||||
verticalMargin: 10,
|
||||
};
|
||||
$(z).sortable({
|
||||
stop : function(event,ui){
|
||||
var order = {}
|
||||
$('.link-monitors-list').each(function(n,block){
|
||||
var el = $(this)
|
||||
var ke = el.attr('ke')
|
||||
var authToken = el.attr('auth')
|
||||
var orderKey = ke + authToken
|
||||
if(authToken === $user.auth_token)orderKey = 0
|
||||
if(!order[orderKey])order[orderKey] = []
|
||||
var monitorBlocks = $(this).find('.monitor_block')
|
||||
$.each(monitorBlocks,function(n,block){
|
||||
var mid = $(block).attr('mid')
|
||||
order[orderKey].push(mid)
|
||||
})
|
||||
})
|
||||
$user.details.monitorListOrder = order
|
||||
$.ccio.cx({f:'monitorListOrder',monitorListOrder:order},user)
|
||||
},
|
||||
handle: '.title'
|
||||
})
|
||||
}
|
||||
$(z).prepend(tmp)
|
||||
// componentHandler.upgradeAllRegistered()
|
||||
break;
|
||||
case 0:case 4:
|
||||
$.ccio.init('ls');
|
||||
break;
|
||||
case 2:
|
||||
var x = 0;
|
||||
var y = 0;
|
||||
var width = $.grid.getMonitorsPerRow()
|
||||
var height = width;
|
||||
if(user.details && user.details.monitorOrder && user.details.monitorOrder[d.ke+d.mid]){
|
||||
var saved = user.details.monitorOrder[d.ke+d.mid];
|
||||
x = saved.x;
|
||||
y = saved.y;
|
||||
width = saved.width;
|
||||
height = saved.height;
|
||||
}
|
||||
var autoPlacement = false
|
||||
if($.ccio.op().switches.monitorOrder !== 1){
|
||||
autoPlacement = true
|
||||
}
|
||||
$(z).data('gridstack').addWidget($(tmp), x, y, width, height, autoPlacement);
|
||||
k.e=$('#monitor_live_'+d.mid+user.auth_token);
|
||||
try{
|
||||
if(JSON.parse(d.details).control=="1"){
|
||||
k.e.find('[monitor="control_toggle"]').show()
|
||||
}else{
|
||||
k.e.find('.pad').remove();
|
||||
k.e.find('[monitor="control_toggle"]').hide()
|
||||
}
|
||||
$.ccio.tm('stream-element',d,null,user)
|
||||
}catch(re){$.ccio.log(re)}
|
||||
k.mid=d.mid
|
||||
k.mon=$.ccio.mon[d.ke+d.mid+user.auth_token]
|
||||
$.ccio.init('monitorInfo',k)
|
||||
break;
|
||||
case'detector-filters-where':
|
||||
$('#detector_filters_where').append(tmp);
|
||||
$('#detector_filters_where .row [where="p4"][disabled]').prop('disabled',false)
|
||||
$('#detector_filters_where .row:last [where="p1"]').val(d.p1)
|
||||
$('#detector_filters_where .row:last [where="p2"]').val(d.p2)
|
||||
$('#detector_filters_where .row:last [where="p3"]').val(d.p3)
|
||||
$('#detector_filters_where .row:last [where="p4"]').val(d.p4).prop('disabled',true)
|
||||
break;
|
||||
case'filters-where':
|
||||
$('#filters_where').append(tmp);
|
||||
$('#filters_where .row:last [where="p1"]').val(d.p1)
|
||||
$('#filters_where .row:last [where="p2"]').val(d.p2)
|
||||
$('#filters_where .row:last [where="p3"]').val(d.p3)
|
||||
break;
|
||||
case'input-map':
|
||||
var mapsList = $.aM.maps
|
||||
mapsList.append(tmp)
|
||||
mapsList.find('.input-map').last().find('[map-detail="aduration"]').change()
|
||||
return tempID;
|
||||
break;
|
||||
case'stream-channel':
|
||||
var channeList = $.aM.channels
|
||||
channeList.append(tmp)
|
||||
channeList.find('.stream-channel').last().find('[channel-detail="stream_vcodec"]').change()
|
||||
return tempID;
|
||||
break;
|
||||
case'link-set':
|
||||
$('[links="'+d.host+'"] [link="secure"]').val(d.secure).change()
|
||||
break;
|
||||
}
|
||||
return tmp;
|
||||
}
|
||||
$.ccio.pm=function(x,d,z,user){
|
||||
var tmp='';if(!d){d={}};
|
||||
if(!user){
|
||||
user=$user
|
||||
}
|
||||
switch(x){
|
||||
case 0:
|
||||
d.mon=$.ccio.mon[d.ke+d.mid+user.auth_token];
|
||||
d.ev='.glM'+d.mid+user.auth_token+'.videos_list ul,.glM'+d.mid+user.auth_token+'.videos_monitor_list ul';d.fr=$.ccio.fr.find(d.ev),d.tmp='';
|
||||
if(d.fr.length===0){$.ccio.fr.append('<div class="videos_list glM'+d.mid+user.auth_token+'"><h3 class="title">'+d.mon.name+'</h3><ul></ul></div>')}
|
||||
if(d.videos&&d.videos.length>0){
|
||||
$.each(d.videos,function(n,v){
|
||||
if(v.status!==0){
|
||||
tmp+=$.ccio.tm(0,v,null,user)
|
||||
}
|
||||
})
|
||||
}else{
|
||||
$('.glM'+d.mid+user.auth_token+'.videos_list,.glM'+d.mid+user.auth_token+'.videos_monitor_list').appendTo($.ccio.fr)
|
||||
tmp+='<li class="notice novideos">No videos</li>';
|
||||
}
|
||||
$(d.ev).html(tmp);
|
||||
$.ccio.init('ls');
|
||||
break;
|
||||
case 3:
|
||||
z='#api_list';
|
||||
$(z).empty();
|
||||
$.each(d,function(n,v){
|
||||
tmp+=$.ccio.tm(3,v,null,user);
|
||||
})
|
||||
break;
|
||||
case'option':
|
||||
$.each(d,function(n,v){
|
||||
tmp+=$.ccio.tm('option',v,null,user);
|
||||
})
|
||||
break;
|
||||
case'user-row':
|
||||
$.each(d,function(n,v){
|
||||
tmp+=$.ccio.tm('user-row',v,null,user);
|
||||
})
|
||||
z='#users_online'
|
||||
break;
|
||||
case'link-set':
|
||||
$.sM.links.empty()
|
||||
$.each(d,function(n,v){
|
||||
tmp+=$.ccio.tm('link-set',v,'#linkShinobi',user)
|
||||
})
|
||||
break;
|
||||
}
|
||||
if(z){
|
||||
$(z).prepend(tmp)
|
||||
}
|
||||
return tmp;
|
||||
}
|
801
web/libs/js/dash2.elements.js
Normal file
801
web/libs/js/dash2.elements.js
Normal file
|
@ -0,0 +1,801 @@
|
|||
$(document).ready(function(e){
|
||||
console.log("%cWarning!", "font: 2em monospace; color: red;");
|
||||
console.log('%cLeaving the developer console open is fine if you turn off "Network Recording". This is because it will keep a log of all files, including frames and videos segments.', "font: 1.2em monospace; ");
|
||||
if(!$.ccio.permissionCheck('monitor_create')){
|
||||
$('#add_monitor_button_main').remove()
|
||||
}
|
||||
$.each(['user_change','monitor_create','view_logs'],function(n,permission){
|
||||
if(!$.ccio.permissionCheck(permission)){
|
||||
$('.permission_'+permission).remove()
|
||||
}
|
||||
})
|
||||
|
||||
//Group Selector
|
||||
$.gR={e:$('#group_list'),b:$('#group_list_button')};
|
||||
$.gR.drawList=function(){
|
||||
var e={};
|
||||
e.tmp='';
|
||||
$.each($.ccio.init('monGroup'),function(n,v){
|
||||
if($user.mon_groups[n]){
|
||||
e.tmp+='<li class="mdl-menu__item" groups="'+n+'">'+$user.mon_groups[n].name+'</li>'
|
||||
}
|
||||
})
|
||||
$.gR.e.html(e.tmp)
|
||||
}
|
||||
$.gR.e.on('click','[groups]',function(){
|
||||
var e={};
|
||||
e.e=$(this),
|
||||
e.a=e.e.attr('groups');
|
||||
var user=$.users[e.e.attr('auth')];
|
||||
if(!user){user=$user}
|
||||
if(user===$user){
|
||||
e.chosen_set='watch_on'
|
||||
}else{
|
||||
e.chosen_set='watch_on_links'
|
||||
}
|
||||
$.each($.ccio.op()[e.chosen_set],function(n,v){
|
||||
$.each(v,function(m,b){
|
||||
$.ccio.cx({f:'monitor',ff:'watch_off',id:m,ke:n},user)
|
||||
})
|
||||
})
|
||||
$.each($.ccio.mon_groups[e.a],function(n,v){
|
||||
$.ccio.cx({f:'monitor',ff:'watch_on',id:v.mid,ke:v.ke},user)
|
||||
})
|
||||
})
|
||||
$.ccio.sortListMonitors = function(user){
|
||||
var listKey = user.auth_token
|
||||
if(user.auth_token === $user.auth_token){
|
||||
listKey = 0
|
||||
}
|
||||
if(!user.details.monitorListOrder)user.details.monitorListOrder = {0:[]}
|
||||
var getIdPlace = function(x){return user.details.monitorListOrder[listKey].indexOf(x)}
|
||||
$(function() {
|
||||
$('.link-monitors-list[auth="'+user.auth_token+'"] .monitor_block').sort(function(a, b) {
|
||||
var contentA = getIdPlace($(a).attr('mid'))
|
||||
var contentB = getIdPlace($(b).attr('mid'))
|
||||
return contentA - contentB
|
||||
}).each(function() { $('.link-monitors-list[auth="'+user.auth_token+'"]').append($(this)); });
|
||||
})
|
||||
}
|
||||
//log stream writer
|
||||
$.logWriter = {}
|
||||
$.logWriter.floodTimeout = null
|
||||
$.logWriter.floodCounter = 0
|
||||
$.logWriter.draw = function(id,d,user){
|
||||
if($.logWriter.floodLock)return $.ccio.log('logWriter.floodLock : Log was dropped');
|
||||
if($.logWriter.floodTimeout){
|
||||
++$.logWriter.floodCounter
|
||||
}
|
||||
if($.logWriter.floodCounter > 10){
|
||||
$.logWriter.floodLock = setTimeout(function(){
|
||||
delete($.logWriter.floodLock)
|
||||
},10000)
|
||||
}
|
||||
clearTimeout($.logWriter.floodTimeout)
|
||||
$.logWriter.floodTimeout = setTimeout(function(){
|
||||
delete($.logWriter.floodTimeout)
|
||||
$.logWriter.floodCounter = 0
|
||||
},1000)
|
||||
$.ccio.tm(4,d,'#logs,'+id+'.monitor_item .logs:visible,'+id+'#add_monitor:visible .logs',user)
|
||||
}
|
||||
//open all monitors
|
||||
$('[class_toggle="list-blocks"][data-target="#left_menu"]').dblclick(function(){
|
||||
$('#monitors_list .monitor_block').each(function(n,v){
|
||||
var el = $(v)
|
||||
var ke = el.attr('ke')
|
||||
var mid = el.attr('mid')
|
||||
var auth = el.attr('auth')
|
||||
var monItem = $('.monitor_item[ke='+ke+'][mid='+mid+'][auth='+auth+']')
|
||||
if(monItem.length > 0){
|
||||
monItem.find('[monitor="watch_on"]').click()
|
||||
}else{
|
||||
el.find('[monitor="watch"]').click()
|
||||
}
|
||||
})
|
||||
})
|
||||
//search monitors list
|
||||
$('#monitors_list_search').keyup(function(){
|
||||
var monitorBlocks = $('.monitor_block');
|
||||
var searchTerms = $(this).val().toLowerCase().split(' ')
|
||||
if(searchTerms.length === 0 || searchTerms[0] === ''){
|
||||
monitorBlocks.show()
|
||||
return
|
||||
}
|
||||
monitorBlocks.hide()
|
||||
$.each($.ccio.mon,function(n,monitor){
|
||||
var searchThis = JSON.stringify($.ccio.init('cleanMon',monitor)).toLowerCase().replace('"','');
|
||||
$.each(searchTerms,function(m,term){
|
||||
if(searchThis.indexOf(term) >-1 ){
|
||||
$('.monitor_block[ke="'+monitor.ke+'"][mid="'+monitor.mid+'"]').show()
|
||||
}
|
||||
})
|
||||
})
|
||||
})
|
||||
//dynamic bindings
|
||||
$.ccio.windowFocus = true
|
||||
$(window).focus(function() {
|
||||
$.ccio.windowFocus = true
|
||||
clearInterval($.ccio.soundAlarmInterval)
|
||||
}).blur(function() {
|
||||
$.ccio.windowFocus = false
|
||||
});
|
||||
$('body')
|
||||
.on('click','.logout',function(e){
|
||||
var logout = function(user,callback){
|
||||
$.get($.ccio.init('location',user)+user.auth_token+'/logout/'+user.ke+'/'+user.uid,callback)
|
||||
}
|
||||
$.each($.users,function(n,linkedShinobiUser){
|
||||
logout(linkedShinobiUser,function(){});
|
||||
})
|
||||
logout($user,function(data){
|
||||
console.log(data)
|
||||
localStorage.removeItem('ShinobiLogin_'+location.host);
|
||||
location.href=location.href;
|
||||
});
|
||||
})
|
||||
.on('click','[video]',function(e){
|
||||
e.e=$(this),
|
||||
e.a=e.e.attr('video'),
|
||||
e.p=e.e.parents('[mid]'),
|
||||
e.ke=e.p.attr('ke'),
|
||||
e.mid=e.p.attr('mid'),
|
||||
e.file=e.p.attr('file');
|
||||
e.auth=e.p.attr('auth');
|
||||
e.status=e.p.attr('status');
|
||||
if(!e.ke||!e.mid){
|
||||
//for calendar plugin
|
||||
e.p=e.e.parents('[data-mid]'),
|
||||
e.ke=e.p.data('ke'),
|
||||
e.mid=e.p.data('mid'),
|
||||
e.file=e.p.data('file');
|
||||
e.auth=e.p.data('auth');
|
||||
e.status=e.p.data('status');
|
||||
}
|
||||
e.mon=$.ccio.mon[e.ke+e.mid+e.auth];
|
||||
switch(e.a){
|
||||
case'launch':
|
||||
e.preventDefault();
|
||||
e.href=$(this).attr('href')
|
||||
var el = $('#video_viewer')
|
||||
var modalBody = el.find('.modal-body')
|
||||
el.find('.modal-title span').html(e.mon.name+' - '+e.file)
|
||||
var html = '<video class="video_video" video="'+e.href+'" autoplay loop controls><source src="'+e.href+'" type="video/'+e.mon.ext+'"></video><br><small class="msg"></small>'
|
||||
modalBody.html(html)
|
||||
el.find('video')[0].onerror = function(){
|
||||
modalBody.find('.msg').text(lang.h265BrowserText1)
|
||||
}
|
||||
el.attr('mid',e.mid);
|
||||
footer = el.find('.modal-footer');
|
||||
footer.find('.download_link').attr('href',e.href).attr('download',e.file);
|
||||
footer.find('[monitor="download"][host="dropbox"]').attr('href',e.href);
|
||||
el.modal('show')
|
||||
.attr('ke',e.ke)
|
||||
.attr('mid',e.mid)
|
||||
.attr('auth',e.auth)
|
||||
.attr('file',e.file);
|
||||
if(e.status==1){
|
||||
$.get($.ccio.init('videoHrefToRead',e.href),function(d){
|
||||
if(d.ok !== true)console.log(d,new Error())
|
||||
})
|
||||
}
|
||||
break;
|
||||
case'delete':
|
||||
e.preventDefault();
|
||||
var videoLink = e.p.find('[download]').attr('href')
|
||||
var href = $(this).attr('href')
|
||||
console.log('videoLink',videoLink)
|
||||
console.log(href)
|
||||
if(!href){
|
||||
href = $.ccio.init('location',$.users[e.auth])+e.auth+'/videos/'+e.ke+'/'+e.mid+'/'+e.file+'/delete<% if(config.useUTC === true){%>?isUTC=true<%}%>'
|
||||
}
|
||||
console.log(href)
|
||||
$.confirm.e.modal('show');
|
||||
$.confirm.title.text(lang['Delete Video']+' : '+e.file)
|
||||
e.html=lang.DeleteVideoMsg
|
||||
e.html+='<video class="video_video" autoplay loop controls><source src="'+videoLink+'" type="video/'+e.mon.ext+'"></video>';
|
||||
$.confirm.body.html(e.html)
|
||||
$.confirm.click({title:'Delete Video',class:'btn-danger'},function(){
|
||||
$.getJSON(href,function(d){
|
||||
$.ccio.log(d)
|
||||
})
|
||||
});
|
||||
break;
|
||||
case'download':
|
||||
e.preventDefault();
|
||||
switch(e.e.attr('host')){
|
||||
case'dropbox':
|
||||
if($.ccio.DropboxAppKey){
|
||||
Dropbox.save(e.e.attr('href'),e.e.attr('download'),{progress: function (progress) {$.ccio.log(progress)},success: function () {
|
||||
$.ccio.log(lang.dropBoxSuccess);
|
||||
}});
|
||||
}
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
})
|
||||
.on('change','[localStorage]',function(){
|
||||
e = {}
|
||||
e.e=$(this)
|
||||
e.localStorage = e.e.attr('localStorage')
|
||||
e.value = e.e.val()
|
||||
$.ccio.op(e.localStorage,e.value)
|
||||
})
|
||||
.on('click','[system]',function(e){
|
||||
var e={};
|
||||
e.e=$(this),
|
||||
e.a=e.e.attr('system');//the function
|
||||
switch(e.a){
|
||||
case'switch':
|
||||
e.switch=e.e.attr('switch');
|
||||
e.o=$.ccio.op().switches
|
||||
if(!e.o){
|
||||
e.o={}
|
||||
}
|
||||
if(!e.o[e.switch]){
|
||||
e.o[e.switch]=0
|
||||
}
|
||||
if(e.o[e.switch]===1){
|
||||
e.o[e.switch]=0
|
||||
}else{
|
||||
e.o[e.switch]=1
|
||||
}
|
||||
$.ccio.op('switches',e.o)
|
||||
switch(e.switch){
|
||||
case'monitorOrder':
|
||||
if(e.o[e.switch] !== 1){
|
||||
$('.monitor_item').attr('data-gs-auto-position','yes')
|
||||
}else{
|
||||
$('.monitor_item').attr('data-gs-auto-position','no')
|
||||
}
|
||||
break;
|
||||
case'monitorMuteAudio':
|
||||
$('.monitor_item video').each(function(n,el){
|
||||
if(e.o[e.switch] === 1){
|
||||
el.muted = true
|
||||
}else{
|
||||
el.muted = false
|
||||
}
|
||||
})
|
||||
break;
|
||||
}
|
||||
switch(e.e.attr('type')){
|
||||
case'text':
|
||||
if(e.o[e.switch]===1){
|
||||
e.e.addClass('text-success')
|
||||
}else{
|
||||
e.e.removeClass('text-success')
|
||||
}
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case'cronStop':
|
||||
$.ccio.cx({f:'cron',ff:'stop'})
|
||||
break;
|
||||
case'cronRestart':
|
||||
$.ccio.cx({f:'cron',ff:'restart'})
|
||||
break;
|
||||
case'jpegToggle':
|
||||
e.cx={f:'monitor',ff:'jpeg_on'};
|
||||
if($.ccio.op().jpeg_on===true){
|
||||
e.cx.ff='jpeg_off';
|
||||
}
|
||||
$.ccio.cx(e.cx)
|
||||
break;
|
||||
}
|
||||
})
|
||||
.on('click','[class_toggle]',function(e){
|
||||
e.e=$(this);
|
||||
e.n=e.e.attr('data-target');
|
||||
e.v=e.e.attr('class_toggle');
|
||||
e.o=$.ccio.op().class_toggle;
|
||||
if($(e.n).hasClass(e.v)){e.t=0}else{e.t=1}
|
||||
if(!e.o)e.o={};
|
||||
e.o[e.n]=[e.v,e.t];
|
||||
$.ccio.op('class_toggle',e.o)
|
||||
$(e.n).toggleClass(e.v);
|
||||
})
|
||||
.on('change','[dropdown_toggle]',function(e){
|
||||
e.e=$(this);
|
||||
e.n=e.e.attr('dropdown_toggle');
|
||||
e.v=e.e.val();
|
||||
e.o=$.ccio.op().dropdown_toggle;
|
||||
if(!e.o)e.o={};
|
||||
e.o[e.n]=e.v;
|
||||
$.ccio.op('dropdown_toggle',e.o)
|
||||
})
|
||||
//monitor functions
|
||||
.on('click','[monitor]',function(){
|
||||
var e={};
|
||||
e.e=$(this),
|
||||
e.a=e.e.attr('monitor'),//the function
|
||||
e.p=e.e.parents('[mid]'),//the parent element for monitor item
|
||||
e.ke=e.p.attr('ke'),//group key
|
||||
e.mid=e.p.attr('mid'),//monitor id
|
||||
e.auth=e.p.attr('auth'),//authkey
|
||||
e.mon=$.ccio.mon[e.ke+e.mid+e.auth];//monitor configuration
|
||||
var user
|
||||
if($.users[e.auth]){user=$.users[e.auth]}else{user=$user}
|
||||
if(!user){
|
||||
user=$user
|
||||
}
|
||||
switch(e.a){
|
||||
case'show_data':
|
||||
e.p.toggleClass('show_data')
|
||||
var dataBlocks = e.p.find('.stream-block,.mdl-data_window')
|
||||
if(e.p.hasClass('show_data')){
|
||||
dataBlocks.addClass('col-md-6').removeClass('col-md-12')
|
||||
}else{
|
||||
dataBlocks.addClass('col-md-12').removeClass('col-md-6')
|
||||
}
|
||||
break;
|
||||
case'motion':
|
||||
if(!e.mon.motionDetectionRunning){
|
||||
$.ccio.init('streamMotionDetectOn',e,user)
|
||||
}else{
|
||||
$.ccio.init('streamMotionDetectOff',e,user)
|
||||
}
|
||||
break;
|
||||
case'pop':
|
||||
e.fin=function(img){
|
||||
if($.ccio.mon[e.ke+e.mid+user.auth_token].popOut){
|
||||
$.ccio.mon[e.ke+e.mid+user.auth_token].popOut.close()
|
||||
}
|
||||
$.ccio.mon[e.ke+e.mid+user.auth_token].popOut = window.open($.ccio.init('location',user)+user.auth_token+'/embed/'+e.ke+'/'+e.mid+'/fullscreen|jquery|relative|gui','pop_'+e.mid+user.auth_token,'height='+img.height+',width='+img.width);
|
||||
}
|
||||
if(e.mon.watch===1){
|
||||
$.ccio.snapshot(e,function(url){
|
||||
$('#temp').html('<img>')
|
||||
var img=$('#temp img')[0]
|
||||
img.onload=function(){
|
||||
e.fin(img)
|
||||
}
|
||||
img.src=url
|
||||
})
|
||||
}else{
|
||||
var img={height:720,width:1280}
|
||||
e.fin(img)
|
||||
}
|
||||
break;
|
||||
case'mode':
|
||||
e.mode=e.e.attr('mode')
|
||||
if(e.mode){
|
||||
$.getJSON($.ccio.init('location',user)+user.auth_token+'/monitor/'+e.ke+'/'+e.mid+'/'+e.mode,function(d){
|
||||
$.ccio.log(d)
|
||||
})
|
||||
}
|
||||
break;
|
||||
case'timelapse':
|
||||
$.timelapse.e.modal('show')
|
||||
$.timelapse.monitors.find('.monitor').remove()
|
||||
$.each($.ccio.mon,function(n,v){
|
||||
$.timelapse.monitors.append('<option class="monitor" value="'+v.mid+'">'+v.name+'</option>')
|
||||
})
|
||||
e.e=$.timelapse.monitors.find('.monitor').prop('selected',false)
|
||||
if(e.mid!==''){
|
||||
e.e=$.timelapse.monitors.find('.monitor[value="'+e.mid+'"]')
|
||||
}
|
||||
e.e.first().prop('selected',true)
|
||||
$.timelapse.f.submit()
|
||||
break;
|
||||
case'powerview':
|
||||
$.pwrvid.e.modal('show')
|
||||
$.pwrvid.m.empty()
|
||||
$.each($.ccio.mon,function(n,v){
|
||||
$.pwrvid.m.append('<option value="'+v.mid+'">'+v.name+'</option>')
|
||||
})
|
||||
e.e=$.pwrvid.m.find('option').prop('selected',false)
|
||||
if(e.mid!==''){
|
||||
e.e=$.pwrvid.m.find('[value="'+e.mid+'"]')
|
||||
}
|
||||
e.e.first().prop('selected',true)
|
||||
$.pwrvid.f.submit()
|
||||
break;
|
||||
case'region':
|
||||
if(!e.mon){
|
||||
$.ccio.init('note',{title:lang['Unable to Launch'],text:lang.UnabletoLaunchText,type:'error'});
|
||||
return;
|
||||
}
|
||||
e.d=JSON.parse(e.mon.details);
|
||||
e.width=$.aM.e.find('[detail="detector_scale_x"]');
|
||||
e.height=$.aM.e.find('[detail="detector_scale_y"]');
|
||||
e.d.cords=$.aM.e.find('[detail="cords"]').val();
|
||||
if(e.width.val()===''){
|
||||
e.d.detector_scale_x=320;
|
||||
e.d.detector_scale_y=240;
|
||||
$.aM.e.find('[detail="detector_scale_x"]').val(e.d.detector_scale_x);
|
||||
$.aM.e.find('[detail="detector_scale_y"]').val(e.d.detector_scale_y);
|
||||
}else{
|
||||
e.d.detector_scale_x=e.width.val();
|
||||
e.d.detector_scale_y=e.height.val();
|
||||
}
|
||||
|
||||
$.zO.e.modal('show');
|
||||
$.zO.o().attr('width',e.d.detector_scale_x).attr('height',e.d.detector_scale_y);
|
||||
$.zO.c.css({width:e.d.detector_scale_x,height:e.d.detector_scale_y});
|
||||
if(e.d.cords&&(e.d.cords instanceof Object)===false){
|
||||
try{e.d.cords=JSON.parse(e.d.cords);}catch(er){}
|
||||
}
|
||||
if(!e.d.cords||e.d.cords===''){
|
||||
e.d.cords={
|
||||
red:{ name:"red",sensitivity:0.0005, max_sensitivity:"",color_threshold:"",points:[[0,0],[0,100],[100,0]] },
|
||||
}
|
||||
}
|
||||
$.zO.regionViewerDetails=e.d;
|
||||
$.zO.initRegionList()
|
||||
break;
|
||||
case'detector_filters':
|
||||
$.detectorFilters.e.modal('show');
|
||||
break;
|
||||
case'snapshot':
|
||||
$.ccio.snapshot(e,function(url){
|
||||
$('#temp').html('<a href="'+url+'" download="'+$.ccio.init('tf')+'_'+e.ke+'_'+e.mid+'.jpg">a</a>').find('a')[0].click();
|
||||
});
|
||||
break;
|
||||
case'control':
|
||||
e.a=e.e.attr('control')
|
||||
$.ccio.cx({f:'monitor',ff:'control',direction:e.a,mid:e.mid,ke:e.ke},user)
|
||||
break;
|
||||
case'videos_table':case'calendar':case'video_grid'://call videos table or calendar or video grid
|
||||
$.vidview.launcher=$(this);
|
||||
e.limit=$.vidview.limit.val();
|
||||
if(!$.vidview.current_mid||$.vidview.current_mid!==e.mid){
|
||||
$.vidview.current_mid=e.mid
|
||||
$.vidview.current_page=1;
|
||||
if(e.limit.replace(/ /g,'')===''){
|
||||
e.limit='100';
|
||||
}
|
||||
if(e.limit.indexOf(',')===-1){
|
||||
e.limit='0,'+e.limit
|
||||
}else{
|
||||
e.limit='0,'+e.limit.split(',')[1]
|
||||
}
|
||||
if(e.limit=='0,0'){
|
||||
e.limit='0'
|
||||
}
|
||||
$.vidview.limit.val(e.limit)
|
||||
}
|
||||
e.dateRange=$('#videos_viewer_daterange').data('daterangepicker');
|
||||
var videoSet = 'videos'
|
||||
switch($.vidview.set.val()){
|
||||
case'cloud':
|
||||
videoSet = 'cloudVideos'
|
||||
break;
|
||||
}
|
||||
e.videoURL=$.ccio.init('location',user)+user.auth_token+'/'+videoSet+'/'+e.ke+'/'+e.mid+'?limit='+e.limit+'&start='+$.ccio.init('th',e.dateRange.startDate)+'&end='+$.ccio.init('th',e.dateRange.endDate);
|
||||
$.getJSON(e.videoURL,function(d){
|
||||
d.pages=d.total/100;
|
||||
$('.video_viewer_total').text(d.total)
|
||||
if(d.pages+''.indexOf('.')>-1){++d.pages}
|
||||
$.vidview.page_count=d.pages;
|
||||
d.count=1
|
||||
$.vidview.pages.empty()
|
||||
d.fn=function(drawOne){
|
||||
if(d.count<=$.vidview.page_count){
|
||||
$.vidview.pages.append('<a class="btn btn-primary" page="'+d.count+'">'+d.count+'</a> ')
|
||||
++d.count;
|
||||
d.fn()
|
||||
}
|
||||
}
|
||||
d.fn()
|
||||
$.vidview.pages.find('[page="'+$.vidview.current_page+'"]').addClass('active')
|
||||
e.v=$.vidview.e;
|
||||
$.vidview.loadedVideos = {}
|
||||
e.b=e.v.modal('show').find('.modal-body .contents');
|
||||
e.t=e.v.find('.modal-title i');
|
||||
switch(e.a){
|
||||
case'calendar':
|
||||
$.vidview.e.removeClass('dark')
|
||||
e.t.attr('class','fa fa-calendar')
|
||||
e.ar=[];
|
||||
if(d.videos[0]){
|
||||
$.each(d.videos,function(n,v){
|
||||
if(v.status !== 0){
|
||||
$.vidview.loadedVideos[v.filename] = Object.assign(v,{})
|
||||
var n=$.ccio.mon[v.ke+v.mid+user.auth_token];
|
||||
if(n){v.title=n.name+' - '+(parseInt(v.size)/1000000).toFixed(2)+'mb';}
|
||||
v.start=v.time;
|
||||
// v.filename=$.ccio.init('tf',v.time)+'.'+v.ext;
|
||||
e.ar.push(v);
|
||||
}
|
||||
})
|
||||
e.b.html('')
|
||||
try{e.b.fullCalendar('destroy')}catch(er){}
|
||||
e.b.fullCalendar({
|
||||
header: {
|
||||
left: 'prev,next today',
|
||||
center: 'title',
|
||||
right: 'month,agendaWeek,agendaDay,listWeek'
|
||||
},
|
||||
defaultDate: $.ccio.timeObject(d.videos[0].time).format('YYYY-MM-DD'),
|
||||
navLinks: true,
|
||||
eventLimit: true,
|
||||
events:e.ar,
|
||||
eventClick:function(f){
|
||||
$('#temp').html('<div mid="'+f.mid+'" ke="'+f.ke+'" auth="'+user.auth_token+'" file="'+f.filename+'"><div video="launch" href="'+$.ccio.init('videoUrlBuild',f)+'"></div></div>').find('[video="launch"]').click();
|
||||
$(this).css('border-color', 'red');
|
||||
}
|
||||
});
|
||||
setTimeout(function(){e.b.fullCalendar('changeView','month');e.b.find('.fc-scroller').css('height','auto')},500)
|
||||
}else{
|
||||
e.b.html('<div class="text-center">'+lang.NoVideosFoundForDateRange+'</div>')
|
||||
}
|
||||
break;
|
||||
case'video_grid':
|
||||
$.vidview.e.addClass('dark')
|
||||
var tmp = '<di class="video_grid row">';
|
||||
$.each(d.videos,function(n,v){
|
||||
var href = $.ccio.init('videoUrlBuild',v)
|
||||
v.mon = $.ccio.mon[v.ke+v.mid+user.auth_token]
|
||||
var parentTag = 'ke="'+v.ke+'" status="'+v.status+'" mid="'+v.mid+'" file="'+v.filename+'" auth="'+v.mon.user.auth_token+'"'
|
||||
tmp += '<div class="col-md-2" '+parentTag+'>'
|
||||
tmp += '<div class="thumb">'
|
||||
tmp += '<div class="title-strip">'+$.ccio.timeObject(v.time).format('h:mm:ss A, MMMM Do YYYY')+'</div>'
|
||||
tmp += '<div class="button-strip">'
|
||||
tmp += '<div class="btn-group">'
|
||||
tmp += '<a class="btn btn-xs btn-primary" video="launch" href="'+href+'"> <i class="fa fa-play-circle"></i> </a>'
|
||||
tmp += '<a class="btn btn-xs btn-default preview" href="'+href+'"> <i class="fa fa-play-circle"></i> </a>'
|
||||
tmp += '<a class="btn btn-xs btn-default" download="'+v.mid+'-'+v.filename+'" href="'+href+'"> <i class="fa fa-download"></i> </a>'
|
||||
tmp += '</div>'
|
||||
tmp += '</div>'
|
||||
tmp += '</div>'
|
||||
tmp += '</div>'
|
||||
})
|
||||
tmp += '</div>'
|
||||
e.b.html(tmp)
|
||||
var i = 0
|
||||
var getThumbnail = function(){
|
||||
var v = d.videos[i]
|
||||
if(v){
|
||||
tool.getVideoImage($.ccio.init('videoUrlBuild',v),0,function(err,base64){
|
||||
if(base64){
|
||||
$('[ke="'+v.ke+'"][mid="'+v.mid+'"][file="'+v.filename+'"] .thumb').css('background-image','url('+base64+')')
|
||||
}
|
||||
++i
|
||||
getThumbnail()
|
||||
})
|
||||
}
|
||||
}
|
||||
getThumbnail()
|
||||
break;
|
||||
case'videos_table':
|
||||
var showThumbnail = $.ccio.op().showThumbnail === '1'
|
||||
$.vidview.e.removeClass('dark')
|
||||
e.t.attr('class','fa fa-film')
|
||||
var tmp = '<table class="table table-striped" style="max-height:500px">';
|
||||
tmp+='<thead>';
|
||||
tmp+='<tr>';
|
||||
tmp+='<th><div class="checkbox"><input id="videos_select_all" type="checkbox"><label for="videos_select_all"></label></div></th>';
|
||||
if(showThumbnail)tmp+='<th data-field="Thumbnail" data-sortable="true">'+lang.Thumbnail+'</th>';
|
||||
tmp+='<th data-field="Closed" data-sortable="true">'+lang.Closed+'</th>';
|
||||
tmp+='<th data-field="Ended" data-sortable="true">'+lang.Ended+'</th>';
|
||||
tmp+='<th data-field="Started" data-sortable="true">'+lang.Started+'</th>';
|
||||
tmp+='<th data-field="Monitor" data-sortable="true">'+lang.Monitor+'</th>';
|
||||
tmp+='<th data-field="Filename" data-sortable="true">'+lang.Filename+'</th>';
|
||||
tmp+='<th data-field="Size" data-sortable="true">'+lang['Size (mb)']+'</th>';
|
||||
tmp+='<th data-field="Preview" data-sortable="true">'+lang.Preview+'</th>';
|
||||
tmp+='<th data-field="Watch" data-sortable="true">'+lang.Watch+'</th>';
|
||||
tmp+='<th data-field="Download" data-sortable="true">'+lang.Download+'</th>';
|
||||
tmp+='<th class="permission_video_delete" data-field="Delete" data-sortable="true">'+lang.Delete+'</th>';
|
||||
// tmp+='<th class="permission_video_delete" data-field="Fix" data-sortable="true">'+lang.Fix+'</th>';
|
||||
tmp+='</tr>';
|
||||
tmp+='</thead>';
|
||||
tmp+='<tbody>';
|
||||
$.each(d.videos,function(n,v){
|
||||
if(v.status!==0){
|
||||
$.vidview.loadedVideos[v.filename] = Object.assign(v,{})
|
||||
var href = $.ccio.init('videoUrlBuild',v)
|
||||
v.mon=$.ccio.mon[v.ke+v.mid+user.auth_token];
|
||||
v.start=v.time;
|
||||
// v.filename=$.ccio.init('tf',v.time)+'.'+v.ext;
|
||||
tmp+='<tr data-ke="'+v.ke+'" data-status="'+v.status+'" data-mid="'+v.mid+'" data-file="'+v.filename+'" data-auth="'+v.mon.user.auth_token+'">';
|
||||
tmp+='<td><div class="checkbox"><input id="'+v.ke+'_'+v.filename+'" name="'+v.filename+'" value="'+v.mid+'" type="checkbox"><label for="'+v.ke+'_'+v.filename+'"></label></div></td>';
|
||||
if(showThumbnail)tmp+='<td class="text-center"><img class="thumbnail"></td>';
|
||||
tmp+='<td><span class="livestamp" title="'+$.ccio.timeObject(v.end).format('YYYY-MM-DD HH:mm:ss')+'"></span></td>';
|
||||
tmp+='<td title="'+v.end+'">'+$.ccio.timeObject(v.end).format('h:mm:ss A, MMMM Do YYYY')+'</td>';
|
||||
tmp+='<td title="'+v.time+'">'+$.ccio.timeObject(v.time).format('h:mm:ss A, MMMM Do YYYY')+'</td>';
|
||||
tmp+='<td>'+v.mon.name+'</td>';
|
||||
tmp+='<td>'+v.filename+'</td>';
|
||||
tmp+='<td>'+(parseInt(v.size)/1000000).toFixed(2)+'</td>';
|
||||
tmp+='<td><a class="btn btn-sm btn-default preview" href="'+href+'"> <i class="fa fa-play-circle"></i> </a></td>';
|
||||
tmp+='<td><a class="btn btn-sm btn-primary" video="launch" href="'+href+'"> <i class="fa fa-play-circle"></i> </a></td>';
|
||||
tmp+='<td><a class="btn btn-sm btn-success" download="'+v.mid+'-'+v.filename+'" href="'+href+'"> <i class="fa fa-download"></i> </a></td>';
|
||||
tmp+='<td class="permission_video_delete"><a class="btn btn-sm btn-danger" video="delete" href="'+$.ccio.init('videoHrefToDelete',href)+'"> <i class="fa fa-trash"></i> </a></td>';
|
||||
// tmp+='<td class="permission_video_delete"><a class="btn btn-sm btn-warning" video="fix"> <i class="fa fa-wrench"></i> </a></td>';
|
||||
tmp+='</tr>';
|
||||
}
|
||||
})
|
||||
tmp+='</tbody>';
|
||||
tmp+='</table>';
|
||||
e.b.html(tmp)
|
||||
if(showThumbnail){
|
||||
var i = 0
|
||||
var getThumbnail = function(){
|
||||
var v = d.videos[i]
|
||||
if(v){
|
||||
tool.getVideoImage($.ccio.init('videoUrlBuild',v),0,function(err,base64){
|
||||
if(base64){
|
||||
$('[data-ke="'+v.ke+'"][data-mid="'+v.mid+'"][data-file="'+v.filename+'"] .thumbnail')[0].src = base64
|
||||
}
|
||||
++i
|
||||
getThumbnail()
|
||||
})
|
||||
}
|
||||
}
|
||||
getThumbnail()
|
||||
}
|
||||
$.ccio.init('ls');
|
||||
$.vidview.e.find('table').bootstrapTable();
|
||||
break;
|
||||
}
|
||||
})
|
||||
break;
|
||||
case'fullscreen':
|
||||
e.e=e.e.parents('.monitor_item');
|
||||
e.e.addClass('fullscreen')
|
||||
e.vid=e.e.find('.stream-element')
|
||||
if(e.vid.is('canvas')){
|
||||
e.doc=$('body')
|
||||
e.vid.attr('height',e.doc.height())
|
||||
e.vid.attr('width',e.doc.width())
|
||||
}
|
||||
$.ccio.init('fullscreen',e.vid[0])
|
||||
break;
|
||||
case'watch_on':
|
||||
$.ccio.cx({f:'monitor',ff:'watch_on',id:e.mid},user)
|
||||
break;
|
||||
case'control_toggle':
|
||||
e.e=e.p.find('.PTZ_controls');
|
||||
if(e.e.length>0){
|
||||
e.e.remove()
|
||||
}else{
|
||||
var html = '<div class="PTZ_controls">'
|
||||
html += '<div class="pad">'
|
||||
html += '<div class="control top" monitor="control" control="up"></div>'
|
||||
html += '<div class="control left" monitor="control" control="left"></div>'
|
||||
html += '<div class="control right" monitor="control" control="right"></div>'
|
||||
html += '<div class="control bottom" monitor="control" control="down"></div>'
|
||||
html += '<div class="control middle" monitor="control" control="center"></div>'
|
||||
html += '</div>'
|
||||
html += '<div class="btn-group btn-group-sm btn-group-justified">'
|
||||
html += '<a title="'+lang['Zoom In']+'" class="zoom_in btn btn-default" monitor="control" control="zoom_in"><i class="fa fa-search-plus"></i></a>'
|
||||
html += '<a title="'+lang['Zoom Out']+'" class="zoom_out btn btn-default" monitor="control" control="zoom_out"><i class="fa fa-search-minus"></i></a>'
|
||||
html += '</div>'
|
||||
html += '<div class="btn-group btn-group-sm btn-group-justified">'
|
||||
html += '<a title="'+lang['Enable Nightvision']+'" class="nv_enable btn btn-default" monitor="control" control="enable_nv"><i class="fa fa-moon-o"></i></a>'
|
||||
html += '<a title="'+lang['Disable Nightvision']+'" class="nv_disable btn btn-default" monitor="control" control="disable_nv"><i class="fa fa-sun-o"></i></a>'
|
||||
html += '</div>'
|
||||
html += '</div>'
|
||||
e.p.append(html)
|
||||
}
|
||||
break;
|
||||
case'watch':
|
||||
if($("#monitor_live_"+e.mid+user.auth_token).length===0||$.ccio.mon[e.ke+e.mid+user.auth_token].watch!==1){
|
||||
$.ccio.cx({f:'monitor',ff:'watch_on',id:e.mid},user)
|
||||
}else{
|
||||
$("#main_canvas").animate({scrollTop:$("#monitor_live_"+e.mid+user.auth_token).offset().top-($('#main_header').height()+10)},500);
|
||||
}
|
||||
break;
|
||||
case'watch_off':
|
||||
$.ccio.cx({f:'monitor',ff:'watch_off',id:e.mid},user)
|
||||
break;
|
||||
case'delete':
|
||||
e.m=$('#confirm_window').modal('show');e.f=e.e.attr('file');
|
||||
$.confirm.title.text(lang['Delete Monitor']+' : '+e.mon.name)
|
||||
e.html=lang.DeleteMonitorText
|
||||
e.html+='<table class="info-table table table-striped"><tr>';
|
||||
$.each($.ccio.init('cleanMon',e.mon),function(n,v,g){
|
||||
if(n==='host'&&v.indexOf('@')>-1){g=v.split('@')[1]}else{g=v};
|
||||
try{JSON.parse(g);return}catch(err){}
|
||||
e.html+='<tr><td><b>'+n+'</b></td><td>'+g+'</td></tr>';
|
||||
})
|
||||
e.html+='</tr></table>';
|
||||
$.confirm.body.html(e.html)
|
||||
$.confirm.click([
|
||||
{
|
||||
title:'Delete Monitor',
|
||||
class:'btn-danger',
|
||||
callback:function(){
|
||||
$.get($.ccio.init('location',user)+user.auth_token+'/configureMonitor/'+user.ke+'/'+e.mon.mid+'/delete',function(d){
|
||||
$.ccio.log(d)
|
||||
})
|
||||
}
|
||||
},
|
||||
{
|
||||
title:'Delete Monitor and Files',
|
||||
class:'btn-danger',
|
||||
callback:function(){
|
||||
$.get($.ccio.init('location',user)+user.auth_token+'/configureMonitor/'+user.ke+'/'+e.mon.mid+'/delete?deleteFiles=true',function(d){
|
||||
$.ccio.log(d)
|
||||
})
|
||||
}
|
||||
}
|
||||
])
|
||||
break;
|
||||
case'edit':
|
||||
e.p=$('#add_monitor'),e.mt=e.p.find('.modal-title')
|
||||
e.p.find('.am_notice').hide()
|
||||
e.p.find('[detailcontainer="detector_cascades"]').prop('checked',false).parents('.mdl-js-switch').removeClass('is-checked')
|
||||
if(!$.ccio.mon[e.ke+e.mid+user.auth_token]){
|
||||
e.p.find('.am_notice_new').show()
|
||||
//new monitor
|
||||
e.p.find('[monitor="delete"]').hide()
|
||||
e.mt.find('span').text('Add'),e.mt.find('i').attr('class','fa fa-plus');
|
||||
//default values
|
||||
e.values=$.aM.generateDefaultMonitorSettings();
|
||||
}else{
|
||||
e.p.find('.am_notice_edit').show()
|
||||
//edit monitor
|
||||
e.p.find('[monitor="delete"]').show()
|
||||
e.mt.find('span').text(lang.Edit);
|
||||
e.mt.find('i').attr('class','fa fa-wrench');
|
||||
e.values=$.ccio.mon[e.ke+e.mid+user.auth_token];
|
||||
}
|
||||
$.aM.selected=e.values;
|
||||
// e.openTabs=$.ccio.op().tabsOpen
|
||||
// if(e.openTabs[e.mid]){
|
||||
// e.values=e.openTabs[e.mid]
|
||||
// }
|
||||
$.aM.import(e)
|
||||
$('#add_monitor').modal('show')
|
||||
break;
|
||||
}
|
||||
})
|
||||
.on('dblclick','[type="password"],.password_field',function(){
|
||||
var _this = $(this)
|
||||
var type = 'password'
|
||||
_this.addClass('password_field')
|
||||
if(_this.attr('type') === 'password'){
|
||||
type = 'text'
|
||||
}
|
||||
_this.attr('type',type)
|
||||
})
|
||||
|
||||
$('.modal').on('hidden.bs.modal',function(){
|
||||
$(this).find('video').remove();
|
||||
$(this).find('iframe').attr('src','about:blank');
|
||||
});
|
||||
$('.modal').on('shown.bs.modal',function(){
|
||||
e={e:$(this).find('.flex-container-modal-body')}
|
||||
if(e.e.length>0){
|
||||
e.e.resize()
|
||||
}
|
||||
});
|
||||
|
||||
$('body')
|
||||
.on('click','.scrollTo',function(ee){
|
||||
ee.preventDefault()
|
||||
var e = {e:$(this)};
|
||||
e.parent=e.e.attr('scrollToParent')
|
||||
if(!e.parent){
|
||||
e.parent='body,html'
|
||||
}
|
||||
$(e.parent).animate({
|
||||
scrollTop: $(e.e.attr('href')).position().top
|
||||
}, 400);
|
||||
})
|
||||
.on('resize','.flex-container-modal-body',function(e){
|
||||
e=$(this)
|
||||
e.find('.flex-modal-block').css('height',e.height())
|
||||
})
|
||||
.on('resize','#monitors_live .monitor_item',function(e){
|
||||
e.e=$(this).find('.stream-block');
|
||||
e.c=e.e.find('canvas');
|
||||
e.c.attr('height',e.e.height());
|
||||
e.c.attr('width',e.e.width());
|
||||
})
|
||||
.on('keyup','.search-parent .search-controller',function(){
|
||||
_this = this;
|
||||
$.each($(".search-parent .search-body .search-row"), function() {
|
||||
if($(this).text().toLowerCase().indexOf($(_this).val().toLowerCase()) === -1)
|
||||
$(this).hide();
|
||||
else
|
||||
$(this).show();
|
||||
});
|
||||
})
|
||||
.on('dblclick','.stream-hud',function(){
|
||||
$(this).parents('[mid]').find('[monitor="fullscreen"]').click();
|
||||
})
|
||||
//.on('mousemove',".magnifyStream",$.ccio.magnifyStream)
|
||||
//.on('touchmove',".magnifyStream",$.ccio.magnifyStream);
|
||||
})
|
61
web/libs/js/dash2.gridstack.js
Normal file
61
web/libs/js/dash2.gridstack.js
Normal file
|
@ -0,0 +1,61 @@
|
|||
$(document).ready(function(e){
|
||||
//monitor grid
|
||||
$.grid={e:$('#monitors_live')}
|
||||
$.grid.data = function(){
|
||||
return $.grid.e.data('gridstack')
|
||||
}
|
||||
$.grid.getMonitorsPerRow = function(){
|
||||
var x
|
||||
switch($.ccio.op().montage){
|
||||
case'1':
|
||||
x = '12'
|
||||
break;
|
||||
case'2':
|
||||
x = '6'
|
||||
break;
|
||||
case'3':
|
||||
x = '4'
|
||||
break;
|
||||
case'4':
|
||||
x = '3'
|
||||
break;
|
||||
case'5':
|
||||
x = '5'
|
||||
break;
|
||||
case'6':
|
||||
x = '2'
|
||||
break;
|
||||
default://3
|
||||
x = '4'
|
||||
break;
|
||||
}
|
||||
return x
|
||||
}
|
||||
$.grid.saveElementPositions = function() {
|
||||
var monitors = {}
|
||||
$.grid.e.find(" .monitor_item").each(function(n,v){
|
||||
var el = $(v)
|
||||
var item = {}
|
||||
item.ke = el.attr('ke')
|
||||
item.mid = el.attr('mid')
|
||||
item.x = el.attr('data-gs-x')
|
||||
item.y = el.attr('data-gs-y')
|
||||
item.height = el.attr('data-gs-height')
|
||||
item.width = el.attr('data-gs-width')
|
||||
monitors[item.ke+item.mid] = item
|
||||
})
|
||||
$user.details.monitorOrder=monitors;
|
||||
$.ccio.cx({f:'monitorOrder',monitorOrder:monitors})
|
||||
}
|
||||
$.grid.e
|
||||
.gridstack({
|
||||
cellHeight: 80,
|
||||
verticalMargin: 0,
|
||||
})
|
||||
.on('dragstop', function(event,ui){
|
||||
setTimeout(function(){
|
||||
$.grid.saveElementPositions()
|
||||
},700)
|
||||
})
|
||||
.on('gsresizestop', $.grid.saveElementPositions);
|
||||
})
|
612
web/libs/js/dash2.init.js
Normal file
612
web/libs/js/dash2.init.js
Normal file
|
@ -0,0 +1,612 @@
|
|||
$.ccio.init=function(x,d,user,k){
|
||||
if(!k){k={}};k.tmp='';
|
||||
if(d&&d.user){
|
||||
user=d.user
|
||||
}
|
||||
if(!user){
|
||||
user=$user
|
||||
}
|
||||
switch(x){
|
||||
case'cleanMon':
|
||||
var acceptedFields = [
|
||||
'mid',
|
||||
'ke',
|
||||
'name',
|
||||
'shto',
|
||||
'shfr',
|
||||
'details',
|
||||
'type',
|
||||
'ext',
|
||||
'protocol',
|
||||
'host',
|
||||
'path',
|
||||
'port',
|
||||
'fps',
|
||||
'mode',
|
||||
'width',
|
||||
'height'
|
||||
]
|
||||
var row = {};
|
||||
$.each(d,function(m,b){
|
||||
if(acceptedFields.indexOf(m)>-1){
|
||||
row[m]=b;
|
||||
}
|
||||
})
|
||||
return row
|
||||
break;
|
||||
case'cleanMons':
|
||||
if(d==='object'){
|
||||
var arr={}
|
||||
}else{
|
||||
var arr=[]
|
||||
}
|
||||
$.each($.ccio.mon,function(n,v){
|
||||
var row = $.ccio.init('cleanMon',v)
|
||||
if(d==='object'){
|
||||
arr[n]=row
|
||||
}else{
|
||||
arr.push(row)
|
||||
}
|
||||
})
|
||||
return arr;
|
||||
break;
|
||||
case'location':
|
||||
var url
|
||||
if(d&&d.info&&d.info.URL){
|
||||
url=d.info.URL
|
||||
if(url.charAt(url.length-1)!=='/'){
|
||||
url=url+'/'
|
||||
}
|
||||
}else{
|
||||
url = $.ccio.libURL
|
||||
}
|
||||
return url
|
||||
break;
|
||||
case'videoUrlBuild':
|
||||
var url
|
||||
if(d.href){
|
||||
url = d.href
|
||||
}else if(!d.href && d.hrefNoAuth){
|
||||
url = $.ccio.init('location',user)+user.auth_token+d.hrefNoAuth
|
||||
}
|
||||
if(user!==$user&&url.charAt(0)==='/'){
|
||||
url = $.ccio.init('location',user)+d.href.substring(1)
|
||||
}
|
||||
return url
|
||||
break;
|
||||
case'videoHrefToDelete':
|
||||
var urlSplit = d.split('?')
|
||||
var url = urlSplit[0]+'/delete'
|
||||
if(urlSplit[1])url += '?' + urlSplit[1]
|
||||
return url
|
||||
break;
|
||||
case'videoHrefToUnread':
|
||||
var urlSplit = d.split('?')
|
||||
var url = urlSplit[0]+'/status/1'
|
||||
if(urlSplit[1])url += '?' + urlSplit[1]
|
||||
return url
|
||||
break;
|
||||
case'videoHrefToRead':
|
||||
var urlSplit = d.split('?')
|
||||
var url = urlSplit[0]+'/status/2'
|
||||
if(urlSplit[1])url += '?' + urlSplit[1]
|
||||
return url
|
||||
break;
|
||||
// case'streamWindow':
|
||||
// return $('.monitor_item[mid="'+d.id+'"][ke="'+d.ke+'"][auth="'+user.auth_token+'"]')
|
||||
// break;
|
||||
case'streamMotionDetectRestart':
|
||||
$.ccio.init('streamMotionDetectOff',d,user)
|
||||
$.ccio.init('streamMotionDetectOn',d,user)
|
||||
break;
|
||||
case'streamMotionDetectOff':
|
||||
d.mon.motionDetectionRunning = false
|
||||
$('.monitor_item[mid="'+d.mid+'"][ke="'+d.ke+'"][auth="'+user.auth_token+'"]').find('.stream-detected-object,.zoomGlass').remove()
|
||||
clearInterval(d.mon.motionDetector)
|
||||
break;
|
||||
case'streamMotionDetectOn':
|
||||
switch(JSON.parse(d.mon.details).stream_type){
|
||||
case'hls':case'flv':case'mp4':
|
||||
//pass
|
||||
break;
|
||||
default:
|
||||
return $.ccio.init('note',{title:'Client-side Detector',text:'Could not be started. Only <b>FLV</b> and <b>HLS</b> can use this feature.',type:'error'});
|
||||
break;
|
||||
|
||||
}
|
||||
d.mon.motionDetectorNextDraw = true
|
||||
d.mon.motionDetectionRunning = true
|
||||
$.ccio.snapshot(d,function(url){
|
||||
$('#temp').html('<img>')
|
||||
var img=$('#temp img')[0]
|
||||
img.onload=function(){
|
||||
var frameNumber = 0,
|
||||
mainWindow = $('.monitor_item[mid="'+d.mid+'"][ke="'+d.ke+'"][auth="'+user.auth_token+'"]'),
|
||||
blenderCanvas = mainWindow.find(".blenderCanvas"),
|
||||
motionVision = mainWindow.find(".motionVision"),
|
||||
streamElement = mainWindow.find('.stream-element'),
|
||||
streamElementTag = streamElement[0],
|
||||
lastURL = null,
|
||||
currentImage = null,
|
||||
f = [],
|
||||
drawMatrices = {
|
||||
e:mainWindow,
|
||||
monitorDetails:JSON.parse(d.mon.details),
|
||||
stream:streamElement,
|
||||
streamObjects:mainWindow.find('.stream-objects'),
|
||||
details:{
|
||||
name:'clientSideDetection',
|
||||
}
|
||||
};
|
||||
widthRatio = streamElement.width() / img.width
|
||||
heightRatio = streamElement.height() / img.height
|
||||
drawMatrices.monitorDetails.detector_scale_x = img.width;
|
||||
drawMatrices.monitorDetails.detector_scale_y = img.height;
|
||||
function checkForMotion() {
|
||||
blenderCanvas.width = img.width;
|
||||
blenderCanvas.height = img.height;
|
||||
blenderCanvasContext.drawImage(streamElementTag, 0, 0);
|
||||
f[frameNumber] = blenderCanvasContext.getImageData(0, 0, blenderCanvas.width, blenderCanvas.height);
|
||||
frameNumber = 0 == frameNumber ? 1 : 0;
|
||||
currentImage = blenderCanvasContext.getImageData(0, 0, blenderCanvas.width, blenderCanvas.height);
|
||||
foundPixels = [];
|
||||
for (var currentImageLength = currentImage.data.length * 0.25, b = 0; b < currentImageLength;){
|
||||
var pos = b * 4
|
||||
currentImage.data[pos] = .5 * (255 - currentImage.data[pos]) + .5 * f[frameNumber].data[pos];
|
||||
currentImage.data[pos + 1] = .5 * (255 - currentImage.data[pos + 1]) + .5 * f[frameNumber].data[pos + 1];
|
||||
currentImage.data[pos + 2] = .5 * (255 - currentImage.data[pos + 2]) + .5 * f[frameNumber].data[pos + 2];
|
||||
currentImage.data[pos + 3] = 255;
|
||||
var score = (currentImage.data[pos] + currentImage.data[pos + 1] + currentImage.data[pos + 2]) / 3;
|
||||
if(score>170){
|
||||
var x = (pos / 4) % img.width;
|
||||
var y = Math.floor((pos / 4) / img.width);
|
||||
foundPixels.push([x,y])
|
||||
}
|
||||
b += 4;
|
||||
}
|
||||
var groupedPoints = Object.assign({},Cluster);
|
||||
groupedPoints.iterations(25);
|
||||
groupedPoints.data(foundPixels);
|
||||
var groupedPoints = groupedPoints.clusters()
|
||||
drawMatrices.details.matrices=[]
|
||||
var mostHeight = 0;
|
||||
var mostWidth = 0;
|
||||
var mostWithMotion = null;
|
||||
groupedPoints.forEach(function(v,n){
|
||||
var matrix = {
|
||||
topLeft:[img.width,img.height],
|
||||
topRight:[0,img.height],
|
||||
bottomRight:[0,0],
|
||||
bottomLeft:[img.width,0],
|
||||
}
|
||||
v.points.forEach(function(b){
|
||||
var x = b[0]
|
||||
var y = b[1]
|
||||
if(x<matrix.topLeft[0])matrix.topLeft[0]=x;
|
||||
if(y<matrix.topLeft[1])matrix.topLeft[1]=y;
|
||||
//Top Right point
|
||||
if(x>matrix.topRight[0])matrix.topRight[0]=x;
|
||||
if(y<matrix.topRight[1])matrix.topRight[1]=y;
|
||||
//Bottom Right point
|
||||
if(x>matrix.bottomRight[0])matrix.bottomRight[0]=x;
|
||||
if(y>matrix.bottomRight[1])matrix.bottomRight[1]=y;
|
||||
//Bottom Left point
|
||||
if(x<matrix.bottomLeft[0])matrix.bottomLeft[0]=x;
|
||||
if(y>matrix.bottomLeft[1])matrix.bottomLeft[1]=y;
|
||||
})
|
||||
matrix.x = matrix.topLeft[0];
|
||||
matrix.y = matrix.topLeft[1];
|
||||
matrix.width = matrix.topRight[0] - matrix.topLeft[0]
|
||||
matrix.height = matrix.bottomLeft[1] - matrix.topLeft[1]
|
||||
|
||||
if(matrix.width>mostWidth&&matrix.height>mostHeight){
|
||||
mostWidth = matrix.width;
|
||||
mostHeight = matrix.height;
|
||||
mostWithMotion = matrix;
|
||||
}
|
||||
|
||||
drawMatrices.details.matrices.push(matrix)
|
||||
})
|
||||
$.ccio.magnifyStream({
|
||||
p:mainWindow,
|
||||
useCanvas:true,
|
||||
zoomAmount:1,
|
||||
auto:true,
|
||||
animate:true,
|
||||
pageX:((mostWithMotion.width / 2) + mostWithMotion.x) * widthRatio,
|
||||
pageY:((mostWithMotion.height / 2) + mostWithMotion.y) * heightRatio
|
||||
})
|
||||
$.ccio.init('drawMatrices',drawMatrices)
|
||||
if(d.mon.motionDetectorNextDraw===true){
|
||||
clearTimeout(d.mon.motionDetectorNextDrawTimeout)
|
||||
d.mon.motionDetectorNextDrawTimeout=setTimeout(function(){
|
||||
d.mon.motionDetectorNextDraw = true;
|
||||
},1000)
|
||||
d.mon.motionDetectorNextDraw = false;
|
||||
// console.log({
|
||||
// p:mainWindow,
|
||||
// pageX:((matrix.width / 2) + matrix.x) * widthRatio,
|
||||
// pageY:((matrix.height / 2) + matrix.y) * heightRatio
|
||||
// })
|
||||
}
|
||||
return drawMatrices.details.matrices;
|
||||
}
|
||||
if(blenderCanvas.length === 0){
|
||||
mainWindow.append('<div class="zoomGlass"><canvas class="blenderCanvas"></canvas></div>')
|
||||
blenderCanvas = mainWindow.find(".blenderCanvas")
|
||||
}
|
||||
blenderCanvas = blenderCanvas[0];
|
||||
var blenderCanvasContext = blenderCanvas.getContext("2d");
|
||||
clearInterval(d.mon.motionDetector)
|
||||
d.mon.motionDetector = setInterval(checkForMotion,2000)
|
||||
}
|
||||
img.src=url
|
||||
})
|
||||
break;
|
||||
case'streamURL':
|
||||
var streamURL
|
||||
switch(JSON.parse(d.details).stream_type){
|
||||
case'jpeg':
|
||||
streamURL=$.ccio.init('location',user)+user.auth_token+'/jpeg/'+d.ke+'/'+d.mid+'/s.jpg'
|
||||
break;
|
||||
case'mjpeg':
|
||||
streamURL=$.ccio.init('location',user)+user.auth_token+'/mjpeg/'+d.ke+'/'+d.mid
|
||||
break;
|
||||
case'hls':
|
||||
streamURL=$.ccio.init('location',user)+user.auth_token+'/hls/'+d.ke+'/'+d.mid+'/s.m3u8'
|
||||
break;
|
||||
case'flv':
|
||||
streamURL=$.ccio.init('location',user)+user.auth_token+'/flv/'+d.ke+'/'+d.mid+'/s.flv'
|
||||
break;
|
||||
case'h265':
|
||||
streamURL=$.ccio.init('location',user)+user.auth_token+'/h265/'+d.ke+'/'+d.mid+'/s.hevc'
|
||||
break;
|
||||
case'mp4':
|
||||
streamURL=$.ccio.init('location',user)+user.auth_token+'/mp4/'+d.ke+'/'+d.mid+'/s.mp4'
|
||||
break;
|
||||
case'b64':
|
||||
streamURL='Websocket'
|
||||
break;
|
||||
case'pam':
|
||||
streamURL='Websocket'
|
||||
break;
|
||||
}
|
||||
return streamURL
|
||||
break;
|
||||
case'humanReadMode':
|
||||
switch(d){
|
||||
case'idle':
|
||||
k.mode=lang['Idle']
|
||||
break;
|
||||
case'stop':
|
||||
k.mode=lang['Disabled']
|
||||
break;
|
||||
case'record':
|
||||
k.mode=lang['Record']
|
||||
break;
|
||||
case'start':
|
||||
k.mode=lang['Watch Only']
|
||||
break;
|
||||
}
|
||||
return k.mode
|
||||
break;
|
||||
case'monitorInfo':
|
||||
d.e=$('.glM'+d.mon.mid+user.auth_token);
|
||||
if(JSON.parse(d.mon.details).vcodec!=='copy'&&d.mon.mode=='record'){
|
||||
d.e.find('.monitor_not_record_copy').show()
|
||||
}else{
|
||||
d.e.find('.monitor_not_record_copy').hide()
|
||||
}
|
||||
d.e.find('.monitor_name').text(d.mon.name)
|
||||
d.e.find('.monitor_mid').text(d.mon.mid)
|
||||
d.e.find('.monitor_ext').text(d.mon.ext);
|
||||
d.mode=$.ccio.init('humanReadMode',d.mon.mode,user)
|
||||
d.e.find('.monitor_mode').text(d.mode)
|
||||
d.e.find('.monitor_status').text(d.status)
|
||||
d.e.attr('mode',d.mode)
|
||||
d.e.find('.lamp').attr('title',d.mode)
|
||||
break;
|
||||
case'fullscreen':
|
||||
if (d.requestFullscreen) {
|
||||
d.requestFullscreen();
|
||||
} else if (d.mozRequestFullScreen) {
|
||||
d.mozRequestFullScreen();
|
||||
} else if (d.webkitRequestFullscreen) {
|
||||
d.webkitRequestFullscreen(Element.ALLOW_KEYBOARD_INPUT);
|
||||
}
|
||||
break;
|
||||
case'drawPoints':
|
||||
d.height=d.stream.height()
|
||||
d.width=d.stream.width()
|
||||
if(d.monitorDetails.detector_scale_x===''){d.monitorDetails.detector_scale_x=320}
|
||||
if(d.monitorDetails.detector_scale_y===''){d.monitorDetails.detector_scale_y=240}
|
||||
|
||||
d.widthRatio=d.width/d.monitorDetails.detector_scale_x
|
||||
d.heightRatio=d.height/d.monitorDetails.detector_scale_y
|
||||
|
||||
d.streamObjects.find('.stream-detected-point[name="'+d.details.name+'"]').remove()
|
||||
d.tmp=''
|
||||
$.each(d.details.points,function(n,v){
|
||||
d.tmp+='<div class="stream-detected-point" name="'+d.details.name+'" style="height:'+1+'px;width:'+1+'px;top:'+(d.heightRatio*v.x)+'px;left:'+(d.widthRatio*v.y)+'px;">'
|
||||
if(v.tag){d.tmp+='<span class="tag">'+v.tag+'</span>'}
|
||||
d.tmp+='</div>'
|
||||
})
|
||||
d.streamObjects.append(d.tmp)
|
||||
break;
|
||||
case'drawMatrices':
|
||||
d.height=d.stream.height()
|
||||
d.width=d.stream.width()
|
||||
if(d.monitorDetails.detector_scale_x===''){d.monitorDetails.detector_scale_x=320}
|
||||
if(d.monitorDetails.detector_scale_y===''){d.monitorDetails.detector_scale_y=240}
|
||||
|
||||
d.widthRatio=d.width/d.monitorDetails.detector_scale_x
|
||||
d.heightRatio=d.height/d.monitorDetails.detector_scale_y
|
||||
|
||||
d.streamObjects.find('.stream-detected-object[name="'+d.details.name+'"]').remove()
|
||||
d.tmp=''
|
||||
$.each(d.details.matrices,function(n,v){
|
||||
d.tmp+='<div class="stream-detected-object" name="'+d.details.name+'" style="height:'+(d.heightRatio*v.height)+'px;width:'+(d.widthRatio*v.width)+'px;top:'+(d.heightRatio*v.y)+'px;left:'+(d.widthRatio*v.x)+'px;">'
|
||||
if(v.tag){d.tmp+='<span class="tag">'+v.tag+'</span>'}
|
||||
d.tmp+='</div>'
|
||||
})
|
||||
d.streamObjects.append(d.tmp)
|
||||
break;
|
||||
case'clearTimers':
|
||||
if(!d.mid){d.mid=d.id}
|
||||
if($.ccio.mon[d.ke+d.mid+user.auth_token]){
|
||||
clearTimeout($.ccio.mon[d.ke+d.mid+user.auth_token]._signal);
|
||||
clearInterval($.ccio.mon[d.ke+d.mid+user.auth_token].hlsGarbageCollectorTimer)
|
||||
clearTimeout($.ccio.mon[d.ke+d.mid+user.auth_token].jpegInterval);
|
||||
clearInterval($.ccio.mon[d.ke+d.mid+user.auth_token].signal);
|
||||
clearInterval($.ccio.mon[d.ke+d.mid+user.auth_token].m3uCheck);
|
||||
if($.ccio.mon[d.ke+d.mid+user.auth_token].Base64 && $.ccio.mon[d.ke+d.mid+user.auth_token].Base64.connected){
|
||||
$.ccio.mon[d.ke+d.mid+user.auth_token].Base64.disconnect()
|
||||
}
|
||||
if($.ccio.mon[d.ke+d.mid+user.auth_token].Poseidon){
|
||||
$.ccio.mon[d.ke+d.mid+user.auth_token].Poseidon.stop()
|
||||
}
|
||||
}
|
||||
break;
|
||||
case'note':
|
||||
k.o=$.ccio.op().switches
|
||||
if(k.o&&k.o.notifyHide!==1){
|
||||
new PNotify(d)
|
||||
if(user.details.audio_note && user.details.audio_note !== ''){
|
||||
var audio = new Audio('libs/audio/'+user.details.audio_note);
|
||||
audio.play()
|
||||
}
|
||||
}
|
||||
break;
|
||||
case'monGroup':
|
||||
$.ccio.mon_groups={};
|
||||
$.each($.ccio.mon,function(n,v,x){
|
||||
if(typeof v.details==='string'){
|
||||
k.d=JSON.parse(v.details)
|
||||
}else{
|
||||
k.d=v.details
|
||||
}
|
||||
try{
|
||||
k.groups=JSON.parse(k.d.groups)
|
||||
$.each(k.groups,function(m,b){
|
||||
if(!$.ccio.mon_groups[b])$.ccio.mon_groups[b]={}
|
||||
$.ccio.mon_groups[b][v.mid]=v;
|
||||
})
|
||||
}catch(er){
|
||||
|
||||
}
|
||||
})
|
||||
return $.ccio.mon_groups;
|
||||
break;
|
||||
case'closeVideo':
|
||||
var el = $('#monitor_live_'+d.mid+user.auth_token)
|
||||
var video = el.find('video')
|
||||
if(video.length === 1){
|
||||
if(!video[0].paused){
|
||||
video[0].onerror = function(){}
|
||||
video[0].pause()
|
||||
}
|
||||
video.prop('src','');
|
||||
video.find('source').remove();
|
||||
video.remove();
|
||||
}
|
||||
break;
|
||||
case'jpegModeStop':
|
||||
clearTimeout($.ccio.mon[d.ke+d.mid+user.auth_token].jpegInterval);
|
||||
delete($.ccio.mon[d.ke+d.mid+user.auth_token].jpegInterval);
|
||||
$('#monitor_live_'+d.mid+user.auth_token+' .stream-element').unbind('load')
|
||||
break;
|
||||
case'jpegMode':
|
||||
if(d.watch===1){
|
||||
k=JSON.parse(d.details);
|
||||
k.jpegInterval=parseFloat(k.jpegInterval);
|
||||
if(!k.jpegInterval||k.jpegInterval===''||isNaN(k.jpegInterval)){k.jpegInterval=1}
|
||||
$.ccio.tm('stream-element',$.ccio.mon[d.ke+d.mid+user.auth_token]);
|
||||
k.e=$('#monitor_live_'+d.mid+user.auth_token+' .stream-element');
|
||||
$.ccio.init('jpegModeStop',d,user);
|
||||
k.run=function(){
|
||||
k.e.attr('src',$.ccio.init('location',user)+user.auth_token+'/jpeg/'+d.ke+'/'+d.mid+'/s.jpg?time='+(new Date()).getTime())
|
||||
}
|
||||
k.e.load(function(){
|
||||
$.ccio.mon[d.ke+d.mid+user.auth_token].jpegInterval=setTimeout(k.run,1000/k.jpegInterval);
|
||||
}).error(function(){
|
||||
$.ccio.mon[d.ke+d.mid+user.auth_token].jpegInterval=setTimeout(k.run,1000/k.jpegInterval);
|
||||
})
|
||||
k.run()
|
||||
};
|
||||
break;
|
||||
case'jpegModeAll':
|
||||
$.each($.ccio.mon,function(n,v){
|
||||
$.ccio.init('jpegMode',v,user)
|
||||
});
|
||||
break;
|
||||
case'getLocation':
|
||||
var l = document.createElement("a");
|
||||
l.href = d;
|
||||
return l;
|
||||
break;
|
||||
case 'ls'://livestamp all
|
||||
g={e:jQuery('.livestamp')};
|
||||
g.e.each(function(){g.v=jQuery(this),g.t=g.v.attr('title');if(!g.t){return};g.v.toggleClass('livestamp livestamped').attr('title',$.ccio.init('t',g.t,user)).livestamp(g.t);})
|
||||
return g.e
|
||||
break;
|
||||
case't'://format time
|
||||
if(!d){d=new Date();}
|
||||
return $.ccio.timeObject(d).format('YYYY-MM-DD HH:mm:ss')
|
||||
break;
|
||||
case'th'://format time hy
|
||||
if(!d){d=new Date();}
|
||||
return $.ccio.timeObject(d).format('YYYY-MM-DDTHH:mm:ss')
|
||||
break;
|
||||
case'tf'://time to filename
|
||||
if(!d){d=new Date();}
|
||||
return $.ccio.timeObject(d).format('YYYY-MM-DDTHH-mm-ss')
|
||||
break;
|
||||
case'fn'://row to filename
|
||||
return $.ccio.init('tf',d.time,user)+'.'+d.ext
|
||||
break;
|
||||
case'filters':
|
||||
k.tmp='<option value="" selected>'+lang['Add New']+'</option>';
|
||||
$.each(user.details.filters,function(n,v){
|
||||
k.tmp+='<option value="'+v.id+'">'+v.name+'</option>'
|
||||
});
|
||||
$('#saved_filters').html(k.tmp)
|
||||
break;
|
||||
case'id':
|
||||
$('.usermail').html(d.mail)
|
||||
try{k.d=JSON.parse(d.details);}catch(er){k.d=d.details;}
|
||||
try{user.mon_groups=JSON.parse(k.d.mon_groups);}catch(er){}
|
||||
if(!user.mon_groups)user.mon_groups={};
|
||||
$.sM.reDrawMonGroups()
|
||||
$.each(user,function(n,v){$.sM.e.find('[name="'+n+'"]').val(v).change()})
|
||||
$.each(k.d,function(n,v){$.sM.e.find('[detail="'+n+'"]').val(v).change()})
|
||||
$.gR.drawList();
|
||||
$.ccio.pm('link-set',k.d.links,null,user)
|
||||
break;
|
||||
case'jsontoblock'://draw json as block
|
||||
if(d instanceof Object){
|
||||
$.each(d,function(n,v){
|
||||
k.tmp+='<div>';
|
||||
k.tmp+='<b>'+n+'</b> : '+$.ccio.init('jsontoblock',v,user);
|
||||
k.tmp+='</div>';
|
||||
})
|
||||
}else{
|
||||
k.tmp+='<span>';
|
||||
k.tmp+=d;
|
||||
k.tmp+='</span>';
|
||||
}
|
||||
break;
|
||||
case'url':
|
||||
var porty
|
||||
if(d.port && d.port !== ''){
|
||||
porty = ':' + d.port
|
||||
}else{
|
||||
porty = ''
|
||||
}
|
||||
d.url = d.protocol + '://' + d.host + porty
|
||||
return d.url
|
||||
break;
|
||||
case'data-video':
|
||||
if(!d){
|
||||
$('[data-mid]').each(function(n,v){
|
||||
v=$(v);v.attr('mid',v.attr('data-mid'))
|
||||
});
|
||||
$('[data-ke]').each(function(n,v){
|
||||
v=$(v);v.attr('ke',v.attr('data-ke'))
|
||||
});
|
||||
$('[data-file]').each(function(n,v){
|
||||
v=$(v);v.attr('file',v.attr('data-file'))
|
||||
});
|
||||
$('[data-status]').each(function(n,v){
|
||||
v=$(v);v.attr('status',v.attr('data-status'))
|
||||
});
|
||||
$('[data-auth]').each(function(n,v){
|
||||
v=$(v);v.attr('auth',v.attr('data-auth'))
|
||||
});
|
||||
}else{
|
||||
$('[data-ke="'+d.ke+'"][data-mid="'+d.mid+'"][data-file="'+d.filename+'"][auth="'+user.auth_token+'"]').attr('mid',d.mid).attr('ke',d.ke).attr('status',d.status).attr('file',d.filename).attr('auth',user.auth_token);
|
||||
}
|
||||
break;
|
||||
case'signal':
|
||||
d.mon=$.ccio.mon[d.ke+d.id+user.auth_token];d.e=$('#monitor_live_'+d.id+user.auth_token+' .signal').addClass('btn-success').removeClass('btn-danger');d.signal=parseFloat(JSON.parse(d.mon.details).signal_check);
|
||||
if(!d.signal||d.signal==NaN){d.signal=10;};d.signal=d.signal*1000*60;
|
||||
clearTimeout($.ccio.mon[d.ke+d.id+user.auth_token]._signal);$.ccio.mon[d.ke+d.id+user.auth_token]._signal=setTimeout(function(){d.e.addClass('btn-danger').removeClass('btn-success');},d.signal)
|
||||
break;
|
||||
case'signal-check':
|
||||
try{
|
||||
d.mon=$.ccio.mon[d.ke+d.id+user.auth_token];d.p=$('#monitor_live_'+d.id+user.auth_token);
|
||||
try{d.d=JSON.parse(d.mon.details)}catch(er){d.d=d.mon.details;}
|
||||
d.check={c:0};
|
||||
d.fn=function(){
|
||||
if(!d.speed){d.speed=1000}
|
||||
switch(d.d.stream_type){
|
||||
case'b64':case'h265':
|
||||
d.p.resize()
|
||||
break;
|
||||
case'hls':case'flv':case'mp4':
|
||||
if(d.p.find('video')[0].paused){
|
||||
if(d.d.signal_check_log==1){
|
||||
d.log={type:'Stream Check',msg:lang.clientStreamFailedattemptingReconnect}
|
||||
$.ccio.tm(4,d,'#logs,.monitor_item[mid="'+d.id+'"][ke="'+d.ke+'"][auth="'+user.auth_token+'"] .logs')
|
||||
}
|
||||
$.ccio.cx({f:'monitor',ff:'watch_on',id:d.id},user);
|
||||
}else{
|
||||
if(d.d.signal_check_log==1){
|
||||
d.log={type:'Stream Check',msg:'Success'}
|
||||
$.ccio.tm(4,d,'#logs,.monitor_item[mid="'+d.id+'"][ke="'+d.ke+'"][auth="'+user.auth_token+'"] .logs')
|
||||
}
|
||||
$.ccio.init('signal',d,user);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
if($.ccio.op().jpeg_on===true){return}
|
||||
$.ccio.snapshot(d,function(url){
|
||||
d.check.f=url;
|
||||
setTimeout(function(){
|
||||
$.ccio.snapshot(d,function(url){
|
||||
if(d.check.f===url){
|
||||
if(d.check.c<3){
|
||||
++d.check.c;
|
||||
setTimeout(function(){
|
||||
d.fn();
|
||||
},d.speed)
|
||||
}else{
|
||||
if(d.d.signal_check_log==1){
|
||||
d.log={type:'Stream Check',msg:'Client side ctream check failed, attempting reconnect.'}
|
||||
$.ccio.tm(4,d,'#logs,.monitor_item[mid="'+d.id+'"][ke="'+d.ke+'"][auth="'+user.auth_token+'"] .logs')
|
||||
}
|
||||
delete(d.check)
|
||||
$.ccio.cx({f:'monitor',ff:'watch_on',id:d.id},user);
|
||||
}
|
||||
}else{
|
||||
if(d.d.signal_check_log==1){
|
||||
d.log={type:'Stream Check',msg:'Success'}
|
||||
$.ccio.tm(4,d,'#logs,.monitor_item[mid="'+d.id+'"][ke="'+d.ke+'"][auth="'+user.auth_token+'"] .logs')
|
||||
}
|
||||
delete(d.check)
|
||||
$.ccio.init('signal',d,user);
|
||||
}
|
||||
});
|
||||
},d.speed)
|
||||
});
|
||||
break;
|
||||
}
|
||||
}
|
||||
d.fn();
|
||||
}catch(er){
|
||||
er=er.stack;
|
||||
d.in=function(x){return er.indexOf(x)>-1}
|
||||
switch(true){
|
||||
case d.in("The HTMLImageElement provided is in the 'broken' state."):
|
||||
delete(d.check)
|
||||
$.ccio.cx({f:'monitor',ff:'watch_on',id:d.id},user);
|
||||
break;
|
||||
default:
|
||||
$.ccio.log('signal-check',er)
|
||||
break;
|
||||
}
|
||||
clearInterval($.ccio.mon[d.ke+d.id+user.auth_token].signal);delete($.ccio.mon[d.ke+d.id+user.auth_token].signal);
|
||||
}
|
||||
break;
|
||||
}
|
||||
return k.tmp;
|
||||
}
|
66
web/libs/js/dash2.logviewer.js
Normal file
66
web/libs/js/dash2.logviewer.js
Normal file
|
@ -0,0 +1,66 @@
|
|||
$(document).ready(function(e){
|
||||
//log viewer
|
||||
$.log = {
|
||||
e : $('#logs_modal'),
|
||||
lm : $('#log_monitors'),
|
||||
dateRange : $('#logs_daterange'),
|
||||
loaded : {}
|
||||
}
|
||||
$.log.dateRange.daterangepicker({
|
||||
startDate:$.ccio.timeObject().subtract(moment.duration("5:00:00")),
|
||||
endDate:$.ccio.timeObject().add(moment.duration("24:00:00")),
|
||||
timePicker: true,
|
||||
timePicker24Hour: true,
|
||||
timePickerSeconds: true,
|
||||
timePickerIncrement: 30,
|
||||
locale: {
|
||||
format: 'MM/DD/YYYY h:mm A'
|
||||
}
|
||||
},function(start, end, label){
|
||||
//change daterange
|
||||
$.log.lm.change()
|
||||
});
|
||||
$.log.table = $.log.e.find('table')
|
||||
$.log.e.on('shown.bs.modal', function () {
|
||||
$.log.lm.find('option:not(.hard)').remove()
|
||||
$.each($.ccio.mon,function(n,v){
|
||||
v.id = v.mid
|
||||
$.ccio.tm('option',v,'#log_monitors')
|
||||
})
|
||||
$.log.lm.change()
|
||||
})
|
||||
$.log.lm.change(function(){
|
||||
e = {}
|
||||
e.v = $(this).val();
|
||||
e.urlSelector = e.v+'';
|
||||
if(e.v === 'all'){
|
||||
e.urlSelector = ''
|
||||
}
|
||||
e.dateRange = $.log.dateRange.data('daterangepicker');
|
||||
$.log.loaded.startDate = e.dateRange.startDate
|
||||
$.log.loaded.endDate = e.dateRange.endDate
|
||||
var url = $.ccio.init('location',$user)+$user.auth_token+'/logs/'+$user.ke+'/'+e.urlSelector+'?start='+$.ccio.init('th',$.log.loaded.startDate)+'&end='+$.ccio.init('th',$.log.loaded.endDate)
|
||||
$.get(url,function(d){
|
||||
$.log.loaded.url = url
|
||||
$.log.loaded.query = e.v
|
||||
$.log.loaded.rows = d
|
||||
e.tmp='';
|
||||
if(d.length === 0){
|
||||
e.tmp = '<tr class="text-center"><td>'+lang.NoLogsFoundForDateRange+'</td></tr>'
|
||||
}else{
|
||||
$.each(d,function(n,v){
|
||||
e.tmp+='<tr class="search-row"><td title="'+v.time+'" class="livestamp"></td><td>'+v.time+'</td><td>'+v.mid+'</td><td>'+$.ccio.init('jsontoblock',v.info)+'</td></tr>'
|
||||
})
|
||||
}
|
||||
$.log.table.find('tbody').html(e.tmp)
|
||||
// $.log.table.bootstrapTable()
|
||||
$.ccio.init('ls')
|
||||
})
|
||||
})
|
||||
$.log.e.find('[download]').click(function(){
|
||||
$.ccio.downloadJSON($.log.loaded,'Shinobi_Logs_'+(new Date())+'.json',{
|
||||
title : 'No Logs Found',
|
||||
text : 'No file will be downloaded.',
|
||||
})
|
||||
})
|
||||
})
|
830
web/libs/js/dash2.monitoredit.js
Normal file
830
web/libs/js/dash2.monitoredit.js
Normal file
|
@ -0,0 +1,830 @@
|
|||
$(document).ready(function(e){
|
||||
|
||||
//Monitor Editor
|
||||
$.aM={e:$('#add_monitor'),monitorsForCopy:$('#copy_settings_monitors')};
|
||||
$.aM.f=$.aM.e.find('form')
|
||||
$.aM.channels=$('#monSectionStreamChannels')
|
||||
$.aM.maps=$('#monSectionInputMaps')
|
||||
$.aM.e.find('.follow-list ul').affix();
|
||||
$.each($.ccio.definitions["Monitor Settings"].blocks,function(n,v){
|
||||
$.each(v.info,function(m,b){
|
||||
if(!b.name){
|
||||
console.log(b)
|
||||
return
|
||||
}
|
||||
if(b.name.indexOf('detail=')>-1){
|
||||
b.name=b.name.replace('detail=','')
|
||||
v.element=$.aM.e.find('[detail="'+b.name+'"]')
|
||||
}else{
|
||||
v.element=$.aM.e.find('[name="'+b.name+'"]')
|
||||
}
|
||||
v.parent=v.element.parents('.form-group').find('label div:first-child span')
|
||||
v.parent.find('small').remove()
|
||||
v.parent.append('<small class="hover">'+b.description+'</small>')
|
||||
})
|
||||
})
|
||||
$.aM.generateDefaultMonitorSettings=function(){
|
||||
return {
|
||||
"mode": "start",
|
||||
"mid": $.ccio.gid(),
|
||||
"name": "Some Stream",
|
||||
"type": "h264",
|
||||
"protocol": "rtsp",
|
||||
"host": "",
|
||||
"port": "",
|
||||
"path": "",
|
||||
"ext": "mp4",
|
||||
"fps": "1",
|
||||
"width": "640",
|
||||
"height": "480",
|
||||
"details": JSON.stringify({
|
||||
"fatal_max": "0",
|
||||
"notes": "",
|
||||
"dir": "",
|
||||
"auto_host_enable": "1",
|
||||
"auto_host": "",
|
||||
"rtsp_transport": "tcp",
|
||||
"muser": "",
|
||||
"mpass": "",
|
||||
"port_force": "0",
|
||||
"aduration": "1000000",
|
||||
"probesize": "1000000",
|
||||
"stream_loop": "0",
|
||||
"sfps": "",
|
||||
"accelerator": "0",
|
||||
"hwaccel": "auto",
|
||||
"hwaccel_vcodec": "",
|
||||
"hwaccel_device": "",
|
||||
"stream_type": "mp4",
|
||||
"stream_flv_type": "ws",
|
||||
"stream_mjpeg_clients": "",
|
||||
"stream_vcodec": "copy",
|
||||
"stream_acodec": "no",
|
||||
"hls_time": "2",
|
||||
"preset_stream": "ultrafast",
|
||||
"hls_list_size": "3",
|
||||
"signal_check": "10",
|
||||
"signal_check_log": "0",
|
||||
"stream_quality": "15",
|
||||
"stream_fps": "2",
|
||||
"stream_scale_x": "",
|
||||
"stream_scale_y": "",
|
||||
"rotate_stream": "no",
|
||||
"svf": "",
|
||||
"rtmp_vcodec": "h264",
|
||||
"rtmp_acodec": "aac",
|
||||
"stream_timestamp": "0",
|
||||
"stream_timestamp_font": "",
|
||||
"stream_timestamp_font_size": "",
|
||||
"stream_timestamp_color": "",
|
||||
"stream_timestamp_box_color": "",
|
||||
"stream_timestamp_x": "",
|
||||
"stream_timestamp_y": "",
|
||||
"stream_watermark": "0",
|
||||
"stream_watermark_location": "",
|
||||
"stream_watermark_position": "tr",
|
||||
"snap": "0",
|
||||
"snap_fps": "",
|
||||
"snap_scale_x": "",
|
||||
"snap_scale_y": "",
|
||||
"snap_vf": "",
|
||||
"rawh264": "0",
|
||||
"rawh264_vcodec": "copy",
|
||||
"rawh264_acodec": "",
|
||||
"rawh264_fps": "",
|
||||
"rawh264_scale_x": "",
|
||||
"rawh264_scale_y": "",
|
||||
"rawh264_crf": "",
|
||||
"rawh264_vf": "",
|
||||
"vcodec": "copy",
|
||||
"crf": "1",
|
||||
"preset_record": "",
|
||||
"acodec": "no",
|
||||
"dqf": "0",
|
||||
"cutoff": "15",
|
||||
"rotate_record": "no",
|
||||
"vf": "",
|
||||
"timestamp": "0",
|
||||
"timestamp_font": "",
|
||||
"timestamp_font_size": "10",
|
||||
"timestamp_color": "white",
|
||||
"timestamp_box_color": "0x00000000@1",
|
||||
"timestamp_x": "(w-tw)/2",
|
||||
"timestamp_y": "0",
|
||||
"watermark": "0",
|
||||
"watermark_location": "",
|
||||
"watermark_position": "tr",
|
||||
"cust_input": "",
|
||||
"cust_snap": "",
|
||||
"cust_rawh264": "",
|
||||
"cust_detect": "",
|
||||
"cust_stream": "",
|
||||
"cust_stream_server": "",
|
||||
"cust_record": "",
|
||||
"custom_output": "",
|
||||
"detector": "0",
|
||||
"detector_pam": "1",
|
||||
"detector_webhook": "0",
|
||||
"detector_webhook_url": "",
|
||||
"detector_command_enable": "0",
|
||||
"detector_command": "",
|
||||
"detector_command_timeout": "",
|
||||
"detector_lock_timeout": "",
|
||||
"detector_save": "0",
|
||||
"detector_frame_save": "0",
|
||||
"detector_mail": "0",
|
||||
"detector_mail_timeout": "",
|
||||
"detector_record_method": "sip",
|
||||
"detector_trigger": "1",
|
||||
"detector_trigger_record_fps": "",
|
||||
"detector_timeout": "10",
|
||||
"watchdog_reset": "0",
|
||||
"detector_delete_motionless_videos": "0",
|
||||
"detector_send_frames": "1",
|
||||
"detector_region_of_interest": "0",
|
||||
"detector_fps": "",
|
||||
"detector_scale_x": "640",
|
||||
"detector_scale_y": "480",
|
||||
"detector_use_motion": "1",
|
||||
"detector_use_detect_object": "0",
|
||||
"detector_frame": "0",
|
||||
"detector_sensitivity": "",
|
||||
"detector_max_sensitivity": "",
|
||||
"detector_threshold": "1",
|
||||
"detector_color_threshold": "",
|
||||
"cords": "[]",
|
||||
"detector_buffer_vcodec": "auto",
|
||||
"detector_buffer_fps": "",
|
||||
"detector_buffer_hls_time": "",
|
||||
"detector_buffer_hls_list_size": "",
|
||||
"detector_buffer_start_number": "",
|
||||
"detector_buffer_live_start_index": "",
|
||||
"detector_lisence_plate": "0",
|
||||
"detector_lisence_plate_country": "us",
|
||||
"detector_notrigger": "0",
|
||||
"detector_notrigger_mail": "0",
|
||||
"detector_notrigger_timeout": "",
|
||||
"control": "0",
|
||||
"control_base_url": "",
|
||||
"control_stop": "0",
|
||||
"control_url_stop_timeout": "",
|
||||
"control_url_center": "",
|
||||
"control_url_left": "",
|
||||
"control_url_left_stop": "",
|
||||
"control_url_right": "",
|
||||
"control_url_right_stop": "",
|
||||
"control_url_up": "",
|
||||
"control_url_up_stop": "",
|
||||
"control_url_down": "",
|
||||
"control_url_down_stop": "",
|
||||
"control_url_enable_nv": "",
|
||||
"control_url_disable_nv": "",
|
||||
"control_url_zoom_out": "",
|
||||
"control_url_zoom_out_stop": "",
|
||||
"control_url_zoom_in": "",
|
||||
"control_url_zoom_in_stop": "",
|
||||
"tv_channel": "0",
|
||||
"groups": "[]",
|
||||
"loglevel": "warning",
|
||||
"sqllog": "0",
|
||||
"detector_cascades": ""
|
||||
}),
|
||||
"shto": "[]",
|
||||
"shfr": "[]"
|
||||
}
|
||||
}
|
||||
$.aM.drawList=function(){
|
||||
e={list:$.aM.e.find('.follow-list ul'),html:''}
|
||||
$.aM.e.find('[section]:visible').each(function(n,v){
|
||||
e.e=$(v)
|
||||
e.id = e.e.attr('id');
|
||||
e.title = e.e.find('h4').first().html();
|
||||
var div = document.createElement('div');
|
||||
div.innerHTML = e.title;
|
||||
var elements = div.getElementsByTagName('a');
|
||||
while (elements[0])
|
||||
elements[0].parentNode.removeChild(elements[0])
|
||||
var elements = div.getElementsByTagName('small');
|
||||
while (elements[0])
|
||||
elements[0].parentNode.removeChild(elements[0])
|
||||
var repl = div.innerHTML;
|
||||
e.html += '<li><a class="scrollTo" href="#'+e.id+'" scrollToParent="#add_monitor .modal-body">'+repl+'</a></li>'
|
||||
})
|
||||
e.list.html(e.html)
|
||||
}
|
||||
$.aM.import=function(e){
|
||||
$.get($.ccio.init('location',$user)+$user.auth_token+'/hls/'+e.values.ke+'/'+e.values.mid+'/detectorStream.m3u8',function(data){
|
||||
$('#monEditBufferPreview').html(data)
|
||||
})
|
||||
$.aM.e.find('.edit_id').text(e.values.mid);
|
||||
$.aM.e.attr('mid',e.values.mid).attr('ke',e.values.ke).attr('auth',e.auth)
|
||||
$.each(e.values,function(n,v){
|
||||
$.aM.e.find('[name="'+n+'"]').val(v).change()
|
||||
})
|
||||
e.ss=JSON.parse(e.values.details);
|
||||
//get maps
|
||||
$.aM.maps.empty()
|
||||
if(e.ss.input_maps&&e.ss.input_maps!==''){
|
||||
var input_maps
|
||||
try{
|
||||
input_maps = JSON.parse(e.ss.input_maps)
|
||||
}catch(er){
|
||||
input_maps = e.ss.input_maps;
|
||||
}
|
||||
if(input_maps.length>0){
|
||||
$.aM.showInputMappingFields()
|
||||
$.each(input_maps,function(n,v){
|
||||
var tempID = $.ccio.tm('input-map')
|
||||
var parent = $('#monSectionMap'+tempID)
|
||||
$.each(v,function(m,b){
|
||||
parent.find('[map-detail="'+m+'"]').val(b).change()
|
||||
})
|
||||
})
|
||||
}else{
|
||||
$.aM.showInputMappingFields(false)
|
||||
}
|
||||
}
|
||||
//get channels
|
||||
$.aM.channels.empty()
|
||||
if(e.ss.stream_channels&&e.ss.stream_channels!==''){
|
||||
var stream_channels
|
||||
try{
|
||||
stream_channels = JSON.parse(e.ss.stream_channels)
|
||||
}catch(er){
|
||||
stream_channels = e.ss.stream_channels;
|
||||
}
|
||||
$.each(stream_channels,function(n,v){
|
||||
var tempID = $.ccio.tm('stream-channel')
|
||||
var parent = $('#monSectionChannel'+tempID)
|
||||
$.each(v,function(m,b){
|
||||
parent.find('[channel-detail="'+m+'"]').val(b)
|
||||
})
|
||||
})
|
||||
}
|
||||
//get map choices for outputs
|
||||
$('[input-mapping] .choices').empty()
|
||||
if(e.ss.input_map_choices&&e.ss.input_map_choices!==''){
|
||||
var input_map_choices
|
||||
try{
|
||||
input_map_choices = JSON.parse(e.ss.input_map_choices)
|
||||
}catch(er){
|
||||
input_map_choices = e.ss.input_map_choices;
|
||||
}
|
||||
$.each(input_map_choices,function(n,v){
|
||||
$.each(v,function(m,b){
|
||||
var parent = $('[input-mapping="'+n+'"] .choices')
|
||||
$.ccio.tm('input-map-selector',b,parent)
|
||||
})
|
||||
})
|
||||
}
|
||||
$.aM.e.find('[detail]').each(function(n,v){
|
||||
v=$(v).attr('detail');if(!e.ss[v]){e.ss[v]=''}
|
||||
})
|
||||
$.each(e.ss,function(n,v){
|
||||
var theVal = v;
|
||||
if(v instanceof Object){
|
||||
theVal = JSON.stringify(v);
|
||||
}
|
||||
$.aM.e.find('[detail="'+n+'"]').val(theVal).change();
|
||||
});
|
||||
$.each(e.ss,function(n,v){
|
||||
try{
|
||||
var variable=JSON.parse(v)
|
||||
}catch(err){
|
||||
var variable=v
|
||||
}
|
||||
if(variable instanceof Object){
|
||||
$('[detailContainer="'+n+'"][detailObject]').prop('checked',false)
|
||||
$('[detailContainer="'+n+'"][detailObject]').parents('.mdl-js-switch').removeClass('is-checked')
|
||||
if(variable instanceof Array){
|
||||
$.each(variable,function(m,b,parentOfObject){
|
||||
$('[detailContainer="'+n+'"][detailObject="'+b+'"]').prop('checked',true)
|
||||
parentOfObject=$('[detailContainer="'+n+'"][detailObject="'+b+'"]').parents('.mdl-js-switch')
|
||||
parentOfObject.addClass('is-checked')
|
||||
})
|
||||
}else{
|
||||
$.each(variable,function(m,b){
|
||||
if(typeof b ==='string'){
|
||||
$('[detailContainer="'+n+'"][detailObject="'+m+'"]').val(b).change()
|
||||
}else{
|
||||
$('[detailContainer="'+n+'"][detailObject="'+m+'"]').prop('checked',true)
|
||||
parentOfObject=$('[detailContainer="'+n+'"][detailObject="'+m+'"]').parents('.mdl-js-switch')
|
||||
parentOfObject.addClass('is-checked')
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
});
|
||||
try{
|
||||
$.each(['groups','group_detector_multi'],function(m,b){
|
||||
var tmp=''
|
||||
$.each($user.mon_groups,function(n,v){
|
||||
tmp+='<li class="mdl-list__item">';
|
||||
tmp+='<span class="mdl-list__item-primary-content">';
|
||||
tmp+=v.name;
|
||||
tmp+='</span>';
|
||||
tmp+='<span class="mdl-list__item-secondary-action">';
|
||||
tmp+='<label class="mdl-switch mdl-js-switch mdl-js-ripple-effect">';
|
||||
tmp+='<input type="checkbox" '+b+' value="'+v.id+'" class="mdl-switch__input"';
|
||||
if(!e.ss[b]){
|
||||
e.ss[b]=[]
|
||||
}
|
||||
if(e.ss[b].indexOf(v.id)>-1){tmp+=' checked';}
|
||||
tmp+=' />';
|
||||
tmp+='</label>';
|
||||
tmp+='</span>';
|
||||
tmp+='</li>';
|
||||
})
|
||||
$('#monitor_'+b).html(tmp)
|
||||
})
|
||||
componentHandler.upgradeAllRegistered()
|
||||
}catch(er){
|
||||
console.log(er)
|
||||
//no group, this 'try' will be removed in future.
|
||||
};
|
||||
$('#copy_settings').val('0').change()
|
||||
var tmp = '';
|
||||
$.each($.ccio.mon,function(n,v){
|
||||
if(v.ke === $user.ke){
|
||||
tmp += $.ccio.tm('option',{auth_token:$user.auth_token,id:v.mid,name:v.name},null,$user);
|
||||
}
|
||||
})
|
||||
$.aM.monitorsForCopy.find('optgroup').html(tmp)
|
||||
setTimeout(function(){$.aM.drawList()},1000)
|
||||
}
|
||||
//parse "Automatic" field in "Input" Section
|
||||
$.aM.e.on('change','.auto_host_fill input,.auto_host_fill select',function(e){
|
||||
var theSwitch = $.aM.e.find('[detail="auto_host_enable"]').val()
|
||||
if(!theSwitch||theSwitch===''){
|
||||
theSwitch='1'
|
||||
}
|
||||
if(theSwitch==='1'){
|
||||
return
|
||||
}
|
||||
if($.aM.e.find('[name="host"]').val() !== ''){
|
||||
$.aM.e.find('[detail="auto_host"]').val($.aM.buildMonitorURL())
|
||||
}
|
||||
})
|
||||
$.aM.e.on('change','[detail="auto_host"]',function(e){
|
||||
var isRTSP = false
|
||||
var inputType = $.aM.e.find('[name="type"]').val()
|
||||
var url = $(this).val()
|
||||
var theSwitch = $.aM.e.find('[detail="auto_host_enable"]')
|
||||
var disabled = theSwitch.val()
|
||||
if(!disabled||disabled===''){
|
||||
//if no value, then probably old version of monitor config. Set to Manual to avoid confusion.
|
||||
disabled='0'
|
||||
theSwitch.val('0').change()
|
||||
}
|
||||
if(disabled==='0'){
|
||||
return
|
||||
}
|
||||
if(inputType === 'local'){
|
||||
$.aM.e.find('[name="path"]').val(url).change()
|
||||
}else{
|
||||
var urlSplitByDots = url.split('.')
|
||||
var has = function(query,searchIn){if(!searchIn){searchIn=url;};return url.indexOf(query)>-1}
|
||||
var protocol = url.split('://')[0]
|
||||
console.log(url.split('://'))
|
||||
//switch RTSP, RTMP and RTMPS to parse URL
|
||||
if(has('rtsp://')){
|
||||
isRTSP = true;
|
||||
url = url.replace('rtsp://','http://')
|
||||
}
|
||||
if(has('rtmp://')){
|
||||
isRTMP = true;
|
||||
url = url.replace('rtmp://','http://')
|
||||
}
|
||||
if(has('rtmps://')){
|
||||
isRTMPS = true;
|
||||
url = url.replace('rtmps://','http://')
|
||||
}
|
||||
//parse URL
|
||||
var parsedURL = document.createElement('a');
|
||||
parsedURL.href = url;
|
||||
var pathname = parsedURL.pathname
|
||||
if(url.indexOf('?') > -1){
|
||||
pathname += '?'+url.split('?')[1]
|
||||
}
|
||||
$.aM.e.find('[name="protocol"]').val(protocol).change()
|
||||
if(isRTSP){
|
||||
$.aM.e.find('[detail="rtsp_transport"]').val('tcp').change()
|
||||
$.aM.e.find('[detail="aduration"]').val(1000000).change()
|
||||
$.aM.e.find('[detail="probesize"]').val(1000000).change()
|
||||
}
|
||||
$.aM.e.find('[detail="muser"]').val(parsedURL.username).change()
|
||||
$.aM.e.find('[detail="mpass"]').val(parsedURL.password).change()
|
||||
$.aM.e.find('[name="host"]').val(parsedURL.hostname).change()
|
||||
$.aM.e.find('[name="port"]').val(parsedURL.port).change()
|
||||
$.aM.e.find('[name="path"]').val(pathname).change()
|
||||
delete(parsedURL)
|
||||
}
|
||||
})
|
||||
$.aM.e.find('.refresh_cascades').click(function(e){
|
||||
$.ccio.cx({f:'ocv_in',data:{f:'refreshPlugins',ke:$user.ke}})
|
||||
})
|
||||
$.aM.f.submit(function(ee){
|
||||
ee.preventDefault();
|
||||
e={e:$(this)};
|
||||
e.s=e.e.serializeObject();
|
||||
e.er=[];
|
||||
$.each(e.s,function(n,v){e.s[n]=v.trim()});
|
||||
e.s.mid=e.s.mid.replace(/[^\w\s]/gi,'').replace(/ /g,'')
|
||||
if(e.s.mid.length<3){e.er.push('Monitor ID too short')}
|
||||
if(e.s.port==''){
|
||||
if(e.s.protocol === 'https'){
|
||||
e.s.port = 443
|
||||
}else{
|
||||
e.s.port = 80
|
||||
}
|
||||
}
|
||||
if(e.s.name==''){e.er.push('Monitor Name cannot be blank')}
|
||||
// if(e.s.protocol=='rtsp'){e.s.ext='mp4',e.s.type='rtsp'}
|
||||
if(e.er.length>0){
|
||||
$.sM.e.find('.msg').html(e.er.join('<br>'));
|
||||
$.ccio.init('note',{title:'Configuration Invalid',text:e.er.join('<br>'),type:'error'});
|
||||
return;
|
||||
}
|
||||
$.post($.ccio.init('location',$user)+$user.auth_token+'/configureMonitor/'+$user.ke+'/'+e.s.mid,{data:JSON.stringify(e.s)},function(d){
|
||||
$.ccio.log(d)
|
||||
})
|
||||
//
|
||||
if($('#copy_settings').val() === '1'){
|
||||
e.s.details = JSON.parse(e.s.details);
|
||||
var copyMonitors = $.aM.monitorsForCopy.val();
|
||||
var chosenSections = [];
|
||||
var chosenMonitors = {};
|
||||
|
||||
if(!copyMonitors||copyMonitors.length===0){
|
||||
$.ccio.init('note',{title:lang['No Monitors Selected'],text:lang.monSavedButNotCopied})
|
||||
return
|
||||
}
|
||||
|
||||
$.aM.e.find('[copy]').each(function(n,v){
|
||||
var el = $(v)
|
||||
if(el.val() === '1'){
|
||||
chosenSections.push(el.attr('copy'))
|
||||
}
|
||||
})
|
||||
var alterSettings = function(settingsToAlter,monitor){
|
||||
monitor.details = JSON.parse(monitor.details);
|
||||
$.aM.e.find(settingsToAlter).find('input,select,textarea').each(function(n,v){
|
||||
var el = $(v);
|
||||
var name = el.attr('name')
|
||||
var detail = el.attr('detail')
|
||||
var value
|
||||
switch(true){
|
||||
case !!name:
|
||||
var value = e.s[name]
|
||||
monitor[name] = value;
|
||||
break;
|
||||
case !!detail:
|
||||
detail = detail.replace('"','')
|
||||
var value = e.s.details[detail]
|
||||
monitor.details[detail] = value;
|
||||
break;
|
||||
}
|
||||
})
|
||||
monitor.details = JSON.stringify(monitor.details);
|
||||
return monitor;
|
||||
}
|
||||
$.each(copyMonitors,function(n,id){
|
||||
var monitor
|
||||
if(id === '$New'){
|
||||
monitor = $.aM.generateDefaultMonitorSettings();
|
||||
//connection
|
||||
monitor.name = e.s.name+' - '+monitor.mid
|
||||
monitor.type = e.s.type
|
||||
monitor.protocol = e.s.protocol
|
||||
monitor.host = e.s.host
|
||||
monitor.port = e.s.port
|
||||
monitor.path = e.s.path
|
||||
monitor.details.fatal_max = e.s.details.fatal_max
|
||||
monitor.details.port_force = e.s.details.port_force
|
||||
monitor.details.muser = e.s.details.muser
|
||||
monitor.details.password = e.s.details.password
|
||||
monitor.details.rtsp_transport = e.s.details.rtsp_transport
|
||||
monitor.details.auto_host = e.s.details.auto_host
|
||||
monitor.details.auto_host_enable = e.s.details.auto_host_enable
|
||||
//input
|
||||
monitor.details.aduration = e.s.details.aduration
|
||||
monitor.details.probesize = e.s.details.probesize
|
||||
monitor.details.stream_loop = e.s.details.stream_loop
|
||||
monitor.details.sfps = e.s.details.sfps
|
||||
monitor.details.accelerator = e.s.details.accelerator
|
||||
monitor.details.hwaccel = e.s.details.hwaccel
|
||||
monitor.details.hwaccel_vcodec = e.s.details.hwaccel_vcodec
|
||||
monitor.details.hwaccel_device = e.s.details.hwaccel_device
|
||||
}else{
|
||||
monitor = Object.assign({},$.ccio.init('cleanMon',$.ccio.mon[$user.ke+id+$user.auth_token]));
|
||||
}
|
||||
$.each(chosenSections,function(n,section){
|
||||
monitor = alterSettings(section,monitor)
|
||||
})
|
||||
console.log(monitor)
|
||||
$.post($.ccio.init('location',$user)+$user.auth_token+'/configureMonitor/'+$user.ke+'/'+monitor.mid,{data:JSON.stringify(monitor)},function(d){
|
||||
$.ccio.log(d)
|
||||
})
|
||||
chosenMonitors[monitor.mid] = monitor;
|
||||
})
|
||||
console.log(chosenMonitors)
|
||||
}
|
||||
|
||||
$.aM.e.modal('hide')
|
||||
return false;
|
||||
});
|
||||
//////////////////
|
||||
//Input Map (Feed)
|
||||
$.aM.mapPlacementInit = function(){
|
||||
$('.input-map').each(function(n,v){
|
||||
var _this = $(this)
|
||||
_this.find('.place').text(n+1)
|
||||
})
|
||||
}
|
||||
$.aM.mapSave = function(){
|
||||
var e={};
|
||||
var mapContainers = $('[input-mapping]');
|
||||
var stringForSave={}
|
||||
mapContainers.each(function(q,t){
|
||||
var mapRowElement = $(t).find('.map-row');
|
||||
var mapRow = []
|
||||
mapRowElement.each(function(n,v){
|
||||
var map={}
|
||||
$.each($(v).find('[map-input]'),function(m,b){
|
||||
map[$(b).attr('map-input')]=$(b).val()
|
||||
});
|
||||
mapRow.push(map)
|
||||
});
|
||||
stringForSave[$(t).attr('input-mapping')] = mapRow;
|
||||
});
|
||||
$.aM.e.find('[detail="input_map_choices"]').val(JSON.stringify(stringForSave)).change();
|
||||
}
|
||||
$.aM.maps.on('click','.delete',function(){
|
||||
$(this).parents('.input-map').remove()
|
||||
var inputs = $('[map-detail]')
|
||||
if(inputs.length===0){
|
||||
$.aM.e.find('[detail="input_maps"]').val('[]').change()
|
||||
$.aM.showInputMappingFields(false)
|
||||
}else{
|
||||
inputs.first().change()
|
||||
$.aM.showInputMappingFields()
|
||||
}
|
||||
$.aM.mapPlacementInit()
|
||||
})
|
||||
$.aM.e.on('change','[map-detail]',function(){
|
||||
var e={};
|
||||
e.e=$.aM.maps.find('.input-map')
|
||||
e.s=[]
|
||||
e.e.each(function(n,v){
|
||||
var map={}
|
||||
$.each($(v).find('[map-detail]'),function(m,b){
|
||||
map[$(b).attr('map-detail')]=$(b).val()
|
||||
});
|
||||
e.s.push(map)
|
||||
});
|
||||
$.aM.e.find('[detail="input_maps"]').val(JSON.stringify(e.s)).change()
|
||||
})
|
||||
$.aM.e.on('click','[input-mapping] .add_map_row',function(){
|
||||
$.ccio.tm('input-map-selector',{},$(this).parents('[input-mapping]').find('.choices'))
|
||||
$.aM.mapSave()
|
||||
})
|
||||
$.aM.e.on('click','[input-mapping] .delete_map_row',function(){
|
||||
$(this).parents('.map-row').remove()
|
||||
$.aM.mapSave()
|
||||
})
|
||||
$.aM.e.on('change','[map-input]',function(){
|
||||
$.aM.mapSave()
|
||||
})
|
||||
//////////////////
|
||||
//Stream Channels
|
||||
$.aM.channelSave = function(){
|
||||
var e={};
|
||||
e.e=$.aM.channels.find('.stream-channel')
|
||||
e.s=[]
|
||||
e.e.each(function(n,v){
|
||||
var channel={}
|
||||
$.each($(v).find('[channel-detail]'),function(m,b){
|
||||
channel[$(b).attr('channel-detail')]=$(b).val()
|
||||
});
|
||||
e.s.push(channel)
|
||||
});
|
||||
$.aM.e.find('[detail="stream_channels"]').val(JSON.stringify(e.s)).change()
|
||||
}
|
||||
$.aM.channelPlacementInit = function(){
|
||||
$('.stream-channel').each(function(n,v){
|
||||
var _this = $(this)
|
||||
_this.attr('stream-channel',n)
|
||||
_this.find('.place').text(n)
|
||||
_this.find('[input-mapping]').attr('input-mapping','stream_channel-'+n)
|
||||
$.aM.mapSave()
|
||||
})
|
||||
}
|
||||
$.aM.buildMonitorURL = function(){
|
||||
var e={};
|
||||
e.user=$.aM.e.find('[detail="muser"]').val();
|
||||
e.pass=$.aM.e.find('[detail="mpass"]').val();
|
||||
e.host=$.aM.e.find('[name="host"]').val();
|
||||
e.protocol=$.aM.e.find('[name="protocol"]').val();
|
||||
e.port=$.aM.e.find('[name="port"]').val();
|
||||
e.path=$.aM.e.find('[name="path"]').val();
|
||||
if($.aM.e.find('[name="type"]').val()==='local'){
|
||||
e.url=e.path;
|
||||
}else{
|
||||
if(e.host.indexOf('@')===-1&&e.user!==''){
|
||||
e.host=e.user+':'+e.pass+'@'+e.host;
|
||||
}
|
||||
e.url=$.ccio.init('url',e)+e.path;
|
||||
}
|
||||
return e.url
|
||||
}
|
||||
$.aM.showInputMappingFields = function(showMaps){
|
||||
var el = $('[input-mapping],.input-mapping')
|
||||
if(showMaps === undefined)showMaps = true
|
||||
if(showMaps){
|
||||
el.show()
|
||||
}else{
|
||||
el.hide()
|
||||
}
|
||||
$.aM.drawList()
|
||||
}
|
||||
$.aM.channels.on('click','.delete',function(){
|
||||
$(this).parents('.stream-channel').remove()
|
||||
$.aM.channelSave()
|
||||
$.aM.channelPlacementInit()
|
||||
})
|
||||
$.aM.e.on('change','[channel-detail]',function(){
|
||||
$.aM.channelSave()
|
||||
})
|
||||
//////////////////
|
||||
$.aM.e.on('change','[groups]',function(){
|
||||
var e={};
|
||||
e.e=$.aM.e.find('[groups]:checked');
|
||||
e.s=[];
|
||||
e.e.each(function(n,v){
|
||||
e.s.push($(v).val())
|
||||
});
|
||||
$.aM.e.find('[detail="groups"]').val(JSON.stringify(e.s)).change()
|
||||
})
|
||||
$.aM.e.on('change','[group_detector_multi]',function(){
|
||||
var e={};
|
||||
e.e=$.aM.e.find('[group_detector_multi]:checked');
|
||||
e.s=[];
|
||||
e.e.each(function(n,v){
|
||||
e.s.push($(v).val())
|
||||
});
|
||||
$.aM.e.find('[detail="group_detector_multi"]').val(JSON.stringify(e.s)).change()
|
||||
})
|
||||
$.aM.e.on('change','.detector_cascade_selection',function(){
|
||||
var e={};
|
||||
e.e=$.aM.e.find('.detector_cascade_selection:checked');
|
||||
e.s={};
|
||||
e.e.each(function(n,v){
|
||||
e.s[$(v).val()]={}
|
||||
});
|
||||
$.aM.e.find('[detail="detector_cascades"]').val(JSON.stringify(e.s)).change()
|
||||
})
|
||||
//$.aM.e.on('change','.detector_cascade_selection',function(){
|
||||
// var e={};
|
||||
// e.details=$.aM.e.find('[name="details"]')
|
||||
// try{
|
||||
// e.detailsVal=JSON.parse(e.details.val())
|
||||
// }catch(err){
|
||||
// e.detailsVal={}
|
||||
// }
|
||||
// e.detailsVal.detector_cascades=[];
|
||||
// e.e=$.aM.e.find('.detector_cascade_selection:checked');
|
||||
// e.e.each(function(n,v){
|
||||
// e.detailsVal.detector_cascades.push($(v).val())
|
||||
// });
|
||||
// e.details.val(JSON.stringify(e.detailsVal))
|
||||
//})
|
||||
$.aM.e.find('.probe_config').click(function(){
|
||||
$.pB.e.find('[name="url"]').val($.aM.buildMonitorURL());
|
||||
$.pB.f.submit();
|
||||
$.pB.e.modal('show');
|
||||
})
|
||||
$.aM.e.find('.import_config').click(function(e){
|
||||
var e={};e.e=$(this);e.mid=e.e.parents('[mid]').attr('mid');
|
||||
$.confirm.e.modal('show');
|
||||
$.confirm.title.text(lang['Import Monitor Configuration'])
|
||||
e.html=lang.ImportMonitorConfigurationText+'<div style="margin-top:15px"><div class="form-group"><textarea placeholder="'+lang['Paste JSON here.']+'" class="form-control"></textarea></div><label class="upload_file btn btn-primary btn-block"> Upload File <input class="upload" type=file name="files[]"></label></div>';
|
||||
$.confirm.body.html(e.html)
|
||||
$.confirm.e.find('.upload').change(function(e){
|
||||
var files = e.target.files; // FileList object
|
||||
f = files[0];
|
||||
var reader = new FileReader();
|
||||
reader.onload = function(ee) {
|
||||
$.confirm.e.find('textarea').val(ee.target.result);
|
||||
}
|
||||
reader.readAsText(f);
|
||||
});
|
||||
$.confirm.click({title:'Import',class:'btn-primary'},function(){
|
||||
try{
|
||||
e.values=JSON.parse($.confirm.e.find('textarea').val());
|
||||
$.aM.import(e)
|
||||
$.aM.e.modal('show')
|
||||
}catch(err){
|
||||
$.ccio.log(err)
|
||||
$.ccio.init('note',{title:lang['Invalid JSON'],text:lang.InvalidJSONText,type:'error'})
|
||||
}
|
||||
});
|
||||
});
|
||||
$.aM.e.find('.save_config').click(function(e){
|
||||
var e={};e.e=$(this);e.mid=e.e.parents('[mid]').attr('mid');e.s=$.aM.f.serializeObject();
|
||||
if(!e.mid||e.mid===''){
|
||||
e.mid='NewMonitor'
|
||||
}
|
||||
e.dataStr = "data:text/json;charset=utf-8," + encodeURIComponent(JSON.stringify(e.s));
|
||||
$('#temp').html('<a></a>')
|
||||
.find('a')
|
||||
.attr('href',e.dataStr)
|
||||
.attr('download','Shinobi_'+e.mid+'_config.json')
|
||||
[0].click()
|
||||
});
|
||||
$.aM.e.find('.add_map').click(function(e){
|
||||
$.aM.showInputMappingFields()
|
||||
$.ccio.tm('input-map')
|
||||
});
|
||||
$.aM.e.find('.add_channel').click(function(e){
|
||||
$.ccio.tm('stream-channel')
|
||||
});
|
||||
$.aM.f.find('[detail="stream_type"]').change(function(e){
|
||||
e.e=$(this);
|
||||
if(e.e.val()==='jpeg'){$.aM.f.find('[detail="snap"]').val('1').change()}
|
||||
})
|
||||
$.aM.f.find('[name="type"]').change(function(e){
|
||||
e.e=$(this);
|
||||
if(e.e.val()==='h264'){$.aM.f.find('[name="protocol"]').val('rtsp').change()}
|
||||
})
|
||||
$.aM.md=$.aM.f.find('[detail]');
|
||||
$.aM.md.change($.ccio.form.details)
|
||||
$.aM.f.on('change','[selector]',function(){
|
||||
e={e:$(this)}
|
||||
e.v=e.e.val();
|
||||
e.a=e.e.attr('selector')
|
||||
e.triggerChange=e.e.attr('triggerchange')
|
||||
e.triggerChangeIgnore=e.e.attr('triggerChangeIgnore')
|
||||
$.aM.f.find('.'+e.a+'_input').hide()
|
||||
$.aM.f.find('.'+e.a+'_'+e.v).show();
|
||||
$.aM.f.find('.'+e.a+'_text').text($(this).find('option:selected').text())
|
||||
if(e.triggerChange && e.triggerChange !== '' && !e.triggerChangeIgnore || (e.triggerChangeIgnore && e.triggerChangeIgnore.split(',').indexOf(e.v) === -1)){
|
||||
console.log(e.triggerChange)
|
||||
$(e.triggerChange).trigger('change')
|
||||
}
|
||||
$.aM.drawList()
|
||||
});
|
||||
$.aM.f.find('[name="type"]').change(function(e){
|
||||
e.e=$(this);
|
||||
e.v=e.e.val();
|
||||
e.h=$.aM.f.find('[name="path"]');
|
||||
e.p=e.e.parents('.form-group');
|
||||
switch(e.v){
|
||||
case'local':case'socket':
|
||||
e.h.attr('placeholder','/dev/video0')
|
||||
break;
|
||||
default:
|
||||
e.h.attr('placeholder','/videostream.cgi?1')
|
||||
break;
|
||||
}
|
||||
});
|
||||
$.aM.connectedDetectorPlugins = {}
|
||||
$.aM.addDetectorPlugin = function(name,d){
|
||||
$.aM.connectedDetectorPlugins[d.plug] = {
|
||||
id: d.id,
|
||||
plug: d.plug,
|
||||
notice: d.notice,
|
||||
connectionType: d.connectionType
|
||||
}
|
||||
$.aM.drawPluginElements()
|
||||
}
|
||||
$.aM.removeDetectorPlugin = function(name){
|
||||
delete($.aM.connectedDetectorPlugins[name])
|
||||
$.aM.drawPluginElements(name)
|
||||
}
|
||||
$.aM.drawPluginElements = function(){
|
||||
if(Object.keys($.aM.connectedDetectorPlugins).length === 0){
|
||||
$('.stream-objects .stream-detected-object').remove()
|
||||
$('.shinobi-detector').hide()
|
||||
$('.shinobi-detector-msg').empty()
|
||||
$('.shinobi-detector_name').empty()
|
||||
$('.shinobi-detector_plug').hide()
|
||||
$('.shinobi-detector-invert').show()
|
||||
$.aM.drawList()
|
||||
}else{
|
||||
var pluginTitle = []
|
||||
var pluginNotice = []
|
||||
$.each($.aM.connectedDetectorPlugins,function(name,d){
|
||||
pluginTitle.push(name)
|
||||
if(d.notice){
|
||||
pluginNotice.push('<b>' + d.plug + '</b> : ' + d.notice)
|
||||
}
|
||||
$('.shinobi-detector-'+d.plug).show()
|
||||
})
|
||||
$('.shinobi-detector').show()
|
||||
$('.shinobi-detector-invert').hide()
|
||||
$('.shinobi-detector_name').text(pluginTitle.join(', '))
|
||||
if(pluginNotice.length > 0)$('.shinobi-detector-msg').text(pluginNotice.join('<br>'))
|
||||
$.aM.drawList()
|
||||
}
|
||||
}
|
||||
})
|
192
web/libs/js/dash2.multimon.js
Normal file
192
web/libs/js/dash2.multimon.js
Normal file
|
@ -0,0 +1,192 @@
|
|||
$(document).ready(function(e){
|
||||
//multi monitor manager
|
||||
$.multimon={e:$('#multi_mon')};
|
||||
$.multimon.table=$.multimon.e.find('.tableData tbody');
|
||||
$.multimon.f=$.multimon.e.find('form');
|
||||
$.multimon.f.on('change','#multimon_select_all',function(e){
|
||||
e.e=$(this);
|
||||
e.p=e.e.prop('checked')
|
||||
e.a=$.multimon.f.find('input[type=checkbox][name]')
|
||||
if(e.p===true){
|
||||
e.a.prop('checked',true)
|
||||
}else{
|
||||
e.a.prop('checked',false)
|
||||
}
|
||||
})
|
||||
$.multimon.e.find('.import_config').click(function(){
|
||||
var e={};e.e=$(this);e.mid=e.e.parents('[mid]').attr('mid');
|
||||
$.confirm.e.modal('show');
|
||||
$.confirm.title.text(lang['Import Monitor Configuration'])
|
||||
e.html=lang.ImportMultiMonitorConfigurationText+'<div style="margin-top:15px"><div class="form-group"><textarea placeholder="'+lang['Paste JSON here.']+'" class="form-control"></textarea></div><label class="upload_file btn btn-primary btn-block"> Upload File <input class="upload" type=file name="files[]"></label></div>';
|
||||
$.confirm.body.html(e.html)
|
||||
$.confirm.e.find('.upload').change(function(e){
|
||||
var files = e.target.files; // FileList object
|
||||
f = files[0];
|
||||
var reader = new FileReader();
|
||||
reader.onload = function(ee) {
|
||||
$.confirm.e.find('textarea').val(ee.target.result);
|
||||
}
|
||||
reader.readAsText(f);
|
||||
});
|
||||
$.confirm.click({title:'Import',class:'btn-primary'},function(){
|
||||
// setTimeout(function(){
|
||||
// $.confirm.e.modal('show');
|
||||
// },1000)
|
||||
// $.confirm.title.text(lang['Are you sure?'])
|
||||
// $.confirm.body.html(lang.ImportMultiMonitorConfigurationText)
|
||||
// $.confirm.click({title:'Save Set',class:'btn-danger'},function(){
|
||||
try{
|
||||
var postMonitor = function(v){
|
||||
$.post($.ccio.init('location',$user)+$user.auth_token+'/configureMonitor/'+$user.ke+'/'+v.mid,{data:JSON.stringify(v,null,3)},function(d){
|
||||
$.ccio.log(d)
|
||||
})
|
||||
}
|
||||
var parseZmMonitor = function(Monitor){
|
||||
console.log(Monitor)
|
||||
var newMon = $.aM.generateDefaultMonitorSettings()
|
||||
newMon.details = JSON.parse(newMon.details)
|
||||
newMon.details.stream_type = 'jpeg'
|
||||
switch(Monitor.Type.toLowerCase()){
|
||||
case'ffmpeg':case'libvlc':
|
||||
newMon.details.auto_host_enable = '1'
|
||||
newMon.details.auto_host = Monitor.Path
|
||||
if(newMon.auto_host.indexOf('rtsp://') > -1 || newMon.auto_host.indexOf('rtmp://') > -1 || newMon.auto_host.indexOf('rtmps://') > -1){
|
||||
newMon.type = 'h264'
|
||||
}else{
|
||||
$.ccio.init('note',{title:lang['Please Check Your Settings'],text:lang.migrateText1,type:'error'})
|
||||
}
|
||||
break;
|
||||
case'local':
|
||||
newMon.details.auto_host = Monitor.Device
|
||||
break;
|
||||
case'remote':
|
||||
|
||||
break;
|
||||
}
|
||||
newMon.details = JSON.stringify(newMon.details)
|
||||
console.log(newMon)
|
||||
return newMon
|
||||
}
|
||||
parsedData=JSON.parse($.confirm.e.find('textarea').val());
|
||||
//zoneminder one monitor
|
||||
if(parsedData.monitor){
|
||||
$.aM.import({
|
||||
values : parseZmMonitor(parsedData.monitor.Monitor)
|
||||
})
|
||||
$.aM.e.modal('show')
|
||||
}else
|
||||
//zoneminder multiple monitors
|
||||
if(parsedData.monitors){
|
||||
$.each(parsedData.monitors,function(n,v){
|
||||
$.aM.import({
|
||||
values : parseZmMonitor(parsedData.Monitor)
|
||||
})
|
||||
parseZmMonitor(v.Monitor)
|
||||
})
|
||||
}else
|
||||
//shinobi one monitor
|
||||
if(parsedData.mid){
|
||||
postMonitor(parsedData)
|
||||
}else
|
||||
//shinobi multiple monitors
|
||||
if(parsedData[0] && parsedData[0].mid){
|
||||
$.each(parsedData,function(n,v){
|
||||
postMonitor(v)
|
||||
})
|
||||
}
|
||||
}catch(err){
|
||||
$.ccio.log(err)
|
||||
$.ccio.init('note',{title:lang['Invalid JSON'],text:lang.InvalidJSONText,type:'error'})
|
||||
}
|
||||
// });
|
||||
});
|
||||
})
|
||||
$.multimon.getSelectedMonitors = function(unclean){
|
||||
var arr=[];
|
||||
if(unclean === true){
|
||||
var monitors = $.ccio.mon
|
||||
}else{
|
||||
var monitors = $.ccio.init('cleanMons','object')
|
||||
}
|
||||
$.each($.multimon.f.serializeObject(),function(n,v){
|
||||
arr.push(monitors[n])
|
||||
})
|
||||
return arr;
|
||||
}
|
||||
$.multimon.e.find('.delete').click(function(){
|
||||
var arr=$.multimon.getSelectedMonitors(true);
|
||||
if(arr.length===0){
|
||||
$.ccio.init('note',{title:'No Monitors Selected',text:'Select atleast one monitor to delete.',type:'error'});
|
||||
return
|
||||
}
|
||||
$.confirm.e.modal('show');
|
||||
$.confirm.title.text(lang['Delete']+' '+lang['Monitors'])
|
||||
e.html='<p>'+lang.DeleteMonitorsText+'</p>';
|
||||
$.confirm.body.html(e.html)
|
||||
$.confirm.click([
|
||||
{
|
||||
title:'Delete Monitors',
|
||||
class:'btn-danger',
|
||||
callback:function(){
|
||||
$.each(arr,function(n,v){
|
||||
$.get($.ccio.init('location',$user)+v.user.auth_token+'/configureMonitor/'+v.ke+'/'+v.mid+'/delete',function(data){
|
||||
console.log(data)
|
||||
})
|
||||
})
|
||||
}
|
||||
},
|
||||
{
|
||||
title:'Delete Monitors and Files',
|
||||
class:'btn-danger',
|
||||
callback:function(){
|
||||
$.each(arr,function(n,v){
|
||||
$.get($.ccio.init('location',$user)+v.user.auth_token+'/configureMonitor/'+v.ke+'/'+v.mid+'/delete?deleteFiles=true',function(data){
|
||||
console.log(data)
|
||||
})
|
||||
})
|
||||
}
|
||||
}
|
||||
]);
|
||||
})
|
||||
//$.multimon.e.find('.edit_all').click(function(){
|
||||
// var arr=$.multimon.getSelectedMonitors();
|
||||
// var arrObject={}
|
||||
// if(arr.length===0){
|
||||
// $.ccio.init('note',{title:'No Monitors Selected',text:'Select atleast one monitor to delete.',type:'error'});
|
||||
// return
|
||||
// }
|
||||
// $.multimonedit.selectedList = arr;
|
||||
// $.multimonedit.e.modal('show')
|
||||
//})
|
||||
$.multimon.e.find('.save_config').click(function(){
|
||||
var e={};e.e=$(this);
|
||||
var arr=$.multimon.getSelectedMonitors();
|
||||
if(arr.length===0){
|
||||
$.ccio.init('note',{title:'No Monitors Selected',text:'Select atleast one monitor to delete.',type:'error'});
|
||||
return
|
||||
}
|
||||
e.dataStr = "data:text/json;charset=utf-8," + encodeURIComponent(JSON.stringify(arr));
|
||||
$('#temp').html('<a></a>')
|
||||
.find('a')
|
||||
.attr('href',e.dataStr)
|
||||
.attr('download','Shinobi_Monitors_'+(new Date())+'.json')
|
||||
[0].click()
|
||||
})
|
||||
$.multimon.e.on('shown.bs.modal',function() {
|
||||
var tmp=''
|
||||
$.each($.ccio.mon,function(n,v){
|
||||
var streamURL = $.ccio.init('streamURL',v)
|
||||
if(streamURL!=='Websocket'&&v.mode!==('idle'&&'stop')){
|
||||
streamURL='<a target="_blank" href="'+streamURL+'">'+streamURL+'</a>'
|
||||
}
|
||||
var img = $('#left_menu [mid="'+v.mid+'"][auth="'+v.user.auth_token+'"] [monitor="watch"]').attr('src')
|
||||
tmp+='<tr mid="'+v.mid+'" ke="'+v.ke+'" auth="'+v.user.auth_token+'">'
|
||||
tmp+='<td><div class="checkbox"><input id="multimonCheck_'+v.ke+v.mid+v.user.auth_token+'" type="checkbox" name="'+v.ke+v.mid+v.user.auth_token+'" value="1"><label for="multimonCheck_'+v.ke+v.mid+v.user.auth_token+'"></label></div></td>'
|
||||
tmp+='<td><a monitor="watch"><img class="small-square-img" src="'+img+'"></a></td><td>'+v.name+'<br><small>'+v.mid+'</small></td><td class="monitor_status">'+v.status+'</td><td>'+streamURL+'</td>'
|
||||
//buttons
|
||||
tmp+='<td class="text-right"><a title="'+lang.Pop+'" monitor="pop" class="btn btn-primary"><i class="fa fa-external-link"></i></a> <a title="'+lang.Calendar+'" monitor="calendar" class="btn btn-default"><i class="fa fa-calendar"></i></a> <a title="'+lang['Power Viewer']+'" class="btn btn-default" monitor="powerview"><i class="fa fa-map-marker"></i></a> <a title="'+lang['Time-lapse']+'" class="btn btn-default" monitor="timelapse"><i class="fa fa-angle-double-right"></i></a> <a title="'+lang['Videos List']+'" monitor="videos_table" class="btn btn-default"><i class="fa fa-film"></i></a> <a title="'+lang['Monitor Settings']+'" class="btn btn-default" monitor="edit"><i class="fa fa-wrench"></i></a></td>'
|
||||
tmp+='</tr>'
|
||||
})
|
||||
$.multimon.table.html(tmp)
|
||||
})
|
||||
})
|
60
web/libs/js/dash2.onvifscanner.js
Normal file
60
web/libs/js/dash2.onvifscanner.js
Normal file
|
@ -0,0 +1,60 @@
|
|||
$(document).ready(function(e){
|
||||
//onvif probe
|
||||
$.oB={
|
||||
e:$('#onvif_probe'),
|
||||
v:$('#onvif_video'),
|
||||
};
|
||||
$.oB.f=$.oB.e.find('form');$.oB.o=$.oB.e.find('.output_data');
|
||||
$.oB.f.submit(function(ee){
|
||||
ee.preventDefault();
|
||||
e={};
|
||||
$.oB.foundMonitors={}
|
||||
e.e=$(this),e.s=e.e.serializeObject();
|
||||
$.oB.o.empty();
|
||||
$.oB.e.find('._loading').show()
|
||||
$.oB.e.find('[type="submit"]').prop('disabled',true)
|
||||
$.ccio.cx({f:'onvif',ip:e.s.ip,port:e.s.port,user:e.s.user,pass:e.s.pass})
|
||||
clearTimeout($.oB.checkTimeout)
|
||||
$.oB.checkTimeout=setTimeout(function(){
|
||||
if($.oB.o.find('tr').length===0){
|
||||
$.oB.e.find('._loading').hide()
|
||||
$.oB.e.find('[type="submit"]').prop('disabled',false)
|
||||
$.oB.o.append('<td class="text-center _notfound">Sorry, nothing was found.</td>')
|
||||
}
|
||||
},5000)
|
||||
return false;
|
||||
});
|
||||
$.oB.e.on('click','.copy',function(){
|
||||
$('.hidden-xs [monitor="edit"]').click();
|
||||
e={};
|
||||
e.e = $(this).parents('[onvif_row]');
|
||||
var id = e.e.attr('onvif_row');
|
||||
var onvifRecord = $.oB.foundMonitors[id];
|
||||
var streamURL = onvifRecord.uri;
|
||||
if($.oB.e.find('[name="user"]').val()!==''){
|
||||
streamURL = streamURL.split('://')
|
||||
streamURL = streamURL[0]+'://'+$.oB.e.find('[name="user"]').val()+':'+$.oB.e.find('[name="pass"]').val()+'@'+streamURL[1];
|
||||
}
|
||||
$.aM.e.find('[detail="auto_host"]').val(streamURL).change()
|
||||
$.aM.e.find('[name="mode"]').val('start')
|
||||
$.oB.e.modal('hide')
|
||||
})
|
||||
$.oB.e.find('[name="ip"]').change(function(e){
|
||||
$.ccio.op('onvif_probe_ip',$(this).val());
|
||||
})
|
||||
if($.ccio.op().onvif_probe_ip){
|
||||
$.oB.e.find('[name="ip"]').val($.ccio.op().onvif_probe_ip)
|
||||
}
|
||||
$.oB.e.find('[name="port"]').change(function(e){
|
||||
$.ccio.op('onvif_probe_port',$(this).val());
|
||||
})
|
||||
if($.ccio.op().onvif_probe_port){
|
||||
$.oB.e.find('[name="port"]').val($.ccio.op().onvif_probe_port)
|
||||
}
|
||||
$.oB.e.find('[name="user"]').change(function(e){
|
||||
$.ccio.op('onvif_probe_user',$(this).val());
|
||||
})
|
||||
if($.ccio.op().onvif_probe_user){
|
||||
$.oB.e.find('[name="user"]').val($.ccio.op().onvif_probe_user)
|
||||
}
|
||||
})
|
298
web/libs/js/dash2.powervideo.js
Normal file
298
web/libs/js/dash2.powervideo.js
Normal file
|
@ -0,0 +1,298 @@
|
|||
$(document).ready(function(e){
|
||||
//POWER videos window
|
||||
$.pwrvid={e:$('#pvideo_viewer')};
|
||||
$.pwrvid.f=$.pwrvid.e.find('form'),
|
||||
$.pwrvid.d=$('#vis_pwrvideo'),
|
||||
$.pwrvid.mL=$('#motion_list'),
|
||||
$.pwrvid.m=$('#vis_monitors'),
|
||||
$.pwrvid.lv=$('#live_view'),
|
||||
$.pwrvid.dr=$('#pvideo_daterange'),
|
||||
$.pwrvid.vp=$('#video_preview'),
|
||||
$.pwrvid.seekBar=$('#pwrvid_seekBar'),
|
||||
$.pwrvid.seekBarProgress=$.pwrvid.seekBar.find('.progress-bar'),
|
||||
$.pwrvid.playRate = 1;
|
||||
$.pwrvid.dr.daterangepicker({
|
||||
startDate:$.ccio.timeObject().subtract(moment.duration("24:00:00")),
|
||||
endDate:$.ccio.timeObject().add(moment.duration("24:00:00")),
|
||||
timePicker: true,
|
||||
timePicker24Hour: true,
|
||||
timePickerSeconds: true,
|
||||
timePickerIncrement: 30,
|
||||
locale: {
|
||||
format: 'MM/DD/YYYY h:mm A'
|
||||
}
|
||||
},function(start, end, label){
|
||||
$.pwrvid.drawTimeline()
|
||||
$.pwrvid.dr.focus()
|
||||
});
|
||||
$('#pvideo_show_events').change(function(){
|
||||
$.pwrvid.drawTimeline()
|
||||
})
|
||||
$.pwrvid.e.on('click','[preview]',function(e){
|
||||
e.e=$(this);
|
||||
e.video=$.pwrvid.vp.find('video')[0];
|
||||
if(e.video){
|
||||
e.duration=e.video.duration;
|
||||
e.now=e.video.currentTime;
|
||||
}
|
||||
if($.pwrvid.video){
|
||||
clearInterval($.pwrvid.video.interval);
|
||||
}
|
||||
switch(e.e.attr('preview')){
|
||||
case'fullscreen':
|
||||
$.ccio.init('fullscreen',e.video)
|
||||
break;
|
||||
case'mute':
|
||||
e.video.muted = !e.video.muted
|
||||
e.e.find('i').toggleClass('fa-volume-off fa-volume-up')
|
||||
e.e.toggleClass('btn-danger')
|
||||
break;
|
||||
case'play':
|
||||
e.video.playbackRate = 1;
|
||||
$.pwrvid.vpOnPlayPause(1)
|
||||
break;
|
||||
case'stepFrontFront':
|
||||
e.add=e.e.attr('add')
|
||||
e.stepFrontFront=parseInt(e.e.attr('stepFrontFront'))
|
||||
if(!e.stepFrontFront||isNaN(e.stepFrontFront)){e.stepFrontFront = 5}
|
||||
if(e.add==="0"){
|
||||
$.pwrvid.playRate = e.stepFrontFront
|
||||
}else{
|
||||
$.pwrvid.playRate += e.stepFrontFront
|
||||
}
|
||||
e.video.playbackRate = $.pwrvid.playRate;
|
||||
e.video.play()
|
||||
break;
|
||||
case'stepFront':
|
||||
e.video.currentTime += 1;
|
||||
e.video.pause()
|
||||
break;
|
||||
case'stepBackBack':
|
||||
$.pwrvid.video.interval = setInterval(function(){
|
||||
e.video.playbackRate = 1.0;
|
||||
if(e.video.currentTime == 0){
|
||||
clearInterval($.pwrvid.video.interval);
|
||||
e.video.pause();
|
||||
}
|
||||
else{
|
||||
e.video.currentTime += -.2;
|
||||
}
|
||||
},30);
|
||||
break;
|
||||
case'stepBack':
|
||||
e.video.currentTime += -1;
|
||||
e.video.pause()
|
||||
break;
|
||||
case'video':
|
||||
// e.preventDefault();
|
||||
e.p=e.e.parents('[mid]');
|
||||
e.filename=e.p.attr('file');
|
||||
$.pwrvid.vp.find('h3').text(e.filename)
|
||||
e.href=e.e.attr('href');
|
||||
e.status=e.p.attr('status');
|
||||
e.mon=$.ccio.mon[e.p.attr('ke')+e.p.attr('mid')+$user.auth_token];
|
||||
$.pwrvid.vp.find('.holder').html('<video class="video_video" video="'+e.href+'"><source src="'+e.href+'" type="video/'+e.mon.ext+'"></video>');
|
||||
$.pwrvid.vp
|
||||
.attr('mid',e.mon.mid)
|
||||
.attr('mid',e.mon.user.auth_token)
|
||||
.attr('ke',e.mon.ke)
|
||||
.attr('status',e.status)
|
||||
.attr('file',e.filename)
|
||||
.find('[download],[video="download"]')
|
||||
.attr('download',e.filename)
|
||||
.attr('href',e.href)
|
||||
$.pwrvid.vp.find('video').off('loadeddata').on('loadeddata',function(){
|
||||
$.pwrvid.vp.find('.stream-objects .stream-detected-object').remove()
|
||||
})
|
||||
if(e.status==1){
|
||||
$.get($.ccio.init('videoHrefToRead',e.href),function(d){
|
||||
|
||||
})
|
||||
}
|
||||
var labels=[]
|
||||
var Dataset1=[]
|
||||
var events=$.pwrvid.currentDataObject[e.filename].motion
|
||||
var eventsLabeledByTime={}
|
||||
$.each(events,function(n,v){
|
||||
if(!v.details.confidence){v.details.confidence=0}
|
||||
var time=$.ccio.timeObject(v.time).format('MM/DD/YYYY HH:mm:ss')
|
||||
labels.push(time)
|
||||
Dataset1.push(v.details.confidence)
|
||||
eventsLabeledByTime[time]=v;
|
||||
})
|
||||
if(events.length>0){
|
||||
$.pwrvid.mL.html("<canvas></canvas>")
|
||||
var timeFormat = 'MM/DD/YYYY HH:mm:ss';
|
||||
var color = Chart.helpers.color;
|
||||
Chart.defaults.global.defaultFontColor = '#fff';
|
||||
var config = {
|
||||
type: 'bar',
|
||||
data: {
|
||||
labels: labels,
|
||||
datasets: [{
|
||||
type: 'line',
|
||||
label: 'Motion Confidence',
|
||||
backgroundColor: color(window.chartColors.red).alpha(0.2).rgbString(),
|
||||
borderColor: window.chartColors.red,
|
||||
data: Dataset1,
|
||||
}]
|
||||
},
|
||||
options: {
|
||||
maintainAspectRatio: false,
|
||||
title: {
|
||||
fontColor: "white",
|
||||
text:"Events in this video"
|
||||
},
|
||||
scales: {
|
||||
xAxes: [{
|
||||
type: "time",
|
||||
display: true,
|
||||
time: {
|
||||
format: timeFormat,
|
||||
// round: 'day'
|
||||
}
|
||||
}],
|
||||
},
|
||||
}
|
||||
};
|
||||
var ctx = $.pwrvid.mL.find('canvas')[0].getContext("2d");
|
||||
$.pwrvid.miniChart = new Chart(ctx, config);
|
||||
$.pwrvid.mL.find('canvas').click(function(f) {
|
||||
var target = $.pwrvid.miniChart.getElementsAtEvent(f)[0];
|
||||
if(!target){return false}
|
||||
var video = $.pwrvid.currentDataObject[e.filename];
|
||||
var event = video.motion[target._index];
|
||||
var video1 = $('#video_preview video')[0];
|
||||
video1.currentTime=$.ccio.timeObject(event.time).diff($.ccio.timeObject(video.row.time),'seconds')
|
||||
video1.play()
|
||||
});
|
||||
var colorNames = Object.keys(window.chartColors);
|
||||
|
||||
}else{
|
||||
$.pwrvid.mL.html('<div class="super-center text-center" style="width:auto">'+lang['No Events found for this video']+'</div>')
|
||||
}
|
||||
$.pwrvid.video={filename:e.filename,href:e.href,mid:e.mon.mid,ke:e.mon.ke}
|
||||
$.pwrvid.vpOnPlayPause=function(x,e){
|
||||
var e={}
|
||||
e.video=$.pwrvid.vp.find('video')[0]
|
||||
e.i=$.pwrvid.vp.find('[preview="play"]').find('i')
|
||||
if(e.video.paused===true){
|
||||
e.i.removeClass('fa-pause').addClass('fa-play')
|
||||
if(x==1)e.video.play();
|
||||
}else{
|
||||
e.i.removeClass('fa-play').addClass('fa-pause')
|
||||
if(x==1)e.video.pause();
|
||||
}
|
||||
}
|
||||
var videoElement=$.pwrvid.vp.find('video')[0]
|
||||
$.pwrvid.vp.find('video')
|
||||
.off('loadeddata').on('loadeddata', function() {
|
||||
this.playbackRate = $.pwrvid.playRate;
|
||||
this.play()
|
||||
})
|
||||
.off("pause").on("pause",$.pwrvid.vpOnPlayPause)
|
||||
.off("play").on("play",$.pwrvid.vpOnPlayPause)
|
||||
.off("timeupdate").on("timeupdate",function(){
|
||||
var video = $.pwrvid.currentDataObject[e.filename];
|
||||
var videoTime=$.ccio.timeObject(video.row.time).add(parseInt(videoElement.currentTime),'seconds').format('MM/DD/YYYY HH:mm:ss');
|
||||
var event = eventsLabeledByTime[videoTime];
|
||||
if(event){
|
||||
if(event.details.plates){
|
||||
console.log('licensePlateVideo',event)
|
||||
}
|
||||
if(event.details.matrices){
|
||||
event.monitorDetails=JSON.parse(e.mon.details)
|
||||
event.stream=$(videoElement)
|
||||
event.streamObjects=$.pwrvid.vp.find('.stream-objects')
|
||||
$.ccio.init('drawMatrices',event)
|
||||
}
|
||||
if(event.details.confidence){
|
||||
$.pwrvid.vp.find('.motion-meter .progress-bar').css('width',event.details.confidence+'px').find('span').text(event.details.confidence)
|
||||
}
|
||||
}
|
||||
var value= (( videoElement.currentTime / videoElement.duration ) * 100)+"%"
|
||||
$.pwrvid.seekBarProgress.css("width",value);
|
||||
})
|
||||
$.pwrvid.seekBar.off("click").on("click", function(seek){
|
||||
var offset = $(this).offset();
|
||||
var left = (seek.pageX - offset.left);
|
||||
var totalWidth = $.pwrvid.seekBar.width();
|
||||
var percentage = ( left / totalWidth );
|
||||
var vidTime = videoElement.duration * percentage;
|
||||
videoElement.currentTime = vidTime;
|
||||
});
|
||||
break;
|
||||
}
|
||||
})
|
||||
$.pwrvid.drawTimeline=function(getData){
|
||||
var e={};
|
||||
$.pwrvid.e.find('.nodata').hide()
|
||||
if(getData===undefined){getData=true}
|
||||
var mid=$.pwrvid.m.val();
|
||||
$.pwrvid.e.find('.loading').show()
|
||||
e.live_header=$.pwrvid.lv.find('h3 span');
|
||||
e.live=$.pwrvid.lv.find('iframe');
|
||||
e.dateRange=$.pwrvid.dr.data('daterangepicker');
|
||||
e.videoLimit = $('#pvideo_video_limit').val();
|
||||
e.eventLimit = $('#pvideo_event_limit').val();
|
||||
if(e.eventLimit===''||isNaN(e.eventLimit)){e.eventLimit=500}
|
||||
if(e.videoLimit===''||isNaN(e.videoLimit)){e.videoLimit=0}
|
||||
|
||||
var getTheData = function(){
|
||||
e.live_header.text($.ccio.mon[$user.ke+mid+$user.auth_token].name)
|
||||
e.live.attr('src',$.ccio.init('location',$user)+$user.auth_token+'/embed/'+$user.ke+'/'+mid+'/fullscreen|jquery|relative|gui')
|
||||
|
||||
var pulseLoading = function(){
|
||||
var loading = $.pwrvid.e.find('.loading')
|
||||
var currentColor = loading.css('color')
|
||||
loading.animate('color','red')
|
||||
setTimeout(function(){
|
||||
loading.css('color',currentColor)
|
||||
},500)
|
||||
}
|
||||
if(getData===true){
|
||||
$.ccio.cx({
|
||||
f:'monitor',
|
||||
ff:'get',
|
||||
fff:'videos&events',
|
||||
videoLimit:e.videoLimit,
|
||||
eventLimit:e.eventLimit,
|
||||
startDate:$.ccio.init('th',e.dateRange.startDate),
|
||||
endDate:$.ccio.init('th',e.dateRange.endDate),
|
||||
ke:e.ke,
|
||||
mid:mid
|
||||
});
|
||||
}else{
|
||||
$.pwrvid.e.find('.loading').hide()
|
||||
e.next($.pwrvid.currentVideos,$.pwrvid.currentEvents)
|
||||
}
|
||||
}
|
||||
if(parseInt(e.eventLimit) >= 1000){
|
||||
$.confirm.e.modal('show');
|
||||
$.confirm.title.text(lang['Warning']+'!')
|
||||
e.html=lang.powerVideoEventLimit
|
||||
$.confirm.body.html(e.html)
|
||||
$.confirm.click({title:lang.Request,class:'btn-primary'},function(){
|
||||
getTheData()
|
||||
});
|
||||
}else{
|
||||
getTheData()
|
||||
}
|
||||
}
|
||||
$('#vis_monitors,#pvideo_event_limit,#pvideo_video_limit').change(function(){
|
||||
$.pwrvid.f.submit()
|
||||
})
|
||||
$.pwrvid.f.submit(function(e){
|
||||
e.preventDefault();
|
||||
$.pwrvid.drawTimeline()
|
||||
return false;
|
||||
})
|
||||
$.pwrvid.e.on('hidden.bs.modal',function(e){
|
||||
$(this).find('iframe').attr('src','about:blank')
|
||||
$.pwrvid.vp.find('.holder').empty()
|
||||
delete($.pwrvid.currentDataObject)
|
||||
delete($.pwrvid.currentData)
|
||||
$.pwrvid.mL.empty()
|
||||
$.pwrvid.d.empty()
|
||||
})
|
||||
})
|
48
web/libs/js/dash2.probe.js
Normal file
48
web/libs/js/dash2.probe.js
Normal file
|
@ -0,0 +1,48 @@
|
|||
$(document).ready(function(e){
|
||||
//probe
|
||||
$.pB={e:$('#probe')};$.pB.f=$.pB.e.find('form');$.pB.o=$.pB.e.find('.output_data');
|
||||
$.pB.f.submit(function(e){
|
||||
|
||||
$.pB.e.find('._loading').show()
|
||||
$.pB.o.empty();
|
||||
$.pB.e.find('.stop').show();
|
||||
$.pB.e.find('[type="submit"]').hide();
|
||||
|
||||
e.preventDefault();e.e=$(this),e.s=e.e.serializeObject();
|
||||
e.s.url=e.s.url.trim();
|
||||
var flags = '';
|
||||
switch(e.s.mode){
|
||||
case'json':
|
||||
flags = '-v quiet -print_format json -show_format -show_streams';
|
||||
break;
|
||||
}
|
||||
// if(e.s.url.indexOf('{{JSON}}')>-1){
|
||||
// e.s.url='-v quiet -print_format json -show_format -show_streams '+e.s.url
|
||||
// }
|
||||
$.get($.ccio.init('location',$user)+$user.auth_token+'/probe/'+$user.ke+'?url='+e.s.url+'&flags='+flags,function(data){
|
||||
if(data.ok===true){
|
||||
var html
|
||||
try{
|
||||
html = $.ccio.init('jsontoblock',JSON.parse(data.result))
|
||||
}catch(err){
|
||||
html = data.result
|
||||
}
|
||||
$.pB.o.append(html)
|
||||
}else{
|
||||
$.ccio.init('note',{title:'Failed to Probe',text:data.error,type:'error'});
|
||||
}
|
||||
$.pB.e.find('._loading').hide()
|
||||
$.pB.o.append('<div><b>END</b></div>');
|
||||
$.pB.e.find('.stop').hide();
|
||||
$.pB.e.find('[type="submit"]').show();
|
||||
})
|
||||
return false;
|
||||
});
|
||||
$.pB.e.on('hidden.bs.modal',function(){
|
||||
$.pB.o.empty()
|
||||
})
|
||||
$.pB.e.find('.stop').click(function(e){
|
||||
e.e=$(this);
|
||||
// $.ccio.cx({f:'ffprobe',ff:'stop'})
|
||||
});
|
||||
})
|
200
web/libs/js/dash2.regioneditor.js
Normal file
200
web/libs/js/dash2.regioneditor.js
Normal file
|
@ -0,0 +1,200 @@
|
|||
$(document).ready(function(e){
|
||||
//Region Editor
|
||||
$.zO={e:$('#region_editor')};
|
||||
$.zO.f=$.zO.e.find('form');
|
||||
$.zO.o=function(){return $.zO.e.find('canvas')};
|
||||
$.zO.c=$.zO.e.find('.canvas_holder');
|
||||
$.zO.name=$.zO.e.find('[name="name"]');
|
||||
$.zO.rl=$('#regions_list');
|
||||
$.zO.rp=$('#regions_points');
|
||||
$.zO.ca=$('#regions_canvas');
|
||||
$.zO.saveCoords=function(){
|
||||
$.aM.e.find('[detail="cords"]').val(JSON.stringify($.zO.regionViewerDetails.cords)).change()
|
||||
}
|
||||
$.zO.initRegionList=function(){
|
||||
$('#regions_list,#region_points').empty();
|
||||
$.each($.zO.regionViewerDetails.cords,function(n,v){
|
||||
if(v&&v.name){
|
||||
$.zO.rl.append('<option value="'+n+'">'+v.name+'</option>')
|
||||
}
|
||||
});
|
||||
$.zO.rl.change();
|
||||
}
|
||||
$.zO.rl.change(function(e){
|
||||
$.zO.initCanvas();
|
||||
})
|
||||
$.zO.initLiveStream=function(e){
|
||||
var e={}
|
||||
e.re=$('#region_editor_live');
|
||||
e.re.find('iframe,img').attr('src','about:blank').hide()
|
||||
if($('#region_still_image').is(':checked')){
|
||||
e.re=e.re.find('img')
|
||||
e.choice='jpeg'
|
||||
}else{
|
||||
e.re=e.re.find('iframe')
|
||||
e.choice='embed'
|
||||
}
|
||||
e.src=$.ccio.init('location',$user)+$user.auth_token+'/'+e.choice+'/'+$user.ke+'/'+$.aM.selected.mid
|
||||
if(e.choice=='embed'){
|
||||
e.src+='/fullscreen|jquery|relative'
|
||||
}else{
|
||||
e.src+='/s.jpg'
|
||||
}
|
||||
if(e.re.attr('src')!==e.src){
|
||||
e.re.attr('src',e.src).show()
|
||||
}
|
||||
e.re.attr('width',$.zO.regionViewerDetails.detector_scale_x)
|
||||
e.re.attr('height',$.zO.regionViewerDetails.detector_scale_y)
|
||||
}
|
||||
$('#region_still_image').change(function(e){
|
||||
e.o=$.ccio.op().switches
|
||||
if(!e.o){e.o={}}
|
||||
if($(this).is(':checked')){
|
||||
e.o.regionStillImage=1
|
||||
}else{
|
||||
e.o.regionStillImage="0"
|
||||
}
|
||||
$.ccio.op('switches',e.o)
|
||||
$.zO.initLiveStream()
|
||||
}).ready(function(e){
|
||||
e.switches=$.ccio.op().switches
|
||||
if(e.switches&&e.switches.regionStillImage===1){
|
||||
$('#region_still_image').prop('checked',true)
|
||||
}
|
||||
})
|
||||
$.zO.initCanvas=function(){
|
||||
var e={};
|
||||
e.ar=[];
|
||||
e.val=$.zO.rl.val();
|
||||
if(!e.val){
|
||||
$.zO.f.find('[name="name"]').val('')
|
||||
$.zO.f.find('[name="sensitivity"]').val('')
|
||||
$.zO.f.find('[name="max_sensitivity"]').val('')
|
||||
$.zO.f.find('[name="threshold"]').val('')
|
||||
$.zO.f.find('[name="color_threshold"]').val('')
|
||||
$.zO.rp.empty()
|
||||
}else{
|
||||
e.cord=$.zO.regionViewerDetails.cords[e.val];
|
||||
if(!e.cord.points){e.cord.points=[[0,0],[0,100],[100,0]]}
|
||||
$.each(e.cord.points,function(n,v){
|
||||
e.ar=e.ar.concat(v)
|
||||
});
|
||||
if(isNaN(e.cord.sensitivity)){
|
||||
e.cord.sensitivity=$.zO.regionViewerDetails.detector_sensitivity;
|
||||
}
|
||||
$.zO.f.find('[name="name"]').val(e.val)
|
||||
$.zO.e.find('.cord_name').text(e.val)
|
||||
$.zO.f.find('[name="sensitivity"]').val(e.cord.sensitivity)
|
||||
$.zO.f.find('[name="max_sensitivity"]').val(e.cord.max_sensitivity)
|
||||
$.zO.f.find('[name="threshold"]').val(e.cord.threshold)
|
||||
$.zO.f.find('[name="color_threshold"]').val(e.cord.color_threshold)
|
||||
$.zO.e.find('.canvas_holder canvas').remove();
|
||||
|
||||
$.zO.initLiveStream()
|
||||
e.e=$.zO.ca.val(e.ar.join(','))
|
||||
e.e.canvasAreaDraw({
|
||||
imageUrl:placeholder.getData(placeholder.plcimg({
|
||||
bgcolor:'transparent',
|
||||
text:' ',
|
||||
size:$.zO.regionViewerDetails.detector_scale_x+'x'+$.zO.regionViewerDetails.detector_scale_y
|
||||
}))
|
||||
});
|
||||
e.e.change();
|
||||
}
|
||||
}
|
||||
$.zO.e.on('change','[name]:not([name="name"])',function(){
|
||||
var el = $(this)
|
||||
var val = el.val()
|
||||
var key = el.attr('name')
|
||||
$.zO.regionViewerDetails.cords[$.zO.rl.val()][key] = val
|
||||
$.zO.saveCoords()
|
||||
})
|
||||
$.zO.e.on('change','[name="name"]',function(e){
|
||||
e.old=$.zO.rl.val();
|
||||
e.new=$.zO.name.val();
|
||||
$.zO.regionViewerDetails.cords[e.new]=$.zO.regionViewerDetails.cords[e.old];
|
||||
delete($.zO.regionViewerDetails.cords[e.old]);
|
||||
$.zO.rl.find('option[value="'+e.old+'"]').attr('value',e.new).text(e.new)
|
||||
$.zO.saveCoords()
|
||||
})
|
||||
$.zO.e.on('change','[point]',function(e){
|
||||
e.points=[];
|
||||
$('[points]').each(function(n,v){
|
||||
v=$(v);
|
||||
n=v.find('[point="x"]').val();
|
||||
if(n){
|
||||
e.points.push([n,v.find('[point="y"]').val()])
|
||||
}
|
||||
})
|
||||
$.zO.regionViewerDetails.cords[$.zO.name.val()].points=e.points;
|
||||
$.zO.initCanvas();
|
||||
})
|
||||
$.zO.e.find('.erase').click(function(e){
|
||||
e.arr=[]
|
||||
$.each($.zO.regionViewerDetails.cords,function(n,v){
|
||||
if(v&&v!==$.zO.regionViewerDetails.cords[$.zO.rl.val()]){
|
||||
e.arr.push(v)
|
||||
}
|
||||
})
|
||||
$.zO.regionViewerDetails.cords=e.arr.concat([]);
|
||||
if(Object.keys($.zO.regionViewerDetails.cords).length>0){
|
||||
$.zO.initRegionList();
|
||||
}else{
|
||||
$.zO.f.find('input').prop('disabled',true)
|
||||
$('#regions_points tbody').empty()
|
||||
$('#regions_list [value="'+$.zO.rl.val()+'"]').remove()
|
||||
$.aM.e.find('[detail="cords"]').val('[]')
|
||||
}
|
||||
});
|
||||
//$.zO.e.find('.new').click(function(e){
|
||||
// $.zO.regionViewerDetails.cords[$.zO.rl.val()]
|
||||
// $.zO.initRegionList();
|
||||
//})
|
||||
$.zO.e.on('changed','#regions_canvas',function(e){
|
||||
e.val=$(this).val().replace(/(,[^,]*),/g, '$1;').split(';');
|
||||
e.ar=[];
|
||||
$.each(e.val,function(n,v){
|
||||
v=v.split(',')
|
||||
if(v[1]){
|
||||
e.ar.push([v[0],v[1]])
|
||||
}
|
||||
})
|
||||
$.zO.regionViewerDetails.cords[$.zO.rl.val()].points=e.ar;
|
||||
e.selected=$.zO.regionViewerDetails.cords[$.zO.rl.val()];
|
||||
e.e=$('#regions_points tbody').empty();
|
||||
$.each($.zO.regionViewerDetails.cords[$.zO.rl.val()].points,function(n,v){
|
||||
if(isNaN(v[0])){v[0]=20}
|
||||
if(isNaN(v[1])){v[1]=20}
|
||||
e.e.append('<tr points="'+n+'"><td><input class="form-control" placeholder="X" point="x" value="'+v[0]+'"></td><td><input class="form-control" placeholder="Y" point="y" value="'+v[1]+'"></td><td class="text-right"><a class="delete btn btn-danger"><i class="fa fa-trash-o"></i></a></td></tr>')
|
||||
});
|
||||
$.zO.saveCoords()
|
||||
})
|
||||
$.zO.f.submit(function(e){
|
||||
e.preventDefault();e.e=$(this),e.s=e.e.serializeObject();
|
||||
|
||||
return false;
|
||||
});
|
||||
$('#regions_points')
|
||||
.on('click','.delete',function(e){
|
||||
e.p=$(this).parents('tr'),e.row=e.p.attr('points');
|
||||
delete($.zO.regionViewerDetails.cords[$.zO.rl.val()].points[e.row])
|
||||
$.zO.saveCoords()
|
||||
e.p.remove();
|
||||
$.zO.rl.change();
|
||||
})
|
||||
$.zO.e.on('click','.add',function(e){
|
||||
$.zO.f.find('input').prop('disabled',false)
|
||||
e.gid=$.ccio.gid(5);
|
||||
e.save={};
|
||||
$.each($.zO.regionViewerDetails.cords,function(n,v){
|
||||
if(v&&v!==null&&v!=='null'){
|
||||
e.save[n]=v;
|
||||
}
|
||||
})
|
||||
$.zO.regionViewerDetails.cords=e.save;
|
||||
$.zO.regionViewerDetails.cords[e.gid]={name:e.gid,sensitivity:0.0005,max_sensitivity:'',threshold:1,color_threshold:9,points:[[0,0],[0,100],[100,0]]};
|
||||
$.zO.rl.append('<option value="'+e.gid+'">'+e.gid+'</option>');
|
||||
$.zO.rl.val(e.gid)
|
||||
$.zO.rl.change();
|
||||
});
|
||||
})
|
917
web/libs/js/dash2.socketio.js
Normal file
917
web/libs/js/dash2.socketio.js
Normal file
|
@ -0,0 +1,917 @@
|
|||
$(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)
|
||||
}
|
||||
$.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 <b>'+d.details.name+'</b>')
|
||||
}
|
||||
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 .value').html(d.human)
|
||||
$('.diskUsed .percent').html(d.percent)
|
||||
$('.diskUsed .progress-bar').css('width',d.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:'<b>'+d.mon.name+'</b> <small>'+d.mon.mid+'</small> 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 <b>'+d.mid+'</b> is now running in mode <b>'+d.mode+'</b>',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("<canvas></canvas>")
|
||||
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,
|
||||
// round: 'day'
|
||||
}
|
||||
}],
|
||||
},
|
||||
}
|
||||
};
|
||||
|
||||
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('<li class="glM'+target.row.mid+$user.auth_token+'" mid="'+target.row.mid+'" ke="'+target.row.ke+'" status="'+target.row.status+'" file="'+target.row.filename+'" auth="'+$user.auth_token+'"><a class="btn btn-sm btn-primary" preview="video" href="'+target.row.href+'"><i class="fa fa-play-circle"></i></a></li>').find('a').click()
|
||||
});
|
||||
var colorNames = Object.keys(window.chartColors);
|
||||
}else{
|
||||
$.pwrvid.e.find('.nodata').show()
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
$user.ws=io(location.origin,{
|
||||
path : tool.checkCorrectPathEnding(location.pathname)+'socket.io'
|
||||
});
|
||||
$user.ws.on('connect',function (d){
|
||||
$(document).ready(function(e){
|
||||
$.ccio.init('id',$user);
|
||||
$.ccio.cx({f:'init',ke:$user.ke,auth:$user.auth_token,uid:$user.uid})
|
||||
if($user.details&&$user.details.links){
|
||||
$.each($user.details.links,function(n,v){
|
||||
if(v.secure==='0'){
|
||||
v.protocol='http'
|
||||
}else{
|
||||
v.protocol='https'
|
||||
}
|
||||
if(v.host.indexOf('://')>-1){
|
||||
v.URL=v.protocol+'://'+v.host.split('://')[1]
|
||||
}else{
|
||||
v.URL=v.protocol+'://'+v.host
|
||||
}
|
||||
$.get(v.URL+'/'+v.api+'/userInfo/'+v.ke,function(e){
|
||||
if(e.ok===true){
|
||||
e.user.auth_token=v.api
|
||||
$.users[v.api]=e.user
|
||||
$.users[v.api].info=v
|
||||
$.users[v.api].ws=io(v.host)
|
||||
$.users[v.api].ws.on('ping', function(d){
|
||||
$.users[v.api].ws.emit('pong',{beat:1});
|
||||
});
|
||||
$.users[v.api].ws.on('connect',function (d){
|
||||
console.log(v.host,'connected')
|
||||
$.ccio.cx({f:'init',ke:e.user.ke,auth:v.api,uid:e.user.uid},$.users[v.api])
|
||||
})
|
||||
$.users[v.api].ws.on('f',function (d){
|
||||
$.ccio.globalWebsocket(d,$.users[v.api])
|
||||
})
|
||||
}
|
||||
})
|
||||
})
|
||||
}
|
||||
})
|
||||
})
|
||||
PNotify.prototype.options.styling = "fontawesome";
|
||||
$user.ws.on('ping', function(d){
|
||||
$user.ws.emit('pong',{beat:1});
|
||||
});
|
||||
$user.ws.on('f',function (d){
|
||||
$.ccio.globalWebsocket(d)
|
||||
switch(d.f){
|
||||
case'api_key_deleted':
|
||||
if($user.uid === d.uid){
|
||||
$.ccio.init('note',{title:lang['API Key Deleted'],text:lang.APIKeyDeletedText,type:'notice'});
|
||||
$('[api_key="'+d.form.code+'"]').remove()
|
||||
}
|
||||
break;
|
||||
case'api_key_added':
|
||||
if($user.uid === d.uid){
|
||||
$.ccio.init('note',{title:lang['API Key Added'],text:lang.FiltersUpdatedText,type:'success'});
|
||||
$.ccio.tm(3,d.form,'#api_list')
|
||||
}
|
||||
break;
|
||||
case'filters_change':
|
||||
$.ccio.init('note',{title:lang['Filters Updated'],text:lang.FiltersUpdatedText,type:'success'});
|
||||
$user.details.filters=d.filters;
|
||||
$.ccio.init('filters');
|
||||
break;
|
||||
case'user_settings_change':
|
||||
$.ccio.init('note',{title:lang['Settings Changed'],text:lang.SettingsChangedText,type:'success'});
|
||||
$.ccio.init('id',d.form);
|
||||
d.form.details=JSON.parse(d.form.details)
|
||||
$('#custom_css').append(d.form.details.css)
|
||||
if(d.form.details){
|
||||
$user.details=d.form.details
|
||||
}
|
||||
break;
|
||||
case'users_online':
|
||||
$.ccio.pm('user-row',d.users);
|
||||
break;
|
||||
case'user_status_change':
|
||||
if(d.status===1){
|
||||
$.ccio.tm('user-row',d.user,null)
|
||||
}else{
|
||||
$('.user-row[uid="'+d.uid+'"][ke="'+d.ke+'"]').remove()
|
||||
}
|
||||
break;
|
||||
case'ffprobe_stop':
|
||||
$.pB.e.find('._loading').hide()
|
||||
$.pB.o.append('<div><b>END</b></div>');
|
||||
$.pB.e.find('.stop').hide();
|
||||
$.pB.e.find('[type="submit"]').show();
|
||||
break;
|
||||
case'ffprobe_start':
|
||||
$.pB.e.find('._loading').show()
|
||||
$.pB.o.empty();
|
||||
$.pB.e.find('.stop').show();
|
||||
$.pB.e.find('[type="submit"]').hide();
|
||||
break;
|
||||
case'ffprobe_data':
|
||||
$.pB.results=JSON.parse(d.data)
|
||||
$.pB.o.append($.ccio.init('jsontoblock',$.pB.results))
|
||||
break;
|
||||
case'detector_cascade_list':
|
||||
d.tmp=''
|
||||
$.each(d.cascades,function(n,v){
|
||||
d.tmp+='<li class="mdl-list__item">';
|
||||
d.tmp+='<span class="mdl-list__item-primary-content">';
|
||||
d.tmp+=v;
|
||||
d.tmp+='</span>';
|
||||
d.tmp+='<span class="mdl-list__item-secondary-action">';
|
||||
d.tmp+='<label class="mdl-switch mdl-js-switch mdl-js-ripple-effect">';
|
||||
d.tmp+='<input type="checkbox" value="'+v+'" detailContainer="detector_cascades" detailObject="'+v+'" class="detector_cascade_selection mdl-switch__input"/>';
|
||||
d.tmp+='</label>';
|
||||
d.tmp+='</span>';
|
||||
d.tmp+='</li>';
|
||||
})
|
||||
$('#detector_cascade_list').html(d.tmp)
|
||||
componentHandler.upgradeAllRegistered()
|
||||
//add auto select for preferences
|
||||
d.currentlyEditing=$.aM.e.attr('mid')
|
||||
if(d.currentlyEditing&&d.currentlyEditing!==''){
|
||||
d.currentlyEditing=JSON.parse(JSON.parse($.ccio.mon[d.currentlyEditing].details).detector_cascades)
|
||||
$.each(d.currentlyEditing,function(m,b){
|
||||
d.e=$('.detector_cascade_selection[value="'+m+'"]').prop('checked',true)
|
||||
d.p=d.e.parents('.mdl-js-switch')
|
||||
if(d.p.length>0){
|
||||
d.p.addClass('is-checked')
|
||||
}
|
||||
})
|
||||
}
|
||||
break;
|
||||
case'detector_plugged':
|
||||
$.aM.addDetectorPlugin(d.plug,d)
|
||||
break;
|
||||
case'detector_unplugged':
|
||||
$.aM.removeDetectorPlugin(d.plug)
|
||||
break;
|
||||
case'monitor_edit_failed':
|
||||
d.pnote={title:'Monitor Not Saved',text:'<b>'+d.mon.name+'</b> <small>'+d.mon.mid+'</small> has not been saved.',type:'error'}
|
||||
switch(d.ff){
|
||||
case'max_reached':
|
||||
d.pnote.text+=' '+lang.monitorEditFailedMaxReached
|
||||
break;
|
||||
}
|
||||
$.ccio.init('note',d.pnote);
|
||||
break;
|
||||
// case'onvif_end':
|
||||
// if(Object.keys($.oB.foundMonitorsCount).length===0){
|
||||
// $.oB.e.find('._loading').hide()
|
||||
// $.oB.e.find('[type="submit"]').prop('disabled',false)
|
||||
// $.oB.o.append('<td class="text-center _notfound">Sorry, nothing was found.</td>')
|
||||
// }
|
||||
// break;
|
||||
case'onvif':
|
||||
var tempID = $.ccio.gid();
|
||||
$.oB.foundMonitors[tempID] = Object.assign({},d);
|
||||
$.oB.e.find('._loading').hide()
|
||||
$.oB.e.find('._notfound').remove()
|
||||
$.oB.e.find('[type="submit"]').prop('disabled',false)
|
||||
d.info=$.ccio.init('jsontoblock',d.info)
|
||||
if(d.uri){
|
||||
d.stream=d.uri
|
||||
}else{
|
||||
d.stream='URL not Found'
|
||||
}
|
||||
$('#onvif_probe .output_data').append('<tr onvif_row="'+tempID+'"><td><a class="btn btn-sm btn-primary copy"> <i class="fa fa-copy"></i> </a></td><td class="ip">'+d.ip+'</td><td class="port">'+d.port+'</td><td>'+$.ccio.init('jsontoblock',d.info)+'</td><td class="url">'+d.stream+'</td></tr>')
|
||||
break;
|
||||
}
|
||||
delete(d);
|
||||
});
|
||||
})
|
334
web/libs/js/dash2.timelapse.js
Normal file
334
web/libs/js/dash2.timelapse.js
Normal file
|
@ -0,0 +1,334 @@
|
|||
$(document).ready(function(e){
|
||||
//Timelapse Window
|
||||
$.timelapse={e:$('#timelapse')}
|
||||
$.timelapse.f=$.timelapse.e.find('form'),
|
||||
$.timelapse.meter=$.timelapse.e.find('.motion-meter'),
|
||||
$.timelapse.line=$('#timelapse_video_line'),
|
||||
$.timelapse.display=$('#timelapse_video_display'),
|
||||
$.timelapse.seekBar=$('#timelapse_seekBar'),
|
||||
$.timelapse.seekBarProgress=$.timelapse.seekBar.find('.progress-bar'),
|
||||
$.timelapse.dr=$('#timelapse_daterange'),
|
||||
$.timelapse.mL=$.timelapse.e.find('.motion_list'),
|
||||
$.timelapse.monitors=$.timelapse.e.find('.monitors_list');
|
||||
$.timelapse.playDirection='videoAfter'
|
||||
$.timelapse.playRate=15
|
||||
$.timelapse.placeholder=placeholder.getData(placeholder.plcimg({bgcolor:'#b57d00',text:'...'}))
|
||||
$.timelapse.dr.daterangepicker({
|
||||
startDate:$.ccio.timeObject().subtract(moment.duration("24:00:00")),
|
||||
endDate:$.ccio.timeObject().add(moment.duration("24:00:00")),
|
||||
timePicker: true,
|
||||
timePicker24Hour: true,
|
||||
timePickerSeconds: true,
|
||||
timePickerIncrement: 30,
|
||||
locale: {
|
||||
format: 'MM/DD/YYYY h:mm A'
|
||||
}
|
||||
},function(start, end, label){
|
||||
$.timelapse.drawTimeline()
|
||||
$.timelapse.dr.focus()
|
||||
});
|
||||
$.timelapse.f.find('input,select').change(function(){
|
||||
$.timelapse.f.submit()
|
||||
})
|
||||
$.timelapse.f.submit(function(e){
|
||||
e.preventDefault();
|
||||
$.timelapse.drawTimeline()
|
||||
return false;
|
||||
})
|
||||
$.timelapse.drawTimeline=function(getData){
|
||||
var e={};
|
||||
if(getData===undefined){getData=true}
|
||||
var mid = $.timelapse.monitors.val()
|
||||
e.dateRange=$.timelapse.dr.data('daterangepicker');
|
||||
e.dateRange={startDate:e.dateRange.startDate,endDate:e.dateRange.endDate}
|
||||
e.videoURL=$.ccio.init('location',$user)+$user.auth_token+'/videos/'+$user.ke+'/'+mid;
|
||||
e.videoURL+='?limit=100&start='+$.ccio.init('th',e.dateRange.startDate)+'&end='+$.ccio.init('th',e.dateRange.endDate);
|
||||
e.next=function(videos){
|
||||
$.timelapse.currentVideos={}
|
||||
e.tmp=''
|
||||
$.each(videos.videos,function(n,v){
|
||||
if(!v||!v.time){return}
|
||||
// v.filename=$.ccio.init('tf',v.time)+'.'+v.ext;
|
||||
v.videoBefore=videos.videos[n-1];
|
||||
v.videoAfter=videos.videos[n+1];
|
||||
// if(v.href.charAt(0)==='/'){
|
||||
// v.href=$.ccio.init('location',user)+(v.href.substring(1))
|
||||
// v.videoURL=$.ccio.init('location',user)+(v.videoURL.substring(1))
|
||||
// }
|
||||
v.position=n;
|
||||
$.timelapse.currentVideos[v.filename]=v;
|
||||
e.tmp+='<li class="glM'+v.mid+$user.auth_token+' list-group-item timelapse_video flex-block" timelapse="video" file="'+v.filename+'" href="'+v.href+'" mid="'+v.mid+'" ke="'+v.ke+'" auth="'+$user.auth_token+'">'
|
||||
e.tmp+='<div class="flex-block">'
|
||||
e.tmp+='<div class="flex-unit-3"><div class="frame" style="background-image:url('+$.timelapse.placeholder+')"></div></div>'
|
||||
e.tmp+='<div class="flex-unit-3"><div><span title="'+v.time+'" class="livestamp"></span></div><div>'+v.filename+'</div></div>'
|
||||
e.tmp+='<div class="flex-unit-3 text-right"><a class="btn btn-default" download="'+v.mid+'-'+v.filename+'" href="'+v.href+'"> <i class="fa fa-download"></i> </a> <a class="btn btn-danger" video="delete" href="'+$.ccio.init('videoHrefToDelete',v.href)+'"> <i class="fa fa-trash-o"></i> </a></div>'
|
||||
e.tmp+='</div>'
|
||||
e.tmp+='<div class="flex-block">'
|
||||
e.tmp+='<div class="flex-unit-3"><div class="progress"><div class="progress-bar progress-bar-primary" role="progressbar" style="width:0%"></div></div></div>'
|
||||
e.tmp+='</div>'
|
||||
e.tmp+='</li>'
|
||||
})
|
||||
$.timelapse.line.html(e.tmp)
|
||||
$.ccio.init('ls')
|
||||
if(getData===true){
|
||||
e.timeout=50
|
||||
}else{
|
||||
e.timeout=2000
|
||||
}
|
||||
setTimeout(function(){
|
||||
if($.timelapse.e.find('.timelapse_video.active').length===0){
|
||||
$.timelapse.e.find('[timelapse="video"]').first().click()
|
||||
}
|
||||
},e.timeout)
|
||||
}
|
||||
if(getData===true){
|
||||
$.getJSON(e.videoURL,function(videos){
|
||||
videos.videos=videos.videos.reverse()
|
||||
$.timelapse.currentVideosArray=videos
|
||||
e.next(videos)
|
||||
})
|
||||
}else{
|
||||
e.next($.timelapse.currentVideosArray)
|
||||
}
|
||||
}
|
||||
$.timelapse.playButtonIcon = $.timelapse.e.find('[timelapse="play"]').find('i')
|
||||
$.timelapse.timelapseSpeedUseBasicSwitch = $('#timelapseSpeedUseBasic')
|
||||
$.timelapse.timelapseSpeedUseBasicSwitch.on('change',function(){
|
||||
var el = $.timelapse.e.find('.timelapseSpeedUseBasicSwitch')
|
||||
if($(this).is(':checked')){
|
||||
el.hide()
|
||||
}else{
|
||||
el.show()
|
||||
}
|
||||
$.timelapse.play()
|
||||
})
|
||||
$.timelapse.getUseBasicStatus = function(){return $.timelapse.timelapseSpeedUseBasicSwitch.prop('checked')}
|
||||
$.timelapse.onPlayPause = function(toggleGui,secondWind){
|
||||
if($.timelapse.paused === true){
|
||||
$.timelapse.paused = false
|
||||
if(toggleGui === true)$.timelapse.play();
|
||||
}else{
|
||||
$.timelapse.paused = true
|
||||
if(toggleGui === true)$.timelapse.pause(secondWind);
|
||||
}
|
||||
}
|
||||
$.timelapse.pause = function(secondWind){
|
||||
//secondWind is used because sometimes pause can be pressed just as a video ends and the pause command does not register on the next video.
|
||||
var videoNow = $.timelapse.display.find('video.videoNow')[0]
|
||||
var pause = function(){
|
||||
if(videoNow.paused == false)videoNow.pause()
|
||||
clearInterval($.timelapse.interval)
|
||||
$.timelapse.playButtonIcon.removeClass('fa-pause').addClass('fa-play')
|
||||
}
|
||||
pause()
|
||||
if(secondWind === true)setTimeout(pause,250);
|
||||
}
|
||||
$.timelapse.play = function(x){
|
||||
var videoNow = $.timelapse.display.find('video.videoNow')[0]
|
||||
$.timelapse.pause()
|
||||
clearInterval($.timelapse.interval)
|
||||
if($.timelapse.getUseBasicStatus()){
|
||||
videoNow.playbackRate = $.timelapse.playRate
|
||||
if(videoNow.paused)videoNow.play()
|
||||
}else{
|
||||
videoNow.playbackRate = 1.0
|
||||
$.timelapse.interval = setInterval(function(){
|
||||
if(videoNow.currentTime >= videoNow.duration - .2){
|
||||
clearInterval($.timelapse.interval)
|
||||
videoNow.currentTime = videoNow.duration
|
||||
}else{
|
||||
videoNow.currentTime += .5
|
||||
}
|
||||
},500 / $.timelapse.playRate)
|
||||
}
|
||||
$.timelapse.playButtonIcon.removeClass('fa-play').addClass('fa-pause')
|
||||
}
|
||||
$.timelapse.rewind = function(e){
|
||||
var videoNow = $.timelapse.display.find('video.videoNow')[0]
|
||||
$.timelapse.pause()
|
||||
videoNow.playbackRate = 1.0
|
||||
clearInterval($.timelapse.interval)
|
||||
$.timelapse.interval = setInterval(function(){
|
||||
if(videoNow.currentTime <= 0.2){
|
||||
clearInterval($.timelapse.interval)
|
||||
videoNow.currentTime = 0
|
||||
$('[timelapse][href="'+e.videoCurrentBefore.attr('video')+'"]').click()
|
||||
var videoNowNew = $.timelapse.display.find('video.videoNow')[0]
|
||||
videoNowNew.pause()
|
||||
videoNowNew.currentTime = videoNowNew.duration - 0.1
|
||||
$.timelapse.e.find('[timelapse="stepBackBack"]').click()
|
||||
}else{
|
||||
videoNow.currentTime += -.5
|
||||
}
|
||||
},500 / $.timelapse.playRate)
|
||||
$.timelapse.playButtonIcon.removeClass('fa-play').addClass('fa-pause')
|
||||
}
|
||||
$.timelapse.e.on('click','[timelapse]',function(){
|
||||
var e={}
|
||||
e.e=$(this)
|
||||
e.videoCurrentNow=$.timelapse.display.find('.videoNow')
|
||||
e.videoCurrentAfter=$.timelapse.display.find('.videoAfter')
|
||||
e.videoCurrentBefore=$.timelapse.display.find('.videoBefore')
|
||||
if($.timelapse.videoInterval){
|
||||
clearInterval($.timelapse.videoInterval);
|
||||
}
|
||||
switch(e.e.attr('timelapse')){
|
||||
case'download':
|
||||
$.timelapse.line.find('.active [download]').click()
|
||||
break;
|
||||
case'mute':
|
||||
e.videoCurrentNow[0].muted = !e.videoCurrentNow[0].muted
|
||||
$.timelapse.videoNowIsMuted = e.videoCurrentNow[0].muted
|
||||
e.e.find('i').toggleClass('fa-volume-off fa-volume-up')
|
||||
e.e.toggleClass('btn-danger')
|
||||
break;
|
||||
case'play':
|
||||
e.videoCurrentNow[0].playbackRate = $.timelapse.playRate;
|
||||
$.timelapse.onPlayPause(true,true)
|
||||
break;
|
||||
case'setPlayBackRate':
|
||||
$.timelapse.pause()
|
||||
$.timelapse.playRate = parseFloat(e.e.attr('playRate'))
|
||||
$.timelapse.play()
|
||||
break;
|
||||
case'stepFrontFront':
|
||||
e.add=e.e.attr('add')
|
||||
e.stepFrontFront=parseInt(e.e.attr('stepFrontFront'))
|
||||
if(!e.stepFrontFront||isNaN(e.stepFrontFront)){e.stepFrontFront = 5}
|
||||
if(e.add==="0"){
|
||||
$.timelapse.playRate = e.stepFrontFront
|
||||
}else{
|
||||
$.timelapse.playRate += e.stepFrontFront
|
||||
}
|
||||
e.videoCurrentNow[0].playbackRate = $.timelapse.playRate;
|
||||
e.videoCurrentNow[0].play()
|
||||
break;
|
||||
case'stepFront':
|
||||
e.videoCurrentNow[0].currentTime += 5;
|
||||
e.videoCurrentNow[0].pause()
|
||||
break;
|
||||
case'stepBackBack':
|
||||
// e.videoCurrentNow=$.timelapse.display.find('.videoNow')
|
||||
// e.videoCurrentAfter=$.timelapse.display.find('.videoAfter')
|
||||
// e.videoCurrentBefore=$.timelapse.display.find('.videoBefore')
|
||||
$.timelapse.rewind(e)
|
||||
break;
|
||||
case'stepBack':
|
||||
e.videoCurrentNow[0].currentTime += -5;
|
||||
e.videoCurrentNow[0].pause()
|
||||
break;
|
||||
case'video':
|
||||
$.timelapse.e.find('video').each(function(n,v){
|
||||
v.pause()
|
||||
})
|
||||
e.drawVideoHTML=function(position){
|
||||
var video
|
||||
var exisitingElement=$.timelapse.display.find('.'+position)
|
||||
if(position){
|
||||
video=e.video[position]
|
||||
}else{
|
||||
position='videoNow'
|
||||
video=e.video
|
||||
}
|
||||
if(video){
|
||||
$.timelapse.display.append('<video class="video_video '+position+'" video="'+video.href+'" preload><source src="'+video.href+'" type="video/'+video.ext+'"></video>')
|
||||
}
|
||||
}
|
||||
e.filename=e.e.attr('file')
|
||||
e.video=$.timelapse.currentVideos[e.filename]
|
||||
e.videoIsSame=(e.video.href==e.videoCurrentNow.attr('video'))
|
||||
e.videoIsAfter=(e.video.href==e.videoCurrentAfter.attr('video'))
|
||||
e.videoIsBefore=(e.video.href==e.videoCurrentBefore.attr('video'))
|
||||
if(e.videoIsSame||e.videoIsAfter||e.videoIsBefore){
|
||||
switch(true){
|
||||
case e.videoIsSame:
|
||||
$.ccio.log('$.timelapse','videoIsSame')
|
||||
e.videoNow=$.timelapse.display.find('video.videoNow')
|
||||
if(e.videoNow[0].paused===true){
|
||||
e.videoNow[0].play()
|
||||
}else{
|
||||
e.videoNow[0].pause()
|
||||
}
|
||||
return
|
||||
break;
|
||||
case e.videoIsAfter:
|
||||
$.ccio.log('$.timelapse','videoIsAfter')
|
||||
e.videoCurrentBefore.remove()
|
||||
e.videoCurrentAfter.removeClass('videoAfter').addClass('videoNow')
|
||||
e.videoCurrentNow.removeClass('videoNow').addClass('videoBefore')
|
||||
e.drawVideoHTML('videoAfter')
|
||||
break;
|
||||
case e.videoIsBefore:
|
||||
$.ccio.log('$.timelapse','videoIsBefore')
|
||||
e.videoCurrentAfter.remove()
|
||||
e.videoCurrentBefore.removeClass('videoBefore').addClass('videoNow')
|
||||
e.videoCurrentNow.removeClass('videoNow').addClass('videoAfter')
|
||||
e.drawVideoHTML('videoBefore')
|
||||
break;
|
||||
}
|
||||
}else{
|
||||
$.ccio.log('$.timelapse','newSetOf3')
|
||||
$.timelapse.display.empty()
|
||||
e.drawVideoHTML()//videoNow
|
||||
e.drawVideoHTML('videoBefore')
|
||||
e.drawVideoHTML('videoAfter')
|
||||
}
|
||||
$.timelapse.display.find('video').each(function(n,v){
|
||||
v.addEventListener('loadeddata', function() {
|
||||
e.videoCurrentAfterPreview=$('.timelapse_video[href="'+$(v).attr('video')+'"] .frame')
|
||||
if(e.videoCurrentAfterPreview.attr('set')!=='1'){
|
||||
$.ccio.snapshotVideo(v,function(url,buffer){
|
||||
e.videoCurrentAfterPreview.attr('set','1').css('background-image','url('+url+')')
|
||||
if($(v).hasClass('videoAfter')){
|
||||
v.currentTime=0
|
||||
v.pause()
|
||||
}
|
||||
})
|
||||
}
|
||||
}, false);
|
||||
})
|
||||
e.videoNow=$.timelapse.display.find('video.videoNow')[0]
|
||||
if($.timelapse.videoNowIsMuted){
|
||||
e.videoNow.muted=true
|
||||
}
|
||||
$.timelapse.playButtonIcon.removeClass('fa-pause').addClass('fa-play')
|
||||
$.timelapse.onended = function() {
|
||||
$.timelapse.line.find('[file="'+e.video[$.timelapse.playDirection].filename+'"]').click()
|
||||
};
|
||||
e.videoNow.onended = $.timelapse.onended
|
||||
e.videoNow.onerror = $.timelapse.onended
|
||||
//
|
||||
$(e.videoNow)
|
||||
.off('play').on('play',$.timelapse.play)
|
||||
.off('pause').on('pause',$.timelapse.onPlayPause)
|
||||
.off('timeupdate').on('timeupdate',function(){
|
||||
var value= (( e.videoNow.currentTime / e.videoNow.duration ) * 100)+"%"
|
||||
$.timelapse.seekBarProgress.css("width",value);
|
||||
$.timelapse.e.find('.timelapse_video[file="'+e.filename+'"] .progress-bar').css("width",value);
|
||||
})
|
||||
$.timelapse.play()
|
||||
$.timelapse.seekBar.off("click").on("click", function(seek){
|
||||
var offset = $(this).offset();
|
||||
var left = (seek.pageX - offset.left);
|
||||
var totalWidth = $.timelapse.seekBar.width();
|
||||
var percentage = ( left / totalWidth );
|
||||
var vidTime = e.videoNow.duration * percentage;
|
||||
e.videoNow.currentTime = vidTime;
|
||||
});
|
||||
|
||||
$.ccio.log('$.timelapse',e.video)
|
||||
$.timelapse.line.find('.timelapse_video').removeClass('active')
|
||||
e.videoCurrentNow=$.timelapse.display.find('.videoNow')
|
||||
e.e.addClass('active')
|
||||
if ($('#timelapse_video_line:hover').length === 0) {
|
||||
$.timelapse.line.animate({scrollTop:$.timelapse.line.scrollTop() + e.e.position().top - $.timelapse.line.height()/2 + e.e.height()/2 - 40});
|
||||
}
|
||||
break;
|
||||
}
|
||||
$.timelapse.e.find('.timelapse_playRate').text('x'+$.timelapse.playRate)
|
||||
})
|
||||
$.timelapse.e.on('hidden.bs.modal',function(e){
|
||||
delete($.timelapse.currentVideos)
|
||||
delete($.timelapse.currentVideosArray)
|
||||
})
|
||||
})
|
101
web/libs/js/dash2.usersettings.js
Normal file
101
web/libs/js/dash2.usersettings.js
Normal file
|
@ -0,0 +1,101 @@
|
|||
$(document).ready(function(e){
|
||||
//settings window
|
||||
$.sM={e:$('#settings')};
|
||||
$.sM.f=$.sM.e.find('form');
|
||||
$.sM.links=$('#linkShinobi');
|
||||
$.sM.g=$('#settings_mon_groups');
|
||||
$.sM.md=$.sM.f.find('[detail]');
|
||||
$.sM.md.change($.ccio.form.details);
|
||||
$.sM.f.find('[selector]').change(function(e){
|
||||
e.v=$(this).val();e.a=$(this).attr('selector')
|
||||
$.sM.f.find('.'+e.a+'_input').hide()
|
||||
$.sM.f.find('.'+e.a+'_'+e.v).show();
|
||||
$.sM.f.find('.'+e.a+'_text').text($(this).find('option:selected').text())
|
||||
});
|
||||
$.sM.writewMonGroups=function(){
|
||||
$.sM.f.find('[detail="mon_groups"]').val(JSON.stringify($user.mon_groups)).change()
|
||||
}
|
||||
$.sM.reDrawMonGroups=function(){
|
||||
$.sM.g.empty();
|
||||
$.ccio.pm('option',$user.mon_groups,'#settings_mon_groups')
|
||||
$.sM.g.change();
|
||||
};
|
||||
$.sM.f.submit(function(e){
|
||||
e.preventDefault();
|
||||
$.sM.writewMonGroups()
|
||||
$.sM.linkChange()
|
||||
e.e=$(this),e.s=e.e.serializeObject();
|
||||
e.er=[];
|
||||
if(e.s.pass!==''&&e.password_again===e.s.pass){e.er.push(lang['Passwords don\'t match'])};
|
||||
if(e.er.length>0){$.sM.e.find('.msg').html(e.er.join('<br>'));return;}
|
||||
$.each(e.s,function(n,v){e.s[n]=v.trim()})
|
||||
$.ccio.cx({f:'settings',ff:'edit',form:e.s})
|
||||
$.sM.e.modal('hide')
|
||||
});
|
||||
$.sM.e.on('shown.bs.modal',function(){
|
||||
$.sM.reDrawMonGroups()
|
||||
})
|
||||
$.sM.g.change(function(e){
|
||||
e.v=$(this).val();
|
||||
e.group=$user.mon_groups[e.v];
|
||||
if(!e.group){return}
|
||||
$.sM.selectedMonGroup=e.group;
|
||||
$.each(e.group,function(n,v){
|
||||
$.sM.f.find('[group="'+n+'"]').val(v)
|
||||
})
|
||||
});
|
||||
$.sM.f.find('[group]').change(function(){
|
||||
e = {}
|
||||
e.v = $.sM.g.val()
|
||||
if(!e.v||e.v==''){
|
||||
e.e = $.sM.f.find('[group="name"]')
|
||||
e.name = e.e.val()
|
||||
$('.mon_groups .add').click();
|
||||
e.v = $.sM.g.val()
|
||||
e.e.val(e.name)
|
||||
}
|
||||
e.group=$user.mon_groups[e.v];
|
||||
$.sM.f.find('[group]').each(function(n,v){
|
||||
v=$(v)
|
||||
e.group[v.attr('group')]=v.val()
|
||||
});
|
||||
$user.mon_groups[e.v]=e.group;
|
||||
$.sM.g.find('option[value="'+$.sM.g.val()+'"]').text(e.group.name)
|
||||
$.sM.writewMonGroups()
|
||||
})
|
||||
$.sM.f.on('click','.mon_groups .delete',function(e){
|
||||
e.v=$.sM.g.val();
|
||||
delete($user.mon_groups[e.v]);
|
||||
$.sM.reDrawMonGroups()
|
||||
})
|
||||
$.sM.f.on('click','.mon_groups .add',function(e){
|
||||
e.gid=$.ccio.gid(5);
|
||||
$user.mon_groups[e.gid]={id:e.gid,name:e.gid};
|
||||
$.sM.g.append($.ccio.tm('option',$user.mon_groups[e.gid]));
|
||||
$.sM.g.val(e.gid)
|
||||
$.sM.g.change();
|
||||
});
|
||||
$.sM.linkChange=function(){
|
||||
var e={};
|
||||
e.e=$.sM.e.find('[name="details"]')
|
||||
e.details=JSON.parse(e.e.val())
|
||||
e.details.links=[]
|
||||
$.sM.links.find('.linksGroup').each(function(n,v){
|
||||
var arr={}
|
||||
$(v).find('[link]').each(function(m,b){
|
||||
arr[$(b).attr('link')]=$(b).val()
|
||||
})
|
||||
e.details.links.push(arr)
|
||||
})
|
||||
e.e.val(JSON.stringify(e.details))
|
||||
}
|
||||
$.sM.f.on('change','[link]',$.sM.linkChange)
|
||||
$.sM.e.on('click','.linkShinobi .delete',function(){
|
||||
$(this).parents('.linksGroup').remove()
|
||||
$.sM.linkChange()
|
||||
})
|
||||
$.sM.e.find('.linkShinobi .add').click(function(){
|
||||
$.ccio.tm('link-set',{},'#linkShinobi')
|
||||
$.sM.linkChange()
|
||||
})
|
||||
})
|
174
web/libs/js/dash2.vidview.js
Normal file
174
web/libs/js/dash2.vidview.js
Normal file
|
@ -0,0 +1,174 @@
|
|||
$(document).ready(function(e){
|
||||
//videos window
|
||||
$.vidview={
|
||||
e:$('#videos_viewer'),
|
||||
pages:$('#videos_viewer_pages'),
|
||||
limit:$('#videos_viewer_limit'),
|
||||
dr:$('#videos_viewer_daterange'),
|
||||
preview:$('#videos_viewer_preview'),
|
||||
set:$('#videos_viewer_set')
|
||||
}
|
||||
$.vidview.set.change(function(){
|
||||
var el = $(this)
|
||||
var isCloud = (el.val() === 'cloud')
|
||||
var zipDlButton = $.vidview.e.find('.export_selected,.merge_selected')
|
||||
if(isCloud){
|
||||
zipDlButton.hide()
|
||||
}else{
|
||||
zipDlButton.show()
|
||||
}
|
||||
|
||||
})
|
||||
$.vidview.f=$.vidview.e.find('form')
|
||||
$.vidview.dr.daterangepicker({
|
||||
startDate:$.ccio.timeObject().subtract(moment.duration("24:00:00")),
|
||||
endDate:$.ccio.timeObject().add(moment.duration("24:00:00")),
|
||||
timePicker: true,
|
||||
timePicker24Hour: true,
|
||||
timePickerSeconds: true,
|
||||
timePickerIncrement: 30,
|
||||
locale: {
|
||||
format: 'MM/DD/YYYY h:mm A'
|
||||
}
|
||||
},function(start, end, label){
|
||||
$.vidview.launcher.click()
|
||||
$.vidview.dr.focus()
|
||||
});
|
||||
$.vidview.e.on('change','#videos_select_all',function(e){
|
||||
e.e=$(this);
|
||||
e.p=e.e.prop('checked')
|
||||
e.a=$.vidview.e.find('input[type=checkbox][name]')
|
||||
if(e.p===true){
|
||||
e.a.prop('checked',true)
|
||||
}else{
|
||||
e.a.prop('checked',false)
|
||||
}
|
||||
})
|
||||
$.vidview.f.submit(function(e){
|
||||
e.preventDefault();
|
||||
$.vidview.launcher.click()
|
||||
return false;
|
||||
})
|
||||
$('#videos_viewer_limit,#videos_viewer_daterange,#videos_viewer_set').change(function(){
|
||||
$.vidview.f.submit()
|
||||
})
|
||||
$.vidview.getSelected = function(getArray){
|
||||
var arr = {}
|
||||
if(getArray){
|
||||
arr = []
|
||||
}
|
||||
$.vidview.f.find('[data-ke] input:checked').each(function(n,v){
|
||||
v=$(v).parents('tr')
|
||||
if(getArray){
|
||||
arr.push({filename:v.attr('data-file'),mid:v.attr('data-mid'),auth:v.attr('data-auth')})
|
||||
}else{
|
||||
arr[v.attr('data-file')]={mid:v.attr('data-mid'),auth:v.attr('data-auth')}
|
||||
}
|
||||
})
|
||||
return arr
|
||||
}
|
||||
$.vidview.e.find('.delete_selected').click(function(){
|
||||
e = {}
|
||||
e.s = $.vidview.getSelected()
|
||||
if(Object.keys(e.s).length === 0){
|
||||
$.ccio.init('note',{
|
||||
title:'No Videos Selected',
|
||||
text:'You must choose at least one video.',
|
||||
type:'error'
|
||||
},$user);
|
||||
return
|
||||
}
|
||||
$.confirm.e.modal('show');
|
||||
$.confirm.title.text(lang['Delete Selected Videos'])
|
||||
e.html=lang.DeleteSelectedVideosMsg+'<div style="margin-bottom:15px"></div>'
|
||||
var deleteLinks = []
|
||||
$.each(e.s,function(n,v){
|
||||
e.html+=n+'<br>';
|
||||
if($.vidview.loadedVideos[n])deleteLinks.push($.vidview.loadedVideos[n].links.deleteVideo)
|
||||
})
|
||||
$.confirm.body.html(e.html)
|
||||
$.confirm.click({title:'Delete Video',class:'btn-danger'},function(){
|
||||
$.each(deleteLinks,function(n,link){
|
||||
$.getJSON(link,function(d){
|
||||
$.ccio.log(d)
|
||||
})
|
||||
})
|
||||
});
|
||||
})
|
||||
$.vidview.e.find('.export_selected').click(function(){
|
||||
e = {}
|
||||
var videos = $.vidview.getSelected(true)
|
||||
if(videos.length === 0){
|
||||
$.ccio.init('note',{
|
||||
title:'No Videos Selected',
|
||||
text:'You must choose at least one video.',
|
||||
type:'error'
|
||||
},$user);
|
||||
return
|
||||
}
|
||||
$.confirm.e.modal('show');
|
||||
$.confirm.title.text(lang['Export Selected Videos'])
|
||||
var html = lang.ExportSelectedVideosMsg+'<div style="margin-bottom:15px"></div>'
|
||||
$.each(videos,function(n,v){
|
||||
html+=v.filename+'<br>';
|
||||
})
|
||||
$.confirm.body.html(html)
|
||||
$.confirm.click({title:'Export Video',class:'btn-danger'},function(){
|
||||
var queryVariables = []
|
||||
queryVariables.push('videos='+JSON.stringify(videos))
|
||||
if($.ccio.useUTC === true){
|
||||
queryVariables.push('isUTC=true')
|
||||
}
|
||||
var downloadZip = $.ccio.init('location',$user)+$user.auth_token+'/zipVideos/'+$user.ke+'?'+queryVariables.join('&')
|
||||
$('#temp').html('<iframe>a</iframe>').find('iframe').attr('src',downloadZip);
|
||||
});
|
||||
})
|
||||
$.vidview.e.find('.merge_selected').click(function(){
|
||||
e = {}
|
||||
var videos = $.vidview.getSelected(true)
|
||||
if(videos.length === 0){
|
||||
$.ccio.init('note',{
|
||||
title:'No Videos Selected',
|
||||
text:'You must choose at least one video.',
|
||||
type:'error'
|
||||
},$user);
|
||||
return
|
||||
}
|
||||
$.confirm.e.modal('show');
|
||||
$.confirm.title.text(lang['Merge Selected Videos'])
|
||||
var html = lang.MergeSelectedVideosMsg+'<div style="margin-bottom:15px"></div>'
|
||||
$.each(videos,function(n,v){
|
||||
html+=v.filename+'<br>';
|
||||
})
|
||||
$.confirm.body.html(html)
|
||||
$.confirm.click({title:'Merge Video',class:'btn-danger'},function(){
|
||||
var queryVariables = []
|
||||
queryVariables.push('videos='+JSON.stringify(videos))
|
||||
if($.ccio.useUTC === true){
|
||||
queryVariables.push('isUTC=true')
|
||||
}
|
||||
var downloadZip = $.ccio.init('location',$user)+$user.auth_token+'/videosMerge/'+$user.ke+'?'+queryVariables.join('&')
|
||||
$('#temp').html('<iframe>a</iframe>').find('iframe').attr('src',downloadZip)
|
||||
});
|
||||
})
|
||||
$.vidview.pages.on('click','[page]',function(e){
|
||||
e.limit=$.vidview.limit.val();
|
||||
e.page=$(this).attr('page');
|
||||
$.vidview.current_page=e.page;
|
||||
if(e.limit.replace(/ /g,'')===''){
|
||||
e.limit='100';
|
||||
}
|
||||
if(e.limit.indexOf(',')>-1){
|
||||
e.limit=parseInt(e.limit.split(',')[1])
|
||||
}else{
|
||||
e.limit=parseInt(e.limit)
|
||||
}
|
||||
$.vidview.limit.val((parseInt(e.page)-1)+'00,'+e.limit)
|
||||
$.vidview.launcher.click()
|
||||
})
|
||||
$.vidview.e.on('click','.preview',function(e){
|
||||
e.preventDefault()
|
||||
e=$(this)
|
||||
$.vidview.preview.html('<video class="video_video" video="'+e.attr('href')+'" preload controls autoplay><source src="'+e.attr('href')+'" type="video/mp4"></video>')
|
||||
})
|
||||
})
|
|
@ -1156,7 +1156,9 @@ switch($user.details.lang){
|
|||
tmp+='</li>';
|
||||
break;
|
||||
case'option':
|
||||
tmp+='<option auth="'+user.auth_token+'" value="'+d.id+'">'+d.name+'</option>'
|
||||
var selected = ''
|
||||
if(d.selected === true){selected = ' selected'}
|
||||
tmp+='<option auth="'+user.auth_token+'"'+selected+' value="'+d.id+'">'+d.name+'</option>'
|
||||
break;
|
||||
case'stream-element':
|
||||
try{k.d=JSON.parse(d.details);}catch(er){k.d=d.details}
|
||||
|
@ -5839,13 +5841,14 @@ $('body')
|
|||
getThumbnail()
|
||||
break;
|
||||
case'videos_table':
|
||||
var showThumbnail = $.ccio.op().showThumbnail === '1'
|
||||
$.vidview.e.removeClass('dark')
|
||||
e.t.attr('class','fa fa-film')
|
||||
var tmp = '<table class="table table-striped" style="max-height:500px">';
|
||||
tmp+='<thead>';
|
||||
tmp+='<tr>';
|
||||
tmp+='<th><div class="checkbox"><input id="videos_select_all" type="checkbox"><label for="videos_select_all"></label></div></th>';
|
||||
tmp+='<th data-field="Thumbnail" data-sortable="true">'+lang.Thumbnail+'</th>';
|
||||
if(showThumbnail)tmp+='<th data-field="Thumbnail" data-sortable="true">'+lang.Thumbnail+'</th>';
|
||||
tmp+='<th data-field="Closed" data-sortable="true">'+lang.Closed+'</th>';
|
||||
tmp+='<th data-field="Ended" data-sortable="true">'+lang.Ended+'</th>';
|
||||
tmp+='<th data-field="Started" data-sortable="true">'+lang.Started+'</th>';
|
||||
|
@ -5869,7 +5872,7 @@ $('body')
|
|||
// v.filename=$.ccio.init('tf',v.time)+'.'+v.ext;
|
||||
tmp+='<tr data-ke="'+v.ke+'" data-status="'+v.status+'" data-mid="'+v.mid+'" data-file="'+v.filename+'" data-auth="'+v.mon.user.auth_token+'">';
|
||||
tmp+='<td><div class="checkbox"><input id="'+v.ke+'_'+v.filename+'" name="'+v.filename+'" value="'+v.mid+'" type="checkbox"><label for="'+v.ke+'_'+v.filename+'"></label></div></td>';
|
||||
tmp+='<td class="text-center"><img class="thumbnail"></td>';
|
||||
if(showThumbnail)tmp+='<td class="text-center"><img class="thumbnail"></td>';
|
||||
tmp+='<td><span class="livestamp" title="'+$.ccio.timeObject(v.end).format('YYYY-MM-DD HH:mm:ss')+'"></span></td>';
|
||||
tmp+='<td title="'+v.end+'">'+$.ccio.timeObject(v.end).format('h:mm:ss A, MMMM Do YYYY')+'</td>';
|
||||
tmp+='<td title="'+v.time+'">'+$.ccio.timeObject(v.time).format('h:mm:ss A, MMMM Do YYYY')+'</td>';
|
||||
|
@ -5887,20 +5890,22 @@ $('body')
|
|||
tmp+='</tbody>';
|
||||
tmp+='</table>';
|
||||
e.b.html(tmp)
|
||||
var i = 0
|
||||
var getThumbnail = function(){
|
||||
var v = d.videos[i]
|
||||
if(v){
|
||||
tool.getVideoImage($.ccio.init('videoUrlBuild',v),0,function(err,base64){
|
||||
if(base64){
|
||||
$('[data-ke="'+v.ke+'"][data-mid="'+v.mid+'"][data-file="'+v.filename+'"] .thumbnail')[0].src = base64
|
||||
}
|
||||
++i
|
||||
getThumbnail()
|
||||
})
|
||||
if(showThumbnail){
|
||||
var i = 0
|
||||
var getThumbnail = function(){
|
||||
var v = d.videos[i]
|
||||
if(v){
|
||||
tool.getVideoImage($.ccio.init('videoUrlBuild',v),0,function(err,base64){
|
||||
if(base64){
|
||||
$('[data-ke="'+v.ke+'"][data-mid="'+v.mid+'"][data-file="'+v.filename+'"] .thumbnail')[0].src = base64
|
||||
}
|
||||
++i
|
||||
getThumbnail()
|
||||
})
|
||||
}
|
||||
}
|
||||
getThumbnail()
|
||||
}
|
||||
getThumbnail()
|
||||
$.ccio.init('ls');
|
||||
$.vidview.e.find('table').bootstrapTable();
|
||||
break;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue