Allow Importing ZoneMinder Zones with Monitor Configurations
parent
ceda85e5db
commit
a02313ba77
|
|
@ -106,6 +106,9 @@ function addCredentialsToUrl(streamUrl,username,password){
|
|||
const urlParts = streamUrl.split('://')
|
||||
return [urlParts[0],'://',`${username}:${password}@`,urlParts[1]].join('')
|
||||
}
|
||||
function mergeConcattedJsonString(textData){
|
||||
return textData.replace(/[\r\n]/gm, '').replace('}{',',')
|
||||
}
|
||||
function getFullOrigin(withoutTrailingSlash){
|
||||
var url = location.origin + getLocationPathName()
|
||||
if(withoutTrailingSlash)url = url.slice(0, -1);
|
||||
|
|
|
|||
|
|
@ -977,37 +977,6 @@ monitorEditorWindow.on('change','[channel-detail]',function(){
|
|||
monitorEditorWindow.find('.probe-monitor-settings').click(function(){
|
||||
$.pB.submit(buildMonitorURL(),true)
|
||||
})
|
||||
monitorEditorWindow.find('.import_config').click(function(e){
|
||||
var el = $(this);
|
||||
var monitorId = el.parents('[mid]').attr('mid');
|
||||
$.confirm.create({
|
||||
title: lang['Import Monitor Configuration'],
|
||||
body: 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>',
|
||||
clickOptions: {
|
||||
title: 'Import',
|
||||
class: 'btn-primary'
|
||||
},
|
||||
clickCallback: function(){
|
||||
try{
|
||||
var monitorConfig = safeJsonParse($.confirm.e.find('textarea').val());
|
||||
importIntoMonitorEditor(monitorConfig)
|
||||
monitorEditorWindow.modal('show')
|
||||
}catch(err){
|
||||
debugLog(err)
|
||||
new PNotify({title:lang['Invalid JSON'],text:lang.InvalidJSONText,type:'error'})
|
||||
}
|
||||
}
|
||||
})
|
||||
$.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);
|
||||
});
|
||||
});
|
||||
monitorEditorWindow.find('.save_config').click(function(e){
|
||||
//export monior config in view
|
||||
var el = $(this);
|
||||
|
|
@ -1438,10 +1407,12 @@ editorForm.find('[name="type"]').change(function(e){
|
|||
launchImportMonitorWindow(function(monitor){
|
||||
var monitorConfig = null
|
||||
if(monitor.monitor){
|
||||
mergeZoneMinderZonesIntoMonitors(monitor)
|
||||
monitorConfig = importZoneMinderMonitor(monitor.monitor.Monitor)
|
||||
}else
|
||||
//zoneminder multiple monitors
|
||||
if(monitor.monitors){
|
||||
mergeZoneMinderZonesIntoMonitors(monitor)
|
||||
monitorConfig = importZoneMinderMonitor(monitor.monitors[0].Monitor)
|
||||
}else{
|
||||
if(monitor[0] && monitor.mid){
|
||||
|
|
|
|||
|
|
@ -332,7 +332,50 @@ function importM3u8Playlist(textData){
|
|||
postMonitor(newMon)
|
||||
})
|
||||
}
|
||||
|
||||
function convertZoneMinderZonesToCords(rows,width,height){
|
||||
var coordinates = {}
|
||||
const defaultDetectionWidth = 640
|
||||
const defaultDetectionHeight = 480
|
||||
rows.forEach((row) => {
|
||||
const zone = row.Zone || row
|
||||
let widthRatio = width > defaultDetectionWidth ? defaultDetectionWidth / width : 1
|
||||
let heightRatio = height > defaultDetectionHeight ? defaultDetectionHeight / height : 1
|
||||
const points = zone.Coords.split(' ').map((item) => {
|
||||
let points = item.split(',').map((num) => parseInt(num));
|
||||
points[0] = parseInt(points[0] * widthRatio);
|
||||
points[1] = parseInt(points[1] * heightRatio);
|
||||
return points
|
||||
})
|
||||
const monitorId = zone.MonitorId
|
||||
coordinates[generateId(5)] = {
|
||||
"name": `${zone.Id}-${monitorId}`,
|
||||
"sensitivity": "5",
|
||||
"max_sensitivity": "",
|
||||
"threshold": 1,
|
||||
"color_threshold": 9,
|
||||
"points": points
|
||||
}
|
||||
})
|
||||
return coordinates
|
||||
}
|
||||
function mergeZoneMinderZonesIntoMonitors(data){
|
||||
const monitors = data.monitors
|
||||
const singleMonitor = data.monitor && data.monitor.Monitor ? data.monitor.Monitor : null
|
||||
const zones = data.zones
|
||||
const targetMonitors = singleMonitor ? [singleMonitor] : monitors
|
||||
targetMonitors.forEach((row) => {
|
||||
const monitor = row.Monitor
|
||||
const width = parseInt(monitor.Width)
|
||||
const height = parseInt(monitor.Height)
|
||||
const monitorZones = zones.filter(zone => {
|
||||
return zone.Zone.MonitorId === monitor.Id
|
||||
})
|
||||
monitor.Zones = convertZoneMinderZonesToCords(monitorZones,width,height) || {}
|
||||
})
|
||||
if(singleMonitor){
|
||||
data.monitor.Monitor = targetMonitors[0]
|
||||
}
|
||||
}
|
||||
function importZoneMinderMonitor(Monitor){
|
||||
var newMon = generateDefaultMonitorSettings()
|
||||
newMon.details = safeJsonParse(newMon.details)
|
||||
|
|
@ -356,7 +399,11 @@ function importZoneMinderMonitor(Monitor){
|
|||
newMon.details.mpass = password
|
||||
newMon.details.stream_type = 'hls'
|
||||
newMon.details.detector_buffer_acodec = 'auto'
|
||||
// newMon.details.detector_scale_x = '640'
|
||||
newMon.type = 'h264'
|
||||
if(Monitor.Zones){
|
||||
newMon.details.cords = JSON.stringify(Monitor.Zones)
|
||||
}
|
||||
switch(Monitor.Function){
|
||||
case'None':
|
||||
// The monitor is currently disabled.
|
||||
|
|
@ -428,7 +475,7 @@ function importZoneMinderMonitor(Monitor){
|
|||
|
||||
function importMonitor(textData){
|
||||
try{
|
||||
var parsedData = textData instanceof Object ? textData : safeJsonParse(textData)
|
||||
var parsedData = textData instanceof Object ? textData : safeJsonParse(mergeConcattedJsonString(textData))
|
||||
function postMonitor(v){
|
||||
var monitorId = v.mid
|
||||
$.post(`${getApiPrefix('configureMonitor')}/${monitorId}`,{
|
||||
|
|
@ -439,10 +486,12 @@ function importMonitor(textData){
|
|||
}
|
||||
//zoneminder one monitor
|
||||
if(parsedData.monitor){
|
||||
mergeZoneMinderZonesIntoMonitors(parsedData)
|
||||
postMonitor(importZoneMinderMonitor(parsedData.monitor.Monitor))
|
||||
}else
|
||||
//zoneminder multiple monitors
|
||||
if(parsedData.monitors){
|
||||
mergeZoneMinderZonesIntoMonitors(parsedData)
|
||||
$.each(parsedData.monitors,function(n,v){
|
||||
postMonitor(importZoneMinderMonitor(v.Monitor))
|
||||
})
|
||||
|
|
@ -525,7 +574,7 @@ function launchImportMonitorWindow(callback){
|
|||
title: lang['Import'],
|
||||
class: 'btn-primary',
|
||||
callback: function(){
|
||||
var textData = safeJsonParse($.confirm.e.find('textarea').val())
|
||||
var textData = safeJsonParse(mergeConcattedJsonString($.confirm.e.find('textarea').val()))
|
||||
if(callback){
|
||||
callback(textData)
|
||||
}else{
|
||||
|
|
|
|||
Loading…
Reference in New Issue