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(); + } }