From 1d0ae52046ad62afa7f87425bd2df68207c5683f Mon Sep 17 00:00:00 2001 From: Josh Hawkins <32435876+hawkeye217@users.noreply.github.com> Date: Wed, 16 Oct 2024 15:10:37 -0500 Subject: [PATCH] backend score filtering and sorting --- frigate/api/defs/events_query_parameters.py | 3 +++ frigate/api/event.py | 23 +++++++++++++++++++-- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/frigate/api/defs/events_query_parameters.py b/frigate/api/defs/events_query_parameters.py index 02bbc31ea..c4e40bd4e 100644 --- a/frigate/api/defs/events_query_parameters.py +++ b/frigate/api/defs/events_query_parameters.py @@ -45,6 +45,9 @@ class EventsSearchQueryParams(BaseModel): before: Optional[float] = None time_range: Optional[str] = DEFAULT_TIME_RANGE timezone: Optional[str] = "utc" + min_score: Optional[float] = None + max_score: Optional[float] = None + sort: Optional[str] = None class EventsSummaryQueryParams(BaseModel): diff --git a/frigate/api/event.py b/frigate/api/event.py index c716bba13..892624e53 100644 --- a/frigate/api/event.py +++ b/frigate/api/event.py @@ -348,6 +348,7 @@ def events_search(request: Request, params: EventsSearchQueryParams = Depends()) search_type = params.search_type include_thumbnails = params.include_thumbnails limit = params.limit + sort = params.sort # Filters cameras = params.cameras @@ -355,6 +356,8 @@ def events_search(request: Request, params: EventsSearchQueryParams = Depends()) zones = params.zones after = params.after before = params.before + min_score = params.min_score + max_score = params.max_score time_range = params.time_range # for similarity search @@ -430,6 +433,14 @@ def events_search(request: Request, params: EventsSearchQueryParams = Depends()) if before: event_filters.append((Event.start_time < before)) + if min_score is not None and max_score is not None: + event_filters.append((Event.data["score"].between(min_score, max_score))) + else: + if min_score is not None: + event_filters.append((Event.data["score"] >= min_score)) + if max_score is not None: + event_filters.append((Event.data["score"] <= max_score)) + if time_range != DEFAULT_TIME_RANGE: tz_name = params.timezone hour_modifier, minute_modifier, _ = get_tz_modifiers(tz_name) @@ -554,11 +565,19 @@ def events_search(request: Request, params: EventsSearchQueryParams = Depends()) processed_events.append(processed_event) - # Sort by search distance if search_results are available, otherwise by start_time + # Sort by search distance if search_results are available, otherwise by start_time as default if search_results: processed_events.sort(key=lambda x: x.get("search_distance", float("inf"))) else: - processed_events.sort(key=lambda x: x["start_time"], reverse=True) + if sort == "score_asc": + processed_events.sort(key=lambda x: x["score"]) + elif sort == "score_desc": + processed_events.sort(key=lambda x: x["score"], reverse=True) + elif sort == "date_asc": + processed_events.sort(key=lambda x: x["start_time"]) + else: + # "date_desc" default + processed_events.sort(key=lambda x: x["start_time"], reverse=True) # Limit the number of events returned processed_events = processed_events[:limit]