From 17788bb9c727a51f100d1e3997161bc78a074d31 Mon Sep 17 00:00:00 2001 From: Rui Alves Date: Sat, 21 Sep 2024 12:36:47 +0100 Subject: [PATCH] Use query parameters for the frame latest endpoint --- frigate/api/defs/media_query_parameters.py | 23 +++++++++++++++ frigate/api/media.py | 33 +++++++++++----------- 2 files changed, 39 insertions(+), 17 deletions(-) create mode 100644 frigate/api/defs/media_query_parameters.py diff --git a/frigate/api/defs/media_query_parameters.py b/frigate/api/defs/media_query_parameters.py new file mode 100644 index 000000000..bee1cba07 --- /dev/null +++ b/frigate/api/defs/media_query_parameters.py @@ -0,0 +1,23 @@ +from enum import Enum +from typing import Optional + +from pydantic import BaseModel + + +class Extension(str, Enum): + webp = "webp" + png = "png" + jpg = "jpg" + jpeg = "jpeg" + + +class MediaLatestFrameQueryParams(BaseModel): + extension: Extension = Extension.webp + bbox: Optional[int] = None + timestamp: Optional[int] = None + zones: Optional[int] = None + mask: Optional[int] = None + motion: Optional[int] = None + regions: Optional[int] = None + quality: Optional[int] = 70 + height: Optional[int] = None diff --git a/frigate/api/media.py b/frigate/api/media.py index 4d11bd409..476d017ff 100644 --- a/frigate/api/media.py +++ b/frigate/api/media.py @@ -15,6 +15,7 @@ import cv2 import numpy as np import pytz from fastapi import APIRouter, Path, Query, Request, Response +from fastapi.params import Depends from fastapi.responses import FileResponse, JSONResponse, StreamingResponse from peewee import DoesNotExist, fn from tzlocal import get_localzone_name @@ -121,24 +122,18 @@ def camera_ptz_info(request: Request, camera_name: str): def latest_frame( request: Request, camera_name: str, - extension: Optional[str] = Query("webp", enum=["webp", "png", "jpg", "jpeg"]), - bbox: Optional[int] = None, - timestamp: Optional[int] = None, - zones: Optional[int] = None, - mask: Optional[int] = None, - motion: Optional[int] = None, - regions: Optional[int] = None, - quality: Optional[int] = 70, - height: Optional[int] = None, + params: MediaLatestFrameQueryParams = Depends(), ): draw_options = { - "bounding_boxes": bbox, - "timestamp": timestamp, - "zones": zones, - "mask": mask, - "motion_boxes": motion, - "regions": regions, + "bounding_boxes": params.bbox, + "timestamp": params.timestamp, + "zones": params.zones, + "mask": params.mask, + "motion_boxes": params.motion, + "regions": params.regions, } + quality = params.quality + extension = params.extension if camera_name in request.app.frigate_config.cameras: frame = request.app.detected_frames_processor.get_current_frame( @@ -163,7 +158,7 @@ def latest_frame( frame = request.app.camera_error_image - height = int(height or str(frame.shape[0])) + height = int(params.height or str(frame.shape[0])) width = int(height * frame.shape[1] / frame.shape[0]) if frame is None: @@ -459,7 +454,11 @@ def recordings( @router.get("/media/camera/{camera_name}/start/{start_ts}/end/{end_ts}/clip.mp4") def recording_clip( - request: Request, camera_name: str, start_ts: float, end_ts: float, download: bool = False + request: Request, + camera_name: str, + start_ts: float, + end_ts: float, + download: bool = False, ): recordings = ( Recordings.select(