diff --git a/frigate/api/event.py b/frigate/api/event.py index 01b26346f..164def948 100644 --- a/frigate/api/event.py +++ b/frigate/api/event.py @@ -420,7 +420,7 @@ def events_explore( @router.get("/event_ids", response_model=list[EventResponse]) -def event_ids(ids: str): +async def event_ids(ids: str, request: Request): ids = ids.split(",") if not ids: @@ -432,7 +432,7 @@ def event_ids(ids: str): for event_id in ids: try: event = Event.get(Event.id == event_id) - require_camera_access(event.camera) + await require_camera_access(event.camera, request=request) except DoesNotExist: return JSONResponse( content=({"success": False, "message": f"Event {event_id} not found"}), @@ -835,10 +835,10 @@ def events_summary( @router.get("/events/{event_id}", response_model=EventResponse) -def event(event_id: str): +async def event(event_id: str, request: Request): try: event = Event.get(Event.id == event_id) - require_camera_access(event.camera) + await require_camera_access(event.camera, request=request) return model_to_dict(event) except DoesNotExist: return JSONResponse(content="Event not found", status_code=404) @@ -852,7 +852,6 @@ def event(event_id: str): def set_retain(event_id: str): try: event = Event.get(Event.id == event_id) - require_camera_access(event.camera) except DoesNotExist: return JSONResponse( content=({"success": False, "message": "Event " + event_id + " not found"}), @@ -869,7 +868,7 @@ def set_retain(event_id: str): @router.post("/events/{event_id}/plus", response_model=EventUploadPlusResponse) -def send_to_plus(request: Request, event_id: str, body: SubmitPlusBody = None): +async def send_to_plus(request: Request, event_id: str, body: SubmitPlusBody = None): if not request.app.frigate_config.plus_api.is_active(): message = "PLUS_API_KEY environment variable is not set" logger.error(message) @@ -887,7 +886,7 @@ def send_to_plus(request: Request, event_id: str, body: SubmitPlusBody = None): try: event = Event.get(Event.id == event_id) - require_camera_access(event.camera) + await require_camera_access(event.camera, request=request) except DoesNotExist: message = f"Event {event_id} not found" logger.error(message) @@ -982,7 +981,7 @@ def send_to_plus(request: Request, event_id: str, body: SubmitPlusBody = None): @router.put("/events/{event_id}/false_positive", response_model=EventUploadPlusResponse) -def false_positive(request: Request, event_id: str): +async def false_positive(request: Request, event_id: str): if not request.app.frigate_config.plus_api.is_active(): message = "PLUS_API_KEY environment variable is not set" logger.error(message) @@ -998,7 +997,7 @@ def false_positive(request: Request, event_id: str): try: event = Event.get(Event.id == event_id) - require_camera_access(event.camera) + await require_camera_access(event.camera, request=request) except DoesNotExist: message = f"Event {event_id} not found" logger.error(message) @@ -1076,10 +1075,10 @@ def false_positive(request: Request, event_id: str): response_model=GenericResponse, dependencies=[Depends(require_role(["admin"]))], ) -def delete_retain(event_id: str): +async def delete_retain(event_id: str, request: Request): try: event = Event.get(Event.id == event_id) - require_camera_access(event.camera) + await require_camera_access(event.camera, request=request) except DoesNotExist: return JSONResponse( content=({"success": False, "message": "Event " + event_id + " not found"}), @@ -1100,14 +1099,14 @@ def delete_retain(event_id: str): response_model=GenericResponse, dependencies=[Depends(require_role(["admin"]))], ) -def set_sub_label( +async def set_sub_label( request: Request, event_id: str, body: EventsSubLabelBody, ): try: event: Event = Event.get(Event.id == event_id) - require_camera_access(event.camera) + await require_camera_access(event.camera, request=request) except DoesNotExist: event = None @@ -1155,14 +1154,14 @@ def set_sub_label( response_model=GenericResponse, dependencies=[Depends(require_role(["admin"]))], ) -def set_plate( +async def set_plate( request: Request, event_id: str, body: EventsLPRBody, ): try: event: Event = Event.get(Event.id == event_id) - require_camera_access(event.camera) + await require_camera_access(event.camera, request=request) except DoesNotExist: event = None @@ -1211,14 +1210,14 @@ def set_plate( response_model=GenericResponse, dependencies=[Depends(require_role(["admin"]))], ) -def set_description( +async def set_description( request: Request, event_id: str, body: EventsDescriptionBody, ): try: event: Event = Event.get(Event.id == event_id) - require_camera_access(event.camera) + await require_camera_access(event.camera, request=request) except DoesNotExist: return JSONResponse( content=({"success": False, "message": "Event " + event_id + " not found"}), @@ -1263,12 +1262,12 @@ def set_description( response_model=GenericResponse, dependencies=[Depends(require_role(["admin"]))], ) -def regenerate_description( +async def regenerate_description( request: Request, event_id: str, params: RegenerateQueryParameters = Depends() ): try: event: Event = Event.get(Event.id == event_id) - require_camera_access(event.camera) + await require_camera_access(event.camera, request=request) except DoesNotExist: return JSONResponse( content=({"success": False, "message": "Event " + event_id + " not found"}), @@ -1339,10 +1338,10 @@ def generate_description_embedding( ) -def delete_single_event(event_id: str, request: Request) -> dict: +async def delete_single_event(event_id: str, request: Request) -> dict: try: event = Event.get(Event.id == event_id) - require_camera_access(event.camera) + await require_camera_access(event.camera, request=request) except DoesNotExist: return {"success": False, "message": f"Event {event_id} not found"} @@ -1473,10 +1472,10 @@ def create_event( response_model=GenericResponse, dependencies=[Depends(require_role(["admin"]))], ) -def end_event(request: Request, event_id: str, body: EventsEndBody): +async def end_event(request: Request, event_id: str, body: EventsEndBody): try: event: Event = Event.get(Event.id == event_id) - require_camera_access(event.camera) + await require_camera_access(event.camera, request=request) end_time = body.end_time or datetime.datetime.now().timestamp() request.app.event_metadata_updater.publish( (event_id, end_time), EventMetadataTypeEnum.manual_event_end.value diff --git a/frigate/api/export.py b/frigate/api/export.py index 4b564bbf9..08fc6b1c5 100644 --- a/frigate/api/export.py +++ b/frigate/api/export.py @@ -150,10 +150,10 @@ def export_recording( @router.patch( "/export/{event_id}/rename", dependencies=[Depends(require_role(["admin"]))] ) -def export_rename(event_id: str, body: ExportRenameBody): +async def export_rename(event_id: str, body: ExportRenameBody, request: Request): try: export: Export = Export.get(Export.id == event_id) - require_camera_access(export.camera) + await require_camera_access(export.camera, request=request) except DoesNotExist: return JSONResponse( content=( @@ -179,10 +179,10 @@ def export_rename(event_id: str, body: ExportRenameBody): @router.delete("/export/{event_id}", dependencies=[Depends(require_role(["admin"]))]) -def export_delete(event_id: str): +async def export_delete(event_id: str, request: Request): try: export: Export = Export.get(Export.id == event_id) - require_camera_access(export.camera) + await require_camera_access(export.camera, request=request) except DoesNotExist: return JSONResponse( content=( @@ -233,10 +233,10 @@ def export_delete(event_id: str): @router.get("/exports/{export_id}") -def get_export(export_id: str): +async def get_export(export_id: str, request: Request): try: export = Export.get(Export.id == export_id) - require_camera_access(export.camera) + await require_camera_access(export.camera, request=request) return JSONResponse(content=model_to_dict(export)) except DoesNotExist: return JSONResponse( diff --git a/frigate/api/media.py b/frigate/api/media.py index b0e2d8c51..d22943d93 100644 --- a/frigate/api/media.py +++ b/frigate/api/media.py @@ -852,6 +852,7 @@ def vod_hour(year_month: str, day: int, hour: int, camera_name: str, tz_name: st description="Returns an HLS playlist for the specified object. Append /master.m3u8 or /index.m3u8 for HLS playback.", ) async def vod_event( + request: Request, event_id: str, padding: int = Query(0, description="Padding to apply to the vod."), ): @@ -867,9 +868,7 @@ async def vod_event( status_code=404, ) - require_camera_access( - event.camera - ) # Manual call (sync for non-async route, but since async, await if needed) + await require_camera_access(event.camera, request=request) end_ts = ( datetime.now().timestamp() @@ -904,7 +903,7 @@ async def event_snapshot( try: event = Event.get(Event.id == event_id, Event.end_time != None) event_complete = True - require_camera_access(event.camera) + await require_camera_access(event.camera, request=request) if not event.has_snapshot: return JSONResponse( content={"success": False, "message": "Snapshot not available"}, @@ -933,7 +932,7 @@ async def event_snapshot( height=params.height, quality=params.quality, ) - require_camera_access(camera_state.name) + await require_camera_access(camera_state.name, request=request) except Exception: return JSONResponse( content={"success": False, "message": "Ongoing event not found"}, @@ -980,7 +979,7 @@ async def event_thumbnail( event_complete = False try: event: Event = Event.get(Event.id == event_id) - require_camera_access(event.camera) + await require_camera_access(event.camera, request=request) if event.end_time is not None: event_complete = True diff --git a/frigate/api/review.py b/frigate/api/review.py index 2567e77c3..bddc1c0b7 100644 --- a/frigate/api/review.py +++ b/frigate/api/review.py @@ -153,7 +153,7 @@ async def review( @router.get("/review_ids", response_model=list[ReviewSegmentResponse]) -def review_ids(ids: str): +async def review_ids(request: Request, ids: str): ids = ids.split(",") if not ids: @@ -165,7 +165,7 @@ def review_ids(ids: str): for review_id in ids: try: review = ReviewSegment.get(ReviewSegment.id == review_id) - require_camera_access(review.camera) + await require_camera_access(review.camera, request=request) except DoesNotExist: return JSONResponse( content=( @@ -418,6 +418,7 @@ async def review_summary( @router.post("/reviews/viewed", response_model=GenericResponse) async def set_multiple_reviewed( + request: Request, body: ReviewModifyMultipleBody, current_user: dict = Depends(get_current_user), ): @@ -429,7 +430,7 @@ async def set_multiple_reviewed( for review_id in body.ids: try: review = ReviewSegment.get(ReviewSegment.id == review_id) - require_camera_access(review.camera) + await require_camera_access(review.camera, request=request) review_status = UserReviewStatus.get( UserReviewStatus.user_id == user_id, UserReviewStatus.review_segment == review_id, @@ -594,12 +595,12 @@ def motion_activity( @router.get("/review/event/{event_id}", response_model=ReviewSegmentResponse) -def get_review_from_event(event_id: str): +async def get_review_from_event(request: Request, event_id: str): try: review = ReviewSegment.get( ReviewSegment.data["detections"].cast("text") % f'*"{event_id}"*' ) - require_camera_access(review.camera) + await require_camera_access(review.camera, request=request) return JSONResponse(model_to_dict(review)) except DoesNotExist: return JSONResponse( @@ -609,10 +610,10 @@ def get_review_from_event(event_id: str): @router.get("/review/{review_id}", response_model=ReviewSegmentResponse) -def get_review(review_id: str): +async def get_review(request: Request, review_id: str): try: review = ReviewSegment.get(ReviewSegment.id == review_id) - require_camera_access(review.camera) + await require_camera_access(review.camera, request=request) return JSONResponse(content=model_to_dict(review)) except DoesNotExist: return JSONResponse(