diff --git a/nixos/modules/services/video/frigate.nix b/nixos/modules/services/video/frigate.nix index 08fc665cc2d7..486521577c20 100644 --- a/nixos/modules/services/video/frigate.nix +++ b/nixos/modules/services/video/frigate.nix @@ -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 diff --git a/pkgs/by-name/fr/frigate/constants.patch b/pkgs/by-name/fr/frigate/constants.patch index 59492a30593f..943e49353c01 100644 --- a/pkgs/by-name/fr/frigate/constants.patch +++ b/pkgs/by-name/fr/frigate/constants.patch @@ -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 diff --git a/pkgs/by-name/fr/frigate/ffmpeg.patch b/pkgs/by-name/fr/frigate/ffmpeg.patch new file mode 100644 index 000000000000..78721dd6d3a4 --- /dev/null +++ b/pkgs/by-name/fr/frigate/ffmpeg.patch @@ -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", +~ diff --git a/pkgs/by-name/fr/frigate/package.nix b/pkgs/by-name/fr/frigate/package.nix index 1ba1470bdadf..3c6c9d9b3660 100644 --- a/pkgs/by-name/fr/frigate/package.nix +++ b/pkgs/by-name/fr/frigate/package.nix @@ -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; }; diff --git a/pkgs/by-name/fr/frigate/web.nix b/pkgs/by-name/fr/frigate/web.nix index 45e6a3518519..4d355f864cb5 100644 --- a/pkgs/by-name/fr/frigate/web.nix +++ b/pkgs/by-name/fr/frigate/web.nix @@ -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