From ea0f4b6a0fd31ce1b39604f21eac6d91781f118f Mon Sep 17 00:00:00 2001 From: Nicolas Mowen Date: Wed, 29 Apr 2026 18:05:13 -0600 Subject: [PATCH] Improve efficiency of frame listing for previews --- frigate/api/media.py | 26 +++++++++++++------ frigate/api/preview.py | 13 +++++++--- .../post/review_descriptions.py | 13 +++++++--- 3 files changed, 36 insertions(+), 16 deletions(-) diff --git a/frigate/api/media.py b/frigate/api/media.py index 489c008b4..69f0b8372 100644 --- a/frigate/api/media.py +++ b/frigate/api/media.py @@ -1368,12 +1368,17 @@ def preview_gif( file_start = f"preview_{camera_name}-" start_file = f"{file_start}{start_ts}.{PREVIEW_FRAME_TYPE}" end_file = f"{file_start}{end_ts}.{PREVIEW_FRAME_TYPE}" + + camera_files = [ + entry.name + for entry in os.scandir(preview_dir) + if entry.name.startswith(file_start) + ] + camera_files.sort() + selected_previews = [] - for file in sorted(os.listdir(preview_dir)): - if not file.startswith(file_start): - continue - + for file in camera_files: if file < start_file: continue @@ -1550,12 +1555,17 @@ def preview_mp4( file_start = f"preview_{camera_name}-" start_file = f"{file_start}{start_ts}.{PREVIEW_FRAME_TYPE}" end_file = f"{file_start}{end_ts}.{PREVIEW_FRAME_TYPE}" + + camera_files = [ + entry.name + for entry in os.scandir(preview_dir) + if entry.name.startswith(file_start) + ] + camera_files.sort() + selected_previews = [] - for file in sorted(os.listdir(preview_dir)): - if not file.startswith(file_start): - continue - + for file in camera_files: if file < start_file: continue diff --git a/frigate/api/preview.py b/frigate/api/preview.py index a5e30764d..a307b5abc 100644 --- a/frigate/api/preview.py +++ b/frigate/api/preview.py @@ -148,12 +148,17 @@ def get_preview_frames_from_cache(camera_name: str, start_ts: float, end_ts: flo file_start = f"preview_{camera_name}-" start_file = f"{file_start}{start_ts}.{PREVIEW_FRAME_TYPE}" end_file = f"{file_start}{end_ts}.{PREVIEW_FRAME_TYPE}" + + camera_files = [ + entry.name + for entry in os.scandir(preview_dir) + if entry.name.startswith(file_start) + ] + camera_files.sort() + selected_previews = [] - for file in sorted(os.listdir(preview_dir)): - if not file.startswith(file_start): - continue - + for file in camera_files: if file < start_file: continue diff --git a/frigate/data_processing/post/review_descriptions.py b/frigate/data_processing/post/review_descriptions.py index c5e51d612..3740ac25f 100644 --- a/frigate/data_processing/post/review_descriptions.py +++ b/frigate/data_processing/post/review_descriptions.py @@ -366,12 +366,17 @@ class ReviewDescriptionProcessor(PostProcessorApi): file_start = f"preview_{camera}-" start_file = f"{file_start}{start_time}.webp" end_file = f"{file_start}{end_time}.webp" + + camera_files = [ + entry.name + for entry in os.scandir(preview_dir) + if entry.name.startswith(file_start) + ] + camera_files.sort() + all_frames: list[str] = [] - for file in sorted(os.listdir(preview_dir)): - if not file.startswith(file_start): - continue - + for file in camera_files: if file < start_file: if len(all_frames): all_frames[0] = os.path.join(preview_dir, file)