$(document).ready(function(e){
var theEnclosure = $('#tab-videosTableView')
var monitorsList = theEnclosure.find('.monitors_list')
var dateSelector = theEnclosure.find('.date_selector')
var videosTableDrawArea = $('#videosTable_draw_area')
var videosTablePreviewArea = $('#videosTable_preview_area')
var objectTagSearchField = $('#videosTable_tag_search')
var cloudVideoCheckSwitch = $('#videosTable_cloudVideos')
var sideLinkListBox = $('#side-menu-link-videosTableView ul')
var loadedVideosTable = [];
var redrawTimeout;
var frameUrlCache = {}
var frameUrlCacheTimeouts = {}
async function getSnapshotFromVideoTimeFrame(monitorId,startDate,endDate){
const frameUrlCacheId = `${monitorId}${startDate}${endDate}`
if(typeof frameUrlCache[frameUrlCacheId] === 'string'){
return frameUrlCache[frameUrlCacheId]
}else{
const frame = (await getTimelapseFrames(monitorId,startDate,endDate,1))[0]
const href = frame && frame.href ? frame.href : ''
frameUrlCache[frameUrlCacheId] = `${href}`
frameUrlCacheTimeouts[frameUrlCacheId] = setTimeout(() => {
delete(frameUrlCache[frameUrlCacheId])
delete(frameUrlCacheTimeouts[frameUrlCacheId])
},1000 * 60 * 15)
return href
}
}
function loadFramesForVideosInView(){
videosTableDrawArea.find('.video-thumbnail').each(async (n,imgEl) => {
const el = $(imgEl)
const monitorId = el.attr('data-mid')
const startDate = el.attr('data-time')
const endDate = el.attr('data-end')
const imgBlock = el.find('.video-thumbnail-img-block')
const href = await getSnapshotFromVideoTimeFrame(monitorId,startDate,endDate)
imgBlock.find('img').attr('src',href)
})
}
function openVideosTableView(monitorId,startDate,endDate){
drawVideosTableViewElements(monitorId,startDate,endDate)
}
loadDateRangePicker(dateSelector,{
onChange: function(start, end, label) {
drawVideosTableViewElements()
}
})
monitorsList.change(function(){
drawVideosTableViewElements()
})
objectTagSearchField.change(function(){
drawVideosTableViewElements()
})
cloudVideoCheckSwitch.change(function(){
drawVideosTableViewElements()
})
async function drawVideosTableViewElements(usePreloadedData){
var dateRange = getSelectedTime(dateSelector)
var searchQuery = objectTagSearchField.val() || null
var startDate = dateRange.startDate
var endDate = dateRange.endDate
var monitorId = monitorsList.val()
var wantsArchivedVideo = getVideoSetSelected() === 'archive'
var frameIconsHtml = ''
if(!usePreloadedData){
loadedVideosTable = (await getVideos({
monitorId,
startDate,
endDate,
searchQuery,
archived: wantsArchivedVideo,
customVideoSet: wantCloudVideos() ? 'cloudVideos' : null,
})).videos;
$.each(loadedVideosTable,function(n,v){
loadedVideosInMemory[`${monitorId}${v.time}`]
})
}
// for (let i = 0; i < loadedVideosTable.length; i++) {
// const file = loadedVideosTable[i]
// const frameUrl = await getSnapshotFromVideoTimeFrame(file.mid,file.time,file.end);
// file.frameUrl = frameUrl
// }
videosTableDrawArea.bootstrapTable('destroy')
videosTableDrawArea.bootstrapTable({
onPostBody: loadFramesForVideosInView,
onPageChange: () => {
setTimeout(() => {
loadFramesForVideosInView()
},500)
},
pagination: true,
search: true,
columns: [
{
field: 'mid',
title: '',
checkbox: true,
formatter: () => {
return {
checked: false
}
},
},
{
field: 'image',
title: '',
},
{
field: 'Monitor',
title: '',
},
{
field: 'time',
title: lang['Time Created'],
},
{
field: 'end',
title: lang['Ended']
},
{
field: 'objects',
title: lang['Objects Found']
},
{
field: 'tags',
title: ''
},
{
field: 'size',
title: ''
},
{
field: 'buttons',
title: ''
}
],
data: loadedVideosTable.map((file) => {
var href = file.href
var loadedMonitor = loadedMonitors[file.mid]
return {
image: `
`,
Monitor: loadedMonitor && loadedMonitor.name ? loadedMonitor.name : file.mid,
mid: file.mid,
time: formattedTime(file.time, 'DD-MM-YYYY hh:mm:ss AA'),
end: formattedTime(file.end, 'DD-MM-YYYY hh:mm:ss AA'),
tags: `
${file.ext ? `${file.ext}` : ''}
`,
objects: file.objects,
size: convertKbToHumanSize(file.size),
buttons: `
${permissionCheck('video_delete',file.mid) ? `
` : ''}
${buildDefaultVideoMenuItems(file)}
`,
}
})
})
}
function drawPreviewVideo(href){
videosTablePreviewArea.html(``)
}
function getSelectedRows(getLoadedRows){
var rowsSelected = []
videosTableDrawArea.find('[name="btSelectItem"]:checked').each(function(n,checkbox){
var rowInfo = $(checkbox).parents('tr').find('.row-info')
var monitorId = rowInfo.attr('data-mid')
var groupKey = rowInfo.attr('data-ke')
var time = rowInfo.attr('data-time')
var filename = rowInfo.attr('data-filename')
rowsSelected.push(getLoadedRows ? loadedVideosInMemory[`${monitorId}${time}`] : {
mid: monitorId,
ke: groupKey,
time: time,
filename: filename,
})
})
return rowsSelected
}
function getVideoSetSelected(){
return cloudVideoCheckSwitch.val()
}
function wantCloudVideos(){
const isChecked = getVideoSetSelected() === 'cloud'
return isChecked
}
function drawCompressedVideoProgressBar(data){
var videoUrl = buildNewFileLink(data)
var html = `
`
sideLinkListBox.append(html)
}
function buildNewFileLink(data){
return apiBaseUrl + '/videos/' + data.ke + '/' + data.mid + '/' + data.name
}
function downloadCompressedVideo(data){
var downloadUrl = buildNewFileLink(data)
downloadFile(downloadUrl,data.name)
}
$('body')
.on('click','.open-videosTable',function(e){
e.preventDefault()
var monitorId = getRowsMonitorId(this)
openTab(`videosTableView`,{},null,null,null,() => {
drawMonitorListToSelector(monitorsList,null,null,true)
monitorsList.val(monitorId)
drawVideosTableViewElements()
})
return false;
});
sideLinkListBox
.on('click','.remove-row',function(){
var el = $(this).parents('[data-mid]')
el.remove()
});
theEnclosure
.on('click','.preview-video',function(e){
e.preventDefault()
var el = $(this)
var href = el.attr('href')
setPreviewedVideoHighlight(el,videosTableDrawArea)
drawPreviewVideo(href)
return false;
})
.on('click','.zip-selected-videos',function(e){
e.preventDefault()
var videos = getSelectedRows(true)
zipVideosAndDownloadWithConfirm(videos)
return false;
})
.on('click','.refresh-data',function(e){
e.preventDefault()
drawVideosTableViewElements()
return false;
})
.on('click','.open-snapshot',function(e){
e.preventDefault()
var href = $(this).parents('.video-thumbnail').find('img').click()
return false;
})
.on('click','.delete-selected-videos',function(e){
e.preventDefault()
var videos = getSelectedRows()
if(videos.length === 0)return;
$.confirm.create({
title: lang["Delete Videos"],
body: `${lang.DeleteTheseMsg}`,
clickOptions: {
title: ' ' + lang.Delete,
class: 'btn-danger btn-sm'
},
clickCallback: function(){
deleteVideos(videos).then(() => {
console.log(`Done Deleting Rows!`)
})
}
});
return false;
})
.on('click','.compress-selected-videos',function(e){
e.preventDefault()
var videos = getSelectedRows()
if(videos.length === 0)return;
$.confirm.create({
title: lang["Compress Videos"],
body: `${lang.CompressTheseMsg}`,
clickOptions: {
title: ' ' + lang.Compress,
class: 'btn-primary btn-sm'
},
clickCallback: function(){
compressVideos(videos).then(() => {
console.log(`Done Sending Compression Request!`)
})
}
});
return false;
})
.on('click','.archive-selected-videos',function(e){
e.preventDefault()
var videos = getSelectedRows()
if(videos.length === 0)return;
$.confirm.create({
title: lang["Archive Videos"],
body: `${lang.ArchiveTheseMsg}`,
clickOptions: {
title: ' ' + lang.Archive,
class: 'btn-primary btn-sm'
},
clickCallback: function(){
archiveVideos(videos).then(() => {
console.log(`Done Archiving Rows!`)
})
}
});
return false;
})
.on('click','.download-selected-videos',function(e){
e.preventDefault()
var videos = getSelectedRows()
if(videos.length === 0)return;
$.confirm.create({
title: lang["Batch Download"],
body: `${lang.batchDownloadText}`,
clickOptions: {
title: ' ' + lang.Yes,
class: 'btn-success btn-sm'
},
clickCallback: function(){
downloadVideos(videos)
}
});
return false;
})
.on('click','.pop-img',function(e){
e.preventDefault()
var videos = getSelectedRows()
if(videos.length === 0)return;
$.confirm.create({
title: lang["Batch Download"],
body: `${lang.batchDownloadText}`,
clickOptions: {
title: ' ' + lang.Yes,
class: 'btn-success btn-sm'
},
clickCallback: function(){
downloadVideos(videos)
}
});
return false;
})
onWebSocketEvent((data) => {
switch(data.f){
case'video_delete':
if(tabTree.name === 'videosTableView'){
var videoIndexToRemove = loadedVideosTable.findIndex(row => data.mid === row.mid && new Date(row.time).getTime() === new Date(data.time).getTime())
if(videoIndexToRemove !== -1){
loadedVideosTable.splice(videoIndexToRemove, 1);
delete(loadedVideosInMemory[`${data.mid}${data.time}`])
clearTimeout(redrawTimeout)
redrawTimeout = setTimeout(function(){
drawVideosTableViewElements(true)
},2000)
}
}
break;
case'video_compress_started':
console.log(`Compressing Video...`,data)
break;
case'video_compress_completed':
if(data.success){
var progressItem = sideLinkListBox.find(`[data-mid="${data.mid}"][data-ke="${data.mid}"][data-name="${data.name}"]`)
var saveBuiltVideo = dashboardOptions().switches.saveCompressedVideo
if(saveBuiltVideo === 1){
downloadCompressedVideo(data)
progressItem.remove()
console.log(`Downloaded!`,data)
}else if(!data.automated){
progressItem.find('.row-status').text(`${lang.Done}!`)
progressItem.find('.dot').removeClass('dot-orange').addClass('dot-green')
progressItem.find('.download-button').show()
progressItem.find('.progress-bar').css('width',`100%`).text(`100%`)
}else if(data.automated){
progressItem.remove()
}
}
break;
case'video_compress_percent':
var progressItem = sideLinkListBox.find(`[data-mid="${data.mid}"][data-ke="${data.mid}"][data-name="${data.name}"]`)
data.percent = data.percent > 100 ? 100 : data.percent
if(progressItem.length === 0){
drawCompressedVideoProgressBar(data)
}else{
progressItem = sideLinkListBox.find(`[data-mid="${data.mid}"][data-ke="${data.mid}"][data-name="${data.name}"]`)
progressItem.find('.progress-bar').css('width',`${data.percent}%`).text(`${data.percent}%`)
}
console.log(data)
break;
}
})
addOnTabOpen('videosTableView', function () {
drawMonitorListToSelector(monitorsList,null,null,true)
drawVideosTableViewElements()
})
addOnTabReopen('videosTableView', function () {
var theSelected = `${monitorsList.val()}`
drawMonitorListToSelector(monitorsList,null,null,true)
monitorsList.val(theSelected)
})
addOnTabAway('videosTableView', function () {
videosTablePreviewArea.find('video')[0].pause()
})
})