diff --git a/backend/assets/loading.webp b/backend/assets/loading.webp
new file mode 100644
index 0000000..a8da92d
Binary files /dev/null and b/backend/assets/loading.webp differ
diff --git a/backend/config_parser.py b/backend/config_parser.py
index fe2c42b..0b35559 100644
--- a/backend/config_parser.py
+++ b/backend/config_parser.py
@@ -150,6 +150,7 @@ class Go2Rtc:
class TranscodeTools:
statuses:dict[str, TranscodeStatus] = {}
WIN32PYTHON = "python-win32"
+ preview_storage = []
def __init__(self, tools_directory, transcode_directory, hide_checks = True, delete_temporary_files = False) -> None:
self.delete_temporary_files = delete_temporary_files
@@ -279,6 +280,12 @@ class TranscodeTools:
async def processing_preview(self, file:File, nvr: NVR, ext = "webp", preview_pre_bytes = 1024 * 512):
raw_file = file.previewPath(self.transcode_directory)
preview_file = f"{raw_file}.{ext}"
+
+ if preview_file in self.preview_storage:
+ return preview_file
+ else:
+ self.preview_storage.append(preview_file)
+
if os.path.exists(preview_file) and os.path.getsize(preview_file) != 0:
self.logger.info(f"{preview_file} is exists")
return preview_file
diff --git a/backend/server.py b/backend/server.py
index caf8e97..6e557cc 100644
--- a/backend/server.py
+++ b/backend/server.py
@@ -228,7 +228,7 @@ class Server:
response.status_code = 400
return {"ok":False, "error":e}
@self.app.get(self.API_BASE_REF + "/preview/{recorder_index}")
- async def getTranscodePreview(response: Response, recorder_index:int, b64:str):
+ async def getTranscodePreview(response: Response, recorder_index:int, b64:str, background_tasks: BackgroundTasks):
try:
if len(b64) == 0:
response.status_code = 404
@@ -236,17 +236,20 @@ class Server:
file: File = File.from_b64(b64 + "==")
- try:
- preview = await self.config.transcode_tools.processing_preview(file, None, "webp")
- except NeedNVR:
+ async def loadPreview(file):
nvr:NVR = self.config.getRecorder(recorder_index).nvr
await nvr.login()
- preview = await self.config.transcode_tools.processing_preview(file, nvr, "webp")
+ await self.config.transcode_tools.processing_preview(file, nvr, "webp")
- headers = {}
- headers.update({"Content-Length":str(os.path.getsize(preview))})
- headers.update({"Content-Disposition": f'attachment; filename="preview.webp"'})
- return FileResponse(preview, media_type="application/octet-stream", headers=headers)
+ try:
+ preview = await self.config.transcode_tools.processing_preview(file, None, "webp")
+ headers = {}
+ headers.update({"Content-Length":str(os.path.getsize(preview))})
+ headers.update({"Content-Disposition": f'attachment; filename="preview.webp"'})
+ return FileResponse(preview, media_type="application/octet-stream", headers=headers)
+ except NeedNVR:
+ background_tasks.add_task(loadPreview, file = file)
+ return FileResponse("./assets/loading.webp")
except Exception as e:
traceback.print_exc()
diff --git a/frontend/ang_dvrip/src/app/components/about/about.component.ts b/frontend/ang_dvrip/src/app/components/about/about.component.ts
index b99f93f..ae195ad 100644
--- a/frontend/ang_dvrip/src/app/components/about/about.component.ts
+++ b/frontend/ang_dvrip/src/app/components/about/about.component.ts
@@ -1,5 +1,6 @@
import { Component, OnInit } from '@angular/core';
import {ActivatedRoute} from "@angular/router";
+import {BaseUtils} from "../../utils/BaseUtils";
@Component({
selector: 'app-about',
@@ -11,6 +12,7 @@ export class AboutComponent implements OnInit {
channel_index: number = 0;
img: string = "";
updated: Date = new Date();
+ baseUtils = BaseUtils;
constructor(private route:ActivatedRoute) {}
@@ -21,7 +23,7 @@ export class AboutComponent implements OnInit {
}
getSnapshot() {
- this.img = `/api/dvrip/snapshot/${this.recorder_index}/${this.channel_index}?timestamp=${new Date().getTime()}`
+ this.img = `/api/dvrip/snapshot/${this.recorder_index}/${this.channel_index}?timestamp=${this.baseUtils.getTime()}`
this.updated = new Date();
}
diff --git a/frontend/ang_dvrip/src/app/components/history/history.component.html b/frontend/ang_dvrip/src/app/components/history/history.component.html
index f4b9867..0f75c79 100644
--- a/frontend/ang_dvrip/src/app/components/history/history.component.html
+++ b/frontend/ang_dvrip/src/app/components/history/history.component.html
@@ -35,7 +35,7 @@
mat-card-image
style="cursor: pointer"
(click)="openTransCodeDialog(element)"
- [src]="'api/dvrip/preview/'+recorder_index+'?b64='+element.b64"
+ [src]="'api/dvrip/preview/'+recorder_index+'?b64='+element.b64+'×tamp='+this.baseUtils.getTime()"
alt="Превью недоступно">
@@ -48,7 +48,6 @@
>
{{element.processing != null?'cloud_upload':element.converted?'cloud_done':'cloud_download'}} {{element.processing != null?'Обработка':element.converted?'Просмотреть':'Загрузить'}}
-
diff --git a/frontend/ang_dvrip/src/app/utils/BaseUtils.ts b/frontend/ang_dvrip/src/app/utils/BaseUtils.ts
index fe86b25..b3e364d 100644
--- a/frontend/ang_dvrip/src/app/utils/BaseUtils.ts
+++ b/frontend/ang_dvrip/src/app/utils/BaseUtils.ts
@@ -25,4 +25,8 @@ export class BaseUtils {
return new Date();
}
}
+
+ static getTime():number {
+ return new Date().getTime();
+ }
}