mirror of
https://github.com/blakeblackshear/frigate.git
synced 2024-11-21 19:07:46 +01:00
Fix apis (#13932)
This commit is contained in:
parent
ecbf0410eb
commit
d17253b023
@ -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(
|
||||||
|
@ -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:
|
||||||
|
Loading…
Reference in New Issue
Block a user