From 1a708a374826dc6f64a2fb156bd5cee42d159faf Mon Sep 17 00:00:00 2001 From: Josh Hawkins <32435876+hawkeye217@users.noreply.github.com> Date: Wed, 8 Apr 2026 08:16:14 -0500 Subject: [PATCH] make sub label query for events API endpoints case insensitive --- frigate/api/chat.py | 2 +- frigate/api/event.py | 30 ++++++++++++++++++++---------- 2 files changed, 21 insertions(+), 11 deletions(-) diff --git a/frigate/api/chat.py b/frigate/api/chat.py index 3e10714ca..978fa6334 100644 --- a/frigate/api/chat.py +++ b/frigate/api/chat.py @@ -407,7 +407,7 @@ async def _execute_search_objects( query_params = EventsQueryParams( cameras=arguments.get("camera", "all"), labels=arguments.get("label", "all"), - sub_labels=arguments.get("sub_label", "all").lower(), + sub_labels=arguments.get("sub_label", "all"), # case-insensitive on the backend zones=zones, zone=zones, after=after, diff --git a/frigate/api/event.py b/frigate/api/event.py index 001b34025..a7d1cffc8 100644 --- a/frigate/api/event.py +++ b/frigate/api/event.py @@ -199,13 +199,18 @@ def events( sub_label_clauses.append((Event.sub_label.is_null())) for label in filtered_sub_labels: + lowered = label.lower() sub_label_clauses.append( - (Event.sub_label.cast("text") == label) - ) # include exact matches + (fn.LOWER(Event.sub_label.cast("text")) == lowered) + ) # include exact matches (case-insensitive) - # include this label when part of a list - sub_label_clauses.append((Event.sub_label.cast("text") % f"*{label},*")) - sub_label_clauses.append((Event.sub_label.cast("text") % f"*, {label}*")) + # include this label when part of a list (LIKE is case-insensitive in sqlite for ASCII) + sub_label_clauses.append( + (fn.LOWER(Event.sub_label.cast("text")) % f"*{lowered},*") + ) + sub_label_clauses.append( + (fn.LOWER(Event.sub_label.cast("text")) % f"*, {lowered}*") + ) sub_label_clause = reduce(operator.or_, sub_label_clauses) clauses.append((sub_label_clause)) @@ -609,13 +614,18 @@ def events_search( sub_label_clauses.append((Event.sub_label.is_null())) for label in filtered_sub_labels: + lowered = label.lower() sub_label_clauses.append( - (Event.sub_label.cast("text") == label) - ) # include exact matches + (fn.LOWER(Event.sub_label.cast("text")) == lowered) + ) # include exact matches (case-insensitive) - # include this label when part of a list - sub_label_clauses.append((Event.sub_label.cast("text") % f"*{label},*")) - sub_label_clauses.append((Event.sub_label.cast("text") % f"*, {label}*")) + # include this label when part of a list (LIKE is case-insensitive in sqlite for ASCII) + sub_label_clauses.append( + (fn.LOWER(Event.sub_label.cast("text")) % f"*{lowered},*") + ) + sub_label_clauses.append( + (fn.LOWER(Event.sub_label.cast("text")) % f"*, {lowered}*") + ) event_filters.append((reduce(operator.or_, sub_label_clauses)))