From d7dc7ce3bc14b23eb9af40f2e67210548f009092 Mon Sep 17 00:00:00 2001 From: Josh Hawkins <32435876+hawkeye217@users.noreply.github.com> Date: Thu, 27 Aug 2026 12:43:51 -0500 Subject: [PATCH] chown recordings, previews, and exports to the runtime user at create --- frigate/output/preview.py | 2 ++ frigate/record/export.py | 4 ++++ frigate/record/maintainer.py | 4 ++++ 3 files changed, 10 insertions(+) diff --git a/frigate/output/preview.py b/frigate/output/preview.py index f07521fb8d..294a8c36a0 100644 --- a/frigate/output/preview.py +++ b/frigate/output/preview.py @@ -23,6 +23,7 @@ from frigate.ffmpeg_presets import ( ) from frigate.models import Previews from frigate.util.image import copy_yuv_to_position, get_blank_yuv_frame, get_yuv_crop +from frigate.util.ownership import chown_to_runtime logger = logging.getLogger(__name__) @@ -185,6 +186,7 @@ class FFMpegConverter(threading.Thread): if p.returncode == 0: logger.debug("successfully saved preview") + chown_to_runtime(self.path) self.requestor.send_data( INSERT_PREVIEW, { diff --git a/frigate/record/export.py b/frigate/record/export.py index 0a84cd4bee..2dfa05d0de 100644 --- a/frigate/record/export.py +++ b/frigate/record/export.py @@ -35,6 +35,7 @@ from frigate.ffmpeg_presets import ( ) from frigate.models import Export, Previews, Recordings, ReviewSegment from frigate.util.ffmpeg import run_ffmpeg_with_progress +from frigate.util.ownership import chown_to_runtime from frigate.util.time import is_current_hour logger = logging.getLogger(__name__) @@ -940,6 +941,8 @@ class RecordingExporter(threading.Thread): else: video_path = f"{EXPORT_DIR}/{self.camera}_{filename_start_datetime}-{filename_end_datetime}_{cleaned_export_id}.mp4" thumb_path = self.save_thumbnail(self.export_id) + if thumb_path: + chown_to_runtime(thumb_path) export_values = { Export.id: self.export_id, @@ -1014,6 +1017,7 @@ class RecordingExporter(threading.Thread): Path(thumb_path).unlink(missing_ok=True) return else: + chown_to_runtime(video_path) self._emit_progress("finalizing", 100.0) Export.update({Export.in_progress: False}).where( Export.id == self.export_id diff --git a/frigate/record/maintainer.py b/frigate/record/maintainer.py index 6da72bdb0d..88a01564d5 100644 --- a/frigate/record/maintainer.py +++ b/frigate/record/maintainer.py @@ -43,6 +43,7 @@ from frigate.const import ( from frigate.models import Recordings, ReviewSegment from frigate.review.types import SeverityEnum from frigate.util.media import get_keyframe_offsets +from frigate.util.ownership import chown_to_runtime from frigate.util.services import get_video_properties logger = logging.getLogger(__name__) @@ -928,6 +929,7 @@ class RecordingMaintainer(threading.Thread): ) os.makedirs(directory, exist_ok=True) + chown_to_runtime(directory) # file will be in utc due to path_time being in utc file_name = f"{path_time.strftime('%M.%S.mp4')}" @@ -966,6 +968,8 @@ class RecordingMaintainer(threading.Thread): f"Copied {file_path} in {datetime.datetime.now().timestamp() - start_frame} seconds." ) + chown_to_runtime(file_path) + try: # get the segment size of the cache file # file without faststart is same size