diff --git a/Dockerfile b/Dockerfile
index dc0ede43..e0b40bde 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -100,8 +100,8 @@ RUN sed -i -e 's/\r//g' /home/Shinobi/Docker/init.sh
VOLUME ["/home/Shinobi/videos"]
VOLUME ["/home/Shinobi/plugins"]
+VOLUME ["/home/Shinobi/libs/customAutoLoad"]
VOLUME ["/config"]
-VOLUME ["/customAutoLoad"]
VOLUME ["/var/lib/mysql"]
EXPOSE 8080 443 21 25
diff --git a/Dockerfile.arm32v7 b/Dockerfile.arm32v7
index e7bd2698..c85896f6 100644
--- a/Dockerfile.arm32v7
+++ b/Dockerfile.arm32v7
@@ -98,8 +98,8 @@ RUN chmod -f +x /home/Shinobi/Docker/init.sh
VOLUME ["/home/Shinobi/videos"]
VOLUME ["/home/Shinobi/plugins"]
+VOLUME ["/home/Shinobi/libs/customAutoLoad"]
VOLUME ["/config"]
-VOLUME ["/customAutoLoad"]
VOLUME ["/var/lib/mysql"]
EXPOSE 8080
diff --git a/Dockerfile.nvidia b/Dockerfile.nvidia
index 0a06510b..10ac76ef 100644
--- a/Dockerfile.nvidia
+++ b/Dockerfile.nvidia
@@ -107,8 +107,8 @@ RUN sed -i -e 's/\r//g' /home/Shinobi/Docker/init.sh
VOLUME ["/home/Shinobi/videos"]
VOLUME ["/home/Shinobi/plugins"]
+VOLUME ["/home/Shinobi/libs/customAutoLoad"]
VOLUME ["/config"]
-VOLUME ["/customAutoLoad"]
VOLUME ["/var/lib/mysql"]
EXPOSE 8080 443 21 25
diff --git a/INSTALL/CentOS - Quick Install.sh b/INSTALL/CentOS - Quick Install.sh
index b45014a5..614de9b9 100644
--- a/INSTALL/CentOS - Quick Install.sh
+++ b/INSTALL/CentOS - Quick Install.sh
@@ -125,7 +125,7 @@ if [ "${ffmpeginstall^}" = "Y" ]; then
elif [ "$version" = 8 ]; then
#Enable Negativo17 repo for FFMPEG (CentOS 8)
sudo dnf install epel-release dnf-utils -y -q -e 0
- sudo yum-config-manager --set-enabled PowerTools
+ sudo yum-config-manager --set-enabled powertools
sudo yum-config-manager --add-repo=https://negativo17.org/repos/epel-multimedia.repo
sudo dnf install ffmpeg ffmpeg-devel -y -q -e 0
fi
@@ -148,7 +148,7 @@ if [ "${installdbserver^}" = "Y" ] || [ "${installdbserver^}" = "" ]; then
if [ "${securedbserver^}" = "Y" ]; then
#Configure basic security for MariaDB
- sudo mysql_secure_installation
+ sudo mariadb-secure-installation
else
echo "========================================================="
echo "Skipping database server security configuration..."
diff --git a/INSTALL/centos.sh b/INSTALL/centos.sh
index 4c8d7a77..15a61ea2 100644
--- a/INSTALL/centos.sh
+++ b/INSTALL/centos.sh
@@ -76,7 +76,7 @@ if [ "$mysqlagree" = "y" ] || [ "$mysqlagree" = "Y" ]; then
sudo systemctl start mariadb
sudo systemctl enable mariadb
#Run mysql install
- sudo mysql_secure_installation
+ sudo mariadb-secure-installation
fi
echo "============="
echo "Shinobi - Database Installation"
diff --git a/cron.js b/cron.js
index bc738df5..414136e0 100644
--- a/cron.js
+++ b/cron.js
@@ -92,8 +92,8 @@ const deleteVideo = (x) => {
const deleteFileBinEntry = (x) => {
postMessage({f:'s.deleteFileBinEntry',file:x})
}
-const setDiskUsedForGroup = (groupKey,size,target) => {
- postMessage({f:'s.setDiskUsedForGroup', ke: groupKey, size: size, target: target})
+const setDiskUsedForGroup = (groupKey,size,target,videoRow) => {
+ postMessage({f:'s.setDiskUsedForGroup', ke: groupKey, size: size, target: target, videoRow: videoRow})
}
const getVideoDirectory = function(e){
if(e.mid&&!e.id){e.id=e.mid};
@@ -185,6 +185,7 @@ const checkFilterRules = function(v){
})
}
const deleteVideosByDays = async (v,days,addedQueries) => {
+ const groupKey = v.ke;
const whereQuery = [
['ke','=',v.ke],
['time','<', sqlDate(days+' DAY')],
@@ -207,7 +208,8 @@ const deleteVideosByDays = async (v,days,addedQueries) => {
const filename = formattedTime(row.time) + '.' + row.ext
try{
await fs.promises.unlink(dir + filename)
- clearSize += row.size / 1048576
+ const fileSizeMB = row.size / 1048576;
+ setDiskUsedForGroup(groupKey,-fileSizeMB,null,row)
sendToWebSocket({
f: 'video_delete',
filename: filename + '.' + row.ext,
@@ -227,7 +229,6 @@ const deleteVideosByDays = async (v,days,addedQueries) => {
where: whereQuery
})
affectedRows = deleteResponse.rows || 0
- setDiskUsedForGroup(v.ke,-clearSize)
}
return {
ok: true,
diff --git a/languages/pt_BR.json b/languages/pt_BR.json
index 34b64f42..14367af0 100644
--- a/languages/pt_BR.json
+++ b/languages/pt_BR.json
@@ -51,7 +51,7 @@
"Enable Nightvision": "Ativar Visão Noturna",
"Disable Nightvision": "Desativar Visão Noturna",
"Current": "Atual",
- "Monitors": "Monitors",
+ "Monitors": "Monitores",
"Video": "Video",
"Videos": "Videos",
"Events": "Eventos",
@@ -122,12 +122,12 @@
"Execute Command": "Executar Comando",
"for Global Access": "para Acesso Global",
"Help": "Ajuda",
- "Don't show this anymore": "Não mostre isso mais",
+ "Don't show this anymore": "Não me mostre isso mais",
"Chat on Discord": "Conversar no Discord",
"Documentation": "Documentação",
"All Monitors": "Todos Monitores",
- "Motion Meter": "Medidos de Movimento",
- "FFmpegTip": "FFprobe is a simple multimedia streams analyzer. You can use it to output all kinds of information about an input including duration, frame rate, frame size, etc.",
+ "Motion Meter": "Medição de movimentos",
+ "FFmpegTip": "FFprobe é um simples analisador de streams. Você pode usá-lo para extrar todos os tipos de informação sobre uma entrada incluindo duração, taxa de frames por segundo, tamanho do frame, etc;",
"Complete Stream URL": "URL de transmissão completa",
"ONVIF Scanner": "ONVIF Scanner",
"Scan Settings": "Configurações de digitalização",
@@ -162,7 +162,7 @@
"Browser Console Log": "Navegador de logs",
"All Monitors and Privileges": "Todos monitores e privilégios",
"Permissions": "Permissões",
- "Time-lapse Tool": "Ferramenta Time-laps",
+ "Time-lapse Tool": "Time-lapse",
"total": "total",
"MB": "MB",
"Calendar": "Calendário",
@@ -187,11 +187,11 @@
"Add New": "Adicionar novo",
"Delete Selected Videos": "Excluir vídeos selecionados",
"DeleteSelectedVideosMsg": "Deseja excluir esses vídeos? Você não poderá recuperá-los.",
- "clientStreamFailedattemptingReconnect": "A verificação ctream do lado do cliente falhou, tentando reconectar.",
+ "clientStreamFailedattemptingReconnect": "A verificação do stream falhou, tentando se reconectar.",
"Delete Filter": "Excluir filtro",
"confirmDeleteFilter": "Deseja excluir este filtro? Você não poderá recuperá-lo.",
"Fix Video": "Corrigir Vídeo",
- "FixVideoMsg": "Você deseja corrigir esse vídeo? Você não poderá desfazer essa ação..",
+ "FixVideoMsg": "Você deseja corrigir o vídeo? Você não poderá desfazer essa ação..",
"DeleteVideoMsg": "Deseja excluir este vídeo? Você não poderá recuperá-lo.",
"dropBoxSuccess": "Sucesso! Arquivos salvos em seu Dropbox.",
"API Key Deleted": "Chave da API excluída",
@@ -246,13 +246,13 @@
"Connected": "Conectado",
"Not Connected": "Não conectado",
"Lisence Plate Detector": "Detector de placas",
- "OpenCV Cascades": "OpenCV Cascatas",
+ "OpenCV Cascades": "Cascatas OpenCV ",
"Refresh List of Cascades": "Atualizar Lista de Cascatas",
"\"No Motion\" Detector": "\"Sem movimento\" Detector",
"Control": "Controle",
"Grouping": "Agrupando Adicione grupos em Configurações",
"Logging": "Logging",
- "IdentityText1": "É assim que o sistema irá identificar os dados para este fluxo. Você não pode alterar o ID do Monitor uma vez que você pressionou salvar. Se você quiser, você pode fazer o ID do Monitor mais legível para humanos antes de continuar.",
+ "IdentityText1": "É assim que o sistema irá identificar os dados para este fluxo. Você não pode alterar o ID do Monitor uma vez que você o salvou. Se você quiser, você pode fazer o ID do Monitor mais legível para humanos antes de continuar.",
"IdentityText2": "Você pode duplicar um monitor modificando o ID do Monitor e depois pressionando salvar. Você não pode usar o ID de um monitor que já existe ou ele economizará sobre as informações do banco de dados desse monitor.",
"noSpecialCharacters": "Sem espaços ou caracteres especiais.",
"NotesPlacholder": "Comentários que você quer deixar para as configurações desta câmera.",
@@ -273,7 +273,7 @@
"Path": "Caminho",
"Monitor Capture Rate": "Taxa de captura do monitor (FPS)",
"Analyzation Duration": "Duração da análise",
- "Probe Size": "Probe Size",
+ "Probe Size": "Tamanho da sonda",
"Stream Type": "Tipo de transmissão",
"# of Allow MJPEG Clients": "# para permitir clientes MJPEG 0 para infinito",
"HLS Video Encoder": "Codificador de vídeo HLS",
@@ -281,9 +281,9 @@
"HLS Segment Length": "Comprimento do segmento HLS em segundos",
"HLS Preset": "Pré-definição HLS",
"HLS List Size": "Tamanho da lista HLS",
- "Check Signal Interval": "Verifique o intervalo do sinal em minutos",
+ "Check Signal Interval": "Verificar o intervalo do sinal em minutos",
"Log Signal Event": "Evento de sinal de registro Apenas cliente",
- "Quality": "Qualidade 1 para alta, 23 para Low",
+ "Quality": "Qualidade 1 para alta, 23 para baixa",
"Rate": "Taxa (FPS)",
"Width": "Largura",
"Height": "Altura",
@@ -444,13 +444,13 @@
"Process Unexpected Exit": "Saída inesperado do processo",
"Process Crashed for Monitor": "Processo de Monitor quebrado",
"FFmpegCantStart": "FFmpeg não pôde iniciar",
- "FFmpegCantStartText": "O mecanismo de gravação para esta câmera não pôde começar. Pode haver algo errado com a configuração da sua câmera. Se houver algum registro diferente deste, por favor, coloque-os em Problemas no Github.",
+ "FFmpegCantStartText": "O FFMpeg não pode inicializar. Pode haver algo de errado com a configuração da sua câmera. Se houver alguma configuração diferente, por favor, reporte no Gitlab.",
"JPEG Error": "Erro JPEG",
"JPEGErrorText": "Houve um problema ao obter dados da sua câmera.",
"Fatal Maximum Reached": "Máximo atingido, parando câmera.",
- "FatalMaximumReachedText": "Erro JPEG fatal.",
+ "FatalMaximumReachedText": "Erro fatal de JPEG",
"Incorrect Settings Chosen": "Configuração incorreta escolhida",
- "Can't Connect": "Não pode conectar",
+ "Can't Connect": "Não foi possível conectar",
"Video Finished": "Vídeo finalizado",
"No Monitor Found, Ignoring Request": "Monitor não encontrado, ignorando requisição",
"Event": "Evento",
diff --git a/libs/socketio.js b/libs/socketio.js
index e02c3918..f6a3b1bd 100644
--- a/libs/socketio.js
+++ b/libs/socketio.js
@@ -955,7 +955,22 @@ module.exports = function(s,config,lang,io){
s.deleteFileBinEntry(d.file)
break;
case's.setDiskUsedForGroup':
- s.setDiskUsedForGroup(d.ke,d.size,d.target || undefined)
+ function doOnMain(){
+ s.setDiskUsedForGroup(d.ke,d.size,d.target || undefined)
+ }
+ if(d.videoRow){
+ let storageIndex = s.getVideoStorageIndex(d.videoRow);
+ if(storageIndex){
+ s.setDiskUsedForGroupAddStorage(d.ke,{
+ size: d.size,
+ storageIndex: storageIndex
+ })
+ }else{
+ doOnMain()
+ }
+ }else{
+ doOnMain()
+ }
break;
case'start':case'end':
d.mid='_cron';s.userLog(d,{type:'cron',msg:d.msg})
diff --git a/libs/videos.js b/libs/videos.js
index 6fd64e28..eb63c944 100644
--- a/libs/videos.js
+++ b/libs/videos.js
@@ -608,9 +608,11 @@ module.exports = function(s,config,lang){
}
s.getVideoStorageIndex = function(video){
try{
- var details = s.parseJSON(video.details) || {}
- var storageId = details.storageId
- if(s.group[video.ke] && s.group[video.ke].activeMonitors[video.id] && s.group[video.ke].activeMonitors[video.id].addStorageId)storageId = s.group[video.ke].activeMonitors[video.id].addStorageId
+ const monitorId = video.id || video.mid
+ const details = s.parseJSON(video.details) || {}
+ const storageId = details.storageId
+ const activeMonitor = s.group[video.ke] && s.group[video.ke].activeMonitors[monitorId] ? s.group[video.ke].activeMonitors[monitorId] : null;
+ if(activeMonitor && activeMonitor.addStorageId)storageId = activeMonitor.addStorageId;
if(storageId){
return s.group[video.ke].addStorageUse[storageId]
}