Updated documentation for the review endpoint

This commit is contained in:
Rui Alves 2024-10-10 19:02:42 +01:00
parent a2ca18a714
commit 95005b2a0d
6 changed files with 165 additions and 91 deletions

View File

@ -172,76 +172,65 @@ paths:
in: query in: query
required: false required: false
schema: schema:
anyOf: type: string
- type: string
- type: 'null'
default: all default: all
title: Cameras title: Cameras
- name: labels - name: labels
in: query in: query
required: false required: false
schema: schema:
anyOf: type: string
- type: string
- type: 'null'
default: all default: all
title: Labels title: Labels
- name: zones - name: zones
in: query in: query
required: false required: false
schema: schema:
anyOf: type: string
- type: string
- type: 'null'
default: all default: all
title: Zones title: Zones
- name: reviewed - name: reviewed
in: query in: query
required: false required: false
schema: schema:
anyOf: type: integer
- type: integer
- type: 'null'
default: 0 default: 0
title: Reviewed title: Reviewed
- name: limit - name: limit
in: query in: query
required: false required: false
schema: schema:
anyOf: type: integer
- type: integer
- type: 'null'
title: Limit title: Limit
- name: severity - name: severity
in: query in: query
required: false required: false
schema: schema:
anyOf: allOf:
- type: string - $ref: '#/components/schemas/SeverityEnum'
- type: 'null'
title: Severity title: Severity
- name: before - name: before
in: query in: query
required: false required: false
schema: schema:
anyOf: type: number
- type: number
- type: 'null'
title: Before title: Before
- name: after - name: after
in: query in: query
required: false required: false
schema: schema:
anyOf: type: number
- type: number
- type: 'null'
title: After title: After
responses: responses:
'200': '200':
description: Successful Response description: Successful Response
content: content:
application/json: application/json:
schema: { } schema:
type: array
items:
$ref: '#/components/schemas/ReviewSegmentResponse'
title: Response Review Review Get
'422': '422':
description: Validation Error description: Validation Error
content: content:
@ -259,36 +248,28 @@ paths:
in: query in: query
required: false required: false
schema: schema:
anyOf: type: string
- type: string
- type: 'null'
default: all default: all
title: Cameras title: Cameras
- name: labels - name: labels
in: query in: query
required: false required: false
schema: schema:
anyOf: type: string
- type: string
- type: 'null'
default: all default: all
title: Labels title: Labels
- name: zones - name: zones
in: query in: query
required: false required: false
schema: schema:
anyOf: type: string
- type: string
- type: 'null'
default: all default: all
title: Zones title: Zones
- name: timezone - name: timezone
in: query in: query
required: false required: false
schema: schema:
anyOf: type: string
- type: string
- type: 'null'
default: utc default: utc
title: Timezone title: Timezone
responses: responses:
@ -363,34 +344,26 @@ paths:
in: query in: query
required: false required: false
schema: schema:
anyOf: type: string
- type: string
- type: 'null'
default: all default: all
title: Cameras title: Cameras
- name: before - name: before
in: query in: query
required: false required: false
schema: schema:
anyOf: type: number
- type: number
- type: 'null'
title: Before title: Before
- name: after - name: after
in: query in: query
required: false required: false
schema: schema:
anyOf: type: number
- type: number
- type: 'null'
title: After title: After
- name: scale - name: scale
in: query in: query
required: false required: false
schema: schema:
anyOf: type: integer
- type: integer
- type: 'null'
default: 30 default: 30
title: Scale title: Scale
responses: responses:
@ -417,34 +390,26 @@ paths:
in: query in: query
required: false required: false
schema: schema:
anyOf: type: string
- type: string
- type: 'null'
default: all default: all
title: Cameras title: Cameras
- name: before - name: before
in: query in: query
required: false required: false
schema: schema:
anyOf: type: number
- type: number
- type: 'null'
title: Before title: Before
- name: after - name: after
in: query in: query
required: false required: false
schema: schema:
anyOf: type: number
- type: number
- type: 'null'
title: After title: After
- name: scale - name: scale
in: query in: query
required: false required: false
schema: schema:
anyOf: type: integer
- type: integer
- type: 'null'
default: 30 default: 30
title: Scale title: Scale
responses: responses:
@ -763,13 +728,25 @@ paths:
content: content:
application/json: application/json:
schema: { } schema: { }
/nvinfo:
get:
tags:
- App
summary: Nvinfo
operationId: nvinfo_nvinfo_get
responses:
'200':
description: Successful Response
content:
application/json:
schema: { }
/logs/{service}: /logs/{service}:
get: get:
tags: tags:
- App - App
- Logs - Logs
summary: Logs summary: Logs
description: Get logs for the requested service (frigate/nginx/go2rtc/chroma) description: Get logs for the requested service (frigate/nginx/go2rtc)
operationId: logs_logs__service__get operationId: logs_logs__service__get
parameters: parameters:
- name: service - name: service
@ -781,7 +758,6 @@ paths:
- frigate - frigate
- nginx - nginx
- go2rtc - go2rtc
- chroma
title: Service title: Service
- name: download - name: download
in: query in: query
@ -1042,7 +1018,8 @@ paths:
- Preview - Preview
summary: Preview Hour summary: Preview Hour
description: Get all mp4 previews relevant for time period given the timezone description: Get all mp4 previews relevant for time period given the timezone
operationId: preview_hour_preview__year_month___day___hour___camera_name___tz_name__get operationId: >-
preview_hour_preview__year_month___day___hour___camera_name___tz_name__get
parameters: parameters:
- name: year_month - name: year_month
in: path in: path
@ -1092,7 +1069,8 @@ paths:
- Preview - Preview
summary: Get Preview Frames From Cache summary: Get Preview Frames From Cache
description: Get list of cached preview frames description: Get list of cached preview frames
operationId: get_preview_frames_from_cache_preview__camera_name__start__start_ts__end__end_ts__frames_get operationId: >-
get_preview_frames_from_cache_preview__camera_name__start__start_ts__end__end_ts__frames_get
parameters: parameters:
- name: camera_name - name: camera_name
in: path in: path
@ -1177,7 +1155,8 @@ paths:
tags: tags:
- Export - Export
summary: Export Recording summary: Export Recording
operationId: export_recording_export__camera_name__start__start_time__end__end_time__post operationId: >-
export_recording_export__camera_name__start__start_time__end__end_time__post
parameters: parameters:
- name: camera_name - name: camera_name
in: path in: path
@ -1942,6 +1921,15 @@ paths:
schema: schema:
type: string type: string
title: Event Id title: Event Id
- name: source
in: query
required: false
schema:
anyOf:
- $ref: '#/components/schemas/RegenerateDescriptionEnum'
- type: 'null'
default: thumbnails
title: Source
responses: responses:
'200': '200':
description: Successful Response description: Successful Response
@ -2029,12 +2017,12 @@ paths:
application/json: application/json:
schema: schema:
$ref: '#/components/schemas/HTTPValidationError' $ref: '#/components/schemas/HTTPValidationError'
'{camera_name}': /{camera_name}:
get: get:
tags: tags:
- Media - Media
summary: Mjpeg Feed summary: Mjpeg Feed
operationId: mjpeg_feed_camera_name__get operationId: mjpeg_feed__camera_name__get
parameters: parameters:
- name: camera_name - name: camera_name
in: path in: path
@ -2241,7 +2229,8 @@ paths:
tags: tags:
- Media - Media
summary: Get Snapshot From Recording summary: Get Snapshot From Recording
operationId: get_snapshot_from_recording__camera_name__recordings__frame_time__snapshot__format__get operationId: >-
get_snapshot_from_recording__camera_name__recordings__frame_time__snapshot__format__get
parameters: parameters:
- name: camera_name - name: camera_name
in: path in: path
@ -2363,7 +2352,9 @@ paths:
tags: tags:
- Media - Media
summary: Recordings summary: Recordings
description: Return specific camera recordings between the given 'after'/'end' times. If not provided the last hour will be used description: >-
Return specific camera recordings between the given 'after'/'end' times.
If not provided the last hour will be used
operationId: recordings__camera_name__recordings_get operationId: recordings__camera_name__recordings_get
parameters: parameters:
- name: camera_name - name: camera_name
@ -2377,14 +2368,14 @@ paths:
required: false required: false
schema: schema:
type: number type: number
default: 1727542549.303557 default: 1728577904.036181
title: After title: After
- name: before - name: before
in: query in: query
required: false required: false
schema: schema:
type: number type: number
default: 1727546149.303926 default: 1728581504.0362
title: Before title: Before
responses: responses:
'200': '200':
@ -3121,7 +3112,9 @@ paths:
tags: tags:
- Media - Media
summary: Label Snapshot summary: Label Snapshot
description: Returns the snapshot image from the latest event for the given camera and label combo description: >-
Returns the snapshot image from the latest event for the given camera
and label combo
operationId: label_snapshot__camera_name___label__snapshot_jpg_get operationId: label_snapshot__camera_name___label__snapshot_jpg_get
parameters: parameters:
- name: camera_name - name: camera_name
@ -3287,6 +3280,56 @@ components:
title: Detail title: Detail
type: object type: object
title: HTTPValidationError title: HTTPValidationError
RegenerateDescriptionEnum:
type: string
enum:
- thumbnails
- snapshot
title: RegenerateDescriptionEnum
ReviewSegmentResponse:
properties:
id:
type: string
title: Id
camera:
type: string
title: Camera
start_time:
type: string
format: date-time
title: Start Time
end_time:
type: string
format: date-time
title: End Time
has_been_reviewed:
type: boolean
title: Has Been Reviewed
severity:
$ref: '#/components/schemas/SeverityEnum'
thumb_path:
type: string
title: Thumb Path
data:
title: Data
type: object
required:
- id
- camera
- start_time
- end_time
- has_been_reviewed
- severity
- thumb_path
- data
title: ReviewSegmentResponse
SeverityEnum:
type: string
enum:
- alert
- detection
- significant_motion
title: SeverityEnum
SubmitPlusBody: SubmitPlusBody:
properties: properties:
include_annotation: include_annotation:

View File

@ -1,28 +1,31 @@
from typing import Optional from typing import Union
from pydantic import BaseModel from pydantic import BaseModel
from pydantic.json_schema import SkipJsonSchema
from frigate.api.defs.severity_enum import SeverityEnum
class ReviewQueryParams(BaseModel): class ReviewQueryParams(BaseModel):
cameras: Optional[str] = "all" cameras: str = "all"
labels: Optional[str] = "all" labels: str = "all"
zones: Optional[str] = "all" zones: str = "all"
reviewed: Optional[int] = 0 reviewed: int = 0
limit: Optional[int] = None limit: Union[int, SkipJsonSchema[None]] = None
severity: Optional[str] = None severity: Union[SeverityEnum, SkipJsonSchema[None]] = None
before: Optional[float] = None before: Union[float, SkipJsonSchema[None]] = None
after: Optional[float] = None after: Union[float, SkipJsonSchema[None]] = None
class ReviewSummaryQueryParams(BaseModel): class ReviewSummaryQueryParams(BaseModel):
cameras: Optional[str] = "all" cameras: str = "all"
labels: Optional[str] = "all" labels: str = "all"
zones: Optional[str] = "all" zones: str = "all"
timezone: Optional[str] = "utc" timezone: str = "utc"
class ReviewActivityMotionQueryParams(BaseModel): class ReviewActivityMotionQueryParams(BaseModel):
cameras: Optional[str] = "all" cameras: str = "all"
before: Optional[float] = None before: Union[float, SkipJsonSchema[None]] = None
after: Optional[float] = None after: Union[float, SkipJsonSchema[None]] = None
scale: Optional[int] = 30 scale: int = 30

View File

@ -0,0 +1,16 @@
from datetime import datetime
from pydantic import BaseModel, Json
from frigate.api.defs.severity_enum import SeverityEnum
class ReviewSegmentResponse(BaseModel):
id: str
camera: str
start_time: datetime
end_time: datetime
has_been_reviewed: bool
severity: SeverityEnum
thumb_path: str
data: Json

View File

@ -0,0 +1,7 @@
from enum import Enum
class SeverityEnum(str, Enum):
alert = "alert"
detection = "detection"
significant_motion = "significant_motion"

View File

@ -82,6 +82,10 @@ def create_fastapi_app(
database.close() database.close()
return response return response
@app.on_event("startup")
async def startup():
logger.info("FastAPI started")
# Rate limiter (used for login endpoint) # Rate limiter (used for login endpoint)
auth.rateLimiter.set_limit(frigate_config.auth.failed_login_rate_limit or "") auth.rateLimiter.set_limit(frigate_config.auth.failed_login_rate_limit or "")
app.state.limiter = limiter app.state.limiter = limiter

View File

@ -17,6 +17,7 @@ from frigate.api.defs.review_query_parameters import (
ReviewQueryParams, ReviewQueryParams,
ReviewSummaryQueryParams, ReviewSummaryQueryParams,
) )
from frigate.api.defs.review_responses import ReviewSegmentResponse
from frigate.api.defs.tags import Tags from frigate.api.defs.tags import Tags
from frigate.models import Recordings, ReviewSegment from frigate.models import Recordings, ReviewSegment
from frigate.util.builtin import get_tz_modifiers from frigate.util.builtin import get_tz_modifiers
@ -26,7 +27,7 @@ logger = logging.getLogger(__name__)
router = APIRouter(tags=[Tags.review]) router = APIRouter(tags=[Tags.review])
@router.get("/review") @router.get("/review", response_model=list[ReviewSegmentResponse])
def review(params: ReviewQueryParams = Depends()): def review(params: ReviewQueryParams = Depends()):
cameras = params.cameras cameras = params.cameras
labels = params.labels labels = params.labels