diff --git a/backend/config_parser.py b/backend/config_parser.py index 0b35559..1e39752 100644 --- a/backend/config_parser.py +++ b/backend/config_parser.py @@ -294,12 +294,18 @@ class TranscodeTools: raise NeedNVR if not os.path.exists(raw_file) or os.path.getsize(raw_file) == 0: - self.logger.info(f"download new preview {preview_file}") - async with aiofiles.open(raw_file, "wb") as raw: - async for chunk in nvr.stream_file(file, preview_pre_bytes): - await raw.write(chunk) + try: + async with asyncio.timeout(10): + self.logger.info(f"download new preview {preview_file}") + async with aiofiles.open(raw_file, "wb") as raw: + async for chunk in nvr.stream_file(file, preview_pre_bytes): + await raw.write(chunk) + except asyncio.TimeoutError as te: + self.logger.info(f"Cancel download file: {te}") + os.remove(raw_file) + finally: + nvr.logout() - nvr.logout() raw_file_avi = await self.h264toavi(raw_file) if self.delete_temporary_files: self.deleteFile(raw_file) diff --git a/backend/nvr_core.py b/backend/nvr_core.py index 6b0d1b3..748618e 100644 --- a/backend/nvr_core.py +++ b/backend/nvr_core.py @@ -30,8 +30,11 @@ class NVR: await self.client.login(self.loop) def logout(self): - self.logger.debug(f"[{self.index}] Logout to {self.client}") - self.client.close() + try: + self.logger.debug(f"[{self.index}] Logout to {self.client}") + self.client.close() + except: + pass async def channels(self): self.logger.debug(f"[{self.index}] Get channels") diff --git a/backend/server.py b/backend/server.py index 6e557cc..c8a5d0c 100644 --- a/backend/server.py +++ b/backend/server.py @@ -1,3 +1,5 @@ +import asyncio + from fastapi import FastAPI, Response, BackgroundTasks, Header, Request from fastapi.responses import StreamingResponse, FileResponse from fastapi.security import HTTPBasic, HTTPBasicCredentials @@ -247,7 +249,7 @@ class Server: 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: + except NeedNVR | FileNotFoundError: background_tasks.add_task(loadPreview, file = file) return FileResponse("./assets/loading.webp")