mirror of
https://github.com/blakeblackshear/frigate.git
synced 2024-11-30 19:09:13 +01:00
break out recording maintenance and cleanup into separate threads
This commit is contained in:
parent
5d940bcb86
commit
181a504a14
@ -23,7 +23,7 @@ from frigate.models import Event, Recordings
|
|||||||
from frigate.mqtt import create_mqtt_client, MqttSocketRelay
|
from frigate.mqtt import create_mqtt_client, MqttSocketRelay
|
||||||
from frigate.object_processing import TrackedObjectProcessor
|
from frigate.object_processing import TrackedObjectProcessor
|
||||||
from frigate.output import output_frames
|
from frigate.output import output_frames
|
||||||
from frigate.record import RecordingMaintainer
|
from frigate.record import RecordingCleanup, RecordingMaintainer
|
||||||
from frigate.stats import StatsEmitter, stats_init
|
from frigate.stats import StatsEmitter, stats_init
|
||||||
from frigate.video import capture_camera, track_camera
|
from frigate.video import capture_camera, track_camera
|
||||||
from frigate.watchdog import FrigateWatchdog
|
from frigate.watchdog import FrigateWatchdog
|
||||||
@ -301,6 +301,10 @@ class FrigateApp:
|
|||||||
self.recording_maintainer = RecordingMaintainer(self.config, self.stop_event)
|
self.recording_maintainer = RecordingMaintainer(self.config, self.stop_event)
|
||||||
self.recording_maintainer.start()
|
self.recording_maintainer.start()
|
||||||
|
|
||||||
|
def start_recording_cleanup(self):
|
||||||
|
self.recording_cleanup = RecordingCleanup(self.config, self.stop_event)
|
||||||
|
self.recording_cleanup.start()
|
||||||
|
|
||||||
def start_stats_emitter(self):
|
def start_stats_emitter(self):
|
||||||
self.stats_emitter = StatsEmitter(
|
self.stats_emitter = StatsEmitter(
|
||||||
self.config,
|
self.config,
|
||||||
@ -346,6 +350,7 @@ class FrigateApp:
|
|||||||
self.start_event_processor()
|
self.start_event_processor()
|
||||||
self.start_event_cleanup()
|
self.start_event_cleanup()
|
||||||
self.start_recording_maintainer()
|
self.start_recording_maintainer()
|
||||||
|
self.start_recording_cleanup()
|
||||||
self.start_stats_emitter()
|
self.start_stats_emitter()
|
||||||
self.start_watchdog()
|
self.start_watchdog()
|
||||||
# self.zeroconf = broadcast_zeroconf(self.config.mqtt.client_id)
|
# self.zeroconf = broadcast_zeroconf(self.config.mqtt.client_id)
|
||||||
@ -372,6 +377,7 @@ class FrigateApp:
|
|||||||
self.event_processor.join()
|
self.event_processor.join()
|
||||||
self.event_cleanup.join()
|
self.event_cleanup.join()
|
||||||
self.recording_maintainer.join()
|
self.recording_maintainer.join()
|
||||||
|
self.recording_cleanup.join()
|
||||||
self.stats_emitter.join()
|
self.stats_emitter.join()
|
||||||
self.frigate_watchdog.join()
|
self.frigate_watchdog.join()
|
||||||
self.db.stop()
|
self.db.stop()
|
||||||
|
@ -68,6 +68,7 @@ class RecordingMaintainer(threading.Thread):
|
|||||||
continue
|
continue
|
||||||
|
|
||||||
for f in recordings:
|
for f in recordings:
|
||||||
|
# Skip files currently in use
|
||||||
if f in files_in_use:
|
if f in files_in_use:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
@ -76,6 +77,11 @@ class RecordingMaintainer(threading.Thread):
|
|||||||
camera, date = basename.rsplit("-", maxsplit=1)
|
camera, date = basename.rsplit("-", maxsplit=1)
|
||||||
start_time = datetime.datetime.strptime(date, "%Y%m%d%H%M%S")
|
start_time = datetime.datetime.strptime(date, "%Y%m%d%H%M%S")
|
||||||
|
|
||||||
|
# Just delete files if recordings are turned off
|
||||||
|
if not self.config.cameras[camera].record.enabled:
|
||||||
|
Path(cache_path).unlink(missing_ok=True)
|
||||||
|
continue
|
||||||
|
|
||||||
ffprobe_cmd = [
|
ffprobe_cmd = [
|
||||||
"ffprobe",
|
"ffprobe",
|
||||||
"-v",
|
"-v",
|
||||||
@ -119,6 +125,21 @@ class RecordingMaintainer(threading.Thread):
|
|||||||
duration=duration,
|
duration=duration,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def run(self):
|
||||||
|
# Check for new files every 5 seconds
|
||||||
|
while not self.stop_event.wait(5):
|
||||||
|
self.move_files()
|
||||||
|
|
||||||
|
logger.info(f"Exiting recording maintenance...")
|
||||||
|
|
||||||
|
|
||||||
|
class RecordingCleanup(threading.Thread):
|
||||||
|
def __init__(self, config: FrigateConfig, stop_event):
|
||||||
|
threading.Thread.__init__(self)
|
||||||
|
self.name = "recording_cleanup"
|
||||||
|
self.config = config
|
||||||
|
self.stop_event = stop_event
|
||||||
|
|
||||||
def expire_recordings(self):
|
def expire_recordings(self):
|
||||||
logger.debug("Start expire recordings (new).")
|
logger.debug("Start expire recordings (new).")
|
||||||
|
|
||||||
@ -234,17 +255,14 @@ class RecordingMaintainer(threading.Thread):
|
|||||||
logger.debug("End expire files (legacy).")
|
logger.debug("End expire files (legacy).")
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
# only expire events every 10 minutes, but check for new files every 5 seconds
|
# Expire recordings every minute, clean directories every 5 minutes.
|
||||||
for counter in itertools.cycle(range(120)):
|
for counter in itertools.cycle(range(5)):
|
||||||
if self.stop_event.wait(5):
|
if self.stop_event.wait(60):
|
||||||
logger.info(f"Exiting recording maintenance...")
|
logger.info(f"Exiting recording cleanup...")
|
||||||
break
|
break
|
||||||
|
|
||||||
if counter % 12 == 0:
|
|
||||||
self.expire_recordings()
|
self.expire_recordings()
|
||||||
|
|
||||||
if counter == 0:
|
if counter == 0:
|
||||||
self.expire_files()
|
self.expire_files()
|
||||||
remove_empty_directories(RECORD_DIR)
|
remove_empty_directories(RECORD_DIR)
|
||||||
|
|
||||||
self.move_files()
|
|
||||||
|
Loading…
Reference in New Issue
Block a user