Merge remote-tracking branch 'origin/master' into staging-next

Changed files
+359 -852
.github
workflows
ci
nixos
modules
services
pkgs
applications
audio
youtube-music
editors
code-browser
misc
gxneur
build-support
appimage
by-name
au
authentik
cl
cloudflare-warp
co
copper
en
envoy-bin
fr
pa
paperless-ngx
vi
victoriametrics
xw
development
compilers
graalvm
ocaml-modules
multicore-bench
python-modules
django-auditlog
django-cachalot
djangorestframework-dataclasses
djangorestframework-guardian
djangorestframework-guardian2
drf-spectacular-sidecar
python-openstackclient
rq
sanic
tika-client
tools
top-level
-1
.github/workflows/push.yml
···
- release-*
- staging-*
- haskell-updates
-
- python-updates
permissions: {}
+1 -1
ci/README.md
···
- Pull Requests required.
- Long-lived, no deletion, no force push.
- **Secondary development** branches
-
- `staging-` prefix, `haskell-updates` and `python-updates`
+
- `staging-` prefix and `haskell-updates`
- Pull Requests normally required, except when merging development branches into each other.
- Long-lived, no deletion, no force push.
- **Work-In-Progress** branches
-1
ci/request-reviews/dev-branches.txt
···
release-*
staging-*
haskell-updates
-
python-updates
-1
ci/supportedBranches.js
···
staging: ['development', 'secondary'],
'staging-next': ['development', 'secondary'],
'haskell-updates': ['development', 'secondary'],
-
'python-updates': ['development', 'secondary'],
nixos: ['channel'],
nixpkgs: ['channel'],
}
+1 -4
nixos/modules/services/misc/paperless.nix
···
PAPERLESS_REDIS = "unix://${redisServer.unixSocket}";
}
// lib.optionalAttrs (cfg.settings.PAPERLESS_ENABLE_NLTK or true) {
-
PAPERLESS_NLTK_DIR = pkgs.symlinkJoin {
-
name = "paperless_ngx_nltk_data";
-
paths = cfg.package.nltkData;
-
};
+
PAPERLESS_NLTK_DIR = cfg.package.nltkDataDir;
}
// lib.optionalAttrs (cfg.openMPThreadingWorkaround) {
OMP_NUM_THREADS = "1";
+34 -4
nixos/modules/services/video/frigate.nix
···
# 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;
···
checkConfig = mkOption {
type = bool;
-
default = pkgs.stdenv.buildPlatform.canExecute pkgs.stdenv.hostPlatform;
-
defaultText = literalExpression ''
+
default =
pkgs.stdenv.buildPlatform.canExecute pkgs.stdenv.hostPlatform
+
&& (!pkgs.stdenv.hostPlatform.isAarch64);
+
defaultText = literalExpression ''
+
pkgs.stdenv.buildPlatform.canExecute pkgs.stdenv.hostPlatform && !(pkgs.stdenv.hostPlaform.isAarch64)
'';
description = ''
Whether to check the configuration at build time.
···
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/";
···
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";
···
open_file_cache_min_uses 1;
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;
···
[
# unfree:
# config.boot.kernelPackages.nvidiaPackages.latest.bin
-
ffmpeg-headless
libva-utils
procps
radeontop
+34 -31
pkgs/applications/audio/youtube-music/default.nix
···
{
lib,
+
stdenv,
fetchFromGitHub,
makeWrapper,
electron,
python3,
-
stdenv,
copyDesktopItems,
nodejs,
pnpm,
makeDesktopItem,
+
nix-update-script,
}:
stdenv.mkDerivation (finalAttrs: {
pname = "youtube-music";
-
version = "3.9.0";
+
version = "3.10.0";
src = fetchFromGitHub {
owner = "th-ch";
repo = "youtube-music";
-
rev = "v${finalAttrs.version}";
-
hash = "sha256-xaHYNfW5ZLYiaeJ0F32NQ87woMh6K4Ea9rjgNOyabck=";
+
tag = "v${finalAttrs.version}";
+
hash = "sha256-+PCDA7lHaUQw9DhODRsEScyJC+9v8UPiZ1W8w2h/Ljg=";
};
+
patches = [
+
# MPRIS's DesktopEntry property needs to match the desktop entry basename
+
./fix-mpris-desktop-entry.patch
+
];
+
pnpmDeps = pnpm.fetchDeps {
inherit (finalAttrs) pname version src;
-
fetcherVersion = 1;
-
hash = "sha256-xIQyTetHU37gTxCcQp4VCqzGdIfVQGy/aORCVba6YQ0=";
+
fetcherVersion = 2;
+
hash = "sha256-b5I0n3CedA6qCL68lePU3pwyGp1JlQHzUpfCvhqw2qI=";
};
nativeBuildInputs = [
···
]
++ lib.optionals (!stdenv.hostPlatform.isDarwin) [ copyDesktopItems ];
-
ELECTRON_SKIP_BINARY_DOWNLOAD = 1;
+
env.ELECTRON_SKIP_BINARY_DOWNLOAD = 1;
postBuild =
lib.optionalString stdenv.hostPlatform.isDarwin ''
···
-c.electronVersion=${electron.version}
'';
+
desktopItems = [
+
(makeDesktopItem {
+
name = "com.github.th_ch.youtube_music";
+
exec = "youtube-music %u";
+
icon = "youtube-music";
+
desktopName = "YouTube Music";
+
startupWMClass = "com.github.th_ch.youtube_music";
+
categories = [ "AudioVideo" ];
+
})
+
];
+
installPhase = ''
runHook preInstall
···
+ lib.optionalString stdenv.hostPlatform.isDarwin ''
mkdir -p $out/{Applications,bin}
mv pack/mac*/YouTube\ Music.app $out/Applications
-
makeWrapper $out/Applications/YouTube\ Music.app/Contents/MacOS/YouTube\ Music $out/bin/youtube-music
+
ln -s "$out/Applications/YouTube Music.app/Contents/MacOS/YouTube Music" $out/bin/youtube-music
''
+ lib.optionalString (!stdenv.hostPlatform.isDarwin) ''
-
mkdir -p "$out/share/lib/youtube-music"
-
cp -r pack/*-unpacked/{locales,resources{,.pak}} "$out/share/lib/youtube-music"
+
mkdir -p "$out/share/youtube-music"
+
cp -r pack/*-unpacked/{locales,resources{,.pak}} "$out/share/youtube-music"
pushd assets/generated/icons/png
for file in *.png; do
···
postFixup = lib.optionalString (!stdenv.hostPlatform.isDarwin) ''
makeWrapper ${electron}/bin/electron $out/bin/youtube-music \
-
--add-flags $out/share/lib/youtube-music/resources/app.asar \
-
--add-flags "\''${NIXOS_OZONE_WL:+\''${WAYLAND_DISPLAY:+--ozone-platform-hint=auto --enable-features=WaylandWindowDecorations --enable-wayland-ime=true}}" \
+
--add-flags $out/share/youtube-music/resources/app.asar \
+
--add-flags "\''${NIXOS_OZONE_WL:+\''${WAYLAND_DISPLAY:+--ozone-platform-hint=auto --enable-features=WaylandWindowDecorations --enable-wayland-ime=true --wayland-text-input-version=3}}" \
--set-default ELECTRON_FORCE_IS_PACKAGED 1 \
--set-default ELECTRON_IS_DEV 0 \
--inherit-argv0
'';
-
patches = [
-
# MPRIS's DesktopEntry property needs to match the desktop entry basename
-
./fix-mpris-desktop-entry.patch
-
];
-
-
desktopItems = [
-
(makeDesktopItem {
-
name = "com.github.th_ch.youtube_music";
-
exec = "youtube-music %u";
-
icon = "youtube-music";
-
desktopName = "YouTube Music";
-
startupWMClass = "com.github.th_ch.youtube_music";
-
categories = [ "AudioVideo" ];
-
})
-
];
+
passthru.updateScript = nix-update-script { };
-
meta = with lib; {
+
meta = {
description = "Electron wrapper around YouTube Music";
homepage = "https://th-ch.github.io/youtube-music/";
changelog = "https://github.com/th-ch/youtube-music/blob/master/changelog.md#${
-
lib.replaceStrings [ "." ] [ "" ] finalAttrs.src.rev
+
lib.replaceStrings [ "." ] [ "" ] finalAttrs.src.tag
}";
-
license = licenses.mit;
-
maintainers = with maintainers; [
+
license = lib.licenses.mit;
+
maintainers = with lib.maintainers; [
aacebedo
SuperSandro2000
];
-79
pkgs/applications/editors/code-browser/default.nix
···
-
{
-
lib,
-
stdenv,
-
fetchurl,
-
copper,
-
python3,
-
pkg-config,
-
withQt ? false,
-
qtbase ? null,
-
wrapQtAppsHook ? null,
-
withGtk2 ? false,
-
gtk2,
-
withGtk3 ? false,
-
gtk3,
-
mkDerivation ? stdenv.mkDerivation,
-
}:
-
let
-
onlyOneEnabled = xs: 1 == builtins.length (builtins.filter lib.id xs);
-
in
-
assert onlyOneEnabled [
-
withQt
-
withGtk2
-
withGtk3
-
];
-
mkDerivation rec {
-
pname = "code-browser";
-
version = "8.0";
-
src = fetchurl {
-
url = "https://tibleiz.net/download/code-browser-${version}-src.tar.gz";
-
sha256 = "sha256-beCp4lx4MI1+hVgWp2h3piE/zu51zfwQdB5g7ImgmwY=";
-
};
-
postPatch = ''
-
substituteInPlace Makefile --replace "LFLAGS=-no-pie" "LFLAGS=-no-pie -L."
-
patchShebangs .
-
''
-
+ lib.optionalString withQt ''
-
substituteInPlace libs/copper-ui/Makefile --replace "moc -o" "${qtbase.dev}/bin/moc -o"
-
substituteInPlace libs/copper-ui/Makefile --replace "all: qt gtk gtk2" "all: qt"
-
''
-
+ lib.optionalString withGtk2 ''
-
substituteInPlace libs/copper-ui/Makefile --replace "all: qt gtk gtk2" "all: gtk2"
-
''
-
+ lib.optionalString withGtk3 ''
-
substituteInPlace libs/copper-ui/Makefile --replace "all: qt gtk gtk2" "all: gtk"
-
'';
-
nativeBuildInputs = [
-
copper
-
python3
-
pkg-config
-
]
-
++ lib.optionals withGtk2 [ gtk2 ]
-
++ lib.optionals withGtk3 [ gtk3 ]
-
++ lib.optionals withQt [
-
qtbase
-
wrapQtAppsHook
-
];
-
buildInputs =
-
lib.optionals withQt [ qtbase ]
-
++ lib.optionals withGtk2 [ gtk2 ]
-
++ lib.optionals withGtk3 [ gtk3 ];
-
makeFlags = [
-
"prefix=$(out)"
-
"COPPER=${copper}/bin/copper-elf64"
-
"with-local-libs"
-
]
-
++ lib.optionals withQt [
-
"QINC=${qtbase.dev}/include"
-
"UI=qt"
-
]
-
++ lib.optionals withGtk2 [ "UI=gtk2" ]
-
++ lib.optionals withGtk3 [ "UI=gtk" ];
-
-
meta = with lib; {
-
description = "Folding text editor, designed to hierarchically structure any kind of text file and especially source code";
-
homepage = "https://tibleiz.net/code-browser/";
-
license = licenses.gpl2;
-
platforms = platforms.x86_64;
-
};
-
}
-56
pkgs/applications/misc/gxneur/default.nix
···
-
{
-
lib,
-
stdenv,
-
fetchurl,
-
pkg-config,
-
intltool,
-
gtk2,
-
xorg,
-
glib,
-
xneur,
-
libglade,
-
GConf,
-
libappindicator-gtk2,
-
pcre,
-
}:
-
-
stdenv.mkDerivation rec {
-
pname = "gxneur";
-
version = "0.20.0";
-
-
src = fetchurl {
-
url = "https://github.com/AndrewCrewKuznetsov/xneur-devel/raw/f66723feb272c68f7c22a8bf0dbcafa5e3a8a5ee/dists/${version}/gxneur_${version}.orig.tar.gz";
-
sha256 = "0avmhdcj0hpr55fc0iih8fjykmdhn34c8mwdnqvl8jh4nhxxchxr";
-
};
-
-
# glib-2.62 deprecations
-
env.NIX_CFLAGS_COMPILE = "-DGLIB_DISABLE_DEPRECATION_WARNINGS";
-
-
nativeBuildInputs = [
-
pkg-config
-
intltool
-
];
-
buildInputs = [
-
xorg.libX11
-
glib
-
gtk2
-
xorg.libXpm
-
xorg.libXt
-
xorg.libXext
-
xneur
-
libglade
-
GConf
-
pcre
-
libappindicator-gtk2
-
];
-
-
meta = with lib; {
-
description = "GUI for XNEUR keyboard layout switcher";
-
platforms = platforms.linux;
-
license = with licenses; [
-
gpl2
-
gpl3
-
];
-
mainProgram = "gxneur";
-
};
-
}
+4 -2
pkgs/build-support/appimage/default.nix
···
krb5
gsettings-desktop-schemas
hicolor-icon-theme # dont show a gtk warning about hicolor not being installed
+
+
# libraries not on the upstream include list, but nevertheless expected
+
# by at least one appimage
+
libsecret # For bitwarden, appimage is x86_64 only
];
# list of libraries expected in an appimage environment:
···
at-spi2-core
pciutils # for FreeCAD
pipewire # immersed-vr wayland support
-
-
libsecret # For bitwarden
libmpg123 # Slippi launcher
brotli # TwitchDropsMiner
];
+1 -3
pkgs/by-name/au/authentik/package.nix
···
substituteInPlace authentik/lib/default.yml \
--replace-fail '/blueprints' "$out/blueprints" \
--replace-fail './media' '/var/lib/authentik/media'
-
substituteInPlace pyproject.toml \
-
--replace-fail 'djangorestframework-guardian' 'djangorestframework-guardian2'
substituteInPlace authentik/stages/email/utils.py \
--replace-fail 'web/' '${webui}/'
'';
···
django-storages
django-tenants
djangorestframework
-
djangorestframework-guardian2
+
djangorestframework-guardian
docker
drf-orjson-renderer
drf-spectacular
+3 -2
pkgs/by-name/cl/cloudflare-warp/package.nix
···
patchelf --replace-needed libpcap.so.0.8 ${libpcap}/lib/libpcap.so $out/bin/warp-dex
mv lib/systemd/system $out/lib/systemd/
substituteInPlace $out/lib/systemd/system/warp-svc.service \
-
--replace "ExecStart=" "ExecStart=$out"
+
--replace-fail "ExecStart=" "ExecStart=$out"
substituteInPlace $out/lib/systemd/user/warp-taskbar.service \
-
--replace "ExecStart=" "ExecStart=$out"
+
--replace-fail "ExecStart=" "ExecStart=$out" \
+
--replace-fail "BindsTo=" "PartOf="
cat >>$out/lib/systemd/user/warp-taskbar.service <<EOF
-34
pkgs/by-name/co/copper/package.nix
···
-
{
-
lib,
-
stdenv,
-
fetchurl,
-
libffi,
-
}:
-
stdenv.mkDerivation rec {
-
pname = "copper";
-
version = "4.6";
-
src = fetchurl {
-
url = "https://tibleiz.net/download/copper-${version}-src.tar.gz";
-
sha256 = "sha256-tyxAMJp4H50eBz8gjt2O3zj5fq6nOIXKX47wql8aUUg=";
-
};
-
buildInputs = [
-
libffi
-
];
-
postPatch = ''
-
patchShebangs .
-
'';
-
buildPhase = ''
-
make BACKEND=elf64 boot-elf64
-
make BACKEND=elf64 COPPER=stage3/copper-elf64 copper-elf64
-
'';
-
installPhase = ''
-
make BACKEND=elf64 install prefix=$out
-
'';
-
meta = with lib; {
-
description = "Simple imperative language, statically typed with type inference and genericity";
-
homepage = "https://tibleiz.net/copper/";
-
license = licenses.bsd2;
-
platforms = platforms.x86_64;
-
broken = true;
-
};
-
}
+3 -3
pkgs/by-name/en/envoy-bin/package.nix
···
versionCheckHook,
}:
let
-
version = "1.35.0";
+
version = "1.35.1";
inherit (stdenv.hostPlatform) system;
throwSystem = throw "envoy-bin is not available for ${system}.";
···
hash =
{
-
aarch64-linux = "sha256-PLlFrs65Z+mV5V2OoW+bb/91DC5V9Ss2HnERccIunWY=";
-
x86_64-linux = "sha256-0l12MVwCNrUPjn9t6hOpuUscP6EQQHNLd0kG4YjhEeY=";
+
aarch64-linux = "sha256-tIBXnm6bGdA6tlYFL+aDf1bOjlUVof0MDNDpFi0tcbE=";
+
x86_64-linux = "sha256-emAbbVhEw0MA21rPxQD/z/p3yVuDi5JZg1yjuRkkmlo=";
}
.${system} or throwSystem;
in
+7 -365
pkgs/by-name/fr/frigate/constants.patch
···
-
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
+39
pkgs/by-name/fr/frigate/ffmpeg.patch
···
+
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",
+
~
+38 -25
pkgs/by-name/fr/frigate/package.nix
···
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
···
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
···
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}" \
···
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
···
pathvalidate
peewee
peewee-migrate
+
prometheus-client
psutil
py3nvml
+
pyclipper
pydantic
+
python-multipart
pytz
py-vapid
pywebpush
···
ruamel-yaml
scipy
setproctitle
+
shapely
slowapi
starlette
starlette-context
tensorflow-bin
+
titlecase
transformers
tzlocal
unidecode
uvicorn
+
verboselogs
+
virtualenv
ws4py
];
···
runHook postInstall
'';
-
nativeCheckInputs = with python.pkgs; [
+
nativeCheckInputs = with python312Packages; [
pytestCheckHook
];
···
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;
};
+1 -1
pkgs/by-name/fr/frigate/web.nix
···
--replace-fail "/tmp/cache" "/var/cache/frigate"
'';
-
npmDepsHash = "sha256-tPwydUJtFDJs17q0haJaUVEkxua+nHfmwQ9Z9Y24ca8=";
+
npmDepsHash = "sha256-CrK/6BaKmKIxlohEZdGEEKJkioszBUupyKQx4nBeLqI=";
installPhase = ''
cp -rv dist/ $out
+1 -1
pkgs/by-name/fr/froide/package.nix
···
'';
nativeCheckInputs = with python.pkgs; [
-
(postgresql.withPackages (p: [ p.postgis ]))
+
(postgresql.withPackages (p: [ p.postgis ])).out
postgresqlTestHook
pytest-django
pytest-playwright
+76 -65
pkgs/by-name/pa/paperless-ngx/package.nix
···
xcbuild,
pango,
pkg-config,
+
symlinkJoin,
nltk-data,
xorg,
}:
let
-
version = "2.17.1";
+
version = "2.18.1";
src = fetchFromGitHub {
owner = "paperless-ngx";
repo = "paperless-ngx";
tag = "v${version}";
-
hash = "sha256-6FvP/HgomsPxqCtKrZFxMlD2fFyT2e/JII2L7ANiOao=";
+
hash = "sha256-POHF00cV8pl6i1rcwxtZ+Q1AlLybDj6gSlL0lPwSSCo=";
};
python = python3.override {
self = python;
packageOverrides = final: prev: {
-
django = prev.django_5_1;
+
django = prev.django_5_2;
fido2 = prev.fido2.overridePythonAttrs {
version = "1.2.0";
···
poppler-utils
];
-
frontend =
-
let
-
frontendSrc = src + "/src-ui";
-
in
-
stdenv.mkDerivation rec {
-
pname = "paperless-ngx-frontend";
-
inherit version;
+
frontend = stdenv.mkDerivation (finalAttrs: {
+
pname = "paperless-ngx-frontend";
+
inherit version;
-
src = frontendSrc;
+
src = src + "/src-ui";
-
pnpmDeps = pnpm.fetchDeps {
-
inherit pname version src;
-
fetcherVersion = 1;
-
hash = "sha256-VtYYwpMXPAC3g1OESnw3dzLTwiGqJBQcicFZskEucok=";
-
};
+
pnpmDeps = pnpm.fetchDeps {
+
inherit (finalAttrs) pname version src;
+
fetcherVersion = 1;
+
hash = "sha256-bx/jXlG3lRiwKyz1M0dU00Xn5xaeALSIxIAGzo8gAgo=";
+
};
+
+
nativeBuildInputs = [
+
node-gyp
+
nodejs_20
+
pkg-config
+
pnpm.configHook
+
python3
+
]
+
++ lib.optionals stdenv.hostPlatform.isDarwin [
+
xcbuild
+
];
-
nativeBuildInputs = [
-
node-gyp
-
nodejs_20
-
pkg-config
-
pnpm.configHook
-
python3
-
]
-
++ lib.optionals stdenv.hostPlatform.isDarwin [
-
xcbuild
-
];
+
buildInputs = [
+
pango
+
]
+
++ lib.optionals stdenv.hostPlatform.isDarwin [
+
giflib
+
];
-
buildInputs = [
-
pango
-
]
-
++ lib.optionals stdenv.hostPlatform.isDarwin [
-
giflib
-
];
+
CYPRESS_INSTALL_BINARY = "0";
+
NG_CLI_ANALYTICS = "false";
-
CYPRESS_INSTALL_BINARY = "0";
-
NG_CLI_ANALYTICS = "false";
+
buildPhase = ''
+
runHook preBuild
-
buildPhase = ''
-
runHook preBuild
+
pushd node_modules/canvas
+
node-gyp rebuild
+
popd
-
pushd node_modules/canvas
-
node-gyp rebuild
-
popd
+
# cat forcefully disables angular cli's spinner which doesn't work with nix' tty which is 0x0
+
pnpm run build --configuration production | cat
-
pnpm run build --configuration production
+
runHook postBuild
+
'';
-
runHook postBuild
-
'';
+
doCheck = true;
+
checkPhase = ''
+
runHook preCheck
-
doCheck = true;
-
checkPhase = ''
-
runHook preCheck
+
pnpm run test | cat
-
pnpm run test
+
runHook postCheck
+
'';
-
runHook postCheck
-
'';
+
installPhase = ''
+
runHook preInstall
-
installPhase = ''
-
runHook preInstall
+
mkdir -p $out/lib/paperless-ui
+
mv ../src/documents/static/frontend $out/lib/paperless-ui/
-
mkdir -p $out/lib/paperless-ui
-
mv ../src/documents/static/frontend $out/lib/paperless-ui/
+
runHook postInstall
+
'';
+
});
-
runHook postInstall
-
'';
-
};
+
nltkDataDir = symlinkJoin {
+
name = "paperless_ngx_nltk_data";
+
paths = with nltk-data; [
+
punkt-tab
+
snowball-data
+
stopwords
+
];
+
};
in
python.pkgs.buildPythonApplication rec {
pname = "paperless-ngx";
···
fi
substituteInPlace pyproject.toml \
--replace-fail '"--numprocesses=auto",' "" \
-
--replace-fail '--maxprocesses=16' "--numprocesses=$NIX_BUILD_CORES" \
-
--replace-fail "djangorestframework-guardian~=0.3.0" "djangorestframework-guardian2"
+
--replace-fail '--maxprocesses=16' "--numprocesses=$NIX_BUILD_CORES"
'';
nativeBuildInputs = [
···
];
pythonRelaxDeps = [
+
"django"
"django-allauth"
"django-auditlog"
"django-guardian"
···
dependencies =
with python.pkgs;
[
+
babel
bleach
channels
channels-redis
···
}
))
django-auditlog
+
django-cachalot
django-celery-results
django-compression-middleware
django-cors-headers
···
django-multiselectfield
django-soft-delete
djangorestframework
-
djangorestframework-guardian2
+
djangorestframework-guardian
drf-spectacular
drf-spectacular-sidecar
drf-writable-nested
···
pathvalidate
pdf2image
psycopg
+
psycopg-pool
python-dateutil
python-dotenv
python-gnupg
···
export PATH="${path}:$PATH"
export HOME=$(mktemp -d)
export XDG_DATA_DIRS="${liberation_ttf}/share:$XDG_DATA_DIRS"
+
export PAPERLESS_NLTK_DIR=${passthru.nltkDataDir}
'';
disabledTests = [
···
# Favicon tests fail due to static file handling in the test environment
"test_favicon_view"
"test_favicon_view_missing_file"
+
# Requires DNS
+
"test_send_webhook_data_or_json"
+
"test_workflow_webhook_send_webhook_retry"
+
"test_workflow_webhook_send_webhook_task"
];
doCheck = !stdenv.hostPlatform.isDarwin;
passthru = {
inherit
-
python
-
path
frontend
+
nltkDataDir
+
path
+
python
tesseract5
;
-
nltkData = with nltk-data; [
-
punkt-tab
-
snowball-data
-
stopwords
-
];
tests = { inherit (nixosTests) paperless; };
};
+6 -2
pkgs/by-name/vi/victoriametrics/package.nix
···
buildGoModule (finalAttrs: {
pname = "VictoriaMetrics";
-
version = "1.123.0";
+
version = "1.124.0";
src = fetchFromGitHub {
owner = "VictoriaMetrics";
repo = "VictoriaMetrics";
tag = "v${finalAttrs.version}";
-
hash = "sha256-GUVRMlF94BaZSVfz4Z+IBSpf6WuA5o1WQQmeZAqKZ1g=";
+
hash = "sha256-f0Mf/4cFnJ/3I8z/4UhhNJnSCau9Q7mFfR32lP9/yi0=";
};
vendorHash = null;
···
#
# This appears to be some kind of test server for development purposes only.
rm -f app/vmui/packages/vmui/web/{go.mod,main.go}
+
+
# Allow older go versions
+
substituteInPlace go.mod \
+
--replace-fail "go 1.24.6" "go ${finalAttrs.passthru.go.version}"
# Increase timeouts in tests to prevent failure on heavily loaded builders
substituteInPlace lib/storage/storage_test.go \
+16
pkgs/by-name/xw/xwin/package.nix
···
lib,
rustPlatform,
fetchFromGitHub,
+
openssl,
+
pkg-config,
versionCheckHook,
}:
rustPlatform.buildRustPackage (finalAttrs: {
···
};
cargoHash = "sha256-77ArdZ9mOYEon4nzNUNSL0x0UlE1iVujFLwreAd9iMM=";
+
+
strictDeps = true;
+
nativeBuildInputs = [
+
pkg-config
+
];
+
+
buildInputs = [
+
openssl
+
];
+
+
buildNoDefaultFeatures = true;
+
buildFeatures = [
+
"native-tls"
+
];
doCheck = true;
# Requires network access
+4 -1
pkgs/development/compilers/graalvm/default.nix
···
(prev: {
autoPatchelfIgnoreMissingDeps = [ "libonnxruntime.so.1" ];
});
+
graalvm-oracle_24 = (self.callPackage ./graalvm-oracle { version = "24"; }).overrideAttrs (prev: {
+
autoPatchelfIgnoreMissingDeps = [ "libonnxruntime.so.1.18.0" ];
+
});
graalvm-oracle_23 = self.callPackage ./graalvm-oracle { version = "23"; };
graalvm-oracle_17 = self.callPackage ./graalvm-oracle { version = "17"; };
-
graalvm-oracle = self.graalvm-oracle_23;
+
graalvm-oracle = self.graalvm-oracle_24;
}
// lib.optionalAttrs config.allowAliases {
graalvm-oracle_22 = throw "GraalVM 22 is EOL, use a newer version instead";
+1 -1
pkgs/development/compilers/graalvm/graalvm-oracle/default.nix
···
fetchurl,
graalvmPackages,
useMusl ? false,
-
version ? "23",
+
version ? "24",
}:
graalvmPackages.buildGraalvm {
+18
pkgs/development/compilers/graalvm/graalvm-oracle/hashes.nix
···
url = "https://github.com/graalvm/oracle-graalvm-ea-builds/releases/download/jdk-25.0.0-ea.34/graalvm-jdk-25.0.0-ea.34_macos-aarch64_bin.tar.gz";
};
};
+
"24" = {
+
"aarch64-linux" = {
+
hash = "sha256-dvJVfzLoz75ti3u/Mx8PCS674cw2omeOCYMFiSB2KYs=";
+
url = "https://download.oracle.com/graalvm/24/archive/graalvm-jdk-24.0.2_linux-aarch64_bin.tar.gz";
+
};
+
"x86_64-linux" = {
+
hash = "sha256-sBYaSbvB0PQGl1Mt36u4BSpaFeRjd15pRf4+SSAlm64=";
+
url = "https://download.oracle.com/graalvm/24/archive/graalvm-jdk-24.0.2_linux-x64_bin.tar.gz";
+
};
+
"x86_64-darwin" = {
+
hash = "sha256-3w+eXRASAcUL+muqPGV6gaKIPFtQl6n1q5PauG9+O6I=";
+
url = "https://download.oracle.com/graalvm/24/archive/graalvm-jdk-24.0.2_macos-x64_bin.tar.gz";
+
};
+
"aarch64-darwin" = {
+
hash = "sha256-LcdjTtk5xyXUGjU/c0Q/8y5w8vtXc2fxKmk2EH40lNw=";
+
url = "https://download.oracle.com/graalvm/24/archive/graalvm-jdk-24.0.2_macos-aarch64_bin.tar.gz";
+
};
+
};
"23" = {
"aarch64-linux" = {
hash = "sha256-VlB664/l7NWFQrPE3vEJvCXkEzKEJ0ck/HNU5pGGTwU=";
+4 -2
pkgs/development/ocaml-modules/multicore-bench/default.nix
···
lib,
buildDunePackage,
fetchurl,
+
backoff,
domain-local-await,
mtime,
multicore-magic,
···
buildDunePackage rec {
pname = "multicore-bench";
-
version = "0.1.4";
+
version = "0.1.7";
src = fetchurl {
url = "https://github.com/ocaml-multicore/multicore-bench/releases/download/${version}/multicore-bench-${version}.tbz";
-
hash = "sha256-iCx5QvhYo/e53cW23Sza2as4aez4HeESVvLPF1DW85A=";
+
hash = "sha256-vrp9yiuTwhijhYjeDKPFRGyh/5LeydKWJSyMLZRRXIM=";
};
propagatedBuildInputs = [
+
backoff
domain-local-await
mtime
multicore-magic
+2 -2
pkgs/development/python-modules/django-auditlog/default.nix
···
buildPythonPackage rec {
pname = "django-auditlog";
-
version = "3.2.0";
+
version = "3.2.1";
pyproject = true;
src = fetchFromGitHub {
owner = "jazzband";
repo = "django-auditlog";
tag = "v${version}";
-
hash = "sha256-NOtpnYh6HUo7VRSyCUhbpNDv0V9KWST0OEzl7Pt6eR8=";
+
hash = "sha256-159p82PT3za3wp2XhekGxy+NYxLyQfAyUOyhDjyr2CI=";
};
nativeBuildInputs = [
+17 -2
pkgs/development/python-modules/django-cachalot/default.nix
···
psycopg2,
jinja2,
beautifulsoup4,
+
pytest-django,
+
pytestCheckHook,
python,
pytz,
+
redis,
+
redisTestHook,
+
setuptools,
+
stdenv,
}:
buildPythonPackage rec {
···
./disable-unsupported-tests.patch
];
-
propagatedBuildInputs = [ django ];
+
build-system = [ setuptools ];
+
+
dependencies = [ django ];
-
checkInputs = [
+
nativeCheckInputs = [
beautifulsoup4
django-debug-toolbar
psycopg2
jinja2
+
pytest-django
+
pytestCheckHook
pytz
+
redis
+
redisTestHook
];
pythonImportsCheck = [ "cachalot" ];
+
+
# redisTestHook does not work on darwin
+
doCheck = !stdenv.hostPlatform.isDarwin;
# disable broken pinning test
preCheck = ''
+9 -8
pkgs/development/python-modules/djangorestframework-dataclasses/default.nix
···
buildPythonPackage,
fetchFromGitHub,
djangorestframework,
+
pytest-django,
+
pytestCheckHook,
setuptools,
}:
···
hash = "sha256-nUkR5xTyeBv7ziJ6Mej9TKvMOa5/k+ELBqt4BVam/wk=";
};
-
build-system = [ setuptools ];
-
postPatch = ''
patchShebangs manage.py
'';
+
+
build-system = [ setuptools ];
dependencies = [ djangorestframework ];
-
checkPhase = ''
-
runHook preCheck
-
-
./manage.py test
+
nativeCheckInputs = [
+
pytest-django
+
pytestCheckHook
+
];
-
runHook postCheck
-
'';
+
env.DJANGO_SETTINGS_MODULE = "tests.django_settings";
pythonImportsCheck = [ "rest_framework_dataclasses" ];
+14 -14
pkgs/development/python-modules/djangorestframework-guardian/default.nix
···
lib,
buildPythonPackage,
fetchFromGitHub,
-
django,
django-guardian,
djangorestframework,
+
pytest-django,
+
pytestCheckHook,
+
setuptools,
}:
buildPythonPackage rec {
pname = "djangorestframework-guardian";
-
version = "0.3.0";
-
format = "setuptools";
+
version = "0.4.0";
+
pyproject = true;
src = fetchFromGitHub {
owner = "rpkilby";
repo = "django-rest-framework-guardian";
rev = version;
-
hash = "sha256-jl/VEl1pUHU8J1d5ZQSGJweNJayIGw1iVAmwID85fqw=";
+
hash = "sha256-7SaKyWoLen5DAwSyrWeA4rEmjXMcPwJ7LM7WYxk+IKs=";
};
-
postPatch = ''
-
chmod +x manage.py
-
patchShebangs manage.py
-
'';
+
build-system = [ setuptools ];
-
propagatedBuildInputs = [
+
dependencies = [
django-guardian
djangorestframework
];
-
checkPhase = ''
-
./manage.py test
-
'';
+
nativeCheckInputs = [
+
pytest-django
+
pytestCheckHook
+
];
+
+
env.DJANGO_SETTINGS_MODULE = "tests.settings";
pythonImportsCheck = [ "rest_framework_guardian" ];
···
homepage = "https://github.com/rpkilby/django-rest-framework-guardian";
license = licenses.bsd3;
maintainers = [ ];
-
# unmaintained, last compatible version is 3.x, use djangorestframework-guardian2 instead
-
broken = lib.versionAtLeast django.version "4";
};
}
-46
pkgs/development/python-modules/djangorestframework-guardian2/default.nix
···
-
{
-
lib,
-
buildPythonPackage,
-
fetchFromGitHub,
-
django-guardian,
-
djangorestframework,
-
setuptools,
-
}:
-
-
buildPythonPackage rec {
-
pname = "djangorestframework-guardian2";
-
version = "0.7.0";
-
pyproject = true;
-
-
src = fetchFromGitHub {
-
owner = "johnthagen";
-
repo = "django-rest-framework-guardian2";
-
tag = "v${version}";
-
hash = "sha256-LrIhOoBWC3HttjAGbul4zof++OW35pGMyFGZzUpG1Tk=";
-
};
-
-
postPatch = ''
-
chmod +x manage.py
-
patchShebangs manage.py
-
'';
-
-
build-system = [ setuptools ];
-
-
dependencies = [
-
django-guardian
-
djangorestframework
-
];
-
-
checkPhase = ''
-
./manage.py test
-
'';
-
-
pythonImportsCheck = [ "rest_framework_guardian" ];
-
-
meta = with lib; {
-
description = "Django-guardian support for Django REST Framework";
-
homepage = "https://github.com/johnthagen/django-rest-framework-guardian2/";
-
license = licenses.bsd3;
-
maintainers = with maintainers; [ e1mo ];
-
};
-
}
+2 -2
pkgs/development/python-modules/drf-spectacular-sidecar/default.nix
···
buildPythonPackage rec {
pname = "drf-spectacular-sidecar";
-
version = "2025.4.1";
+
version = "2025.8.1";
pyproject = true;
src = fetchFromGitHub {
owner = "tfranzel";
repo = "drf-spectacular-sidecar";
rev = version;
-
hash = "sha256-YzSUwShj7QGCVKlTRM2Gro38Y+jGYQsMGBMAH0radmA=";
+
hash = "sha256-H2eHFX7VG7YqLztEV/G4QnVYytkfADeHxgBTRlmKt50=";
};
build-system = [ setuptools ];
+2 -2
pkgs/development/python-modules/python-openstackclient/default.nix
···
buildPythonPackage rec {
pname = "python-openstackclient";
-
version = "8.1.0";
+
version = "8.2.0";
pyproject = true;
src = fetchPypi {
pname = "python_openstackclient";
inherit version;
-
hash = "sha256-m5xCs/a8S0tICmJU/FYKywGXh4MeCUOW2/msmuVxrks=";
+
hash = "sha256-1hKvGN/GbMjzHmzpZpC2wnOt6KJA7EC39INaiJb7vgE=";
};
build-system = [
+3
pkgs/development/python-modules/rq/default.nix
···
__darwinAllowLocalNetworking = true;
+
# redisTestHook does not work on darwin-x86_64
+
doCheck = !(stdenv.hostPlatform.isDarwin && stdenv.hostPlatform.isx86_64);
+
disabledTests = lib.optionals stdenv.hostPlatform.isDarwin [
# PermissionError: [Errno 13] Permission denied: '/tmp/rq-tests.txt'
"test_deleted_jobs_arent_executed"
+5 -2
pkgs/development/python-modules/sanic/default.nix
···
]
++ optional-dependencies.http3;
-
doCheck = !stdenv.hostPlatform.isDarwin;
-
preCheck = ''
# Some tests depends on sanic on PATH
PATH="$out/bin:$PATH"
···
# needed for relative paths for some packages
cd tests
+
''
+
# Work around "OSError: AF_UNIX path too long"
+
+ lib.optionalString stdenv.hostPlatform.isDarwin ''
+
substituteInPlace worker/test_socket.py \
+
--replace-fail '"./test.sock"' '"/tmp/test.sock"'
'';
disabledTests = [
+6 -8
pkgs/development/python-modules/tika-client/default.nix
···
lib,
buildPythonPackage,
fetchFromGitHub,
-
pythonOlder,
+
anyio,
hatchling,
httpx,
}:
···
pname = "tika-client";
version = "0.10.0";
pyproject = true;
-
-
disabled = pythonOlder "3.9";
src = fetchFromGitHub {
owner = "stumpylog";
···
build-system = [ hatchling ];
-
dependencies = [ httpx ];
+
dependencies = [
+
anyio
+
httpx
+
];
pythonImportsCheck = [ "tika_client" ];
-
# Almost all of the tests (all except one in 0.1.0) fail since there
-
# is no tika http API endpoint reachable. Since tika is not yet
-
# packaged for nixpkgs, it seems like an unreasonable amount of effort
-
# fixing these tests.
+
# The tests expect the tika-server to run in a docker container
doChecks = false;
meta = with lib; {
-54
pkgs/tools/backup/zbackup/default.nix
···
-
{
-
lib,
-
stdenv,
-
fetchFromGitHub,
-
cmake,
-
protobufc,
-
libunwind,
-
lzo,
-
openssl,
-
protobuf,
-
zlib,
-
}:
-
-
stdenv.mkDerivation rec {
-
pname = "zbackup";
-
version = "1.4.4";
-
-
src = fetchFromGitHub {
-
owner = "zbackup";
-
repo = "zbackup";
-
rev = version;
-
hash = "sha256-9Fk4EhEeQ2J4Kirc7oad4CzmW70Mmza6uozd87qfgZI=";
-
};
-
-
patches = [
-
# compare with https://github.com/zbackup/zbackup/pull/158;
-
# but that doesn't apply cleanly to this version
-
./protobuf-api-change.patch
-
];
-
-
# zbackup uses dynamic exception specifications which are not
-
# allowed in C++17
-
env.NIX_CFLAGS_COMPILE = toString [ "--std=c++14" ];
-
-
buildInputs = [
-
zlib
-
openssl
-
protobuf
-
lzo
-
libunwind
-
];
-
nativeBuildInputs = [
-
cmake
-
protobufc
-
];
-
-
meta = {
-
description = "Versatile deduplicating backup tool";
-
mainProgram = "zbackup";
-
homepage = "http://zbackup.org/";
-
platforms = lib.platforms.linux;
-
license = lib.licenses.gpl2Plus;
-
};
-
}
-11
pkgs/tools/backup/zbackup/protobuf-api-change.patch
···
-
--- a/backup_restorer.cc
-
+++ b/backup_restorer.cc
-
@@ -48,7 +48,7 @@
-
// TODO: this disables size checks for each separate message. Figure a better
-
// way to do this while keeping them enabled. It seems we need to create an
-
// instance of CodedInputStream for each message, but it might be expensive
-
- cis.SetTotalBytesLimit( backupData.size(), -1 );
-
+ cis.SetTotalBytesLimit( backupData.size() );
-
-
// Used when emitting chunks
-
string chunk;
+6
pkgs/top-level/aliases.nix
···
cloudlogoffline = throw "cloudlogoffline has been removed"; # added 2025-05-18
clwrapperFunction = throw "Lisp packages have been redesigned. See 'lisp-modules' in the nixpkgs manual."; # Added 2024-05-07
CoinMP = coinmp; # Added 2024-06-12
+
code-browser-gtk = throw "'code-browser-gtk' has been removed, as it was broken since 22.11"; # Added 2025-08-22
+
code-browser-gtk2 = throw "'code-browser-gtk2' has been removed, as it was broken since 22.11"; # Added 2025-08-22
+
code-browser-qt = throw "'code-browser-qt' has been removed, as it was broken since 22.11"; # Added 2025-08-22
collada-dom = opencollada; # added 2024-02-21
colloid-kde = throw "'colloid-kde' has been removed, as it is only compatible with Plasma 5, which is EOL"; # Added 2025-08-20
colorpicker = throw "'colorpicker' has been removed due to lack of maintenance upstream. Consider using 'xcolor', 'gcolor3', 'eyedropper' or 'gpick' instead"; # Added 2024-10-19
colorstorm = throw "'colorstorm' has been removed because it was unmaintained in nixpkgs and upstream was rewritten."; # Added 2025-06-15
connman-ncurses = throw "'connman-ncurses' has been removed due to lack of maintenance upstream."; # Added 2025-05-27
+
copper = throw "'copper' has been removed, as it was broken since 22.11"; # Added 2025-08-22
cordless = throw "'cordless' has been removed due to being archived upstream. Consider using 'discordo' instead."; # Added 2025-06-07
coriander = throw "'coriander' has been removed because it depends on GNOME 2 libraries"; # Added 2024-06-27
corretto19 = throw "Corretto 19 was removed as it has reached its end of life"; # Added 2024-08-01
···
guardian-agent = throw "'guardian-agent' has been removed, as it hasn't been maintained upstream in years and accumulated many vulnerabilities"; # Added 2024-06-09
guile-disarchive = disarchive; # Added 2023-10-27
gutenprintBin = gutenprint-bin; # Added 2025-08-21
+
gxneur = throw "'gxneur' has been removed due to lack of maintenance and reliance on gnome2 and 2to3."; # Added 2025-08-17
### H ###
···
z3_4_8 = throw "'z3_4_8' has been removed in favour of the latest version. Use 'z3'."; # Added 2025-05-18
zabbix50 = throw "'zabbix50' has been removed, it would have reached its End of Life a few days after the release of NixOS 25.05. Consider upgrading to 'zabbix60' or 'zabbix70'.";
zabbix64 = throw "'zabbix64' has been removed because it reached its End of Life. Consider upgrading to 'zabbix70'.";
+
zbackup = throw "'zbackup' has been removed due to being unmaintained upstream"; # Added 2025-08-22
zeroadPackages = recurseIntoAttrs {
zeroad = lib.warnOnInstantiate "'zeroadPackages.zeroad' has been renamed to 'zeroad'" zeroad; # Added 2025-03-22
zeroad-data = lib.warnOnInstantiate "'zeroadPackages.zeroad-data' has been renamed to 'zeroad-data'" zeroad-data; # Added 2025-03-22
-12
pkgs/top-level/all-packages.nix
···
cask-server = libsForQt5.callPackage ../applications/misc/cask-server { };
-
code-browser-qt = libsForQt5.callPackage ../applications/editors/code-browser { withQt = true; };
-
code-browser-gtk2 = callPackage ../applications/editors/code-browser { withGtk2 = true; };
-
code-browser-gtk = callPackage ../applications/editors/code-browser { withGtk3 = true; };
-
cffconvert = python3Packages.toPythonApplication python3Packages.cffconvert;
ckb-next = libsForQt5.callPackage ../tools/misc/ckb-next { };
···
# To expose more packages for Yi, override the extraPackages arg.
yi = callPackage ../applications/editors/yi/wrapper.nix { };
-
-
zbackup = callPackage ../tools/backup/zbackup {
-
protobuf = protobuf_21;
-
};
zbar = libsForQt5.callPackage ../tools/graphics/zbar { };
···
wrapQtAppsHook
-
-
gxneur = callPackage ../applications/misc/gxneur {
-
inherit (gnome2) libglade GConf;
-
};
xournalpp = callPackage ../applications/graphics/xournalpp {
lua = lua5_3;
+1
pkgs/top-level/python-aliases.nix
···
distutils_extra = distutils-extra; # added 2023-10-12
digital-ocean = python-digitalocean; # addad 2024-04-12
dj-stripe = throw "dj-stripe has been removed because it is unused and broken"; # added 2025-07-21
+
djangorestframework-guardian2 = throw "djangorestframework-guardian2 has been removed because djangorestframework-guardian is active again and the upstream project was archived"; # added 2025-08-22
djangorestframework-jwt = drf-jwt; # added 2021-07-20
django-allauth-2fa = throw "django-allauth-2fa was removed because it was unused and django-allauth now contains 2fa logic itself."; # added 2025-02-15
django-sampledatahelper = throw "django-sampledatahelper was removed because it is no longer compatible to latest Django version"; # added 2022-07-18
-4
pkgs/top-level/python-packages.nix
···
callPackage ../development/python-modules/djangorestframework-guardian
{ };
-
djangorestframework-guardian2 =
-
callPackage ../development/python-modules/djangorestframework-guardian2
-
{ };
-
djangorestframework-jsonp = callPackage ../development/python-modules/djangorestframework-jsonp { };
djangorestframework-recursive =