mirror of
				https://github.com/blakeblackshear/frigate.git
				synced 2025-10-27 10:52:11 +01:00 
			
		
		
		
	
							parent
							
								
									f3f9b36e07
								
							
						
					
					
						commit
						2f401bd8da
					
				| @ -107,33 +107,64 @@ class FrigateApp: | |||||||
|         for camera_name in self.config.cameras.keys(): |         for camera_name in self.config.cameras.keys(): | ||||||
|             # create camera_metrics |             # create camera_metrics | ||||||
|             self.camera_metrics[camera_name] = { |             self.camera_metrics[camera_name] = { | ||||||
|                 "camera_fps": mp.Value("d", 0.0), |                 "camera_fps": mp.Value("d", 0.0),  # type: ignore[typeddict-item] | ||||||
|                 "skipped_fps": mp.Value("d", 0.0), |                 # issue https://github.com/python/typeshed/issues/8799 | ||||||
|                 "process_fps": mp.Value("d", 0.0), |                 # from mypy 0.981 onwards | ||||||
|                 "detection_enabled": mp.Value( |                 "skipped_fps": mp.Value("d", 0.0),  # type: ignore[typeddict-item] | ||||||
|                     "i", self.config.cameras[camera_name].detect.enabled |                 # issue https://github.com/python/typeshed/issues/8799 | ||||||
|  |                 # from mypy 0.981 onwards | ||||||
|  |                 "process_fps": mp.Value("d", 0.0),  # type: ignore[typeddict-item] | ||||||
|  |                 # issue https://github.com/python/typeshed/issues/8799 | ||||||
|  |                 # from mypy 0.981 onwards | ||||||
|  |                 "detection_enabled": mp.Value(  # type: ignore[typeddict-item] | ||||||
|  |                     # issue https://github.com/python/typeshed/issues/8799 | ||||||
|  |                     # from mypy 0.981 onwards | ||||||
|  |                     "i", | ||||||
|  |                     self.config.cameras[camera_name].detect.enabled, | ||||||
|                 ), |                 ), | ||||||
|                 "motion_enabled": mp.Value("i", True), |                 "motion_enabled": mp.Value("i", True),  # type: ignore[typeddict-item] | ||||||
|                 "improve_contrast_enabled": mp.Value( |                 # issue https://github.com/python/typeshed/issues/8799 | ||||||
|                     "i", self.config.cameras[camera_name].motion.improve_contrast |                 # from mypy 0.981 onwards | ||||||
|  |                 "improve_contrast_enabled": mp.Value(  # type: ignore[typeddict-item] | ||||||
|  |                     # issue https://github.com/python/typeshed/issues/8799 | ||||||
|  |                     # from mypy 0.981 onwards | ||||||
|  |                     "i", | ||||||
|  |                     self.config.cameras[camera_name].motion.improve_contrast, | ||||||
|                 ), |                 ), | ||||||
|                 "motion_threshold": mp.Value( |                 "motion_threshold": mp.Value(  # type: ignore[typeddict-item] | ||||||
|                     "i", self.config.cameras[camera_name].motion.threshold |                     # issue https://github.com/python/typeshed/issues/8799 | ||||||
|  |                     # from mypy 0.981 onwards | ||||||
|  |                     "i", | ||||||
|  |                     self.config.cameras[camera_name].motion.threshold, | ||||||
|                 ), |                 ), | ||||||
|                 "motion_contour_area": mp.Value( |                 "motion_contour_area": mp.Value(  # type: ignore[typeddict-item] | ||||||
|                     "i", self.config.cameras[camera_name].motion.contour_area |                     # issue https://github.com/python/typeshed/issues/8799 | ||||||
|  |                     # from mypy 0.981 onwards | ||||||
|  |                     "i", | ||||||
|  |                     self.config.cameras[camera_name].motion.contour_area, | ||||||
|                 ), |                 ), | ||||||
|                 "detection_fps": mp.Value("d", 0.0), |                 "detection_fps": mp.Value("d", 0.0),  # type: ignore[typeddict-item] | ||||||
|                 "detection_frame": mp.Value("d", 0.0), |                 # issue https://github.com/python/typeshed/issues/8799 | ||||||
|                 "read_start": mp.Value("d", 0.0), |                 # from mypy 0.981 onwards | ||||||
|                 "ffmpeg_pid": mp.Value("i", 0), |                 "detection_frame": mp.Value("d", 0.0),  # type: ignore[typeddict-item] | ||||||
|  |                 # issue https://github.com/python/typeshed/issues/8799 | ||||||
|  |                 # from mypy 0.981 onwards | ||||||
|  |                 "read_start": mp.Value("d", 0.0),  # type: ignore[typeddict-item] | ||||||
|  |                 # issue https://github.com/python/typeshed/issues/8799 | ||||||
|  |                 # from mypy 0.981 onwards | ||||||
|  |                 "ffmpeg_pid": mp.Value("i", 0),  # type: ignore[typeddict-item] | ||||||
|  |                 # issue https://github.com/python/typeshed/issues/8799 | ||||||
|  |                 # from mypy 0.981 onwards | ||||||
|                 "frame_queue": mp.Queue(maxsize=2), |                 "frame_queue": mp.Queue(maxsize=2), | ||||||
|                 "capture_process": None, |                 "capture_process": None, | ||||||
|                 "process": None, |                 "process": None, | ||||||
|             } |             } | ||||||
|             self.record_metrics[camera_name] = { |             self.record_metrics[camera_name] = { | ||||||
|                 "record_enabled": mp.Value( |                 "record_enabled": mp.Value(  # type: ignore[typeddict-item] | ||||||
|                     "i", self.config.cameras[camera_name].record.enabled |                     # issue https://github.com/python/typeshed/issues/8799 | ||||||
|  |                     # from mypy 0.981 onwards | ||||||
|  |                     "i", | ||||||
|  |                     self.config.cameras[camera_name].record.enabled, | ||||||
|                 ) |                 ) | ||||||
|             } |             } | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -262,8 +262,12 @@ def stats_snapshot( | |||||||
|     for name, detector in stats_tracking["detectors"].items(): |     for name, detector in stats_tracking["detectors"].items(): | ||||||
|         pid = detector.detect_process.pid if detector.detect_process else None |         pid = detector.detect_process.pid if detector.detect_process else None | ||||||
|         stats["detectors"][name] = { |         stats["detectors"][name] = { | ||||||
|             "inference_speed": round(detector.avg_inference_speed.value * 1000, 2), |             "inference_speed": round(detector.avg_inference_speed.value * 1000, 2),  # type: ignore[attr-defined] | ||||||
|             "detection_start": detector.detection_start.value, |             # issue https://github.com/python/typeshed/issues/8799 | ||||||
|  |             # from mypy 0.981 onwards | ||||||
|  |             "detection_start": detector.detection_start.value,  # type: ignore[attr-defined] | ||||||
|  |             # issue https://github.com/python/typeshed/issues/8799 | ||||||
|  |             # from mypy 0.981 onwards | ||||||
|             "pid": pid, |             "pid": pid, | ||||||
|         } |         } | ||||||
|     stats["detection_fps"] = round(total_detection_fps, 2) |     stats["detection_fps"] = round(total_detection_fps, 2) | ||||||
|  | |||||||
| @ -24,7 +24,9 @@ class FrigateWatchdog(threading.Thread): | |||||||
| 
 | 
 | ||||||
|             # check the detection processes |             # check the detection processes | ||||||
|             for detector in self.detectors.values(): |             for detector in self.detectors.values(): | ||||||
|                 detection_start = detector.detection_start.value |                 detection_start = detector.detection_start.value  # type: ignore[attr-defined] | ||||||
|  |                 # issue https://github.com/python/typeshed/issues/8799 | ||||||
|  |                 # from mypy 0.981 onwards | ||||||
|                 if detection_start > 0.0 and now - detection_start > 10: |                 if detection_start > 0.0 and now - detection_start > 10: | ||||||
|                     logger.info( |                     logger.info( | ||||||
|                         "Detection appears to be stuck. Restarting detection process..." |                         "Detection appears to be stuck. Restarting detection process..." | ||||||
|  | |||||||
| @ -3,13 +3,13 @@ Flask == 2.3.* | |||||||
| faster-fifo == 1.4.* | faster-fifo == 1.4.* | ||||||
| imutils == 0.5.* | imutils == 0.5.* | ||||||
| matplotlib == 3.7.* | matplotlib == 3.7.* | ||||||
| mypy == 0.942 | mypy == 1.4.1 | ||||||
| numpy == 1.23.* | numpy == 1.23.* | ||||||
| onvif_zeep == 0.2.12 | onvif_zeep == 0.2.12 | ||||||
| opencv-python-headless == 4.7.0.* | opencv-python-headless == 4.7.0.* | ||||||
| paho-mqtt == 1.6.* | paho-mqtt == 1.6.* | ||||||
| peewee == 3.16.* | peewee == 3.16.* | ||||||
| peewee_migrate == 1.10.* | peewee_migrate == 1.11.* | ||||||
| psutil == 5.9.* | psutil == 5.9.* | ||||||
| pydantic == 1.10.* | pydantic == 1.10.* | ||||||
| git+https://github.com/fbcotter/py3nvml#egg=py3nvml | git+https://github.com/fbcotter/py3nvml#egg=py3nvml | ||||||
|  | |||||||
| @ -8,7 +8,7 @@ | |||||||
|     <link rel="apple-touch-icon" sizes="180x180" href="/images/apple-touch-icon.png" /> |     <link rel="apple-touch-icon" sizes="180x180" href="/images/apple-touch-icon.png" /> | ||||||
|     <link rel="icon" type="image/png" sizes="32x32" href="/images/favicon-32x32.png" /> |     <link rel="icon" type="image/png" sizes="32x32" href="/images/favicon-32x32.png" /> | ||||||
|     <link rel="icon" type="image/png" sizes="16x16" href="/images/favicon-16x16.png" /> |     <link rel="icon" type="image/png" sizes="16x16" href="/images/favicon-16x16.png" /> | ||||||
|     <link rel="icon" type="image/svg+xml" href="/images/favicon.svg"> |     <link rel="icon" type="image/svg+xml" href="/images/favicon.svg" /> | ||||||
|     <link rel="manifest" href="/site.webmanifest" /> |     <link rel="manifest" href="/site.webmanifest" /> | ||||||
|     <link rel="mask-icon" href="/images/favicon.svg" color="#3b82f7" /> |     <link rel="mask-icon" href="/images/favicon.svg" color="#3b82f7" /> | ||||||
|     <meta name="msapplication-TileColor" content="#3b82f7" /> |     <meta name="msapplication-TileColor" content="#3b82f7" /> | ||||||
|  | |||||||
							
								
								
									
										955
									
								
								web/package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										955
									
								
								web/package-lock.json
									
									
									
										generated
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @ -38,8 +38,8 @@ | |||||||
|     "@testing-library/user-event": "^14.4.3", |     "@testing-library/user-event": "^14.4.3", | ||||||
|     "@typescript-eslint/eslint-plugin": "^5.59.1", |     "@typescript-eslint/eslint-plugin": "^5.59.1", | ||||||
|     "@typescript-eslint/parser": "^5.59.1", |     "@typescript-eslint/parser": "^5.59.1", | ||||||
|     "@vitest/coverage-c8": "^0.31.0", |     "@vitest/coverage-v8": "^0.32.2", | ||||||
|     "@vitest/ui": "^0.31.0", |     "@vitest/ui": "^0.32.2", | ||||||
|     "autoprefixer": "^10.4.14", |     "autoprefixer": "^10.4.14", | ||||||
|     "eslint": "^8.39.0", |     "eslint": "^8.39.0", | ||||||
|     "eslint-config-preact": "^1.3.0", |     "eslint-config-preact": "^1.3.0", | ||||||
| @ -53,6 +53,6 @@ | |||||||
|     "tailwindcss": "^3.3.2", |     "tailwindcss": "^3.3.2", | ||||||
|     "typescript": "^5.0.4", |     "typescript": "^5.0.4", | ||||||
|     "vite": "^4.3.5", |     "vite": "^4.3.5", | ||||||
|     "vitest": "^0.31.0" |     "vitest": "^0.32.2" | ||||||
|   } |   } | ||||||
| } | } | ||||||
|  | |||||||
| @ -18,9 +18,9 @@ export default function Export() { | |||||||
|   const localISODate = localDate.toISOString().split('T')[0]; |   const localISODate = localDate.toISOString().split('T')[0]; | ||||||
| 
 | 
 | ||||||
|   const [startDate, setStartDate] = useState(localISODate); |   const [startDate, setStartDate] = useState(localISODate); | ||||||
|   const [startTime, setStartTime] = useState("00:00"); |   const [startTime, setStartTime] = useState('00:00'); | ||||||
|   const [endDate, setEndDate] = useState(localISODate); |   const [endDate, setEndDate] = useState(localISODate); | ||||||
|   const [endTime, setEndTime] = useState("23:59"); |   const [endTime, setEndTime] = useState('23:59'); | ||||||
| 
 | 
 | ||||||
|   const onHandleExport = () => { |   const onHandleExport = () => { | ||||||
|     if (camera == 'select') { |     if (camera == 'select') { | ||||||
| @ -33,8 +33,6 @@ export default function Export() { | |||||||
|       return; |       return; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|      |  | ||||||
| 
 |  | ||||||
|     if (!startDate || !startTime || !endDate || !endTime) { |     if (!startDate || !startTime || !endDate || !endTime) { | ||||||
|       setMessage({ text: 'A start and end time needs to be selected', error: true }); |       setMessage({ text: 'A start and end time needs to be selected', error: true }); | ||||||
|       return; |       return; | ||||||
| @ -48,12 +46,13 @@ export default function Export() { | |||||||
|       return; |       return; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     axios.post(`export/${camera}/start/${start}/end/${end}`, { playback }) |     axios | ||||||
|  |       .post(`export/${camera}/start/${start}/end/${end}`, { playback }) | ||||||
|       .then(() => { |       .then(() => { | ||||||
|         setMessage({ text: 'Successfully started export. View the file in the /exports folder.', error: false }); |         setMessage({ text: 'Successfully started export. View the file in the /exports folder.', error: false }); | ||||||
|       }) |       }) | ||||||
|       .catch((error) => { |       .catch((error) => { | ||||||
|         setMessage({ text: 'Failed to start export: '+error.response.data.message, error: true }); |         setMessage({ text: `Failed to start export: ${error.response.data.message}`, error: true }); | ||||||
|       }); |       }); | ||||||
|   }; |   }; | ||||||
| 
 | 
 | ||||||
| @ -93,13 +92,37 @@ export default function Export() { | |||||||
|         <Heading className="py-2" size="sm"> |         <Heading className="py-2" size="sm"> | ||||||
|           From: |           From: | ||||||
|         </Heading> |         </Heading> | ||||||
|         <input className="dark:bg-slate-800" id="startDate" type="date" value={startDate} onChange={(e) => setStartDate(e.target.value)}/> |         <input | ||||||
|         <input className="dark:bg-slate-800" id="startTime" type="time" value={startTime} onChange={(e) => setStartTime(e.target.value)}/> |           className="dark:bg-slate-800" | ||||||
|  |           id="startDate" | ||||||
|  |           type="date" | ||||||
|  |           value={startDate} | ||||||
|  |           onChange={(e) => setStartDate(e.target.value)} | ||||||
|  |         /> | ||||||
|  |         <input | ||||||
|  |           className="dark:bg-slate-800" | ||||||
|  |           id="startTime" | ||||||
|  |           type="time" | ||||||
|  |           value={startTime} | ||||||
|  |           onChange={(e) => setStartTime(e.target.value)} | ||||||
|  |         /> | ||||||
|         <Heading className="py-2" size="sm"> |         <Heading className="py-2" size="sm"> | ||||||
|           To: |           To: | ||||||
|         </Heading> |         </Heading> | ||||||
|         <input className="dark:bg-slate-800" id="endDate" type="date" value={endDate} onChange={(e) => setEndDate(e.target.value)}/> |         <input | ||||||
|         <input className="dark:bg-slate-800" id="endTime" type="time" value={endTime} onChange={(e) => setEndTime(e.target.value)}/> |           className="dark:bg-slate-800" | ||||||
|  |           id="endDate" | ||||||
|  |           type="date" | ||||||
|  |           value={endDate} | ||||||
|  |           onChange={(e) => setEndDate(e.target.value)} | ||||||
|  |         /> | ||||||
|  |         <input | ||||||
|  |           className="dark:bg-slate-800" | ||||||
|  |           id="endTime" | ||||||
|  |           type="time" | ||||||
|  |           value={endTime} | ||||||
|  |           onChange={(e) => setEndTime(e.target.value)} | ||||||
|  |         /> | ||||||
|       </div> |       </div> | ||||||
|       <Button onClick={() => onHandleExport()}>Submit</Button> |       <Button onClick={() => onHandleExport()}>Submit</Button> | ||||||
|     </div> |     </div> | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user