diff --git a/frigate/api/review.py b/frigate/api/review.py index ad8a5094b..0ab524580 100644 --- a/frigate/api/review.py +++ b/frigate/api/review.py @@ -77,6 +77,29 @@ def review_summary(): hour_modifier, minute_modifier, seconds_offset = get_tz_modifiers(tz_name) month_ago = (datetime.now() - timedelta(days=30)).timestamp() + cameras = request.args.get("cameras", "all") + labels = request.args.get("labels", "all") + + clauses = [(ReviewSegment.start_time > month_ago)] + + if cameras != "all": + camera_list = cameras.split(",") + clauses.append((ReviewSegment.camera << camera_list)) + + if labels != "all": + # use matching so segments with multiple labels + # still match on a search where any label matches + label_clauses = [] + filtered_labels = labels.split(",") + + for label in filtered_labels: + label_clauses.append( + (ReviewSegment.data["objects"].cast("text") % f'*"{label}"*') + ) + + label_clause = reduce(operator.or_, label_clauses) + clauses.append((label_clause)) + groups = ( ReviewSegment.select( fn.strftime( @@ -161,7 +184,7 @@ def review_summary(): ) ).alias("total_motion"), ) - .where(ReviewSegment.start_time > month_ago) + .where(reduce(operator.and_, clauses)) .group_by( (ReviewSegment.start_time + seconds_offset).cast("int") / (3600 * 24), ) diff --git a/web/src/pages/Events.tsx b/web/src/pages/Events.tsx index 92bf6c731..0e37bb0be 100644 --- a/web/src/pages/Events.tsx +++ b/web/src/pages/Events.tsx @@ -115,7 +115,15 @@ export default function Events() { const { data: reviewSummary, mutate: updateSummary } = useSWR< ReviewSummary[] - >(["review/summary", { timezone: timezone }, { revalidateOnFocus: false }]); + >([ + "review/summary", + { + timezone: timezone, + cameras: reviewSearchParams["cameras"] ?? null, + labels: reviewSearchParams["labels"] ?? null, + }, + { revalidateOnFocus: false }, + ]); // preview videos diff --git a/web/src/views/events/EventView.tsx b/web/src/views/events/EventView.tsx index ec9dda500..51e35e65f 100644 --- a/web/src/views/events/EventView.tsx +++ b/web/src/views/events/EventView.tsx @@ -72,7 +72,7 @@ export default function EventView({ // review counts const reviewCounts = useMemo(() => { - if (!reviewSummary) { + if (!reviewSummary || reviewSummary.length == 0) { return { alert: 0, detection: 0, significant_motion: 0 }; } @@ -80,7 +80,13 @@ export default function EventView({ if (filter?.before == undefined) { summary = reviewSummary[0]; } else { - summary = reviewSummary[0]; + const day = new Date(filter.before * 1000); + const key = `${day.getFullYear()}-${("0" + (day.getMonth() + 1)).slice(-2)}-${("0" + day.getDate()).slice(-2)}`; + summary = reviewSummary.find((check) => check.day == key); + } + + if (!summary) { + return { alert: 0, detection: 0, significant_motion: 0 }; } if (filter?.showReviewed == 1) {