From 22f2d37f1fb0b9f00e9aaab9d5ebfbb31db45049 Mon Sep 17 00:00:00 2001
From: Moe <github@m03.ca>
Date: Wed, 29 Jul 2020 16:38:04 -0700
Subject: [PATCH] Show GPS data on Video Recordings (if they have it)

---
 libs/webServerPaths.js         |  6 +++-
 web/libs/js/dash2.elements.js  | 34 +++++++++++++++---
 web/libs/js/dash2.gps.js       | 66 ++++++++++++++++++++++++++++++++++
 web/pages/blocks/videoview.ejs | 12 ++++++-
 web/pages/home.ejs             |  1 +
 5 files changed, 112 insertions(+), 7 deletions(-)
 create mode 100644 web/libs/js/dash2.gps.js

diff --git a/libs/webServerPaths.js b/libs/webServerPaths.js
index d7b0dac8..b17d3498 100644
--- a/libs/webServerPaths.js
+++ b/libs/webServerPaths.js
@@ -1558,7 +1558,11 @@ module.exports = function(s,config,lang,app,io){
                     req.dir=s.getVideoDirectory(r[0])+req.params.file
                     fs.stat(req.dir,function(err,stats){
                         if (!err){
-                            s.streamMp4FileOverHttp(req.dir,req,res)
+                            if(req.query.json === 'true'){
+                                s.closeJsonResponse(res,r[0])
+                            }else{
+                                s.streamMp4FileOverHttp(req.dir,req,res)
+                            }
                         }else{
                             res.end(user.lang['File Not Found in Filesystem'])
                         }
diff --git a/web/libs/js/dash2.elements.js b/web/libs/js/dash2.elements.js
index 692339bb..38e2cd49 100644
--- a/web/libs/js/dash2.elements.js
+++ b/web/libs/js/dash2.elements.js
@@ -157,12 +157,12 @@ $(document).ready(function(e){
                 e.preventDefault();
                 e.href=$(this).attr('href')
                 var el = $('#video_viewer')
-                var modalBody = el.find('.modal-body')
+                var videoContainer = el.find('.video-container')
                 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)
+                videoContainer.html(html)
                 el.find('video')[0].onerror = function(){
-                    modalBody.find('.msg').text(lang.h265BrowserText1)
+                    videoContainer.find('.msg').text(lang.h265BrowserText1)
                 }
                 el.attr('mid',e.mid);
                 footer = el.find('.modal-footer');
@@ -178,6 +178,28 @@ $(document).ready(function(e){
                         if(d.ok !== true)console.log(d,new Error())
                     })
                 }
+                setTimeout(function(){
+                    destroyGpsHandlerForVideoFile(`video_viewer_gps_map_map`)
+                    var videoElement = videoContainer.find('.video_video')
+                    var gpsContainer = videoContainer.next()
+                    var fullWidth = 'col-md-12'
+                    var partialWidth = 'col-md-8'
+                    createGpsHandlerForVideoFile({
+                        ke: e.ke,
+                        mid: e.mid,
+                        file: e.file,
+                        targetVideoElement: videoElement,
+                        targetMapElement: `video_viewer_gps_map`,
+                    },function(response){
+                        if(response.ok){
+                            videoContainer.addClass(partialWidth).removeClass(fullWidth)
+                            gpsContainer.show()
+                        }else{
+                            videoContainer.addClass(fullWidth).removeClass(partialWidth)
+                            gpsContainer.hide()
+                        }
+                    })
+                },2000)
             break;
             case'delete':
                 e.preventDefault();
@@ -766,8 +788,10 @@ $(document).ready(function(e){
     })
 
     $('.modal').on('hidden.bs.modal',function(){
-        $(this).find('video').remove();
-        $(this).find('iframe').attr('src','about:blank');
+        var el = $(this)
+        el.find('video').remove();
+        el.find('iframe').attr('src','about:blank');
+        if(el.attr('id') === 'video_viewer')destroyGpsHandlerForVideoFile(`video_viewer_gps_map_map`)
     });
     $('.modal').on('shown.bs.modal',function(){
         e={e:$(this).find('.flex-container-modal-body')}
diff --git a/web/libs/js/dash2.gps.js b/web/libs/js/dash2.gps.js
new file mode 100644
index 00000000..13ef369c
--- /dev/null
+++ b/web/libs/js/dash2.gps.js
@@ -0,0 +1,66 @@
+$(document).ready(function(){
+    var createMapElement = function(options){
+        $(`#${options.id}`).html(`<div class="gps-map" id="${options.id}_map" style="min-height: 600px;border-radius:5px;overflow:hidden;"></div>`)
+        var vidViewMap = L.map(options.id + '_map').setView(options.initalView, options.zoom)
+        var mapBoxMarker;
+        L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
+            attribution: 'OpenStreet Map'
+        }).addTo(vidViewMap)
+
+        if(options.marker)mapBoxMarker = L.marker(options.marker).addTo(vidViewMap)
+        return {
+            map: vidViewMap,
+            marker: mapBoxMarker,
+        }
+    }
+    window.destroyGpsHandlerForVideoFile = function(mapId){
+        var vidViewMap = $(`#${mapId}`)
+        if (vidViewMap.length > 0) {
+            try{
+                vidViewMap.off();
+                vidViewMap.remove();
+            }catch(err){
+                console.log(err)
+            }
+        }
+    }
+    window.createGpsHandlerForVideoFile = function(options,callback){
+        var groupKey = options.ke
+        var monitorId = options.mid
+        var filename = options.file
+        var videoElement = options.targetVideoElement
+        $.get(getApiPrefix() + '/videos/' + groupKey + '/' + monitorId + '/' + filename + '?json=true',function(video){
+            var response = {ok: false}
+            var gps = video.details.gps
+            console.log(video)
+            if(gps && gps[0]){
+                var gpsPoints = {}
+                var firstMarker = gps[0]
+
+                var videoStartTime = new Date(video.time)
+                $.each(gps,function(n,point){
+                    var pointTime = new Date(point.time)
+                    var seekPosition = (pointTime - videoStartTime) / 1000
+                    gpsPoints[pointTime] = point
+                })
+                response.ok = true
+                response.gpsPoints = gpsPoints
+                callback(response)
+                response.elements = createMapElement({
+                    id: options.targetMapElement,
+                    initalView: [firstMarker.lat,firstMarker.lng],
+                    marker: [firstMarker.lat,firstMarker.lng],
+                    zoom: 5,
+                })
+                videoElement.on('timeupdate',function(){
+                    var point = gpsPoints[parseInt(this.currentTime)]
+                    if(point){
+                        mapBoxMarker.setLatLng([point.lat, point.lng]).update()
+                    }
+                })
+            }else{
+                callback(response)
+            }
+        })
+    }
+})
diff --git a/web/pages/blocks/videoview.ejs b/web/pages/blocks/videoview.ejs
index 65db05a7..86b768d9 100644
--- a/web/pages/blocks/videoview.ejs
+++ b/web/pages/blocks/videoview.ejs
@@ -66,7 +66,17 @@
         </button>
         <h4 class="modal-title" id="video_viewerLabel"><i class="fa fa-play-circle"></i> &nbsp; <span></span></h4>
       </div>
-      <div class="modal-body text-center"></div>
+      <div class="modal-body text-center">
+          <div class="row">
+              <div class="col-md-8 video-container">
+              </div>
+              <div class="col-md-4">
+                  <div id="video_viewer_gps_map">
+
+                  </div>
+              </div>
+          </div>
+      </div>
       <div class="modal-footer">
         <a class="btn btn-danger pull-left" video="delete" data-dismiss="modal"><%-lang.Delete%></a>
           <div class="btn-group">
diff --git a/web/pages/home.ejs b/web/pages/home.ejs
index 23ab9670..496b2568 100644
--- a/web/pages/home.ejs
+++ b/web/pages/home.ejs
@@ -217,6 +217,7 @@
 <script src="<%-window.libURL%>libs/js/dash2.elements.js"></script>
 <script src="<%-window.libURL%>libs/js/dash2.elementbuilder.js"></script>
 <script src="<%-window.libURL%>libs/js/dash2.init.js"></script>
+<script src="<%-window.libURL%>libs/js/dash2.gps.js"></script>
 <% customAutoLoad.LibsJs.forEach(function(lib){ %>
     <script src="<%-window.libURL%>libs/js/<%-lib%>"></script>
 <% }) %>