From 92a0dad2c2bf641a9eaf69c69fbff2616eeb33b6 Mon Sep 17 00:00:00 2001 From: Josh Hawkins <32435876+hawkeye217@users.noreply.github.com> Date: Tue, 29 Jul 2025 13:38:13 -0500 Subject: [PATCH] Catch json decode exception (#19323) * Catch json decode exception when semantic search stats file is corrupted * clear stats file if corrupted --- frigate/embeddings/__init__.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/frigate/embeddings/__init__.py b/frigate/embeddings/__init__.py index 0c118879c..fbdc8d940 100644 --- a/frigate/embeddings/__init__.py +++ b/frigate/embeddings/__init__.py @@ -7,6 +7,7 @@ import multiprocessing as mp import os import signal import threading +from json.decoder import JSONDecodeError from types import FrameType from typing import Any, Optional, Union @@ -73,13 +74,21 @@ class EmbeddingsContext: self.requestor = EmbeddingsRequestor() # load stats from disk + stats_file = os.path.join(CONFIG_DIR, ".search_stats.json") try: - with open(os.path.join(CONFIG_DIR, ".search_stats.json"), "r") as f: + with open(stats_file, "r") as f: data = json.loads(f.read()) self.thumb_stats.from_dict(data["thumb_stats"]) self.desc_stats.from_dict(data["desc_stats"]) except FileNotFoundError: pass + except JSONDecodeError: + logger.warning("Failed to decode semantic search stats, clearing file") + try: + with open(stats_file, "w") as f: + f.write("") + except OSError as e: + logger.error(f"Failed to clear corrupted stats file: {e}") def stop(self): """Write the stats to disk as JSON on exit."""