nixpkgs/pkgs/applications/video/frigate/default.nix
Martin Weinelt 5b3f58125e
frigate: fix serving of clips
Frigate uses string concat to create some paths, which relies on the
cache path ending with a trailing slash.

I've meanwhile proposed a fix upstream, that will likely
be part of the next release.
2023-07-29 17:54:15 +02:00

190 lines
5.4 KiB
Nix

{ lib
, callPackage
, python3
, fetchFromGitHub
, fetchurl
, fetchpatch
, frigate
, opencv4
, nixosTests
}:
let
version = "0.12.1";
src = fetchFromGitHub {
#name = "frigate-${version}-source";
owner = "blakeblackshear";
repo = "frigate";
rev = "refs/tags/v${version}";
hash = "sha256-kNvYsHoObi6b9KT/LYhTGK4uJ/uAHnYhyoQkiXIA/s8=";
};
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/http.py \
--replace "/opt/frigate" "${placeholder "out"}/${python.sitePackages}" \
--replace "/tmp/cache/" "/var/cache/frigate/"
substituteInPlace frigate/output.py \
--replace "/opt/frigate" "${placeholder "out"}/${python.sitePackages}"
substituteInPlace frigate/record.py \
--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 ];
};
}