mirror of
https://github.com/blakeblackshear/frigate.git
synced 2026-02-16 16:15:22 +03:00
Add ability to time_range filter chroma searches
This commit is contained in:
parent
a07fcffe7f
commit
cff2a4836c
@ -43,6 +43,7 @@ class EventsSearchQueryParams(BaseModel):
|
|||||||
zones: Optional[str] = "all"
|
zones: Optional[str] = "all"
|
||||||
after: Optional[float] = None
|
after: Optional[float] = None
|
||||||
before: Optional[float] = None
|
before: Optional[float] = None
|
||||||
|
time_range: Optional[str] = DEFAULT_TIME_RANGE
|
||||||
timezone: Optional[str] = "utc"
|
timezone: Optional[str] = "utc"
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -357,6 +357,7 @@ def events_search(request: Request, params: EventsSearchQueryParams = Depends())
|
|||||||
zones = params.zones
|
zones = params.zones
|
||||||
after = params.after
|
after = params.after
|
||||||
before = params.before
|
before = params.before
|
||||||
|
time_range = params.time_range
|
||||||
|
|
||||||
# for similarity search
|
# for similarity search
|
||||||
event_id = params.event_id
|
event_id = params.event_id
|
||||||
@ -428,6 +429,57 @@ def events_search(request: Request, params: EventsSearchQueryParams = Depends())
|
|||||||
if before:
|
if before:
|
||||||
embeddings_filters.append({"start_time": {"$lt": before}})
|
embeddings_filters.append({"start_time": {"$lt": before}})
|
||||||
|
|
||||||
|
if time_range != DEFAULT_TIME_RANGE:
|
||||||
|
# Get timezone arg to ensure browser times are used
|
||||||
|
tz_name = params.timezone
|
||||||
|
hour_modifier, minute_modifier, _ = get_tz_modifiers(tz_name)
|
||||||
|
|
||||||
|
times = time_range.split(",")
|
||||||
|
time_after = times[0]
|
||||||
|
time_before = times[1]
|
||||||
|
hour_modifier_value = int(hour_modifier.split()[0])
|
||||||
|
minute_modifier_value = int(minute_modifier.split()[0])
|
||||||
|
|
||||||
|
after_hour, after_minute = map(int, time_after.split(":"))
|
||||||
|
before_hour, before_minute = map(int, time_before.split(":"))
|
||||||
|
|
||||||
|
now = datetime.datetime.now()
|
||||||
|
|
||||||
|
tz_offset = datetime.timedelta(
|
||||||
|
hours=hour_modifier_value, minutes=minute_modifier_value
|
||||||
|
)
|
||||||
|
|
||||||
|
after_time = (
|
||||||
|
now.replace(hour=after_hour, minute=after_minute, second=0, microsecond=0)
|
||||||
|
+ tz_offset
|
||||||
|
)
|
||||||
|
before_time = (
|
||||||
|
now.replace(hour=before_hour, minute=before_minute, second=0, microsecond=0)
|
||||||
|
+ tz_offset
|
||||||
|
)
|
||||||
|
|
||||||
|
# Take midnight into account
|
||||||
|
if after_time > before_time:
|
||||||
|
# Time range crosses midnight, so we need to split the filter
|
||||||
|
embeddings_filters.append(
|
||||||
|
{
|
||||||
|
"$or": [
|
||||||
|
{"start_time": {"$gte": after_time.timestamp()}},
|
||||||
|
{"start_time": {"$lt": before_time.timestamp()}},
|
||||||
|
]
|
||||||
|
}
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
# Normal case where after_time is before before_time
|
||||||
|
embeddings_filters.append(
|
||||||
|
{
|
||||||
|
"$and": [
|
||||||
|
{"start_time": {"$gte": after_time.timestamp()}},
|
||||||
|
{"start_time": {"$lt": before_time.timestamp()}},
|
||||||
|
]
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
where = None
|
where = None
|
||||||
if len(embeddings_filters) > 1:
|
if len(embeddings_filters) > 1:
|
||||||
where = {"$and": embeddings_filters}
|
where = {"$and": embeddings_filters}
|
||||||
|
|||||||
@ -11,13 +11,7 @@ import {
|
|||||||
} from "@/components/ui/tooltip";
|
} from "@/components/ui/tooltip";
|
||||||
import { cn } from "@/lib/utils";
|
import { cn } from "@/lib/utils";
|
||||||
import { FrigateConfig } from "@/types/frigateConfig";
|
import { FrigateConfig } from "@/types/frigateConfig";
|
||||||
import {
|
import { SearchFilter, SearchResult, SearchSource } from "@/types/search";
|
||||||
DEFAULT_SEARCH_FILTERS,
|
|
||||||
SearchFilter,
|
|
||||||
SearchFilters,
|
|
||||||
SearchResult,
|
|
||||||
SearchSource,
|
|
||||||
} from "@/types/search";
|
|
||||||
import { useCallback, useEffect, useMemo, useRef, useState } from "react";
|
import { useCallback, useEffect, useMemo, useRef, useState } from "react";
|
||||||
import { isMobileOnly } from "react-device-detect";
|
import { isMobileOnly } from "react-device-detect";
|
||||||
import { LuImage, LuSearchX, LuText } from "react-icons/lu";
|
import { LuImage, LuSearchX, LuText } from "react-icons/lu";
|
||||||
@ -145,20 +139,6 @@ export default function SearchView({
|
|||||||
|
|
||||||
const [searchDetail, setSearchDetail] = useState<SearchResult>();
|
const [searchDetail, setSearchDetail] = useState<SearchResult>();
|
||||||
|
|
||||||
const selectedFilters = useMemo<SearchFilters[]>(() => {
|
|
||||||
const filters = [...DEFAULT_SEARCH_FILTERS];
|
|
||||||
|
|
||||||
if (
|
|
||||||
searchFilter &&
|
|
||||||
(searchFilter?.query?.length || searchFilter?.event_id?.length)
|
|
||||||
) {
|
|
||||||
const index = filters.indexOf("time");
|
|
||||||
filters.splice(index, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
return filters;
|
|
||||||
}, [searchFilter]);
|
|
||||||
|
|
||||||
// search interaction
|
// search interaction
|
||||||
|
|
||||||
const [selectedIndex, setSelectedIndex] = useState<number | null>(null);
|
const [selectedIndex, setSelectedIndex] = useState<number | null>(null);
|
||||||
@ -336,7 +316,6 @@ export default function SearchView({
|
|||||||
"w-full justify-between md:justify-start lg:justify-end",
|
"w-full justify-between md:justify-start lg:justify-end",
|
||||||
)}
|
)}
|
||||||
filter={searchFilter}
|
filter={searchFilter}
|
||||||
filters={selectedFilters as SearchFilters[]}
|
|
||||||
onUpdateFilter={onUpdateFilter}
|
onUpdateFilter={onUpdateFilter}
|
||||||
/>
|
/>
|
||||||
<ScrollBar orientation="horizontal" className="h-0" />
|
<ScrollBar orientation="horizontal" className="h-0" />
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user