diff --git a/frigate/api/defs/request/events_body.py b/frigate/api/defs/request/events_body.py index 0fefbe43fe..0883d066f3 100644 --- a/frigate/api/defs/request/events_body.py +++ b/frigate/api/defs/request/events_body.py @@ -13,6 +13,15 @@ class EventsSubLabelBody(BaseModel): ) +class EventsLPRBody(BaseModel): + recognizedLicensePlate: str = Field( + title="Recognized License Plate", max_length=100 + ) + recognizedLicensePlateScore: Optional[float] = Field( + title="Score for recognized license plate", default=None, gt=0.0, le=1.0 + ) + + class EventsDescriptionBody(BaseModel): description: Union[str, None] = Field(title="The description of the event") diff --git a/frigate/api/event.py b/frigate/api/event.py index c4c763bf7d..4055951c21 100644 --- a/frigate/api/event.py +++ b/frigate/api/event.py @@ -31,6 +31,7 @@ from frigate.api.defs.request.events_body import ( EventsDeleteBody, EventsDescriptionBody, EventsEndBody, + EventsLPRBody, EventsSubLabelBody, SubmitPlusBody, ) @@ -1099,6 +1100,60 @@ def set_sub_label( ) +@router.post( + "/events/{event_id}/recognized_license_plate", + response_model=GenericResponse, + dependencies=[Depends(require_role(["admin"]))], +) +def set_plate( + request: Request, + event_id: str, + body: EventsLPRBody, +): + try: + event: Event = Event.get(Event.id == event_id) + except DoesNotExist: + event = None + + if request.app.detected_frames_processor: + tracked_obj: TrackedObject = None + + for state in request.app.detected_frames_processor.camera_states.values(): + tracked_obj = state.tracked_objects.get(event_id) + + if tracked_obj is not None: + break + else: + tracked_obj = None + + if not event and not tracked_obj: + return JSONResponse( + content=( + {"success": False, "message": "Event " + event_id + " not found."} + ), + status_code=404, + ) + + new_plate = body.recognizedLicensePlate + new_score = body.recognizedLicensePlateScore + + if new_plate == "": + new_plate = None + new_score = None + + request.app.event_metadata_updater.publish( + EventMetadataTypeEnum.recognized_license_plate, (event_id, new_plate, new_score) + ) + + return JSONResponse( + content={ + "success": True, + "message": f"Event {event_id} license plate set to {new_plate if new_plate is not None else 'None'}", + }, + status_code=200, + ) + + @router.post( "/events/{event_id}/description", response_model=GenericResponse,