mirror of
				https://github.com/blakeblackshear/frigate.git
				synced 2025-10-27 10:52:11 +01:00 
			
		
		
		
	Clean up enabled config updates (#17547)
* Immediately end review item for disabled cameras * Clean up checks * Remove duplicate enabled checkers * Cleanup
This commit is contained in:
		
							parent
							
								
									e60df795ad
								
							
						
					
					
						commit
						7bfcf2040d
					
				@ -754,7 +754,6 @@ class Birdseye:
 | 
				
			|||||||
            "birdseye", self.converter, websocket_server, stop_event
 | 
					            "birdseye", self.converter, websocket_server, stop_event
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
        self.birdseye_manager = BirdsEyeFrameManager(config, stop_event)
 | 
					        self.birdseye_manager = BirdsEyeFrameManager(config, stop_event)
 | 
				
			||||||
        self.config_enabled_subscriber = ConfigSubscriber("config/enabled/")
 | 
					 | 
				
			||||||
        self.birdseye_subscriber = ConfigSubscriber("config/birdseye/")
 | 
					        self.birdseye_subscriber = ConfigSubscriber("config/birdseye/")
 | 
				
			||||||
        self.frame_manager = SharedMemoryFrameManager()
 | 
					        self.frame_manager = SharedMemoryFrameManager()
 | 
				
			||||||
        self.stop_event = stop_event
 | 
					        self.stop_event = stop_event
 | 
				
			||||||
@ -799,24 +798,13 @@ class Birdseye:
 | 
				
			|||||||
                updated_birdseye_config,
 | 
					                updated_birdseye_config,
 | 
				
			||||||
            ) = self.birdseye_subscriber.check_for_update()
 | 
					            ) = self.birdseye_subscriber.check_for_update()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            (
 | 
					            if not updated_birdseye_topic:
 | 
				
			||||||
                updated_enabled_topic,
 | 
					 | 
				
			||||||
                updated_enabled_config,
 | 
					 | 
				
			||||||
            ) = self.config_enabled_subscriber.check_for_update()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            if not updated_birdseye_topic and not updated_enabled_topic:
 | 
					 | 
				
			||||||
                break
 | 
					                break
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if updated_birdseye_config:
 | 
					            if updated_birdseye_config:
 | 
				
			||||||
                camera_name = updated_birdseye_topic.rpartition("/")[-1]
 | 
					                camera_name = updated_birdseye_topic.rpartition("/")[-1]
 | 
				
			||||||
                self.config.cameras[camera_name].birdseye = updated_birdseye_config
 | 
					                self.config.cameras[camera_name].birdseye = updated_birdseye_config
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if updated_enabled_config:
 | 
					 | 
				
			||||||
                camera_name = updated_enabled_topic.rpartition("/")[-1]
 | 
					 | 
				
			||||||
                self.config.cameras[
 | 
					 | 
				
			||||||
                    camera_name
 | 
					 | 
				
			||||||
                ].enabled = updated_enabled_config.enabled
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        if self.birdseye_manager.update(
 | 
					        if self.birdseye_manager.update(
 | 
				
			||||||
            camera,
 | 
					            camera,
 | 
				
			||||||
            len([o for o in current_tracked_objects if not o["stationary"]]),
 | 
					            len([o for o in current_tracked_objects if not o["stationary"]]),
 | 
				
			||||||
@ -828,6 +816,5 @@ class Birdseye:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    def stop(self) -> None:
 | 
					    def stop(self) -> None:
 | 
				
			||||||
        self.birdseye_subscriber.stop()
 | 
					        self.birdseye_subscriber.stop()
 | 
				
			||||||
        self.config_enabled_subscriber.stop()
 | 
					 | 
				
			||||||
        self.converter.join()
 | 
					        self.converter.join()
 | 
				
			||||||
        self.broadcaster.join()
 | 
					        self.broadcaster.join()
 | 
				
			||||||
 | 
				
			|||||||
@ -99,12 +99,7 @@ def output_frames(
 | 
				
			|||||||
    websocket_thread = threading.Thread(target=websocket_server.serve_forever)
 | 
					    websocket_thread = threading.Thread(target=websocket_server.serve_forever)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    detection_subscriber = DetectionSubscriber(DetectionTypeEnum.video)
 | 
					    detection_subscriber = DetectionSubscriber(DetectionTypeEnum.video)
 | 
				
			||||||
 | 
					    config_enabled_subscriber = ConfigSubscriber("config/enabled/")
 | 
				
			||||||
    enabled_subscribers = {
 | 
					 | 
				
			||||||
        camera: ConfigSubscriber(f"config/enabled/{camera}", True)
 | 
					 | 
				
			||||||
        for camera in config.cameras.keys()
 | 
					 | 
				
			||||||
        if config.cameras[camera].enabled_in_config
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    jsmpeg_cameras: dict[str, JsmpegCamera] = {}
 | 
					    jsmpeg_cameras: dict[str, JsmpegCamera] = {}
 | 
				
			||||||
    birdseye: Birdseye | None = None
 | 
					    birdseye: Birdseye | None = None
 | 
				
			||||||
@ -128,16 +123,21 @@ def output_frames(
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    websocket_thread.start()
 | 
					    websocket_thread.start()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def get_enabled_state(camera: str) -> bool:
 | 
					 | 
				
			||||||
        _, config_data = enabled_subscribers[camera].check_for_update()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        if config_data:
 | 
					 | 
				
			||||||
            config.cameras[camera].enabled = config_data.enabled
 | 
					 | 
				
			||||||
            return config_data.enabled
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        return config.cameras[camera].enabled
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    while not stop_event.is_set():
 | 
					    while not stop_event.is_set():
 | 
				
			||||||
 | 
					        # check if there is an updated config
 | 
				
			||||||
 | 
					        while True:
 | 
				
			||||||
 | 
					            (
 | 
				
			||||||
 | 
					                updated_enabled_topic,
 | 
				
			||||||
 | 
					                updated_enabled_config,
 | 
				
			||||||
 | 
					            ) = config_enabled_subscriber.check_for_update()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if not updated_enabled_topic:
 | 
				
			||||||
 | 
					                break
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if updated_enabled_config:
 | 
				
			||||||
 | 
					                camera_name = updated_enabled_topic.rpartition("/")[-1]
 | 
				
			||||||
 | 
					                config.cameras[camera_name].enabled = updated_enabled_config.enabled
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        (topic, data) = detection_subscriber.check_for_update(timeout=1)
 | 
					        (topic, data) = detection_subscriber.check_for_update(timeout=1)
 | 
				
			||||||
        now = datetime.datetime.now().timestamp()
 | 
					        now = datetime.datetime.now().timestamp()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -160,7 +160,7 @@ def output_frames(
 | 
				
			|||||||
            _,
 | 
					            _,
 | 
				
			||||||
        ) = data
 | 
					        ) = data
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if not get_enabled_state(camera):
 | 
					        if not config.cameras[camera].enabled:
 | 
				
			||||||
            continue
 | 
					            continue
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        frame = frame_manager.get(frame_name, config.cameras[camera].frame_shape_yuv)
 | 
					        frame = frame_manager.get(frame_name, config.cameras[camera].frame_shape_yuv)
 | 
				
			||||||
@ -240,9 +240,7 @@ def output_frames(
 | 
				
			|||||||
    if birdseye is not None:
 | 
					    if birdseye is not None:
 | 
				
			||||||
        birdseye.stop()
 | 
					        birdseye.stop()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    for subscriber in enabled_subscribers.values():
 | 
					    config_enabled_subscriber.stop()
 | 
				
			||||||
        subscriber.stop()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    websocket_server.manager.close_all()
 | 
					    websocket_server.manager.close_all()
 | 
				
			||||||
    websocket_server.manager.stop()
 | 
					    websocket_server.manager.stop()
 | 
				
			||||||
    websocket_server.manager.join()
 | 
					    websocket_server.manager.join()
 | 
				
			||||||
 | 
				
			|||||||
@ -482,6 +482,10 @@ class ReviewSegmentMaintainer(threading.Thread):
 | 
				
			|||||||
                    camera_name = updated_record_topic.rpartition("/")[-1]
 | 
					                    camera_name = updated_record_topic.rpartition("/")[-1]
 | 
				
			||||||
                    self.config.cameras[camera_name].record = updated_record_config
 | 
					                    self.config.cameras[camera_name].record = updated_record_config
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    # immediately end segment
 | 
				
			||||||
 | 
					                    if not updated_record_config.enabled:
 | 
				
			||||||
 | 
					                        self.end_segment(camera_name)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                if updated_review_topic:
 | 
					                if updated_review_topic:
 | 
				
			||||||
                    camera_name = updated_review_topic.rpartition("/")[-1]
 | 
					                    camera_name = updated_review_topic.rpartition("/")[-1]
 | 
				
			||||||
                    self.config.cameras[camera_name].review = updated_review_config
 | 
					                    self.config.cameras[camera_name].review = updated_review_config
 | 
				
			||||||
@ -492,6 +496,10 @@ class ReviewSegmentMaintainer(threading.Thread):
 | 
				
			|||||||
                        camera_name
 | 
					                        camera_name
 | 
				
			||||||
                    ].enabled = updated_enabled_config.enabled
 | 
					                    ].enabled = updated_enabled_config.enabled
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    # immediately end segment as we may not get another update
 | 
				
			||||||
 | 
					                    if not updated_enabled_config.enabled:
 | 
				
			||||||
 | 
					                        self.end_segment(camera_name)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            (topic, data) = self.detection_subscriber.check_for_update(timeout=1)
 | 
					            (topic, data) = self.detection_subscriber.check_for_update(timeout=1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if not topic:
 | 
					            if not topic:
 | 
				
			||||||
@ -523,16 +531,14 @@ class ReviewSegmentMaintainer(threading.Thread):
 | 
				
			|||||||
                if camera not in self.indefinite_events:
 | 
					                if camera not in self.indefinite_events:
 | 
				
			||||||
                    self.indefinite_events[camera] = {}
 | 
					                    self.indefinite_events[camera] = {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            current_segment = self.active_review_segments.get(camera)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            if (
 | 
					            if (
 | 
				
			||||||
                not self.config.cameras[camera].enabled
 | 
					                not self.config.cameras[camera].enabled
 | 
				
			||||||
                or not self.config.cameras[camera].record.enabled
 | 
					                or not self.config.cameras[camera].record.enabled
 | 
				
			||||||
            ):
 | 
					            ):
 | 
				
			||||||
                if current_segment:
 | 
					 | 
				
			||||||
                    self.end_segment(camera)
 | 
					 | 
				
			||||||
                continue
 | 
					                continue
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            current_segment = self.active_review_segments.get(camera)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            # Check if the current segment should be processed based on enabled settings
 | 
					            # Check if the current segment should be processed based on enabled settings
 | 
				
			||||||
            if current_segment:
 | 
					            if current_segment:
 | 
				
			||||||
                if (
 | 
					                if (
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user