From 344fa858c912db367702679992718471c9218b16 Mon Sep 17 00:00:00 2001
From: Moe <github@m03.ca>
Date: Thu, 30 Jun 2022 18:07:40 -0700
Subject: [PATCH] Remove HLS List Size in favor of Buffer Time from Event

monitorConfig.details.detector_buffer_hls_list_size is now deprecated. It will be automatically calculated based on the Buffer Time from Event that is provided.
---
 definitions/base.js     | 20 +++++++++-----------
 languages/en_CA.json    |  2 ++
 libs/events/utils.js    |  2 +-
 libs/ffmpeg/builders.js |  6 +++++-
 4 files changed, 17 insertions(+), 13 deletions(-)

diff --git a/definitions/base.js b/definitions/base.js
index 30bcdac4..f0dc6ed6 100644
--- a/definitions/base.js
+++ b/definitions/base.js
@@ -3688,6 +3688,12 @@ module.exports = function(s,config,lang){
                       isFormGroupGroup: true,
                       "section-class": "h_det_input h_det_1",
                       "info": [
+                          {
+                             "name": "detail=detector_buffer_seconds_before",
+                             "field": lang['Buffer Time from Event'],
+                             "description": lang["fieldTextBuffetTimeFromEvent"],
+                             "default": "5",
+                          },
                           {
                              "name": "detail=detector_buffer_vcodec",
                              "field": lang['HLS Video Encoder'],
@@ -3792,14 +3798,6 @@ module.exports = function(s,config,lang){
                              "example": "",
                              "possible": ""
                           },
-                          {
-                             "name": "detail=detector_buffer_hls_list_size",
-                             "field": lang['HLS List Size'],
-                             "description": lang["fieldTextDetectorBufferHlsListSize"],
-                             "default": "10",
-                             "example": "",
-                             "possible": ""
-                          },
                           {
                              "name": "detail=detector_buffer_start_number",
                              "field": lang['HLS Start Number'],
@@ -3820,9 +3818,9 @@ module.exports = function(s,config,lang){
                           },
                           {
                              "field": lang['Buffer Preview'],
-                             id: "monEditBufferPreview",
                              "fieldType": "div",
-                             "style": "width:100%;height:300px;background:#eceaea;border-radius:5px;color:#333;font-family:monospace"
+                             // style: `width:100%;background:#eceaea;border-radius:5px;color:#333;font-family:monospace`,
+                             divContent: `<pre><code id="monEditBufferPreview"></code></pre>`
                           },
                       ]
                    },
@@ -7716,7 +7714,7 @@ module.exports = function(s,config,lang){
                                          "bars": 3,
                                          "color0": "info",
                                          "title0": lang["Video Share"],
-                                         "color1": "success",
+                                         "color1": "danger",
                                          "title1": lang["Timelapse Frames Share"],
                                          "color2": "warning",
                                          "title2": lang["FileBin Share"],
diff --git a/languages/en_CA.json b/languages/en_CA.json
index 36698da5..1f3cd263 100644
--- a/languages/en_CA.json
+++ b/languages/en_CA.json
@@ -1401,6 +1401,8 @@
    "MQTT Inbound": "MQTT Inbound",
    "MQTT Outbound": "MQTT Outbound",
    "MQTT Client": "MQTT Client",
+   "Buffer Time from Event": "Buffer Time from Event",
+   "fieldTextBufferTimeFromEvent": "The amount of seconds to record before the trigger happened. If this is consistently inaccutrate you will need to look at the <a target='_blank' href='https://hub.shinobi.video/articles/view/DmWIID78VtvEfnf'>optimization guide</a> or force encoding on the server.",
    "fieldTextMode": "This is the primary task of the monitor.",
    "fieldTextModeDisabled": "Inactive monitor, no process will be created in this mode.",
    "fieldTextModeWatchOnly": "Monitor will only stream, no recording will occur unless otherwise ordered by API or Detector.",
diff --git a/libs/events/utils.js b/libs/events/utils.js
index 7b1129cf..a0502dd9 100644
--- a/libs/events/utils.js
+++ b/libs/events/utils.js
@@ -534,7 +534,7 @@ module.exports = (s,config,lang,app,io) => {
                 //-t 00:'+s.timeObject(new Date(detector_timeout * 1000 * 60)).format('mm:ss')+'
                 activeMonitor.eventBasedRecording.process = spawn(
                     config.ffmpegDir,
-                    splitForFFPMEG(('-loglevel warning -analyzeduration 1000000 -probesize 1000000 -re -i "'+s.dir.streams+d.ke+'/'+d.id+'/detectorStream.m3u8" -movflags faststart+frag_keyframe+empty_moov -fflags +igndts -c:v copy -strftime 1 "'+s.getVideoDirectory(monitorConfig) + filename + '"'))
+                    splitForFFPMEG(('-loglevel warning -live_start_index -99999 -analyzeduration 1000 -probesize 32 -re -i "'+s.dir.streams+d.ke+'/'+d.id+'/detectorStream.m3u8" -movflags faststart+frag_keyframe+empty_moov -fflags +igndts -c:v copy -strftime 1 "'+s.getVideoDirectory(monitorConfig) + filename + '"'))
                 )
                 activeMonitor.eventBasedRecording.process.stderr.on('data',function(data){
                     s.userLog(d,{
diff --git a/libs/ffmpeg/builders.js b/libs/ffmpeg/builders.js
index ad92f30a..8583de25 100644
--- a/libs/ffmpeg/builders.js
+++ b/libs/ffmpeg/builders.js
@@ -679,13 +679,17 @@ module.exports = (s,config,lang) => {
             const isCudaEnabled = hasCudaEnabled(e)
             const outputFilters = []
             var videoCodec = e.details.detector_buffer_vcodec
+            var liveStartIndex = e.details.detector_buffer_live_start_index || '-3'
             var audioCodec = e.details.detector_buffer_acodec ? e.details.detector_buffer_acodec : 'no'
             const videoCodecisCopy = videoCodec === 'copy'
             const videoFps = !isNaN(parseFloat(e.details.stream_fps)) && e.details.stream_fps !== '0' ? parseFloat(e.details.stream_fps) : null
             const inputMap = buildInputMap(e,e.details.input_map_choices.detector_sip_buffer)
             const { videoWidth, videoHeight } = validateDimensions(e.details.event_record_scale_x,e.details.event_record_scale_y)
             const hlsTime = !isNaN(parseInt(e.details.detector_buffer_hls_time)) ? `${parseInt(e.details.detector_buffer_hls_time)}` : '2'
-            const hlsListSize = !isNaN(parseInt(e.details.detector_buffer_hls_list_size)) ? `${parseInt(e.details.detector_buffer_hls_list_size)}` : '4'
+            // const hlsListSize = !isNaN(parseInt(e.details.detector_buffer_hls_list_size)) ? `${parseInt(e.details.detector_buffer_hls_list_size)}` : '4'
+            const secondsBefore = parseInt(e.details.detector_buffer_seconds_before) || 5
+            let hlsListSize = parseInt(secondsBefore * 0.6)
+            hlsListSize = hlsListSize < 3 ? 3 : hlsListSize;
             if(inputMap)outputFlags.push(inputMap)
             if(e.details.cust_sip_record)outputFlags.push(e.details.cust_sip_record)
             if(videoCodec === 'auto'){