add endpoint to submit to plus

This commit is contained in:
Blake Blackshear
2022-04-03 15:00:11 -05:00
parent 045aac8933
commit e724fe3da6
7 changed files with 210 additions and 9 deletions

View File

@@ -29,7 +29,7 @@ from flask import (
from peewee import SqliteDatabase, operator, fn, DoesNotExist, Value
from playhouse.shortcuts import model_to_dict
from frigate.const import CLIPS_DIR, RECORD_DIR
from frigate.const import CLIPS_DIR, PLUS_ENV_VAR
from frigate.models import Event, Recordings
from frigate.stats import stats_snapshot
from frigate.util import calculate_region
@@ -45,6 +45,7 @@ def create_app(
database: SqliteDatabase,
stats_tracking,
detected_frames_processor,
plus_api,
):
app = Flask(__name__)
@@ -61,6 +62,7 @@ def create_app(
app.frigate_config = frigate_config
app.stats_tracking = stats_tracking
app.detected_frames_processor = detected_frames_processor
app.plus_api = plus_api
app.register_blueprint(bp)
@@ -137,6 +139,52 @@ def set_retain(id):
)
@bp.route("/events/<id>/plus", methods=("POST",))
def send_to_plus(id):
if current_app.plus_api is None:
return make_response(
jsonify({"success": False, "message": "Plus token not set"}), 400
)
try:
event = Event.get(Event.id == id)
except DoesNotExist:
return make_response(
jsonify({"success": False, "message": "Event" + id + " not found"}), 404
)
if event.plus_id:
return make_response(
jsonify({"success": False, "message": "Already submitted to plus"}), 400
)
# load clean.png
try:
filename = f"{event.camera}-{event.id}-clean.png"
image = cv2.imread(os.path.join(CLIPS_DIR, filename))
except Exception:
return make_response(
jsonify(
{"success": False, "message": "Unable to load clean png for event"}
),
400,
)
try:
plus_id = current_app.plus_api.upload_image(image, event.camera)
except Exception as ex:
return make_response(
jsonify({"success": False, "message": str(ex)}),
400,
)
# store image id in the database
event.plus_id = plus_id
event.save()
return "success"
@bp.route("/events/<id>/retain", methods=("DELETE",))
def delete_retain(id):
try:
@@ -252,6 +300,7 @@ def event_thumbnail(id):
response.headers["Cache-Control"] = "private, max-age=31536000"
return response
@bp.route("/<camera_name>/<label>/best.jpg")
@bp.route("/<camera_name>/<label>/thumbnail.jpg")
def label_thumbnail(camera_name, label):
@@ -277,9 +326,7 @@ def label_thumbnail(camera_name, label):
return event_thumbnail(event.id)
except DoesNotExist:
frame = np.zeros((175, 175, 3), np.uint8)
ret, jpg = cv2.imencode(
".jpg", frame, [int(cv2.IMWRITE_JPEG_QUALITY), 70]
)
ret, jpg = cv2.imencode(".jpg", frame, [int(cv2.IMWRITE_JPEG_QUALITY), 70])
response = make_response(jpg.tobytes())
response.headers["Content-Type"] = "image/jpeg"
@@ -330,6 +377,7 @@ def event_snapshot(id):
] = f"attachment; filename=snapshot-{id}.jpg"
return response
@bp.route("/<camera_name>/<label>/snapshot.jpg")
def label_snapshot(camera_name, label):
if label == "any":
@@ -353,9 +401,7 @@ def label_snapshot(camera_name, label):
return event_snapshot(event.id)
except DoesNotExist:
frame = np.zeros((720, 1280, 3), np.uint8)
ret, jpg = cv2.imencode(
".jpg", frame, [int(cv2.IMWRITE_JPEG_QUALITY), 70]
)
ret, jpg = cv2.imencode(".jpg", frame, [int(cv2.IMWRITE_JPEG_QUALITY), 70])
response = make_response(jpg.tobytes())
response.headers["Content-Type"] = "image/jpeg"
@@ -460,6 +506,8 @@ def config():
for cmd in camera_dict["ffmpeg_cmds"]:
cmd["cmd"] = " ".join(cmd["cmd"])
config["plus"] = {"enabled": PLUS_ENV_VAR in os.environ}
return jsonify(config)