Add more API definitions for events

This commit is contained in:
Nicolas Mowen 2024-12-03 06:00:55 -07:00
parent b2c43dfab7
commit 309accddda
2 changed files with 50 additions and 27 deletions

View File

@ -0,0 +1,18 @@
from pydantic import BaseModel
class EventCreateResponse(BaseModel):
success: bool
message: str
event_id: str
class EventMultiDeleteResponse(BaseModel):
success: bool
deleted_events: list[str]
not_found_events: list[str]
class EventUploadPlusResponse(BaseModel):
success: bool
plus_id: str

View File

@ -14,6 +14,15 @@ from fastapi.responses import JSONResponse
from peewee import JOIN, DoesNotExist, fn, operator from peewee import JOIN, DoesNotExist, fn, operator
from playhouse.shortcuts import model_to_dict from playhouse.shortcuts import model_to_dict
from frigate.api.defs.query.events_query_parameters import (
DEFAULT_TIME_RANGE,
EventsQueryParams,
EventsSearchQueryParams,
EventsSummaryQueryParams,
)
from frigate.api.defs.query.regenerate_query_parameters import (
RegenerateQueryParameters,
)
from frigate.api.defs.request.events_body import ( from frigate.api.defs.request.events_body import (
EventsCreateBody, EventsCreateBody,
EventsDeleteBody, EventsDeleteBody,
@ -22,19 +31,14 @@ from frigate.api.defs.request.events_body import (
EventsSubLabelBody, EventsSubLabelBody,
SubmitPlusBody, SubmitPlusBody,
) )
from frigate.api.defs.events_query_parameters import ( from frigate.api.defs.response.event_response import (
DEFAULT_TIME_RANGE, EventCreateResponse,
EventsQueryParams, EventMultiDeleteResponse,
EventsSearchQueryParams, EventUploadPlusResponse,
EventsSummaryQueryParams,
)
from frigate.api.defs.regenerate_query_parameters import (
RegenerateQueryParameters,
) )
from frigate.api.defs.response.generic_response import GenericResponse
from frigate.api.defs.tags import Tags from frigate.api.defs.tags import Tags
from frigate.const import ( from frigate.const import CLIPS_DIR
CLIPS_DIR,
)
from frigate.embeddings import EmbeddingsContext from frigate.embeddings import EmbeddingsContext
from frigate.events.external import ExternalEventProcessor from frigate.events.external import ExternalEventProcessor
from frigate.models import Event, ReviewSegment, Timeline from frigate.models import Event, ReviewSegment, Timeline
@ -46,7 +50,7 @@ logger = logging.getLogger(__name__)
router = APIRouter(tags=[Tags.events]) router = APIRouter(tags=[Tags.events])
@router.get("/events") @router.get("/events", response_model=list[Event])
def events(params: EventsQueryParams = Depends()): def events(params: EventsQueryParams = Depends()):
camera = params.camera camera = params.camera
cameras = params.cameras cameras = params.cameras
@ -263,7 +267,7 @@ def events(params: EventsQueryParams = Depends()):
return JSONResponse(content=list(events)) return JSONResponse(content=list(events))
@router.get("/events/explore") @router.get("/events/explore", response_model=list[Event])
def events_explore(limit: int = 10): def events_explore(limit: int = 10):
# get distinct labels for all events # get distinct labels for all events
distinct_labels = Event.select(Event.label).distinct().order_by(Event.label) distinct_labels = Event.select(Event.label).distinct().order_by(Event.label)
@ -308,7 +312,8 @@ def events_explore(limit: int = 10):
"data": { "data": {
k: v k: v
for k, v in event.data.items() for k, v in event.data.items()
if k in ["type", "score", "top_score", "description"] if k
in ["type", "score", "top_score", "description", "sub_label_score"]
}, },
"event_count": label_counts[event.label], "event_count": label_counts[event.label],
} }
@ -324,7 +329,7 @@ def events_explore(limit: int = 10):
return JSONResponse(content=processed_events) return JSONResponse(content=processed_events)
@router.get("/event_ids") @router.get("/event_ids", response_model=list[Event])
def event_ids(ids: str): def event_ids(ids: str):
ids = ids.split(",") ids = ids.split(",")
@ -647,7 +652,7 @@ def events_summary(params: EventsSummaryQueryParams = Depends()):
return JSONResponse(content=[e for e in groups.dicts()]) return JSONResponse(content=[e for e in groups.dicts()])
@router.get("/events/{event_id}") @router.get("/events/{event_id}", response_model=Event)
def event(event_id: str): def event(event_id: str):
try: try:
return model_to_dict(Event.get(Event.id == event_id)) return model_to_dict(Event.get(Event.id == event_id))
@ -655,7 +660,7 @@ def event(event_id: str):
return JSONResponse(content="Event not found", status_code=404) return JSONResponse(content="Event not found", status_code=404)
@router.post("/events/{event_id}/retain") @router.post("/events/{event_id}/retain", response_model=GenericResponse)
def set_retain(event_id: str): def set_retain(event_id: str):
try: try:
event = Event.get(Event.id == event_id) event = Event.get(Event.id == event_id)
@ -674,7 +679,7 @@ def set_retain(event_id: str):
) )
@router.post("/events/{event_id}/plus") @router.post("/events/{event_id}/plus", response_model=EventUploadPlusResponse)
def send_to_plus(request: Request, event_id: str, body: SubmitPlusBody = None): def send_to_plus(request: Request, event_id: str, body: SubmitPlusBody = None):
if not request.app.frigate_config.plus_api.is_active(): if not request.app.frigate_config.plus_api.is_active():
message = "PLUS_API_KEY environment variable is not set" message = "PLUS_API_KEY environment variable is not set"
@ -786,7 +791,7 @@ def send_to_plus(request: Request, event_id: str, body: SubmitPlusBody = None):
) )
@router.put("/events/{event_id}/false_positive") @router.put("/events/{event_id}/false_positive", response_model=EventUploadPlusResponse)
def false_positive(request: Request, event_id: str): def false_positive(request: Request, event_id: str):
if not request.app.frigate_config.plus_api.is_active(): if not request.app.frigate_config.plus_api.is_active():
message = "PLUS_API_KEY environment variable is not set" message = "PLUS_API_KEY environment variable is not set"
@ -875,7 +880,7 @@ def false_positive(request: Request, event_id: str):
) )
@router.delete("/events/{event_id}/retain") @router.delete("/events/{event_id}/retain", response_model=GenericResponse)
def delete_retain(event_id: str): def delete_retain(event_id: str):
try: try:
event = Event.get(Event.id == event_id) event = Event.get(Event.id == event_id)
@ -894,7 +899,7 @@ def delete_retain(event_id: str):
) )
@router.post("/events/{event_id}/sub_label") @router.post("/events/{event_id}/sub_label", response_model=GenericResponse)
def set_sub_label( def set_sub_label(
request: Request, request: Request,
event_id: str, event_id: str,
@ -946,7 +951,7 @@ def set_sub_label(
) )
@router.post("/events/{event_id}/description") @router.post("/events/{event_id}/description", response_model=GenericResponse)
def set_description( def set_description(
request: Request, request: Request,
event_id: str, event_id: str,
@ -993,7 +998,7 @@ def set_description(
) )
@router.put("/events/{event_id}/description/regenerate") @router.put("/events/{event_id}/description/regenerate", response_model=GenericResponse)
def regenerate_description( def regenerate_description(
request: Request, event_id: str, params: RegenerateQueryParameters = Depends() request: Request, event_id: str, params: RegenerateQueryParameters = Depends()
): ):
@ -1064,14 +1069,14 @@ def delete_single_event(event_id: str, request: Request) -> dict:
return {"success": True, "message": f"Event {event_id} deleted"} return {"success": True, "message": f"Event {event_id} deleted"}
@router.delete("/events/{event_id}") @router.delete("/events/{event_id}", response_model=GenericResponse)
def delete_event(request: Request, event_id: str): def delete_event(request: Request, event_id: str):
result = delete_single_event(event_id, request) result = delete_single_event(event_id, request)
status_code = 200 if result["success"] else 404 status_code = 200 if result["success"] else 404
return JSONResponse(content=result, status_code=status_code) return JSONResponse(content=result, status_code=status_code)
@router.delete("/events/") @router.delete("/events/", response_model=EventMultiDeleteResponse)
def delete_events(request: Request, body: EventsDeleteBody): def delete_events(request: Request, body: EventsDeleteBody):
if not body.event_ids: if not body.event_ids:
return JSONResponse( return JSONResponse(
@ -1097,7 +1102,7 @@ def delete_events(request: Request, body: EventsDeleteBody):
return JSONResponse(content=response, status_code=200) return JSONResponse(content=response, status_code=200)
@router.post("/events/{camera_name}/{label}/create") @router.post("/events/{camera_name}/{label}/create", response_model=EventCreateResponse)
def create_event( def create_event(
request: Request, request: Request,
camera_name: str, camera_name: str,
@ -1153,7 +1158,7 @@ def create_event(
) )
@router.put("/events/{event_id}/end") @router.put("/events/{event_id}/end", response_model=GenericResponse)
def end_event(request: Request, event_id: str, body: EventsEndBody): def end_event(request: Request, event_id: str, body: EventsEndBody):
try: try:
end_time = body.end_time or datetime.datetime.now().timestamp() end_time = body.end_time or datetime.datetime.now().timestamp()