forked from Github/frigate
Add snapshot-clean.png API endpoint (#10510)
* Add snapshot-clean.png API endpoint * fix lint * enable on inprogress event
This commit is contained in:
@@ -935,6 +935,81 @@ def grid_snapshot(camera_name):
|
||||
)
|
||||
|
||||
|
||||
@MediaBp.route("/events/<id>/snapshot-clean.png")
|
||||
def event_snapshot_clean(id):
|
||||
download = request.args.get("download", type=bool)
|
||||
png_bytes = None
|
||||
try:
|
||||
event = Event.get(Event.id == id)
|
||||
snapshot_config = current_app.frigate_config.cameras[event.camera].snapshots
|
||||
if not (snapshot_config.enabled and event.has_snapshot):
|
||||
return make_response(
|
||||
jsonify(
|
||||
{
|
||||
"success": False,
|
||||
"message": "Snapshots and clean_copy must be enabled in the config",
|
||||
}
|
||||
),
|
||||
404,
|
||||
)
|
||||
if event.end_time is None:
|
||||
# see if the object is currently being tracked
|
||||
try:
|
||||
camera_states = (
|
||||
current_app.detected_frames_processor.camera_states.values()
|
||||
)
|
||||
for camera_state in camera_states:
|
||||
if id in camera_state.tracked_objects:
|
||||
tracked_obj = camera_state.tracked_objects.get(id)
|
||||
if tracked_obj is not None:
|
||||
png_bytes = tracked_obj.get_clean_png()
|
||||
break
|
||||
except Exception:
|
||||
return make_response(
|
||||
jsonify({"success": False, "message": "Event not found"}), 404
|
||||
)
|
||||
elif not event.has_snapshot:
|
||||
return make_response(
|
||||
jsonify({"success": False, "message": "Snapshot not available"}), 404
|
||||
)
|
||||
except DoesNotExist:
|
||||
return make_response(
|
||||
jsonify({"success": False, "message": "Event not found"}), 404
|
||||
)
|
||||
if png_bytes is None:
|
||||
try:
|
||||
clean_snapshot_path = os.path.join(
|
||||
CLIPS_DIR, f"{event.camera}-{event.id}-clean.png"
|
||||
)
|
||||
if not os.path.exists(clean_snapshot_path):
|
||||
return make_response(
|
||||
jsonify(
|
||||
{"success": False, "message": "Clean snapshot not available"}
|
||||
),
|
||||
404,
|
||||
)
|
||||
with open(
|
||||
os.path.join(CLIPS_DIR, f"{event.camera}-{event.id}-clean.png"), "rb"
|
||||
) as image_file:
|
||||
png_bytes = image_file.read()
|
||||
except Exception:
|
||||
logger.error(f"Unable to load clean png for event: {event.id}")
|
||||
return make_response(
|
||||
jsonify(
|
||||
{"success": False, "message": "Unable to load clean png for event"}
|
||||
),
|
||||
400,
|
||||
)
|
||||
response = make_response(png_bytes)
|
||||
response.headers["Content-Type"] = "image/png"
|
||||
response.headers["Cache-Control"] = "private, max-age=31536000"
|
||||
if download:
|
||||
response.headers["Content-Disposition"] = (
|
||||
f"attachment; filename=snapshot-{id}-clean.png"
|
||||
)
|
||||
return response
|
||||
|
||||
|
||||
@MediaBp.route("/events/<id>/snapshot.jpg")
|
||||
def event_snapshot(id):
|
||||
download = request.args.get("download", type=bool)
|
||||
|
||||
Reference in New Issue
Block a user