This commit is contained in:
Nicolas Mowen 2024-09-24 08:27:10 -06:00 committed by GitHub
parent ecbf0410eb
commit d17253b023
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 66 additions and 66 deletions

View File

@ -1022,7 +1022,7 @@ def create_event(
request: Request, request: Request,
camera_name: str, camera_name: str,
label: str, label: str,
body: EventsCreateBody = None, body: EventsCreateBody = EventsCreateBody(),
): ):
if not camera_name or not request.app.frigate_config.cameras.get(camera_name): if not camera_name or not request.app.frigate_config.cameras.get(camera_name):
return JSONResponse( return JSONResponse(

View File

@ -791,6 +791,71 @@ def label_snapshot(request: Request, camera_name: str, label: str):
) )
@router.get("/events/{event_id}/thumbnail.jpg")
def event_thumbnail(
request: Request,
event_id: str,
max_cache_age: int = Query(
2592000, description="Max cache age in seconds. Default 30 days in seconds."
),
format: str = Query(default="ios", enum=["ios", "android"]),
):
thumbnail_bytes = None
event_complete = False
try:
event = Event.get(Event.id == event_id)
if event.end_time is not None:
event_complete = True
thumbnail_bytes = base64.b64decode(event.thumbnail)
except DoesNotExist:
# see if the object is currently being tracked
try:
camera_states = request.app.detected_frames_processor.camera_states.values()
for camera_state in camera_states:
if event_id in camera_state.tracked_objects:
tracked_obj = camera_state.tracked_objects.get(event_id)
if tracked_obj is not None:
thumbnail_bytes = tracked_obj.get_thumbnail()
except Exception:
return JSONResponse(
content={"success": False, "message": "Event not found"},
status_code=404,
)
if thumbnail_bytes is None:
return JSONResponse(
content={"success": False, "message": "Event not found"},
status_code=404,
)
# android notifications prefer a 2:1 ratio
if format == "android":
jpg_as_np = np.frombuffer(thumbnail_bytes, dtype=np.uint8)
img = cv2.imdecode(jpg_as_np, flags=1)
thumbnail = cv2.copyMakeBorder(
img,
0,
0,
int(img.shape[1] * 0.5),
int(img.shape[1] * 0.5),
cv2.BORDER_CONSTANT,
(0, 0, 0),
)
ret, jpg = cv2.imencode(".jpg", thumbnail, [int(cv2.IMWRITE_JPEG_QUALITY), 70])
thumbnail_bytes = jpg.tobytes()
return StreamingResponse(
io.BytesIO(thumbnail_bytes),
media_type="image/jpeg",
headers={
"Cache-Control": f"private, max-age={max_cache_age}"
if event_complete
else "no-store",
"Content-Type": "image/jpeg",
},
)
@router.get("/{camera_name}/{label}/best.jpg") @router.get("/{camera_name}/{label}/best.jpg")
@router.get("/{camera_name}/{label}/thumbnail.jpg") @router.get("/{camera_name}/{label}/thumbnail.jpg")
def label_thumbnail(request: Request, camera_name: str, label: str): def label_thumbnail(request: Request, camera_name: str, label: str):
@ -1081,71 +1146,6 @@ def event_clip(request: Request, event_id: str, download: bool = False):
) )
@router.get("/events/{event_id}/thumbnail.jpg")
def event_thumbnail(
request: Request,
event_id: str,
max_cache_age: int = Query(
2592000, description="Max cache age in seconds. Default 30 days in seconds."
),
format: str = Query(default="ios", enum=["ios", "android"]),
):
thumbnail_bytes = None
event_complete = False
try:
event = Event.get(Event.id == event_id)
if event.end_time is not None:
event_complete = True
thumbnail_bytes = base64.b64decode(event.thumbnail)
except DoesNotExist:
# see if the object is currently being tracked
try:
camera_states = request.app.detected_frames_processor.camera_states.values()
for camera_state in camera_states:
if event_id in camera_state.tracked_objects:
tracked_obj = camera_state.tracked_objects.get(event_id)
if tracked_obj is not None:
thumbnail_bytes = tracked_obj.get_thumbnail()
except Exception:
return JSONResponse(
content={"success": False, "message": "Event not found"},
status_code=404,
)
if thumbnail_bytes is None:
return JSONResponse(
content={"success": False, "message": "Event not found"},
status_code=404,
)
# android notifications prefer a 2:1 ratio
if format == "android":
jpg_as_np = np.frombuffer(thumbnail_bytes, dtype=np.uint8)
img = cv2.imdecode(jpg_as_np, flags=1)
thumbnail = cv2.copyMakeBorder(
img,
0,
0,
int(img.shape[1] * 0.5),
int(img.shape[1] * 0.5),
cv2.BORDER_CONSTANT,
(0, 0, 0),
)
ret, jpg = cv2.imencode(".jpg", thumbnail, [int(cv2.IMWRITE_JPEG_QUALITY), 70])
thumbnail_bytes = jpg.tobytes()
return StreamingResponse(
io.BytesIO(thumbnail_bytes),
media_type="image/jpeg",
headers={
"Cache-Control": f"private, max-age={max_cache_age}"
if event_complete
else "no-store",
"Content-Type": "image/jpeg",
},
)
@router.get("/events/{event_id}/preview.gif") @router.get("/events/{event_id}/preview.gif")
def event_preview(request: Request, event_id: str): def event_preview(request: Request, event_id: str):
try: try: