From 98df20294bb69c7c64843bc8fdb0438275a3a19d Mon Sep 17 00:00:00 2001 From: Nick Mowen Date: Sat, 16 Sep 2023 20:48:44 -0600 Subject: [PATCH] Refactor export logic --- frigate/record/export.py | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/frigate/record/export.py b/frigate/record/export.py index 2a97d83f2..8b2f487be 100644 --- a/frigate/record/export.py +++ b/frigate/record/export.py @@ -13,6 +13,7 @@ from frigate.ffmpeg_presets import ( EncodeTypeEnum, parse_preset_hardware_acceleration_encode, ) +from frigate.models import Recordings logger = logging.getLogger(__name__) @@ -58,13 +59,28 @@ class RecordingExporter(threading.Thread): ) else: playlist_lines = [] - playlist_start = self.start_time - while playlist_start < self.end_time: - playlist_lines.append( - f"file 'http://127.0.0.1:5000/vod/{self.camera}/start/{playlist_start}/end/{min(playlist_start + MAX_PLAYLIST_SECONDS, self.end_time)}/index.m3u8'" + # get full set of recordings + export_recordings = ( + Recordings.select() + .where( + Recordings.start_time.between(self.start_time, self.end_time) + | Recordings.end_time.between(self.start_time, self.end_time) + | ((self.start > Recordings.start_time) & (self.end_time < Recordings.end_time)) + ) + .where(Recordings.camera == self.camera) + .order_by(Recordings.start_time.asc()) + ) + + # Use pagination to process records in chunks + page_size = 1000 + num_pages = (export_recordings.count() + page_size - 1) // page_size + + for page in range(num_pages): + page = export_recordings.paginate(page, page_size) + playlist_lines.append( + f"file 'http://127.0.0.1:5000/vod/{self.camera}/start/{page[0].start_time}/end/{page[-1].end_time}/index.m3u8'" ) - playlist_start += MAX_PLAYLIST_SECONDS ffmpeg_input = "-y -protocol_whitelist pipe,file,http,tcp -f concat -safe 0 -i /dev/stdin"