mirror of
				https://github.com/blakeblackshear/frigate.git
				synced 2025-10-27 10:52:11 +01:00 
			
		
		
		
	Add snapshot-clean.png API endpoint (#10510)
* Add snapshot-clean.png API endpoint * fix lint * enable on inprogress event
This commit is contained in:
		
							parent
							
								
									3bd0ad63b4
								
							
						
					
					
						commit
						5c3925ab50
					
				| @ -290,6 +290,14 @@ Returns a thumbnail for the event id optimized for notifications. Works while th | ||||
| 
 | ||||
| Returns the clip for the event id. Works after the event has ended. | ||||
| 
 | ||||
| ### `GET /api/events/<id>/snapshot-clean.png` | ||||
| 
 | ||||
| Returns the clean snapshot image for the event id. Only works if `snapshots` and `clean_copy` are enabled in the config. | ||||
| 
 | ||||
| | param      | Type | Description        | | ||||
| | ---------- | ---- | ------------------ | | ||||
| | `download` | bool | Download the image | | ||||
| 
 | ||||
| ### `GET /api/events/<id>/snapshot.jpg` | ||||
| 
 | ||||
| Returns the snapshot image for the event id. Works while the event is in progress and after completion. | ||||
| @ -303,6 +311,7 @@ Accepts the following query string parameters, but they are only applied when an | ||||
| | `timestamp` | int  | Print the timestamp in the upper left (0 or 1)    | | ||||
| | `crop`      | int  | Crop the snapshot to the (0 or 1)                 | | ||||
| | `quality`   | int  | Jpeg encoding quality (0-100). Defaults to 70.    | | ||||
| | `download`  | bool | Download the image                                | | ||||
| 
 | ||||
| ### `POST /api/events/<camera_name>/<label>/create` | ||||
| 
 | ||||
|  | ||||
| @ -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) | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user