frigate: 0.15.2 -> 0.16.0
https://github.com/blakeblackshear/frigate/releases/tag/v0.16.0
This commit is contained in:
@@ -103,14 +103,16 @@ let
|
||||
# Send a subrequest to verify if the user is authenticated and has permission to access the resource.
|
||||
auth_request /auth;
|
||||
|
||||
# Save the upstream metadata response headers from Authelia to variables.
|
||||
# Save the upstream metadata response headers from the auth request to variables
|
||||
auth_request_set $user $upstream_http_remote_user;
|
||||
auth_request_set $role $upstream_http_remote_role;
|
||||
auth_request_set $groups $upstream_http_remote_groups;
|
||||
auth_request_set $name $upstream_http_remote_name;
|
||||
auth_request_set $email $upstream_http_remote_email;
|
||||
|
||||
# Inject the metadata response headers from the variables into the request made to the backend.
|
||||
proxy_set_header Remote-User $user;
|
||||
proxy_set_header Remote-Role $role;
|
||||
proxy_set_header Remote-Groups $groups;
|
||||
proxy_set_header Remote-Email $email;
|
||||
proxy_set_header Remote-Name $name;
|
||||
@@ -343,8 +345,15 @@ in
|
||||
expires off;
|
||||
|
||||
keepalive_disable safari;
|
||||
|
||||
# vod module returns 502 for non-existent media
|
||||
# https://github.com/kaltura/nginx-vod-module/issues/468
|
||||
error_page 502 =404 /vod-not-found;
|
||||
'';
|
||||
};
|
||||
"/vod-not-found" = {
|
||||
return = 404;
|
||||
};
|
||||
"/stream/" = {
|
||||
alias = "/var/cache/frigate/stream/";
|
||||
extraConfig = nginxAuthRequest + ''
|
||||
@@ -549,6 +558,23 @@ in
|
||||
add_header Cache-Control "public";
|
||||
'';
|
||||
};
|
||||
"/locales/" = {
|
||||
root = cfg.package.web;
|
||||
extraConfig = ''
|
||||
access_log off;
|
||||
add_header Cache-Control "public";
|
||||
'';
|
||||
};
|
||||
"~ ^/.*-([A-Za-z0-9]+)\.webmanifest$" = {
|
||||
root = cfg.package.web;
|
||||
extraConfig = ''
|
||||
access_log off;
|
||||
expires 1y;
|
||||
add_header Cache-Control "public";
|
||||
default_type application/json;
|
||||
proxy_set_header Accept-Encoding "";
|
||||
'';
|
||||
};
|
||||
"/" = {
|
||||
root = cfg.package.web;
|
||||
tryFiles = "$uri $uri.html $uri/ /index.html";
|
||||
@@ -583,6 +609,9 @@ in
|
||||
open_file_cache_errors on;
|
||||
aio on;
|
||||
|
||||
# file upload size
|
||||
client_max_body_size 20M;
|
||||
|
||||
# https://github.com/kaltura/nginx-vod-module#vod_open_file_thread_pool
|
||||
vod_open_file_thread_pool default;
|
||||
|
||||
@@ -657,7 +686,6 @@ in
|
||||
[
|
||||
# unfree:
|
||||
# config.boot.kernelPackages.nvidiaPackages.latest.bin
|
||||
ffmpeg-headless
|
||||
libva-utils
|
||||
procps
|
||||
radeontop
|
||||
|
||||
@@ -1,380 +1,22 @@
|
||||
diff --git a/frigate/api/media.py b/frigate/api/media.py
|
||||
index b5f3ba70..09a09c13 100644
|
||||
--- a/frigate/api/media.py
|
||||
+++ b/frigate/api/media.py
|
||||
@@ -31,6 +31,7 @@ from frigate.config import FrigateConfig
|
||||
from frigate.const import (
|
||||
CACHE_DIR,
|
||||
CLIPS_DIR,
|
||||
+ INSTALL_DIR,
|
||||
MAX_SEGMENT_DURATION,
|
||||
PREVIEW_FRAME_TYPE,
|
||||
RECORD_DIR,
|
||||
@@ -154,7 +155,9 @@ def latest_frame(
|
||||
frame_processor.get_current_frame_time(camera_name) + retry_interval
|
||||
):
|
||||
if request.app.camera_error_image is None:
|
||||
- error_image = glob.glob("/opt/frigate/frigate/images/camera-error.jpg")
|
||||
+ error_image = glob.glob(
|
||||
+ os.path.join(INSTALL_DIR, "frigate/images/camera-error.jpg")
|
||||
+ )
|
||||
|
||||
if len(error_image) > 0:
|
||||
request.app.camera_error_image = cv2.imread(
|
||||
@@ -497,7 +500,7 @@ def recording_clip(
|
||||
)
|
||||
|
||||
file_name = sanitize_filename(f"playlist_{camera_name}_{start_ts}-{end_ts}.txt")
|
||||
- file_path = f"/tmp/cache/{file_name}"
|
||||
+ file_path = os.path.join(CACHE_DIR, file_name)
|
||||
with open(file_path, "w") as file:
|
||||
clip: Recordings
|
||||
for clip in recordings:
|
||||
diff --git a/frigate/api/preview.py b/frigate/api/preview.py
|
||||
index d14a15ff..2db2326a 100644
|
||||
--- a/frigate/api/preview.py
|
||||
+++ b/frigate/api/preview.py
|
||||
@@ -9,7 +9,7 @@ from fastapi import APIRouter
|
||||
from fastapi.responses import JSONResponse
|
||||
|
||||
from frigate.api.defs.tags import Tags
|
||||
-from frigate.const import CACHE_DIR, PREVIEW_FRAME_TYPE
|
||||
+from frigate.const import BASE_DIR, CACHE_DIR, PREVIEW_FRAME_TYPE
|
||||
from frigate.models import Previews
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
@@ -52,7 +52,7 @@ def preview_ts(camera_name: str, start_ts: float, end_ts: float):
|
||||
clips.append(
|
||||
{
|
||||
"camera": preview["camera"],
|
||||
- "src": preview["path"].replace("/media/frigate", ""),
|
||||
+ "src": preview["path"].replace(BASE_DIR, ""),
|
||||
"type": "video/mp4",
|
||||
"start": preview["start_time"],
|
||||
"end": preview["end_time"],
|
||||
diff --git a/frigate/comms/webpush.py b/frigate/comms/webpush.py
|
||||
index abfd52d1..ab4cf3c5 100644
|
||||
index c5986d45..b767e19e 100644
|
||||
--- a/frigate/comms/webpush.py
|
||||
+++ b/frigate/comms/webpush.py
|
||||
@@ -12,7 +12,7 @@ from pywebpush import WebPusher
|
||||
@@ -17,7 +17,7 @@ from titlecase import titlecase
|
||||
from frigate.comms.base_communicator import Communicator
|
||||
from frigate.comms.config_updater import ConfigSubscriber
|
||||
from frigate.comms.dispatcher import Communicator
|
||||
from frigate.config import FrigateConfig
|
||||
-from frigate.const import CONFIG_DIR
|
||||
+from frigate.const import BASE_DIR, CONFIG_DIR
|
||||
from frigate.models import User
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
@@ -151,7 +151,7 @@ class WebPushClient(Communicator): # type: ignore[misc]
|
||||
camera: str = payload["after"]["camera"]
|
||||
title = f"{', '.join(sorted_objects).replace('_', ' ').title()}{' was' if state == 'end' else ''} detected in {', '.join(payload['after']['data']['zones']).replace('_', ' ').title()}"
|
||||
message = f"Detected on {camera.replace('_', ' ').title()}"
|
||||
@@ -333,7 +333,7 @@ class WebPushClient(Communicator): # type: ignore[misc]
|
||||
|
||||
title = f"{titlecase(', '.join(sorted_objects).replace('_', ' '))}{' was' if state == 'end' else ''} detected in {titlecase(', '.join(payload['after']['data']['zones']).replace('_', ' '))}"
|
||||
message = f"Detected on {titlecase(camera.replace('_', ' '))}"
|
||||
- image = f"{payload['after']['thumb_path'].replace('/media/frigate', '')}"
|
||||
+ image = f"{payload['after']['thumb_path'].replace(BASE_DIR, '')}"
|
||||
|
||||
# if event is ongoing open to live view otherwise open to recordings view
|
||||
direct_url = f"/review?id={reviewId}" if state == "end" else f"/#{camera}"
|
||||
diff --git a/frigate/const.py b/frigate/const.py
|
||||
index 5976f47b..dc710467 100644
|
||||
--- a/frigate/const.py
|
||||
+++ b/frigate/const.py
|
||||
@@ -1,5 +1,6 @@
|
||||
import re
|
||||
|
||||
+INSTALL_DIR = "/opt/frigate"
|
||||
CONFIG_DIR = "/config"
|
||||
DEFAULT_DB_PATH = f"{CONFIG_DIR}/frigate.db"
|
||||
MODEL_CACHE_DIR = f"{CONFIG_DIR}/model_cache"
|
||||
diff --git a/frigate/detectors/detector_config.py b/frigate/detectors/detector_config.py
|
||||
index 452f1fee..13535a62 100644
|
||||
--- a/frigate/detectors/detector_config.py
|
||||
+++ b/frigate/detectors/detector_config.py
|
||||
@@ -9,7 +9,7 @@ import requests
|
||||
from pydantic import BaseModel, ConfigDict, Field
|
||||
from pydantic.fields import PrivateAttr
|
||||
|
||||
-from frigate.const import DEFAULT_ATTRIBUTE_LABEL_MAP
|
||||
+from frigate.const import DEFAULT_ATTRIBUTE_LABEL_MAP, MODEL_CACHE_DIR
|
||||
from frigate.plus import PlusApi
|
||||
from frigate.util.builtin import generate_color_palette, load_labels
|
||||
|
||||
@@ -117,7 +117,7 @@ class ModelConfig(BaseModel):
|
||||
return
|
||||
|
||||
model_id = self.path[7:]
|
||||
- self.path = f"/config/model_cache/{model_id}"
|
||||
+ self.path = os.path.join(MODEL_CACHE_DIR, model_id)
|
||||
model_info_path = f"{self.path}.json"
|
||||
|
||||
# download the model if it doesn't exist
|
||||
diff --git a/frigate/detectors/plugins/hailo8l.py b/frigate/detectors/plugins/hailo8l.py
|
||||
index b66d78bd..69e86bc5 100644
|
||||
--- a/frigate/detectors/plugins/hailo8l.py
|
||||
+++ b/frigate/detectors/plugins/hailo8l.py
|
||||
@@ -22,6 +22,7 @@ except ModuleNotFoundError:
|
||||
from pydantic import BaseModel, Field
|
||||
from typing_extensions import Literal
|
||||
|
||||
+from frigate.const import MODEL_CACHE_DIR
|
||||
from frigate.detectors.detection_api import DetectionApi
|
||||
from frigate.detectors.detector_config import BaseDetectorConfig
|
||||
|
||||
@@ -57,7 +58,7 @@ class HailoDetector(DetectionApi):
|
||||
self.h8l_tensor_format = detector_config.model.input_tensor
|
||||
self.h8l_pixel_format = detector_config.model.input_pixel_format
|
||||
self.model_url = "https://hailo-model-zoo.s3.eu-west-2.amazonaws.com/ModelZoo/Compiled/v2.11.0/hailo8l/ssd_mobilenet_v1.hef"
|
||||
- self.cache_dir = "/config/model_cache/h8l_cache"
|
||||
+ self.cache_dir = os.path.join(MODEL_CACHE_DIR, "h8l_cache")
|
||||
self.expected_model_filename = "ssd_mobilenet_v1.hef"
|
||||
output_type = "FLOAT32"
|
||||
|
||||
diff --git a/frigate/detectors/plugins/openvino.py b/frigate/detectors/plugins/openvino.py
|
||||
index 51e48530..d199317b 100644
|
||||
--- a/frigate/detectors/plugins/openvino.py
|
||||
+++ b/frigate/detectors/plugins/openvino.py
|
||||
@@ -7,6 +7,7 @@ import openvino.properties as props
|
||||
from pydantic import Field
|
||||
from typing_extensions import Literal
|
||||
|
||||
+from frigate.const import MODEL_CACHE_DIR
|
||||
from frigate.detectors.detection_api import DetectionApi
|
||||
from frigate.detectors.detector_config import BaseDetectorConfig, ModelTypeEnum
|
||||
|
||||
@@ -35,8 +36,10 @@ class OvDetector(DetectionApi):
|
||||
logger.error(f"OpenVino model file {detector_config.model.path} not found.")
|
||||
raise FileNotFoundError
|
||||
|
||||
- os.makedirs("/config/model_cache/openvino", exist_ok=True)
|
||||
- self.ov_core.set_property({props.cache_dir: "/config/model_cache/openvino"})
|
||||
+ os.makedirs(os.path.join(MODEL_CACHE_DIR, "openvino"), exist_ok=True)
|
||||
+ self.ov_core.set_property(
|
||||
+ {props.cache_dir: os.path.join(MODEL_CACHE_DIR, "openvino")}
|
||||
+ )
|
||||
self.interpreter = self.ov_core.compile_model(
|
||||
model=detector_config.model.path, device_name=detector_config.device
|
||||
)
|
||||
diff --git a/frigate/detectors/plugins/rknn.py b/frigate/detectors/plugins/rknn.py
|
||||
index df94d7b6..bc3d9ae0 100644
|
||||
--- a/frigate/detectors/plugins/rknn.py
|
||||
+++ b/frigate/detectors/plugins/rknn.py
|
||||
@@ -6,6 +6,7 @@ from typing import Literal
|
||||
|
||||
from pydantic import Field
|
||||
|
||||
+from frigate.const import MODEL_CACHE_DIR
|
||||
from frigate.detectors.detection_api import DetectionApi
|
||||
from frigate.detectors.detector_config import BaseDetectorConfig, ModelTypeEnum
|
||||
|
||||
@@ -17,7 +18,7 @@ supported_socs = ["rk3562", "rk3566", "rk3568", "rk3576", "rk3588"]
|
||||
|
||||
supported_models = {ModelTypeEnum.yolonas: "^deci-fp16-yolonas_[sml]$"}
|
||||
|
||||
-model_cache_dir = "/config/model_cache/rknn_cache/"
|
||||
+model_cache_dir = os.path.join(MODEL_CACHE_DIR, "rknn_cache/")
|
||||
|
||||
|
||||
class RknnDetectorConfig(BaseDetectorConfig):
|
||||
diff --git a/frigate/detectors/plugins/rocm.py b/frigate/detectors/plugins/rocm.py
|
||||
index 60118d12..7c87edb5 100644
|
||||
--- a/frigate/detectors/plugins/rocm.py
|
||||
+++ b/frigate/detectors/plugins/rocm.py
|
||||
@@ -9,6 +9,7 @@ import numpy as np
|
||||
from pydantic import Field
|
||||
from typing_extensions import Literal
|
||||
|
||||
+from frigate.const import MODEL_CACHE_DIR
|
||||
from frigate.detectors.detection_api import DetectionApi
|
||||
from frigate.detectors.detector_config import (
|
||||
BaseDetectorConfig,
|
||||
@@ -116,7 +117,7 @@ class ROCmDetector(DetectionApi):
|
||||
|
||||
logger.info(f"AMD/ROCm: saving parsed model into {mxr_path}")
|
||||
|
||||
- os.makedirs("/config/model_cache/rocm", exist_ok=True)
|
||||
+ os.makedirs(os.path.join(MODEL_CACHE_DIR, "rocm"), exist_ok=True)
|
||||
migraphx.save(self.model, mxr_path)
|
||||
|
||||
logger.info("AMD/ROCm: model loaded")
|
||||
diff --git a/frigate/output/birdseye.py b/frigate/output/birdseye.py
|
||||
index 00f17c8f..8331eb64 100644
|
||||
--- a/frigate/output/birdseye.py
|
||||
+++ b/frigate/output/birdseye.py
|
||||
@@ -16,7 +16,7 @@ import numpy as np
|
||||
|
||||
from frigate.comms.config_updater import ConfigSubscriber
|
||||
from frigate.config import BirdseyeModeEnum, FfmpegConfig, FrigateConfig
|
||||
-from frigate.const import BASE_DIR, BIRDSEYE_PIPE
|
||||
+from frigate.const import BASE_DIR, BIRDSEYE_PIPE, INSTALL_DIR
|
||||
from frigate.util.image import (
|
||||
SharedMemoryFrameManager,
|
||||
copy_yuv_to_position,
|
||||
@@ -297,7 +297,9 @@ class BirdsEyeFrameManager:
|
||||
birdseye_logo = cv2.imread(custom_logo_files[0], cv2.IMREAD_UNCHANGED)
|
||||
|
||||
if birdseye_logo is None:
|
||||
- logo_files = glob.glob("/opt/frigate/frigate/images/birdseye.png")
|
||||
+ logo_files = glob.glob(
|
||||
+ os.path.join(INSTALL_DIR, "frigate/images/birdseye.png")
|
||||
+ )
|
||||
|
||||
if len(logo_files) > 0:
|
||||
birdseye_logo = cv2.imread(logo_files[0], cv2.IMREAD_UNCHANGED)
|
||||
diff --git a/frigate/test/http_api/base_http_test.py b/frigate/test/http_api/base_http_test.py
|
||||
index e7a1d03e..4fa4a5b5 100644
|
||||
--- a/frigate/test/http_api/base_http_test.py
|
||||
+++ b/frigate/test/http_api/base_http_test.py
|
||||
@@ -9,6 +9,7 @@ from playhouse.sqliteq import SqliteQueueDatabase
|
||||
|
||||
from frigate.api.fastapi_app import create_fastapi_app
|
||||
from frigate.config import FrigateConfig
|
||||
+from frigate.const import BASE_DIR, CACHE_DIR
|
||||
from frigate.models import Event, Recordings, ReviewSegment
|
||||
from frigate.review.types import SeverityEnum
|
||||
from frigate.test.const import TEST_DB, TEST_DB_CLEANUPS
|
||||
@@ -72,19 +73,19 @@ class BaseTestHttp(unittest.TestCase):
|
||||
"total": 67.1,
|
||||
"used": 16.6,
|
||||
},
|
||||
- "/media/frigate/clips": {
|
||||
+ os.path.join(BASE_DIR, "clips"): {
|
||||
"free": 42429.9,
|
||||
"mount_type": "ext4",
|
||||
"total": 244529.7,
|
||||
"used": 189607.0,
|
||||
},
|
||||
- "/media/frigate/recordings": {
|
||||
+ os.path.join(BASE_DIR, "recordings"): {
|
||||
"free": 0.2,
|
||||
"mount_type": "ext4",
|
||||
"total": 8.0,
|
||||
"used": 7.8,
|
||||
},
|
||||
- "/tmp/cache": {
|
||||
+ CACHE_DIR: {
|
||||
"free": 976.8,
|
||||
"mount_type": "tmpfs",
|
||||
"total": 1000.0,
|
||||
diff --git a/frigate/test/test_config.py b/frigate/test/test_config.py
|
||||
index e6cb1274..5a3deefd 100644
|
||||
--- a/frigate/test/test_config.py
|
||||
+++ b/frigate/test/test_config.py
|
||||
@@ -854,9 +854,9 @@ class TestConfig(unittest.TestCase):
|
||||
assert frigate_config.model.merged_labelmap[0] == "person"
|
||||
|
||||
def test_plus_labelmap(self):
|
||||
- with open("/config/model_cache/test", "w") as f:
|
||||
+ with open(os.path.join(MODEL_CACHE_DIR, "test"), "w") as f:
|
||||
json.dump(self.plus_model_info, f)
|
||||
- with open("/config/model_cache/test.json", "w") as f:
|
||||
+ with open(os.path.join(MODEL_CACHE_DIR, "test.json"), "w") as f:
|
||||
json.dump(self.plus_model_info, f)
|
||||
|
||||
config = {
|
||||
diff --git a/frigate/test/test_http.py b/frigate/test/test_http.py
|
||||
index 21379425..66f9d22a 100644
|
||||
--- a/frigate/test/test_http.py
|
||||
+++ b/frigate/test/test_http.py
|
||||
@@ -12,6 +12,7 @@ from playhouse.sqliteq import SqliteQueueDatabase
|
||||
|
||||
from frigate.api.fastapi_app import create_fastapi_app
|
||||
from frigate.config import FrigateConfig
|
||||
+from frigate.const import BASE_DIR, CACHE_DIR
|
||||
from frigate.models import Event, Recordings, Timeline
|
||||
from frigate.stats.emitter import StatsEmitter
|
||||
from frigate.test.const import TEST_DB, TEST_DB_CLEANUPS
|
||||
@@ -76,19 +77,19 @@ class TestHttp(unittest.TestCase):
|
||||
"total": 67.1,
|
||||
"used": 16.6,
|
||||
},
|
||||
- "/media/frigate/clips": {
|
||||
+ os.path.join(BASE_DIR, "clips"): {
|
||||
"free": 42429.9,
|
||||
"mount_type": "ext4",
|
||||
"total": 244529.7,
|
||||
"used": 189607.0,
|
||||
},
|
||||
- "/media/frigate/recordings": {
|
||||
+ os.path.join(BASE_DIR, "recordings"): {
|
||||
"free": 0.2,
|
||||
"mount_type": "ext4",
|
||||
"total": 8.0,
|
||||
"used": 7.8,
|
||||
},
|
||||
- "/tmp/cache": {
|
||||
+ CACHE_DIR: {
|
||||
"free": 976.8,
|
||||
"mount_type": "tmpfs",
|
||||
"total": 1000.0,
|
||||
diff --git a/frigate/util/config.py b/frigate/util/config.py
|
||||
index d456c755..b6b270c9 100644
|
||||
--- a/frigate/util/config.py
|
||||
+++ b/frigate/util/config.py
|
||||
@@ -14,7 +14,7 @@ from frigate.util.services import get_video_properties
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
CURRENT_CONFIG_VERSION = "0.15-1"
|
||||
-DEFAULT_CONFIG_FILE = "/config/config.yml"
|
||||
+DEFAULT_CONFIG_FILE = os.path.join(CONFIG_DIR, "config.yml")
|
||||
|
||||
|
||||
def find_config_file() -> str:
|
||||
diff --git a/frigate/util/model.py b/frigate/util/model.py
|
||||
index ce2c9538..6e93cb38 100644
|
||||
--- a/frigate/util/model.py
|
||||
+++ b/frigate/util/model.py
|
||||
@@ -12,6 +12,8 @@ except ImportError:
|
||||
# openvino is not included
|
||||
pass
|
||||
|
||||
+from frigate.const import MODEL_CACHE_DIR
|
||||
+
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
@@ -46,7 +48,8 @@ def get_ort_providers(
|
||||
# so it is not enabled by default
|
||||
if device == "Tensorrt":
|
||||
os.makedirs(
|
||||
- "/config/model_cache/tensorrt/ort/trt-engines", exist_ok=True
|
||||
+ os.path.join(MODEL_CACHE_DIR, "tensorrt/ort/trt-engines"),
|
||||
+ exist_ok=True,
|
||||
)
|
||||
device_id = 0 if not device.isdigit() else int(device)
|
||||
providers.append(provider)
|
||||
@@ -57,19 +60,23 @@ def get_ort_providers(
|
||||
and os.environ.get("USE_FP_16", "True") != "False",
|
||||
"trt_timing_cache_enable": True,
|
||||
"trt_engine_cache_enable": True,
|
||||
- "trt_timing_cache_path": "/config/model_cache/tensorrt/ort",
|
||||
- "trt_engine_cache_path": "/config/model_cache/tensorrt/ort/trt-engines",
|
||||
+ "trt_timing_cache_path": os.path.join(
|
||||
+ MODEL_CACHE_DIR, "tensorrt/ort"
|
||||
+ ),
|
||||
+ "trt_engine_cache_path": os.path.join(
|
||||
+ MODEL_CACHE_DIR, "tensorrt/ort/trt-engines"
|
||||
+ ),
|
||||
}
|
||||
)
|
||||
else:
|
||||
continue
|
||||
elif provider == "OpenVINOExecutionProvider":
|
||||
- os.makedirs("/config/model_cache/openvino/ort", exist_ok=True)
|
||||
+ os.makedirs(os.path.join(MODEL_CACHE_DIR, "openvino/ort"), exist_ok=True)
|
||||
providers.append(provider)
|
||||
options.append(
|
||||
{
|
||||
"arena_extend_strategy": "kSameAsRequested",
|
||||
- "cache_dir": "/config/model_cache/openvino/ort",
|
||||
+ "cache_dir": os.path.join(MODEL_CACHE_DIR, "openvino/ort"),
|
||||
"device_type": device,
|
||||
}
|
||||
)
|
||||
@@ -103,7 +110,7 @@ class ONNXModelRunner:
|
||||
self.type = "ov"
|
||||
self.ov = ov.Core()
|
||||
self.ov.set_property(
|
||||
- {ov.properties.cache_dir: "/config/model_cache/openvino"}
|
||||
+ {ov.properties.cache_dir: os.path.join(MODEL_CACHE_DIR, "openvino")}
|
||||
)
|
||||
self.interpreter = self.ov.compile_model(
|
||||
model=model_path, device_name=device
|
||||
|
||||
@@ -0,0 +1,39 @@
|
||||
diff --git a/frigate/config/camera/ffmpeg.py b/frigate/config/camera/ffmpeg.py
|
||||
index 04bbfac7..4390a571 100644
|
||||
--- a/frigate/config/camera/ffmpeg.py
|
||||
+++ b/frigate/config/camera/ffmpeg.py
|
||||
@@ -70,18 +70,14 @@ class FfmpegConfig(FrigateBaseModel):
|
||||
@property
|
||||
def ffmpeg_path(self) -> str:
|
||||
if self.path == "default":
|
||||
- return f"/usr/lib/ffmpeg/{DEFAULT_FFMPEG_VERSION}/bin/ffmpeg"
|
||||
- elif self.path in INCLUDED_FFMPEG_VERSIONS:
|
||||
- return f"/usr/lib/ffmpeg/{self.path}/bin/ffmpeg"
|
||||
+ return "@ffmpeg@"
|
||||
else:
|
||||
return f"{self.path}/bin/ffmpeg"
|
||||
|
||||
@property
|
||||
def ffprobe_path(self) -> str:
|
||||
if self.path == "default":
|
||||
- return f"/usr/lib/ffmpeg/{DEFAULT_FFMPEG_VERSION}/bin/ffprobe"
|
||||
- elif self.path in INCLUDED_FFMPEG_VERSIONS:
|
||||
- return f"/usr/lib/ffmpeg/{self.path}/bin/ffprobe"
|
||||
+ return "@ffprobe@"
|
||||
else:
|
||||
return f"{self.path}/bin/ffprobe"
|
||||
|
||||
diff --git a/frigate/record/export.py b/frigate/record/export.py
|
||||
index 0d3f96da..09cadbcd 100644
|
||||
--- a/frigate/record/export.py
|
||||
+++ b/frigate/record/export.py
|
||||
@@ -126,7 +126,7 @@ class RecordingExporter(threading.Thread):
|
||||
minutes = int(diff / 60)
|
||||
seconds = int(diff % 60)
|
||||
ffmpeg_cmd = [
|
||||
- "/usr/lib/ffmpeg/7.0/bin/ffmpeg", # hardcode path for exports thumbnail due to missing libwebp support
|
||||
+ "@ffmpeg@", # hardcode path for exports thumbnail due to missing libwebp support
|
||||
"-hide_banner",
|
||||
"-loglevel",
|
||||
"warning",
|
||||
~
|
||||
@@ -2,31 +2,32 @@
|
||||
lib,
|
||||
stdenv,
|
||||
callPackage,
|
||||
python312,
|
||||
replaceVars,
|
||||
python312Packages,
|
||||
fetchFromGitHub,
|
||||
fetchurl,
|
||||
rocmPackages,
|
||||
ffmpeg-headless,
|
||||
sqlite-vec,
|
||||
frigate,
|
||||
nixosTests,
|
||||
}:
|
||||
|
||||
let
|
||||
version = "0.15.2";
|
||||
version = "0.16.0";
|
||||
|
||||
src = fetchFromGitHub {
|
||||
name = "frigate-${version}-source";
|
||||
owner = "blakeblackshear";
|
||||
repo = "frigate";
|
||||
tag = "v${version}";
|
||||
hash = "sha256-YJFtMVCTtp8h9a9RmkcoZSQ+nIKb5o/4JVynVslkx78=";
|
||||
hash = "sha256-O1rOFRrS3hDbf4fVgfz+KASo20R1aqbDoIf3JKQ1jhs=";
|
||||
};
|
||||
|
||||
frigate-web = callPackage ./web.nix {
|
||||
inherit version src;
|
||||
};
|
||||
|
||||
python = python312;
|
||||
python = python312Packages.python;
|
||||
|
||||
# Tensorflow audio model
|
||||
# https://github.com/blakeblackshear/frigate/blob/v0.15.0/docker/main/Dockerfile#L125
|
||||
@@ -55,14 +56,21 @@ let
|
||||
hash = "sha256-5Cj2vEiWR8Z9d2xBmVoLZuNRv4UOuxHSGZQWTJorXUQ=";
|
||||
};
|
||||
in
|
||||
python.pkgs.buildPythonApplication rec {
|
||||
python312Packages.buildPythonApplication rec {
|
||||
pname = "frigate";
|
||||
inherit version;
|
||||
format = "other";
|
||||
|
||||
inherit src;
|
||||
|
||||
patches = [ ./constants.patch ];
|
||||
patches = [
|
||||
./constants.patch
|
||||
|
||||
(replaceVars ./ffmpeg.patch {
|
||||
ffmpeg = lib.getExe ffmpeg-headless;
|
||||
ffprobe = lib.getExe' ffmpeg-headless "ffprobe";
|
||||
})
|
||||
];
|
||||
|
||||
postPatch = ''
|
||||
echo 'VERSION = "${version}"' > frigate/version.py
|
||||
@@ -86,15 +94,6 @@ python.pkgs.buildPythonApplication rec {
|
||||
substituteInPlace frigate/db/sqlitevecq.py \
|
||||
--replace-fail "/usr/local/lib/vec0" "${lib.getLib sqlite-vec}/lib/vec0${stdenv.hostPlatform.extensions.sharedLibrary}"
|
||||
|
||||
''
|
||||
# clang-rocm, provided by `rocmPackages.clr`, only works on x86_64-linux specifically
|
||||
+ lib.optionalString (with stdenv.hostPlatform; isx86_64 && isLinux) ''
|
||||
substituteInPlace frigate/detectors/plugins/rocm.py \
|
||||
--replace-fail "/opt/rocm/bin/rocminfo" "rocminfo" \
|
||||
--replace-fail "/opt/rocm/lib" "${rocmPackages.clr}/lib"
|
||||
|
||||
''
|
||||
+ ''
|
||||
# provide default paths for models and maps that are shipped with frigate
|
||||
substituteInPlace frigate/config/config.py \
|
||||
--replace-fail "/cpu_model.tflite" "${tflite_cpu_model}" \
|
||||
@@ -106,30 +105,37 @@ python.pkgs.buildPythonApplication rec {
|
||||
substituteInPlace frigate/events/audio.py \
|
||||
--replace-fail "/cpu_audio_model.tflite" "${placeholder "out"}/share/frigate/cpu_audio_model.tflite" \
|
||||
--replace-fail "/audio-labelmap.txt" "${placeholder "out"}/share/frigate/audio-labelmap.txt"
|
||||
|
||||
# work around onvif-zeep idiosyncrasy
|
||||
substituteInPlace frigate/ptz/onvif.py \
|
||||
--replace-fail dist-packages site-packages
|
||||
'';
|
||||
|
||||
dontBuild = true;
|
||||
|
||||
dependencies = with python.pkgs; [
|
||||
dependencies = with python312Packages; [
|
||||
# docker/main/requirements.txt
|
||||
scikit-build
|
||||
# docker/main/requirements-wheel.txt
|
||||
aiofiles
|
||||
aiohttp
|
||||
appdirs
|
||||
argcomplete
|
||||
contextlib2
|
||||
click
|
||||
distlib
|
||||
fastapi
|
||||
filelock
|
||||
future
|
||||
importlib-metadata
|
||||
importlib-resources
|
||||
google-generativeai
|
||||
imutils
|
||||
joserfc
|
||||
levenshtein
|
||||
markupsafe
|
||||
netaddr
|
||||
netifaces
|
||||
norfair
|
||||
numpy
|
||||
ollama
|
||||
onnxruntime
|
||||
onvif-zeep
|
||||
onvif-zeep-async
|
||||
openai
|
||||
opencv4
|
||||
openvino
|
||||
@@ -138,9 +144,12 @@ python.pkgs.buildPythonApplication rec {
|
||||
pathvalidate
|
||||
peewee
|
||||
peewee-migrate
|
||||
prometheus-client
|
||||
psutil
|
||||
py3nvml
|
||||
pyclipper
|
||||
pydantic
|
||||
python-multipart
|
||||
pytz
|
||||
py-vapid
|
||||
pywebpush
|
||||
@@ -149,14 +158,18 @@ python.pkgs.buildPythonApplication rec {
|
||||
ruamel-yaml
|
||||
scipy
|
||||
setproctitle
|
||||
shapely
|
||||
slowapi
|
||||
starlette
|
||||
starlette-context
|
||||
tensorflow-bin
|
||||
titlecase
|
||||
transformers
|
||||
tzlocal
|
||||
unidecode
|
||||
uvicorn
|
||||
verboselogs
|
||||
virtualenv
|
||||
ws4py
|
||||
];
|
||||
|
||||
@@ -178,7 +191,7 @@ python.pkgs.buildPythonApplication rec {
|
||||
runHook postInstall
|
||||
'';
|
||||
|
||||
nativeCheckInputs = with python.pkgs; [
|
||||
nativeCheckInputs = with python312Packages; [
|
||||
pytestCheckHook
|
||||
];
|
||||
|
||||
@@ -200,7 +213,7 @@ python.pkgs.buildPythonApplication rec {
|
||||
passthru = {
|
||||
web = frigate-web;
|
||||
inherit python;
|
||||
pythonPath = (python.pkgs.makePythonPath dependencies) + ":${frigate}/${python.sitePackages}";
|
||||
pythonPath = (python312Packages.makePythonPath dependencies) + ":${frigate}/${python.sitePackages}";
|
||||
tests = {
|
||||
inherit (nixosTests) frigate;
|
||||
};
|
||||
|
||||
@@ -30,7 +30,7 @@ buildNpmPackage {
|
||||
--replace-fail "/tmp/cache" "/var/cache/frigate"
|
||||
'';
|
||||
|
||||
npmDepsHash = "sha256-tPwydUJtFDJs17q0haJaUVEkxua+nHfmwQ9Z9Y24ca8=";
|
||||
npmDepsHash = "sha256-CrK/6BaKmKIxlohEZdGEEKJkioszBUupyKQx4nBeLqI=";
|
||||
|
||||
installPhase = ''
|
||||
cp -rv dist/ $out
|
||||
|
||||
Reference in New Issue
Block a user