mirror of
				https://github.com/blakeblackshear/frigate.git
				synced 2025-10-27 10:52:11 +01:00 
			
		
		
		
	* Refactor recordings config to be based off of review items * Update object processing logic for when an event is created * Migrate to deciding recording retention based on review items * Refactor recording expiration to be based off of review items * Remove remainder of recording events access * Handle migration automatically * Update version and cleanup * Update docs * Clarify docs * Cleanup * Target camera config * Safely access all fields
		
			
				
	
	
		
			52 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			52 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
"""Run recording maintainer and cleanup."""
 | 
						|
 | 
						|
import logging
 | 
						|
import multiprocessing as mp
 | 
						|
import signal
 | 
						|
import threading
 | 
						|
from types import FrameType
 | 
						|
from typing import Optional
 | 
						|
 | 
						|
from playhouse.sqliteq import SqliteQueueDatabase
 | 
						|
from setproctitle import setproctitle
 | 
						|
 | 
						|
from frigate.config import FrigateConfig
 | 
						|
from frigate.models import Recordings, ReviewSegment
 | 
						|
from frigate.record.maintainer import RecordingMaintainer
 | 
						|
from frigate.util.services import listen
 | 
						|
 | 
						|
logger = logging.getLogger(__name__)
 | 
						|
 | 
						|
 | 
						|
def manage_recordings(config: FrigateConfig) -> None:
 | 
						|
    stop_event = mp.Event()
 | 
						|
 | 
						|
    def receiveSignal(signalNumber: int, frame: Optional[FrameType]) -> None:
 | 
						|
        logger.debug(f"Recording manager process received signal {signalNumber}")
 | 
						|
        stop_event.set()
 | 
						|
 | 
						|
    signal.signal(signal.SIGTERM, receiveSignal)
 | 
						|
    signal.signal(signal.SIGINT, receiveSignal)
 | 
						|
 | 
						|
    threading.current_thread().name = "process:recording_manager"
 | 
						|
    setproctitle("frigate.recording_manager")
 | 
						|
    listen()
 | 
						|
 | 
						|
    db = SqliteQueueDatabase(
 | 
						|
        config.database.path,
 | 
						|
        pragmas={
 | 
						|
            "auto_vacuum": "FULL",  # Does not defragment database
 | 
						|
            "cache_size": -512 * 1000,  # 512MB of cache
 | 
						|
            "synchronous": "NORMAL",  # Safe when using WAL https://www.sqlite.org/pragma.html#pragma_synchronous
 | 
						|
        },
 | 
						|
        timeout=max(60, 10 * len([c for c in config.cameras.values() if c.enabled])),
 | 
						|
    )
 | 
						|
    models = [ReviewSegment, Recordings]
 | 
						|
    db.bind(models)
 | 
						|
 | 
						|
    maintainer = RecordingMaintainer(
 | 
						|
        config,
 | 
						|
        stop_event,
 | 
						|
    )
 | 
						|
    maintainer.start()
 |