1
0
Fork 0
mirror of https://gitlab.com/Shinobi-Systems/ShinobiCE.git synced 2025-03-09 15:40:15 +00:00

Teenage Turtle

This commit is contained in:
Moe 2018-08-23 14:13:06 -07:00
parent a80c1e4e97
commit 157bf6feb0
14 changed files with 1530 additions and 563 deletions

View file

@ -0,0 +1,249 @@
<!--Detector Filter Window-->
<div class="modal full fade dark" id="detector_filter" tabindex="-1" role="dialog" aria-labelledby="detector_filterLabel" aria-hidden="true">
<div class="modal-dialog" role="document">
<form class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
<h4 class="modal-title" id="detector_filterLabel"><i class="fa fa-grav"></i> &nbsp; <%-lang['Detector Filters']%></h4>
</div>
<div class="modal-body">
<div class="form-group-group green">
<h4><%- lang['Saved Filters'] %> : <small class="filter_name"></small></h4>
<div class="form-group">
<label>
<div><span><%-lang.Filters%></span></div>
<div><select id="detector_filters" class="form-control">
<option value=""><%-lang['Add New']%></option>
<optgroup label="Saved"></optgroup>
</select></div>
</label>
</div>
<div class="form-group">
<label><div><span><%- lang['Filter Name'] %></span></div>
<div><input class="form-control" name="id" type="hidden">
<input class="form-control" name="filter_name"></div>
</label>
</div>
</div>
<div class="form-group-group blue where">
<h4>Conditions
<div class="pull-right">
<a class="btn btn-success btn-xs add">&nbsp;<i class="fa fa-plus"></i>&nbsp;</a>
<a class="btn btn-danger btn-xs remove">&nbsp;<i class="fa fa-trash-o"></i>&nbsp;</a>
</div>
</h4>
<div id="detector_filters_where"></div>
</div>
<div class="form-group-group red actions">
<h4><%- lang['Action for Selected'] %></h4>
<%
var possibleActions = [
{
"name": "halt",
"field": "Drop Event",
"description": "Make the event do nothing, as if it never happened.",
"default": "No",
"example": "",
"possible": [
{
"name": "No",
"value": "0",
"info": "Allow other functions to continue.",
selected:true
},
{
"name": "Yes",
"value": "1",
"info": "Use Traditional Recording, Hotswap, or Delete Motionless with their currently set options in the Global Detection Settings section."
}
]
},
{
"name": "save",
"field": "Save Events to SQL",
"description": "Save Motion Events in SQL. This will allow display of motion over video during the time motion events occured in the Power Viewer.",
"default": "Yes",
"example": "",
"possible": [
{
"name": "Default",
"value": "",
"info": "Use values set in Global Detector Settings.",
"selected": true
},
{
"name": "No",
"value": "0",
"info": "Finish the current 10 minute order."
},
{
"name": "Yes",
"value": "1",
"info": "Reset the timer"
}
]
},
{
"name": "mail",
"field": "Email on Trigger",
"description": "Recieve an email of an image during a motion event to the master account for the camera group. You must setup SMTP details in conf.json.",
"default": "No",
"example": "1",
"possible": [
{
"name": "Default",
"value": "",
"info": "Use values set in Global Detector Settings.",
"selected": true
},
{
"name": "No",
"value": "0",
"info": "No Email."
},
{
"name": "Yes",
"value": "1",
"info": "Send Email."
}
]
},
{
"name": "webhook",
"field": "Webhook on Trigger",
"description": "Send a GET request during an event to the URL specified. Webhook location can be specified in the Global Detector Settings for the Monitor.",
"default": "No",
"example": "1",
"possible": [
{
"name": "Default",
"value": "",
"info": "Use values set in Global Detector Settings.",
"selected": true
},
{
"name": "No",
"value": "0",
"info": "No Webhook."
},
{
"name": "Yes",
"value": "1",
"info": "Send Webhook."
}
]
},
{
"name": "discord",
"field": "Discord Alert on Trigger",
"description": "Recieve a Discord Notification with an image or video during an event to the Discord channel specified. Discord Bot and Channel settings can be changed in your Account Settings.",
"default": "No",
"example": "1",
"possible": [
{
"name": "Default",
"value": "",
"info": "Use values set in Global Detector Settings.",
"selected": true
},
{
"name": "No",
"value": "0",
"info": "No Alert."
},
{
"name": "Yes",
"value": "1",
"info": "Get a Message to Discord."
}
]
},
{
"name": "command",
"field": "Detector Command",
"description": "You may use this to trigger a script on command.",
"default": "No",
"example": "",
"possible": [
{
"name": "Default",
"value": "",
"info": "Use values set in Global Detector Settings.",
"selected": true
},
{
"name": "No",
"value": "0",
"info": "No script will run."
},
{
"name": "Yes",
"value": "1",
"info": "Trigger the script that is set in the <b>Command</b> option. <b>Command</b> is only visible when selecting this option."
}
]
},
{
"name": "record",
"field": "Use Record Method",
"description": "Use Traditional Recording, Hotswap, or Delete Motionless with their currently set options in the Global Detection Settings section.",
"default": "No",
"example": "",
"possible": [
{
"name": "Default",
"value": "",
"info": "Use values set in Global Detector Settings.",
"selected": true
},
{
"name": "No",
"value": "0",
"info": "No Traditional Recording, Hotswap, or Delete Motionless."
},
{
"name": "Yes",
"value": "1",
"info": "Use Traditional Recording, Hotswap, or Delete Motionless with their currently set options in the Global Detection Settings section."
}
]
},
].forEach(function(item){ %>
<%
var name = 'actions='+item.name
if(item.name.indexOf('=') > -1){
name = item.name
}
%>
<div class="form-group actions-row">
<label>
<div>
<span>
<%-item.field%>
<small><%-item.description%></small>
</span>
</div>
<div>
<select <%- name %> class="form-control">
<% item.possible.forEach(function(option){ %>
<option value="<%-option.value%>"><%-option.name%></option>
<% }) %>
</select>
</div>
</label>
</div>
<% }) %>
</div>
</div>
<div class="modal-footer">
<div class="pull-left">
<button type="button" class="btn btn-default" data-dismiss="modal"><%- lang['Close'] %></button>
<button type="button" class="btn btn-danger delete"><%- lang['Delete'] %></button>
</div>
<button type="submit" class="btn btn-success"><%- lang['Save'] %></button>
</div>
</form>
</div>
</div>

View file

@ -26,7 +26,7 @@
<%-lang.IdentityText2%>
</blockquote>
<div class="form-group">
<label>
<label>
<div><span><%-lang.Mode%></span></div>
<div><select class="form-control" name="mode" selector="h_m">
<option value="stop"><%-lang.Disabled%></option>
@ -124,26 +124,26 @@
<div class="form-group h_p_input h_p_rtsp">
<label><div><span><%-lang['RTSP Transport']%></span></div>
<div><select class="form-control" detail="rtsp_transport">
<option value="no" selected><%-lang['Auto']%></option>
<option value="tcp"><%-lang['TCP']%></option>
<option value="udp"><%-lang['UDP']%></option>
<option value="http"><%-lang['HTTP']%></option>
<option value="no" selected><%-lang['Auto']%></option>
<option value="tcp"><%-lang['TCP']%></option>
<option value="udp"><%-lang['UDP']%></option>
<option value="http"><%-lang['HTTP']%></option>
</select></div>
</label>
</div>
<div class="form-group">
<label><div><span><%-lang['Username']%></span></div>
<div><input class="form-control" detail="muser" placeholder=""></div>
<div><input class="form-control" detail="muser"></div>
</label>
</div>
<div class="form-group">
<label><div><span><%-lang['Password']%></span></div>
<div><input class="form-control" type="password" detail="mpass" placeholder=""></div>
<div><input class="form-control" type="password" detail="mpass"></div>
</label>
</div>
<div class="form-group">
<label><div><span><%-lang['Host']%></span></div>
<div><input class="form-control" name="host" placeholder=""></div>
<div><input class="form-control" name="host"></div>
</label>
</div>
<div class="form-group">
@ -208,7 +208,7 @@
<div><input class="form-control" detail="probesize"></div>
</label>
</div>
<div class="form-group h_t_input h_t_mp4">
<div class="form-group h_t_input h_t_mp4 h_t_local">
<label><div><span><%-lang["Loop Stream"]%></span></div>
<div><select class="form-control" detail="stream_loop">
<option value="0" selected><%-lang.No%></option>
@ -259,6 +259,11 @@
<option value="hevc_qsv"><%-lang['hevc_qsv']%></option>
<option value="mpeg2_qsv"><%-lang['mpeg2_qsv']%></option>
</optgroup>
<optgroup label="Raspberry Pi">
<option value="h264_mmal"><%-lang['h264_mmal']%></option>
<option value="mpeg2_mmal"><%-lang['mpeg2_mmal']%></option>
<option value="mpeg4_mmal"><%-lang['mpeg4_mmal']%></option>
</optgroup>
</select></div>
</label>
</div>
@ -289,9 +294,9 @@
</div>
<div class="form-group">
<label><div><span><%-lang['Stream Type']%></span></div>
<div><select class="form-control" detail="stream_type" selector="h_st" triggerChange="#add_monitor [detail=stream_vcodec]" triggerChangeIgnore="b64,mjpeg">
<div><select class="form-control" detail="stream_type" selector="h_st" triggerChange="#add_monitor [detail=stream_vcodec]" triggerChangeIgnore="b64,mjpeg,jpeg,gif">
<option value="mp4"><%-lang['Poseidon']%></option>
<!-- <option value="pam">PAM</option>-->
<option value="h265"><%-lang['HEVC (H.265)']%></option>
<option value="b64" selected><%-lang['Base64 over Websocket']%></option>
<option value="jpeg"><%-lang['JPEG (Auto Enables JPEG API)']%></option>
<option value="mjpeg"><%-lang['MJPEG']%></option>
@ -300,7 +305,7 @@
</select></div>
</label>
</div>
<div class="form-group h_st_input h_st_flv h_st_mp4">
<div class="form-group h_st_input h_st_flv h_st_mp4 h_st_h265">
<label><div><span><%-lang['Connection Type']%></span></div>
<div><select class="form-control" detail="stream_flv_type" selector="h_st_lat">
<option value="http" selected><%-lang['HTTP']%></option>
@ -318,7 +323,7 @@
<div><input class="form-control" detail="stream_mjpeg_clients" placeholder="20"></div>
</label>
</div>
<div class="h_st_input h_st_hls h_st_flv h_st_mp4">
<div class="h_st_input h_st_hls h_st_flv h_st_mp4 h_st_h265">
<div class="form-group">
<label><div><span><%-lang['HLS Video Encoder']%></span></div>
<div><select class="form-control" detail="stream_vcodec" selector="h_hls_v">
@ -334,6 +339,7 @@
<option value="h264_qsv"><%-lang['h264_qsv']%></option>
<option value="hevc_qsv"><%-lang['hevc_qsv']%></option>
<option value="mpeg2_qsv"><%-lang['mpeg2_qsv']%></option>
<option value="h264_omx"><%-lang['h264_omx']%></option>
</optgroup>
</select></div>
</label>
@ -351,7 +357,7 @@
</label>
</div>
</div>
<div class="h_st_input h_st_mjpeg h_st_b64 h_st_hls h_st_flv h_st_mp4 h_hls_v_input h_hls_v_libx264 h_hls_v_libx265 h_hls_v_h264_nvenc h_hls_v_hevc_nvenc h_hls_v_no">
<div class="h_st_input h_st_mjpeg h_st_b64 h_st_hls h_st_gif h_st_flv h_st_mp4 h_st_h265 h_hls_v_input h_hls_v_libx264 h_hls_v_libx265 h_hls_v_h264_nvenc h_hls_v_hevc_nvenc h_hls_v_no">
<div class="h_st_input h_st_hls">
<div class="form-group">
<label><div><span><%-lang['HLS Segment Length']%></span></div>
@ -364,7 +370,7 @@
</label>
</div>
</div>
<div class="form-group h_st_input h_st_hls h_st_flv h_st_mp4">
<div class="form-group h_st_input h_st_hls h_st_flv h_st_mp4 h_st_h265">
<label><div><span><%-lang['HLS Preset']%></span></div>
<div><input class="form-control" detail="preset_stream" placeholder="ultrafast"></div>
</label>
@ -447,8 +453,8 @@
<div class="form-group">
<label><div><span><%-lang['Enabled']%></span></div>
<div><select class="form-control" detail="stream_timestamp" selector="h_tm">
<option value="1"><%-lang.Yes%></option>
<option value="0" selected><%-lang.No%></option>
<option value="1"><%-lang.Yes%></option>
<option value="0" selected><%-lang.No%></option>
</select></div>
</label>
</div>
@ -545,12 +551,12 @@
</div>
<div class="form-group">
<label><div><span><%-lang['Image Width']%></span></div>
<div><input class="form-control" detail="snap_scale_x" placeholder=""></div>
<div><input class="form-control" detail="snap_scale_x"></div>
</label>
</div>
<div class="form-group">
<label><div><span><%-lang['Image Height']%></span></div>
<div><input class="form-control" detail="snap_scale_y" placeholder=""></div>
<div><input class="form-control" detail="snap_scale_y"></div>
</label>
</div>
<div class="form-group">
@ -578,8 +584,8 @@
<div class="form-group">
<label><div><span><%-lang['Record File Type']%></span></div>
<div><select class="form-control" name="ext" selector="h_f">
<option value="webm"><%-lang['WebM (libvpx)']%></option>
<option value="mp4"><%-lang['MP4 (copy, libx264, libx265)']%></option>
<option value="webm"><%-lang['WebM (libvpx)']%></option>
<option value="mp4"><%-lang['MP4 (copy, libx264, libx265)']%></option>
<!-- <option value="mkv">MKV</option> -->
</select></div>
</label>
@ -606,6 +612,7 @@
<option value="h264_qsv"><%-lang['h264_qsv']%></option>
<option value="hevc_qsv"><%-lang['hevc_qsv']%></option>
<option value="mpeg2_qsv"><%-lang['mpeg2_qsv']%></option>
<option value="h264_omx"><%-lang['h264_omx']%></option>
</optgroup>
<optgroup label="WebM <%-lang['Hardware Accelerated']%>">
<option value="vp8_cuvid"><%-lang['vp8_cuvid']%></option>
@ -618,12 +625,12 @@
<div class="h_vc_input h_vc_libvpx h_vc_libvpx-vp9 h_vc_libx264 h_vc_libx265 h_vc_hevc_nvenc h_vc_h264_nvenc h_vc_h264_vaapi h_vc_hevc_vaapi h_vc_h264_qsv h_vc_hevc_qsv h_vc_mpeg2_qsv h_vc_default h_vc_none">
<div class="form-group">
<label><div><span><%-lang['Quality']%></span></div>
<div><input class="form-control" detail="crf" placeholder=""></div>
<div><input class="form-control" detail="crf"></div>
</label>
</div>
<div class="form-group">
<label><div><span><%-lang['Preset']%></span></div>
<div><input class="form-control" detail="preset_record" placeholder=""></div>
<div><input class="form-control" detail="preset_record"></div>
</label>
</div>
</div>
@ -705,8 +712,8 @@
<div class="form-group">
<label><div><span><%-lang['Enabled']%></span></div>
<div><select class="form-control" detail="timestamp" selector="h_tm">
<option value="1"><%-lang.Yes%></option>
<option value="0" selected><%-lang.No%></option>
<option value="1"><%-lang.Yes%></option>
<option value="0" selected><%-lang.No%></option>
</select></div>
</label>
</div>
@ -785,7 +792,7 @@
<h4><%-lang['Custom']%></h4>
<div class="form-group">
<label><div><span><%-lang['Input Flags']%></span></div>
<div><input class="form-control" detail="cust_input" placeholder=""></div>
<div><input class="form-control" detail="cust_input"></div>
</label>
</div>
<div class="form-group h_sn_input h_sn_1" style="display:none">
@ -820,7 +827,7 @@
</div>
<div class="form-group h_m_input h_m_record">
<label><div><span><%-lang['Recording Flags']%></span></div>
<div><input class="form-control" detail="cust_record" placeholder=""></div>
<div><input class="form-control" detail="cust_record"></div>
</label>
</div>
<div class="form-group">
@ -1005,13 +1012,30 @@
</select></div>
</label>
</div>
<div class="form-group">
<label><div><span><%-lang['Detector Filters']%></span></div>
<div><select class="form-control" detail="use_detector_filters" selector="h_det_fil">
<option value="0" selected><%-lang.No%></option>
<option value="1"><%-lang.Yes%></option>
</select></div>
</label>
</div>
<div class="form-group h_det_fil_input h_det_fil_1">
<label><div><span><%-lang['Filter for Objects only']%></span></div>
<div><select class="form-control" detail="use_detector_filters_object">
<option value="0" selected><%-lang.No%></option>
<option value="1"><%-lang.Yes%></option>
</select></div>
</label>
</div>
<div class="form-group h_det_discord_input h_det_discord_1">
<label><div><span><%-lang['Allow Next Discord Alert']%></span></div>
<div><input class="form-control" detail="detector_discordbot_timeout" placeholder="10"></div>
</label>
</div>
<div class="hidden">
<div><input detail="cords" placeholder=""></div>
<input detail="cords">
<input detail="detector_filters">
</div>
<div class="form-group">
<a class="btn btn-danger btn-block" monitor="region"><i class="fa fa-grav"></i> &nbsp; <%-lang['Region Editor']%></a>
@ -1090,7 +1114,7 @@
</div>
</div>
</div>
<div class="form-group-group orange shinobi-detector-opencv shinobi-detector-openalpr shinobi-detector_plug" section id="monSectionDetectorObject">
<div class="form-group-group orange shinobi-detector-opencv shinobi-detector-openalpr shinobi-detector-pythonyolo shinobi-detector_plug" section id="monSectionDetectorObject">
<h4><%-lang['Object Detection']%> <small><%-lang['Plugin']%> : <b class="shinobi-detector_name"></b> <b class="shinobi-detector-invert"><%-lang['Not Connected']%></b><b class="shinobi-detector" style="display:none"><%-lang['Connected']%></b></small></h4>
<div class="form-group">
<label><div><span><%-lang['Detect Objects']%></span></div>
@ -1102,12 +1126,31 @@
</div>
<div class="form-group">
<label><div><span><%-lang['Check for Motion First']%></span></div>
<div><select class="form-control" detail="detector_use_motion">
<div><select class="form-control" detail="detector_use_motion" selector="h_det_mot_fir">
<option value="0" selected><%-lang.No%></option>
<option value="1"><%-lang.Yes%></option>
</select></div>
</label>
</div>
<div class="h_det_pam_input h_det_pam_1">
<div class="h_det_mot_fir_input h_det_mot_fir_1">
<div class="form-group">
<label><div><span><%-lang['Frame Rate']%></span></div>
<div><input class="form-control" type="number" min="1" detail="detector_fps_object" placeholder="2"></div>
</label>
</div>
<div class="form-group">
<label><div><span><%-lang['Width']%></span></div>
<div><input class="form-control" type="number" min="1" detail="detector_scale_x_object" placeholder="320"></div>
</label>
</div>
<div class="form-group">
<label><div><span><%-lang['Height']%></span></div>
<div><input class="form-control" type="number" min="1" detail="detector_scale_y_object" placeholder="240"></div>
</label>
</div>
</div>
</div>
<div class=" h_casc_input h_casc_1" style="display:none">
<div class="form-group-group orange shinobi-detector-opencv shinobi-detector-openalpr shinobi-detector_plug" style="display:none" section id="monSectionLisencePlateDetector">
<h4><%-lang['Lisence Plate Detector']%></h4>
@ -1222,8 +1265,8 @@
<div class="form-group">
<label><div><span><%-lang['Controllable']%></span></div>
<div><select class="form-control" detail="control" selector="h_c">
<option value="0"><%-lang.No%></option>
<option value="1"><%-lang.Yes%></option>
<option value="0"><%-lang.No%></option>
<option value="1"><%-lang.Yes%></option>
</select></div>
</label>
</div>
@ -1236,7 +1279,7 @@
<div class="form-group">
<label><div><span><%-lang['Call Method']%></span></div>
<div><select class="form-control" detail="control_url_method" selector="h_control_call">
<option value="GET">GET (<%-lang.Default%>)</option>
<option value="GET">GET (<%-lang.Default%>)</option>
<option value="PUT">PUT</option>
<option value="POST">POST</option>
<option value="ONVIF">ONVIF</option>
@ -1246,7 +1289,7 @@
<div class="form-group h_control_call_input h_control_call_GET h_control_call_PUT h_control_call_POST">
<label><div><span><%-lang['Digest Authentication']%></span></div>
<div><select class="form-control" detail="control_digest_auth">
<option value="0"><%-lang.No%></option>
<option value="0"><%-lang.No%></option>
<option value="1"><%-lang.Yes%></option>
</select></div>
</label>
@ -1254,7 +1297,7 @@
<div class="form-group">
<label><div><span><%-lang['Stop Command']%></span></div>
<div><select class="form-control" detail="control_stop" selector="h_cs">
<option value="0"><%-lang.No%></option>
<option value="0"><%-lang.No%></option>
<option value="1"><%-lang.Yes%></option>
</select></div>
</label>
@ -1355,8 +1398,8 @@
<div class="form-group">
<label><div><span><%-lang['Copy to Settings']%></span></div>
<div><select class="form-control" id="copy_settings" selector="h_copy_settings">
<option value="0" selected><%-lang.No%></option>
<option value="1"><%-lang.Yes%></option>
<option value="0" selected><%-lang.No%></option>
<option value="1"><%-lang.Yes%></option>
</select></div>
</label>
</div>
@ -1364,32 +1407,32 @@
<div class="form-group">
<label><div><span><%-lang['Copy Connection Settings']%></span></div>
<div><select class="form-control" copy="#monSectionConnection">
<option value="0" selected><%-lang.No%></option>
<option value="1"><%-lang.Yes%></option>
<option value="0" selected><%-lang.No%></option>
<option value="1"><%-lang.Yes%></option>
</select></div>
</label>
</div>
<div class="form-group">
<label><div><span><%-lang['Copy Input Settings']%></span></div>
<div><select class="form-control" copy="#monSectionInput">
<option value="0" selected><%-lang.No%></option>
<option value="1"><%-lang.Yes%></option>
<option value="0" selected><%-lang.No%></option>
<option value="1"><%-lang.Yes%></option>
</select></div>
</label>
</div>
<div class="form-group">
<label><div><span><%-lang['Copy Stream Settings']%></span></div>
<div><select class="form-control" copy="#monSectionStream,#monSectionStreamTimestamp,#monSectionStreamWatermark">
<option value="0" selected><%-lang.No%></option>
<option value="1"><%-lang.Yes%></option>
<option value="0" selected><%-lang.No%></option>
<option value="1"><%-lang.Yes%></option>
</select></div>
</label>
</div>
<div class="form-group">
<label><div><span><%-lang['Copy JPEG API Settings']%></span></div>
<div><select class="form-control" copy="#monSectionJPEGAPI">
<option value="0" selected><%-lang.No%></option>
<option value="1"><%-lang.Yes%></option>
<option value="0" selected><%-lang.No%></option>
<option value="1"><%-lang.Yes%></option>
</select></div>
</label>
</div>
@ -1397,8 +1440,8 @@
<div class="form-group">
<label><div><span><%-lang['Copy Stream Channel Settings']%></span></div>
<div><select class="form-control" copy="stream_channel">
<option value="0" selected><%-lang.No%></option>
<option value="1"><%-lang.Yes%></option>
<option value="0" selected><%-lang.No%></option>
<option value="1"><%-lang.Yes%></option>
</select></div>
</label>
</div>
@ -1406,40 +1449,40 @@
<div class="form-group">
<label><div><span><%-lang['Copy Recording Settings']%></span></div>
<div><select class="form-control" copy="#monSectionRecording">
<option value="0" selected><%-lang.No%></option>
<option value="1"><%-lang.Yes%></option>
<option value="0" selected><%-lang.No%></option>
<option value="1"><%-lang.Yes%></option>
</select></div>
</label>
</div>
<div class="form-group">
<label><div><span><%-lang['Copy Detector Settings']%></span></div>
<div><select class="form-control" copy="#monSectionDetector,#monSectionDetectorBuffer,#monSectionLisencePlateDetector,#monSectionNoMotionDetector">
<option value="0" selected><%-lang.No%></option>
<option value="1"><%-lang.Yes%></option>
<option value="0" selected><%-lang.No%></option>
<option value="1"><%-lang.Yes%></option>
</select></div>
</label>
</div>
<div class="form-group">
<label><div><span><%-lang['Copy Custom Settings']%></span></div>
<div><select class="form-control" copy="#monSectionCustom">
<option value="0" selected><%-lang.No%></option>
<option value="1"><%-lang.Yes%></option>
<option value="0" selected><%-lang.No%></option>
<option value="1"><%-lang.Yes%></option>
</select></div>
</label>
</div>
<div class="form-group">
<label><div><span><%-lang['Copy Group Settings']%></span></div>
<div><select class="form-control" copy="#monSectionGrouping">
<option value="0" selected><%-lang.No%></option>
<option value="1"><%-lang.Yes%></option>
<option value="0" selected><%-lang.No%></option>
<option value="1"><%-lang.Yes%></option>
</select></div>
</label>
</div>
<div class="form-group">
<label><div><span><%-lang['Copy Logging Settings']%></span></div>
<div><select class="form-control" copy="#monSectionLogging">
<option value="0" selected><%-lang.No%></option>
<option value="1"><%-lang.Yes%></option>
<option value="0" selected><%-lang.No%></option>
<option value="1"><%-lang.Yes%></option>
</select></div>
</label>
</div>
@ -1462,15 +1505,14 @@
<option value="fatal"><%-lang['Fatal']%></option>
<option value="error" selected><%-lang['on Error']%></option>
<option value="warning"><%-lang['All Warnings']%></option>
<option value="debug"><%-lang['Debug']%></option>
</select></div>
</label>
</div>
<div class="form-group">
<label><div><span><%-lang['Save Log in SQL']%></span></div>
<div><select class="form-control" detail="sqllog">
<option value="0" selected><%-lang.No%></option>
<option value="1"><%-lang.Yes%></option>
<option value="0" selected><%-lang.No%></option>
<option value="1"><%-lang.Yes%></option>
</select></div>
</label>
</div>
@ -1504,16 +1546,19 @@
<li class="mdl-menu__item add_map"><i class="fa fa-rss"></i> <%-lang['Add Input Feed']%></li>
<li class="mdl-menu__item add_channel"><i class="fa fa-puzzle-piece"></i> <%-lang['Add Channel']%></li>
</ul>
<span class="h_det_input h_det_1"><button type="button" style="display:none" class="btn btn-warning shinobi-detector-opencv shinobi-detector-openalpr shinobi-detector-motion shinobi-detector_plug" monitor="region"><i class="fa fa-grav"></i> <%-lang['Region Editor']%></button></span>
<div class="h_det_input h_det_1" style="display:inline-block">
<button type="button" class="btn btn-primary" monitor="region"><i class="fa fa-grav"></i> <%-lang['Region Editor']%></button>
<button type="button" class="btn btn-primary" monitor="detector_filters"><i class="fa fa-grav"></i> <%-lang['Detector Filters']%></button>
</div>
</div>
<div style="display:inline-block;margin-right:5px">
<div><select class="form-control btn-default" dropdown_toggle="monedit_user_type" selector="h_us">
<option value="simple" selected><%-lang['Simple']%></option>
<option value="advanced"><%-lang['Advanced']%></option>
<option value="simple" selected><%-lang['Simple']%></option>
<option value="advanced"><%-lang['Advanced']%></option>
</select></div>
</div>
<button type="submit" class="btn btn-success"><i class="fa fa-check"></i> <%-lang.Save%></button>
</div>
</form>
</div>
</div>
</div>

View file

@ -24,6 +24,33 @@
</label>
</div>
</div>
<div class="form-group-group grey">
<h4><%-lang['2-Factor Authentication']%></h4>
<div class="form-group">
<label><div><span><%-lang['Enabled']%></span></div>
<div><select class="form-control" detail="factorAuth">
<option value="0" selected><%-lang.No%></option>
<option value="1"><%-lang.Yes%></option>
</select></div>
</label>
</div>
<div class="form-group">
<label><div><span><%-lang.Email%></span></div>
<div><select class="form-control" detail="factor_mail">
<option value="1" selected><%-lang.Yes%></option>
<option value="0"><%-lang.No%></option>
</select></div>
</label>
</div>
<div class="form-group u_discord_bot_input u_discord_bot_1">
<label><div><span><%-lang.Discord%></span></div>
<div><select class="form-control" detail="factor_discord">
<option value="0" selected><%-lang.No%></option>
<option value="1"><%-lang.Yes%></option>
</select></div>
</label>
</div>
</div>
<div class="form-group-group grey">
<h4><%-lang.Profile%></h4>
<div class="form-group">
@ -41,14 +68,6 @@
<div><input class="form-control" type="password" name="password_again"></div>
</label>
</div>
<div class="form-group">
<label><div><span><%-lang['2-Factor Authentication']%> (<%-lang.Email%>)</span></div>
<div><select class="form-control" detail="factorAuth">
<option value="0" selected><%-lang.No%></option>
<option value="1"><%-lang.Yes%></option>
</select></div>
</label>
</div>
<% if(!details.sub){ %>
<% if(details.edit_size!=='0'){ %>
<div class="form-group">
@ -116,11 +135,19 @@
</div>
</label>
</div>
<div class="form-group">
<label><div><span><%-lang['Alert Sound Delay']%></span></div>
<div><input class="form-control" detail="audio_delay" placeholder="1"></div>
</label>
</div>
<div class="form-group">
<label><div><span><%-lang['Alert Sound Delay']%></span></div>
<div><input class="form-control" detail="audio_delay" placeholder="1"></div>
</label>
</div>
<div class="form-group">
<label><div><span><%-lang['Popout Monitor on Event']%></span></div>
<div><select class="form-control" detail="event_mon_pop">
<option value="0" selected><%-lang.No%></option>
<option value="1"><%-lang.Yes%></option>
</select></div>
</label>
</div>
</div>
<% if(!details.sub){ %>
<div class="form-group-group blue">

View file

@ -20,6 +20,7 @@ if(data.url.charAt(data.url.length - 1) !== '/'){
<script src="<%=data.url%>libs/js/poseidon.js"></script>
<script src="<%=data.url%>libs/js/hls.min.js"></script>
<script src="<%=data.url%>libs/js/flv.min.js"></script>
<script src="<%=data.url%>libs/js/libde265.min.js"></script>
<% if(data.addon){
var ar={}
decodeURI(data.addon).split('|').forEach(function(v){
@ -133,7 +134,7 @@ $(document).ready(function(){
})
</script>
<div class="shinobi_stream" id="<%= data.name %>">
<% switch(mon.details.stream_type){
case'jpeg':
%><img class="stream-element"><%
@ -148,8 +149,8 @@ $(document).ready(function(){
%><canvas class="stream-element"></canvas><%
break;
} %>
<% if(data.addon&&data.addon.indexOf('gui')>-1){ %>
<div class="shinobi_hud">
<div class="shinobi_viewers" title="Current number of viewers"></div>
@ -170,11 +171,30 @@ $(document).ready(function(){
$.shinobi.mon={}
};
$.shinobi.init=function(d){
if($.shinobi.mon[d.id].Base64 && $.shinobi.mon[d.id].Base64.connected){
$.shinobi.mon[d.id].Base64.disconnect()
}
if($.shinobi.mon[d.id].Poseidon){
$.shinobi.mon[d.id].Poseidon.destroy()
}
if ($.shinobi.mon[d.id].h265Player) {
$.shinobi.mon[d.id].h265Player.stop()
}
if($.shinobi.mon[d.id].h265Socket && $.shinobi.mon[d.id].h265Socket.connected){
$.shinobi.mon[d.id].h265Socket.disconnect()
}
if($.shinobi.mon[d.id].h265HttpStream && $.shinobi.mon[d.id].abort){
$.shinobi.mon[d.id].h265HttpStream.abort()
}
if($.shinobi.mon[d.id].flv){
$.shinobi.mon[d.id].flv.destroy()
}
if($.shinobi.mon[d.id].hls){
$.shinobi.mon[d.id].hls.destroy()
}
clearInterval($.shinobi.mon[d.id].jpegInterval);
switch($.shinobi.mon[d.id].details.stream_type){
case'b64':
if($.shinobi.mon[d.id].Base64 && $.shinobi.mon[d.id].Base64.connected){
$.shinobi.mon[d.id].Base64.disconnect()
}
$.shinobi.mon[d.id].Base64 = io('<%=data.url%>',{transports: ['websocket'], forceNew: false})
var ws = $.shinobi.mon[d.id].Base64
ws.on('diconnect',function(){
@ -209,7 +229,7 @@ $(document).ready(function(){
// }
// 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)
URL.revokeObjectURL($.shinobi.mon[d.id].imageUrl)
}
ws.on('data',function(imageData){
try{
@ -232,9 +252,6 @@ $(document).ready(function(){
case'mp4':
var stream = $('#SHINOBI_'+d.ke+'_'+d.id+' .stream-element');
if($.shinobi.mon[d.id].details.stream_flv_type==='ws'){
if($.shinobi.mon[d.id].Poseidon){
$.shinobi.mon[d.id].Poseidon.destroy()
}
var createPoseidon = function(){
$.shinobi.mon[d.id].Poseidon = new Poseidon({
video: stream[0],
@ -261,11 +278,38 @@ $(document).ready(function(){
stream.attr('src','<%=data.url%><%=data.auth%>/mp4/'+d.ke+'/'+d.id+'/s.mp4')
}
break;
case'h265':
var player = $.shinobi.mon[d.id].h265Player
var video = $('#SHINOBI_'+d.ke+'_'+d.id+' .stream-element')[0]
player = new libde265.RawPlayer(video)
player.set_status_callback(function(msg, fps) {
})
player.launch()
if($.shinobi.mon[d.id].details.stream_flv_type==='ws'){
$.shinobi.mon[d.id].h265Socket = io(url,{transports: ['websocket'], forceNew: false})
var ws = $.shinobi.mon[d.id].h265Socket
ws.on('diconnect',function(){
console.log('h265Socket Stream Disconnected')
})
ws.on('connect',function(){
ws.emit('h265',{
auth:'<%=data.auth%>',
ke:d.ke,
uid:'<%=data.uid%>',
id:d.id,
url: '<%=data.url%>'
// channel: channel
})
ws.on('data',function(imageData){
player._handle_onChunk(imageData)
})
})
}else{
$.shinobi.mon[d.id].h265HttpStream = player.createHttpStream('<%=data.url%><%=data.auth%>/h265/'+d.ke+'/'+d.id+'/s.hevc')
}
break;
case'flv':
if (flvjs.isSupported()) {
if($.shinobi.mon[d.id].flv){
$.shinobi.mon[d.id].flv.destroy()
}
var options = {};
// if($.shinobi.mon[d.id].details.stream_flv_type==='ws'){
// if($.shinobi.mon[d.id].details.stream_flv_maxLatency&&$.shinobi.mon[d.id].details.stream_flv_maxLatency!==''){
@ -307,9 +351,9 @@ $(document).ready(function(){
k=d.mon.details;
k.jpegInterval=parseFloat(k.jpegInterval);
if(!k.jpegInterval||k.jpegInterval===''||isNaN(k.jpegInterval)){k.jpegInterval=1}
if(!$.shinobi.mon[d.mon.mid].jpegInterval){
clearInterval($.shinobi.mon[d.mon.mid].jpegInterval);
$.shinobi.mon[d.mon.mid].jpegInterval=setInterval(function(){
if(!$.shinobi.mon[d.id].jpegInterval){
clearInterval($.shinobi.mon[d.id].jpegInterval);
$.shinobi.mon[d.id].jpegInterval=setInterval(function(){
$('#SHINOBI_'+d.ke+'_'+d.id+' .stream-element').attr('src','<%=data.url%><%=data.auth%>/jpeg/'+d.mon.ke+'/'+d.mon.mid+'/s.jpg?time='+(new Date()).getTime())
},1000/k.jpegInterval);
}
@ -317,9 +361,6 @@ $(document).ready(function(){
case'hls':
var video = $('#SHINOBI_'+d.ke+'_'+d.id+' .stream-element')[0];
d.url='<%=data.url%><%=data.auth%>/hls/'+d.ke+'/'+d.id+'/s.m3u8';
if($.shinobi.mon[d.id].hls){
$.shinobi.mon[d.id].hls.destroy()
}
if (navigator.userAgent.match(/(iPod|iPhone|iPad)/)||(navigator.userAgent.match(/(Safari)/)&&!navigator.userAgent.match('Chrome'))) {
video.src=d.url;
video.play();
@ -386,7 +427,7 @@ $(document).ready(function(){
$(window).resize();
// d.mon.details=JSON.stringify(d.mon.details);
d.mon.id = d.mon.mid
$.shinobi.mon[d.mon.mid]=d.mon;
$.shinobi.mon[d.id] = d.mon;
$.shinobi.init(d.mon);
break;
}
@ -413,4 +454,4 @@ $(document).ready(function(){
$.shinobi.init(monitor);
})
$('.shinobi_ws_http_toggle').show()
</script>
</script>

View file

@ -163,6 +163,7 @@
<% include blocks/monitoredit.ejs %>
<% include blocks/probe.ejs %>
<% include blocks/region.ejs %>
<% include blocks/detectorfilters.ejs %>
<% include blocks/confirm.ejs %>
<% if(config.DropboxAppKey){ %>
<!--Dropbox Library, Change data-app-key to your app key. -->
@ -179,6 +180,7 @@
<script src="<%-originalURL%>libs/js/socket.io.js"></script>
<script src="<%-originalURL%>libs/js/fullcalendar.min.js"></script>
<script src="<%-originalURL%>libs/js/hls.min.js"></script>
<script src="<%-originalURL%>libs/js/libde265.min.js"></script>
<script type="text/javascript" src="<%-originalURL%>libs/js/flv.shinobi.js">;</script>
<script src="<%-originalURL%>libs/js/menu.js"></script>
<script src="<%-originalURL%>libs/js/clock.js"></script>
@ -193,4 +195,4 @@
<script src="<%-originalURL%>libs/js/gridstack.min.js"></script>
<script src="<%-originalURL%>libs/js/gridstack.jQueryUI.min.js"></script>
<script><% include ../libs/js/main.dash2.js %></script>
<% include blocks/help.ejs %>
<% include blocks/help.ejs %>