$(document).ready(function(e){ var getUrlPieces = function(url){ var el = document.createElement('a'); el.href = url return el // el.host // www.somedomain.com (includes port if there is one[1]) // el.hostname // www.somedomain.com // el.hash // #top // el.href // http://www.somedomain.com/account/search?filter=a#top // el.pathname // /account/search // el.port // (port if there is one[1]) // el.protocol // http: // el.search // ?filter=a } //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+'
'; $.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:lang['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 } var textFieldData = $.confirm.e.find('textarea').val() var parsedData = JSON.parse(textFieldData) //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){ //#EXTM3U if(textFieldData.indexOf('#EXTM3U') > -1 && textFieldData.indexOf('{"') === -1){ var m3u8List = textFieldData.replace('#EXTM3U','').trim().split('\n') var parsedList = {} var currentName m3u8List.forEach(function(line){ if(line.indexOf('#EXTINF:-1,') > -1){ currentName = line.replace('#EXTINF:-1,','').trim() }else{ parsedList[currentName] = line.trim() } }) $.each(parsedList,function(name,url){ var link = getUrlPieces(url) var newMon = $.aM.generateDefaultMonitorSettings() newMon.details = JSON.parse(newMon.details) newMon.mid = 'HLS' + name.toLowerCase() newMon.name = name newMon.port = link.port newMon.host = link.hostname newMon.path = link.pathname newMon.details.tv_channel = '1' newMon.details.tv_channel_id = name newMon.details.auto_host_enable = '1' newMon.details.auto_host = url newMon.details.stream_quality = '1' newMon.details.stream_fps = '' newMon.details.stream_vcodec = 'libx264' newMon.details.stream_acodec = 'aac' newMon.details.stream_type = 'hls' newMon.details.hls_time = '10' newMon.type = 'mp4' newMon.details = JSON.stringify(newMon.details) postMonitor(newMon) }) }else{ $.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:lang['No Monitors Selected'],text:lang['Select atleast one monitor to delete'],type:'error'}); return } $.confirm.e.modal('show'); $.confirm.title.text(lang['Delete']+' '+lang['Monitors']) e.html='

'+lang.DeleteMonitorsText+'

'; $.confirm.body.html(e.html) $.confirm.click([ { title:lang['Delete']+' '+lang['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:lang['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:lang['No Monitors Selected'],text:lang['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:lang['No Monitors Selected'],text:lang['Select atleast one monitor to delete'],type:'error'}); return } e.dataStr = "data:text/json;charset=utf-8," + encodeURIComponent(JSON.stringify(arr)); $('#temp').html('') .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=''+streamURL+'' } var img = $('#left_menu [mid="'+v.mid+'"][auth="'+v.user.auth_token+'"] [monitor="watch"]').attr('src') tmp+='' tmp+='
' tmp+=''+v.name+'
'+v.mid+''+v.status+''+streamURL+'' //buttons tmp+=' ' tmp+='' }) $.multimon.table.html(tmp) }) })