diff options
Diffstat (limited to 'pkgs/applications')
-rw-r--r-- | pkgs/applications/video/frigate/default.nix | 179 | ||||
-rw-r--r-- | pkgs/applications/video/frigate/web.nix | 26 |
2 files changed, 205 insertions, 0 deletions
diff --git a/pkgs/applications/video/frigate/default.nix b/pkgs/applications/video/frigate/default.nix new file mode 100644 index 0000000000000..05f4c16a63adc --- /dev/null +++ b/pkgs/applications/video/frigate/default.nix @@ -0,0 +1,179 @@ +{ lib +, callPackage +, python3 +, fetchFromGitHub +, fetchurl +, fetchpatch +, frigate +, opencv4 +, nixosTests +}: + +let + version = "0.12.0"; + + src = fetchFromGitHub { + #name = "frigate-${version}-source"; + owner = "blakeblackshear"; + repo = "frigate"; + rev = "refs/tags/v${version}"; + hash = "sha256-kJ0MnmWThiFbXvrN+zL5pZHq+Ig3DhCc8wPlWX2+nP8="; + }; + + frigate-web = callPackage ./web.nix { + inherit version src; + }; + + python = python3.override { + packageOverrides = self: super: { + # https://github.com/blakeblackshear/frigate/blob/v0.12.0/requirements-wheels.txt#L7 + opencv = super.toPythonModule ((opencv4.override { + enablePython = true; + pythonPackages = self; + }).overrideAttrs (oldAttrs: rec { + version = "4.5.5"; + src = fetchFromGitHub { + owner = "opencv"; + repo = "opencv"; + rev = "refs/tags/${version}"; + hash = "sha256-TJfzEAMh4JSshZ7oEZPgB59+NBACsj6Z5TCzVOBaEP4="; + }; + contribSrc = fetchFromGitHub { + owner = "opencv"; + repo = "opencv_contrib"; + rev = "refs/tags/${version}"; + hash = "sha256-skuH9GYg0mivGaJjxbggXk4x/0bbQISrAawA3ZUGfCk="; + }; + postUnpack = '' + cp --no-preserve=mode -r "${contribSrc}/modules" "$NIX_BUILD_TOP/source/opencv_contrib" + ''; + })); + }; + }; + + # Tensorflow Lite models + # https://github.com/blakeblackshear/frigate/blob/v0.12.0/Dockerfile#L88-L91 + tflite_cpu_model = fetchurl { + url = "https://github.com/google-coral/test_data/raw/release-frogfish/ssdlite_mobiledet_coco_qat_postprocess.tflite"; + hash = "sha256-kLszpjTgQZFMwYGapd+ZgY5sOWxNLblSwP16nP/Eck8="; + }; + tflite_edgetpu_model = fetchurl { + url = "https://github.com/google-coral/test_data/raw/release-frogfish/ssdlite_mobiledet_coco_qat_postprocess_edgetpu.tflite"; + hash = "sha256-Siviu7YU5XbVbcuRT6UnUr8PE0EVEnENNV2X+qGzVkE="; + }; + + # OpenVino models + # https://github.com/blakeblackshear/frigate/blob/v0.12.0/Dockerfile#L92-L95 + openvino_model = fetchurl { + url = "https://github.com/openvinotoolkit/open_model_zoo/raw/master/data/dataset_classes/coco_91cl_bkgr.txt"; + hash = "sha256-5Cj2vEiWR8Z9d2xBmVoLZuNRv4UOuxHSGZQWTJorXUQ="; + }; +in +python.pkgs.buildPythonApplication rec { + pname = "frigate"; + inherit version; + format = "other"; + + inherit src; + + patches = [ + (fetchpatch { + # numpy 1.24 compat + url = "https://github.com/blakeblackshear/frigate/commit/cb73d0cd392990448811c7212bc5f09be411fc69.patch"; + hash = "sha256-Spt7eRosmTN8zyJ2uVme5HPVy2TKgBtvbQ6tp6PaNac="; + }) + ]; + + postPatch = '' + echo 'VERSION = "${version}"' > frigate/version.py + + substituteInPlace frigate/app.py \ + --replace "Router(migrate_db)" 'Router(migrate_db, "${placeholder "out"}/share/frigate/migrations")' + + substituteInPlace frigate/const.py \ + --replace "/media/frigate" "/var/lib/frigate" \ + --replace "/tmp/cache" "/var/cache/frigate" + + substituteInPlace frigate/detectors/detector_config.py \ + --replace "/labelmap.txt" "${placeholder "out"}/share/frigate/labelmap.txt" + + substituteInPlace frigate/detectors/plugins/edgetpu_tfl.py \ + --replace "/edgetpu_model.tflite" "${tflite_edgetpu_model}" + + substituteInPlace frigate/detectors/plugins/cpu_tfl.py \ + --replace "/cpu_model.tflite" "${tflite_cpu_model}" + + substituteInPlace frigate/ffmpeg_presets.py --replace \ + '"-timeout" if os.path.exists(BTBN_PATH) else "-stimeout"' \ + '"-timeout"' + ''; + + dontBuild = true; + + propagatedBuildInputs = with python.pkgs; [ + # requirements.txt + scikit-build + # requirements-wheel.txt + click + flask + imutils + matplotlib + numpy + opencv + openvino + paho-mqtt + peewee + peewee-migrate + psutil + pydantic + pyyaml + requests + scipy + setproctitle + tensorflow + tzlocal + ws4py + zeroconf + ]; + + installPhase = '' + runHook preInstall + + mkdir -p $out/${python.sitePackages}/frigate + cp -R frigate/* $out/${python.sitePackages}/frigate/ + + mkdir -p $out/share/frigate + cp -R {migrations,labelmap.txt} $out/share/frigate/ + + cp --no-preserve=mode ${openvino_model} $out/share/frigate/coco_91cl_bkgr.txt + sed -i 's/truck/car/g' $out/share/frigate/coco_91cl_bkgr.txt + + runHook postInstall + ''; + + checkInputs = with python.pkgs; [ + pytestCheckHook + ]; + + passthru = { + web = frigate-web; + inherit python; + pythonPath =(python.pkgs.makePythonPath propagatedBuildInputs) + ":${frigate}/${python.sitePackages}"; + tests = { + inherit (nixosTests) frigate; + }; + }; + + meta = with lib; { + changelog = "https://github.com/blakeblackshear/frigate/releases/tag/v${version}"; + description = "NVR with realtime local object detection for IP cameras"; + longDescription = '' + A complete and local NVR designed for Home Assistant with AI + object detection. Uses OpenCV and Tensorflow to perform realtime + object detection locally for IP cameras. + ''; + homepage = "https://github.com/blakeblackshear/frigate"; + license = licenses.mit; + maintainers = with maintainers; [ hexa ]; + }; +} diff --git a/pkgs/applications/video/frigate/web.nix b/pkgs/applications/video/frigate/web.nix new file mode 100644 index 0000000000000..08b9cef19ee76 --- /dev/null +++ b/pkgs/applications/video/frigate/web.nix @@ -0,0 +1,26 @@ +{ buildNpmPackage +, src +, version +}: + +buildNpmPackage { + pname = "frigate-web"; + inherit version src; + + sourceRoot = "source/web"; + + postPatch = '' + substituteInPlace package.json \ + --replace "--base=/BASE_PATH/" "" + + substituteInPlace src/routes/Storage.jsx \ + --replace "/media/frigate" "/var/lib/frigate" \ + --replace "/tmp/cache" "/var/cache/frigate" + ''; + + npmDepsHash = "sha256-fvRxpQjSEzd2CnoEOVgQcB6MJJ4dcjN8bOaacHjCdwU="; + + installPhase = '' + cp -rv dist/ $out + ''; +} |