Skip to content

Commit

Permalink
Use custom body for the export recordings endpoint (blakeblackshear#1…
Browse files Browse the repository at this point in the history
…4908)

* Use custom body for the export recordings endpoint

* Fixed usage of ExportRecordingsBody

* Updated docs to reflect changes to export endpoint

* Fix friendly name and source

* Updated openAPI spec
  • Loading branch information
iursevla authored Nov 11, 2024
1 parent 64b3397 commit d2b2f3d
Show file tree
Hide file tree
Showing 5 changed files with 93 additions and 37 deletions.
90 changes: 67 additions & 23 deletions docs/static/frigate-api.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ info:

servers:
- url: https://demo.frigate.video/api
- url: http://localhost:5001/
- url: http://localhost:5001/api

paths:
/auth:
Expand Down Expand Up @@ -296,7 +296,7 @@ paths:
content:
application/json:
schema:
$ref: '#/components/schemas/ReviewSetMultipleReviewedBody'
$ref: '#/components/schemas/ReviewModifyMultipleBody'
responses:
'200':
description: Successful Response
Expand All @@ -321,7 +321,7 @@ paths:
content:
application/json:
schema:
$ref: '#/components/schemas/ReviewDeleteMultipleReviewsBody'
$ref: '#/components/schemas/ReviewModifyMultipleBody'
responses:
'200':
description: Successful Response
Expand Down Expand Up @@ -1141,11 +1141,11 @@ paths:
type: number
title: End Time
requestBody:
required: true
content:
application/json:
schema:
type: object
title: Body
$ref: '#/components/schemas/ExportRecordingsBody'
responses:
'200':
description: Successful Response
Expand Down Expand Up @@ -1408,6 +1408,14 @@ paths:
- type: number
- type: 'null'
title: Max Length
- name: event_id
in: query
required: false
schema:
anyOf:
- type: string
- type: 'null'
title: Event Id
- name: sort
in: query
required: false
Expand Down Expand Up @@ -1518,7 +1526,7 @@ paths:
anyOf:
- type: string
- type: 'null'
default: thumbnail,description
default: thumbnail
title: Search Type
- name: include_thumbnails
in: query
Expand Down Expand Up @@ -1590,6 +1598,22 @@ paths:
- type: 'null'
default: 00:00,24:00
title: Time Range
- name: has_clip
in: query
required: false
schema:
anyOf:
- type: boolean
- type: 'null'
title: Has Clip
- name: has_snapshot
in: query
required: false
schema:
anyOf:
- type: boolean
- type: 'null'
title: Has Snapshot
- name: timezone
in: query
required: false
Expand Down Expand Up @@ -2356,14 +2380,14 @@ paths:
required: false
schema:
type: number
default: 1729274204.653048
default: 1731275308.238304
title: After
- name: before
in: query
required: false
schema:
type: number
default: 1729277804.653095
default: 1731278908.238313
title: Before
responses:
'200':
Expand Down Expand Up @@ -3262,6 +3286,27 @@ components:
required:
- subLabel
title: EventsSubLabelBody
ExportRecordingsBody:
properties:
playback:
allOf:
- $ref: '#/components/schemas/PlaybackFactorEnum'
title: Playback factor
default: realtime
source:
allOf:
- $ref: '#/components/schemas/PlaybackSourceEnum'
title: Playback source
default: recordings
name:
type: string
maxLength: 256
title: Friendly name
image_path:
type: string
title: Image Path
type: object
title: ExportRecordingsBody
Extension:
type: string
enum:
Expand Down Expand Up @@ -3313,6 +3358,18 @@ components:
- total_alert
- total_detection
title: Last24HoursReview
PlaybackFactorEnum:
type: string
enum:
- realtime
- timelapse_25x
title: PlaybackFactorEnum
PlaybackSourceEnum:
type: string
enum:
- recordings
- preview
title: PlaybackSourceEnum
RegenerateDescriptionEnum:
type: string
enum:
Expand All @@ -3336,7 +3393,7 @@ components:
- motion
- camera
title: ReviewActivityMotionResponse
ReviewDeleteMultipleReviewsBody:
ReviewModifyMultipleBody:
properties:
ids:
items:
Expand All @@ -3348,7 +3405,7 @@ components:
type: object
required:
- ids
title: ReviewDeleteMultipleReviewsBody
title: ReviewModifyMultipleBody
ReviewSegmentResponse:
properties:
id:
Expand Down Expand Up @@ -3386,19 +3443,6 @@ components:
- thumb_path
- data
title: ReviewSegmentResponse
ReviewSetMultipleReviewedBody:
properties:
ids:
items:
type: string
minLength: 1
type: array
minItems: 1
title: Ids
type: object
required:
- ids
title: ReviewSetMultipleReviewedBody
ReviewSummaryResponse:
properties:
last24Hours:
Expand Down
Empty file added frigate/api/defs/__init__.py
Empty file.
Empty file.
20 changes: 20 additions & 0 deletions frigate/api/defs/request/export_recordinds_body.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
from typing import Union

from pydantic import BaseModel, Field
from pydantic.json_schema import SkipJsonSchema

from frigate.record.export import (
PlaybackFactorEnum,
PlaybackSourceEnum,
)


class ExportRecordingsBody(BaseModel):
playback: PlaybackFactorEnum = Field(
default=PlaybackFactorEnum.realtime, title="Playback factor"
)
source: PlaybackSourceEnum = Field(
default=PlaybackSourceEnum.recordings, title="Playback source"
)
name: str = Field(title="Friendly name", default=None, max_length=256)
image_path: Union[str, SkipJsonSchema[None]] = None
20 changes: 6 additions & 14 deletions frigate/api/export.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,13 @@
import random
import string
from pathlib import Path
from typing import Optional

import psutil
from fastapi import APIRouter, Request
from fastapi.responses import JSONResponse
from peewee import DoesNotExist

from frigate.api.defs.request.export_recordinds_body import ExportRecordingsBody
from frigate.api.defs.tags import Tags
from frigate.const import EXPORT_DIR
from frigate.models import Export, Previews, Recordings
Expand All @@ -37,7 +37,7 @@ def export_recording(
camera_name: str,
start_time: float,
end_time: float,
body: dict = None,
body: ExportRecordingsBody,
):
if not camera_name or not request.app.frigate_config.cameras.get(camera_name):
return JSONResponse(
Expand All @@ -47,18 +47,10 @@ def export_recording(
status_code=404,
)

json: dict[str, any] = body or {}
playback_factor = json.get("playback", "realtime")
playback_source = json.get("source", "recordings")
friendly_name: Optional[str] = json.get("name")

if len(friendly_name or "") > 256:
return JSONResponse(
content=({"success": False, "message": "File name is too long."}),
status_code=401,
)

existing_image = json.get("image_path")
playback_factor = body.playback
playback_source = body.source
friendly_name = body.name
existing_image = body.image_path

if playback_source == "recordings":
recordings_count = (
Expand Down

0 comments on commit d2b2f3d

Please sign in to comment.