mirror of
https://github.com/blakeblackshear/frigate.git
synced 2026-05-09 23:15:28 +03:00
Compare commits
No commits in common. "7a222488a0b137d66c70af12b0f55707c7c63363" and "5f8d590d87a70c7fc59d8aa46243cac0144a297b" have entirely different histories.
7a222488a0
...
5f8d590d87
@ -464,12 +464,10 @@ class RecordingMaintainer(threading.Thread):
|
|||||||
self.drop_segment(cache_path)
|
self.drop_segment(cache_path)
|
||||||
return None
|
return None
|
||||||
|
|
||||||
# if it doesn't overlap with a review item, drop the segment once it
|
# if it doesn't overlap with an review item, go ahead and drop the segment
|
||||||
# ends more than event_pre_capture before the most recently processed
|
# if it ends more than the configured pre_capture for the camera
|
||||||
# frame. at this point we've already decided not to keep it for
|
# BUT only if continuous/motion is NOT enabled (otherwise wait for processing)
|
||||||
# continuous/motion retention (either disabled or segment_stats said
|
elif highest is None:
|
||||||
# discard), so waiting longer just fills the cache.
|
|
||||||
else:
|
|
||||||
camera_info = self.object_recordings_info[camera]
|
camera_info = self.object_recordings_info[camera]
|
||||||
most_recently_processed_frame_time = (
|
most_recently_processed_frame_time = (
|
||||||
camera_info[-1][0] if len(camera_info) > 0 else 0
|
camera_info[-1][0] if len(camera_info) > 0 else 0
|
||||||
|
|||||||
@ -1,4 +1,3 @@
|
|||||||
import datetime
|
|
||||||
import sys
|
import sys
|
||||||
import unittest
|
import unittest
|
||||||
from unittest.mock import MagicMock, patch
|
from unittest.mock import MagicMock, patch
|
||||||
@ -75,46 +74,6 @@ class TestMaintainer(unittest.IsolatedAsyncioTestCase):
|
|||||||
f"Expected a single warning for unexpected files, got {len(matching)}",
|
f"Expected a single warning for unexpected files, got {len(matching)}",
|
||||||
)
|
)
|
||||||
|
|
||||||
async def test_drops_quiet_segment_when_only_motion_retention(self):
|
|
||||||
# Regression: when motion retention is enabled but a segment has no
|
|
||||||
# motion and no review overlaps it, the segment must still be dropped.
|
|
||||||
# Otherwise it sits in cache forever, accumulates, and triggers the
|
|
||||||
# "Unable to keep up with recording segments in cache" warning every
|
|
||||||
# ~10s as the overflow trim in move_files discards the oldest one.
|
|
||||||
config = MagicMock(spec=FrigateConfig)
|
|
||||||
|
|
||||||
camera_config = MagicMock()
|
|
||||||
camera_config.record.enabled = True
|
|
||||||
camera_config.record.continuous.days = 0
|
|
||||||
camera_config.record.motion.days = 1
|
|
||||||
camera_config.record.event_pre_capture = 5
|
|
||||||
config.cameras = {"test_cam": camera_config}
|
|
||||||
|
|
||||||
stop_event = MagicMock()
|
|
||||||
maintainer = RecordingMaintainer(config, stop_event)
|
|
||||||
|
|
||||||
now = datetime.datetime.now(datetime.timezone.utc)
|
|
||||||
start_time = now - datetime.timedelta(seconds=20)
|
|
||||||
end_time = now - datetime.timedelta(seconds=10)
|
|
||||||
cache_path = "/tmp/cache/test_cam@20260417150000+0000.mp4"
|
|
||||||
|
|
||||||
maintainer.end_time_cache = {cache_path: (end_time, 10.0)}
|
|
||||||
# Single processed frame well past end_time with no motion/objects.
|
|
||||||
maintainer.object_recordings_info["test_cam"] = [(now.timestamp(), [], [], [])]
|
|
||||||
maintainer.audio_recordings_info["test_cam"] = []
|
|
||||||
|
|
||||||
maintainer.drop_segment = MagicMock()
|
|
||||||
maintainer.recordings_publisher = MagicMock()
|
|
||||||
|
|
||||||
result = await maintainer.validate_and_move_segment(
|
|
||||||
"test_cam",
|
|
||||||
reviews=[],
|
|
||||||
recording={"start_time": start_time, "cache_path": cache_path},
|
|
||||||
)
|
|
||||||
|
|
||||||
self.assertIsNone(result)
|
|
||||||
maintainer.drop_segment.assert_called_once_with(cache_path)
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
unittest.main()
|
unittest.main()
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user