From c9eeb714ce14d2a6e28a0d371c57183f91f70569 Mon Sep 17 00:00:00 2001 From: Nick Mowen Date: Sun, 9 Oct 2022 09:18:17 -0600 Subject: [PATCH] Rewrite storage logic to use storage maintainer and segment sizes --- frigate/http.py | 17 ++++++++++++----- frigate/storage.py | 17 +++++++++++++++++ 2 files changed, 29 insertions(+), 5 deletions(-) diff --git a/frigate/http.py b/frigate/http.py index da1d81a4b..233afb2d0 100644 --- a/frigate/http.py +++ b/frigate/http.py @@ -694,12 +694,19 @@ def get_recordings_storage_usage(): recording_stats = stats_snapshot(current_app.stats_tracking)["service"]["storage"][ RECORD_DIR ] - total_bytes = recording_stats["total"] - storage = {"cameras": {}, "total": total_bytes} - storage[camera_name] = camera_bytes - total_bytes += camera_bytes + total_mb = recording_stats["total"] - return jsonify(storage) + camera_usages: dict[ + str, dict + ] = current_app.storage_maintainer.calculate_camera_usages() + camera_usages["max"] = total_mb + + for camera_name in camera_usages.keys(): + camera_usages[camera_name]["usage_percent"] = ( + camera_usages[camera_name]["usage"] / total_mb + ) + + return jsonify(camera_usages) # return hourly summary for recordings of camera diff --git a/frigate/storage.py b/frigate/storage.py index 2720b7aca..dd6218e76 100644 --- a/frigate/storage.py +++ b/frigate/storage.py @@ -60,6 +60,23 @@ class StorageMaintainer(threading.Thread): self.camera_storage_stats[camera]["bandwidth"] = bandwidth logger.debug(f"{camera} has a bandwidth of {bandwidth} MB/hr.") + def calculate_camera_usages(self) -> dict[str, dict]: + """Calculate the storage usage of each camera.""" + usages: dict[str, dict] = {} + total_storage = 0 + + for camera in self.config.cameras.keys(): + camera_storage = ( + Recordings.select(fn.SUM(Recordings.segment_size)) + .where(Recordings.camera == camera, Recordings.segment_size != 0) + .scalar() + ) + total_storage += camera_storage + usages[camera] = {"usage": camera_storage} + + usages["total"] = {"usage": total_storage} + return usages + def check_storage_needs_cleanup(self) -> bool: """Return if storage needs cleanup.""" # currently runs cleanup if less than 1 hour of space is left