diff --git a/docs/docs/integrations/api.md b/docs/docs/integrations/api.md index 341751ca4..b324aae36 100644 --- a/docs/docs/integrations/api.md +++ b/docs/docs/integrations/api.md @@ -450,6 +450,7 @@ Reviews from the database. Accepts the following query string parameters: | `after` | int | Epoch time | | `cameras` | str | , separated list of cameras | | `labels` | str | , separated list of labels | +| `zones` | str | , separated list of zones | | `reviewed` | int | Include items that have been reviewed (0 or 1) | | `limit` | int | Limit the number of events returned | | `severity` | str | Limit items to severity (alert, detection, significant_motion) | diff --git a/frigate/api/review.py b/frigate/api/review.py index e730573cf..eabf91bb2 100644 --- a/frigate/api/review.py +++ b/frigate/api/review.py @@ -22,6 +22,7 @@ ReviewBp = Blueprint("reviews", __name__) def review(): cameras = request.args.get("cameras", "all") labels = request.args.get("labels", "all") + zones = request.args.get("zones", "all") reviewed = request.args.get("reviewed", type=int, default=0) limit = request.args.get("limit", type=int, default=None) severity = request.args.get("severity", None) @@ -60,6 +61,20 @@ def review(): label_clause = reduce(operator.or_, label_clauses) clauses.append((label_clause)) + if zones != "all": + # use matching so segments with multiple zones + # still match on a search where any zone matches + zone_clauses = [] + filtered_zones = zones.split(",") + + for zone in filtered_zones: + zone_clauses.append( + (ReviewSegment.data["zones"].cast("text") % f'*"{zone}"*') + ) + + zone_clause = reduce(operator.or_, zone_clauses) + clauses.append((zone_clause)) + if reviewed == 0: clauses.append((ReviewSegment.has_been_reviewed == False))