Compare commits

...
4 Commits
7 changed files with 547 additions and 5 deletions
+1 -1
View File
@@ -174,7 +174,7 @@
boot.plymouth.enable = true; boot.plymouth.enable = true;
boot.initrd.systemd.enable = true; boot.initrd.systemd.enable = true;
boot.supportedFilesystems = ["ntfs"]; boot.supportedFilesystems = ["ntfs"];
boot.kernelPackages = pkgs.linuxPackages_7_1; boot.kernelPackages = pkgs.linuxPackages;
# Configure console keymap # Configure console keymap
console.keyMap = "de"; console.keyMap = "de";
@@ -0,0 +1,461 @@
{
stdenv,
lib,
cacert,
curl,
runCommandLocal,
unzip,
appimageTools,
addDriverRunpath,
dbus,
libGLU,
xkeyboard-config,
libxcb-util,
libxcb-wm,
libxcb-render-util,
libxcb-keysyms,
libxcb-image,
libxxf86vm,
libxt,
libxtst,
libxrender,
libxrandr,
libxi,
libxinerama,
libxfixes,
libxext,
libxdamage,
libxcursor,
libxcomposite,
libx11,
libsm,
libice,
libxcb,
buildFHSEnv,
bash,
writeText,
writeShellScript,
ocl-icd,
xkeyboard_config,
glib,
libarchive,
libxcrypt-legacy,
python3,
aprutil,
makeDesktopItem,
copyDesktopItems,
jq,
perl,
studioVariant ? true,
common-updater-scripts,
writeShellApplication,
}: let
davinci = (
stdenv.mkDerivation rec {
pname = "davinci-resolve${lib.optionalString studioVariant "-studio"}";
version = "21.1.1";
nativeBuildInputs = [
appimageTools.appimage-exec
addDriverRunpath
copyDesktopItems
unzip
];
# Pretty sure, there are missing dependencies ...
buildInputs = [
libGLU
libxxf86vm
];
src =
runCommandLocal "${pname}-src.zip"
rec {
outputHashMode = "recursive";
outputHashAlgo = "sha256";
outputHash =
if studioVariant
then "sha256-rURkNmPzRjeD2aadEpZE9h/uQfsmVm43sJTJVODqP30="
else "sha256-hU27MRgjuBv201uR4tdI1P4ay8dCKyhNBtxwZ9CajJM=";
impureEnvVars = lib.fetchers.proxyImpureEnvVars;
nativeBuildInputs = [
curl
jq
];
# ENV VARS
SSL_CERT_FILE = "${cacert}/etc/ssl/certs/ca-bundle.crt";
# Get linux.downloadId from HTTP response on https://www.blackmagicdesign.com/products/davinciresolve
REFERID = "263d62f31cbb49e0868005059abcb0c9";
DOWNLOADSURL = "https://www.blackmagicdesign.com/api/support/us/downloads.json";
SITEURL = "https://www.blackmagicdesign.com/api/register/us/download";
PRODUCT = "DaVinci Resolve${lib.optionalString studioVariant " Studio"}";
VERSION = version;
USERAGENT = builtins.concatStringsSep " " [
"User-Agent: Mozilla/5.0 (X11; Linux ${stdenv.hostPlatform.linuxArch})"
"AppleWebKit/537.36 (KHTML, like Gecko)"
"Chrome/77.0.3865.75"
"Safari/537.36"
];
REQJSON = builtins.toJSON {
"firstname" = "NixOS";
"lastname" = "Linux";
"email" = "someone@nixos.org";
"phone" = "+31 71 452 5670";
"country" = "nl";
"street" = "-";
"state" = "Province of Utrecht";
"city" = "Utrecht";
"product" = PRODUCT;
};
}
''
DOWNLOADID=$(
curl --silent --compressed "$DOWNLOADSURL" \
| jq --raw-output '.downloads[] | .urls.Linux?[]? | select(.downloadTitle | test("^'"$PRODUCT $VERSION"'( Update)?$")) | .downloadId'
)
echo "downloadid is $DOWNLOADID"
test -n "$DOWNLOADID"
RESOLVEURL=$(curl \
--silent \
--header 'Host: www.blackmagicdesign.com' \
--header 'Accept: application/json, text/plain, */*' \
--header 'Origin: https://www.blackmagicdesign.com' \
--header "$USERAGENT" \
--header 'Content-Type: application/json;charset=UTF-8' \
--header "Referer: https://www.blackmagicdesign.com/support/download/$REFERID/Linux" \
--header 'Accept-Encoding: gzip, deflate, br' \
--header 'Accept-Language: en-US,en;q=0.9' \
--header 'Authority: www.blackmagicdesign.com' \
--header 'Cookie: _ga=GA1.2.1849503966.1518103294; _gid=GA1.2.953840595.1518103294' \
--data-ascii "$REQJSON" \
--compressed \
"$SITEURL/$DOWNLOADID")
echo "resolveurl is $RESOLVEURL"
curl \
--retry 3 --retry-delay 3 \
--header "Upgrade-Insecure-Requests: 1" \
--header "$USERAGENT" \
--header "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8" \
--header "Accept-Language: en-US,en;q=0.9" \
--compressed \
"$RESOLVEURL" \
> $out
'';
# The unpack phase won't generate a directory
sourceRoot = ".";
installPhase = let
appimageName = "DaVinci_Resolve_${lib.optionalString studioVariant "Studio_"}${version}_Linux.run";
in ''
runHook preInstall
export HOME=$PWD/home
mkdir -p $HOME
mkdir -p $out
test -e ${lib.escapeShellArg appimageName}
appimage-exec.sh -x $out ${lib.escapeShellArg appimageName}
mkdir -p $out/{"Apple Immersive/Calibration",configs,DolbyVision,easyDCP,Extras,Fairlight,GPUCache,Immersive/Canon/STMap,logs,Media,"Resolve Disk Database",.crashreport,.license,.LUT}
# Install udev rules for Blackmagic hardware (color panels, Speed Editor, Editor Keyboard)
mkdir -p $out/lib/udev/rules.d
cp $out/share/etc/udev/rules.d/99-BlackmagicDevices.rules $out/lib/udev/rules.d/
cp $out/share/etc/udev/rules.d/99-ResolveKeyboardHID.rules $out/lib/udev/rules.d/
# Generate catch-all rules for Blackmagic Design vendor ID (096e)
# USB device access (color panels, general hardware)
echo 'SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTRS{idVendor}=="096e", MODE="0666"' \
> $out/lib/udev/rules.d/99-DavinciPanel.rules
# hidraw access (Speed Editor jog wheel, Editor Keyboard, future HID devices)
echo 'KERNEL=="hidraw*", SUBSYSTEM=="hidraw", ATTRS{idVendor}=="096e", MODE="0666"' \
>> $out/lib/udev/rules.d/99-DavinciPanel.rules
# Verify all three rules files are present
test -f $out/lib/udev/rules.d/99-BlackmagicDevices.rules
test -f $out/lib/udev/rules.d/99-ResolveKeyboardHID.rules
test -f $out/lib/udev/rules.d/99-DavinciPanel.rules
runHook postInstall
'';
postInstall = ''
${perl}/bin/perl -pi -e 's/\x03\x00\x89\x45\xFC\x83\x7D\xFC\x00\x74\x11\x48\x8B\x45\xC8\x8B/\x03\x00\x89\x45\xFC\x83\x7D\xFC\x00\xEB\x11\x48\x8B\x45\xC8\x8B/g' $out/bin/resolve
${perl}/bin/perl -pi -e 's/\x74\x11\x48\x8B\x45\xC8\x8B\x55\xFC\x89\x50\x58\xB8\x00\x00\x00/\xEB\x11\x48\x8B\x45\xC8\x8B\x55\xFC\x89\x50\x58\xB8\x00\x00\x00/g' $out/bin/resolve
${perl}/bin/perl -0777 -pi -e 's/(\x40\x84\xED)\x74(.\xBF\x16\x00\x00\x00\xBE.\x01\x00\x00\xE8)/$1\x75$2/g' $out/bin/resolve
mkdir -p $out/.license
echo -e "LICENSE blackmagic davinciresolvestudio 999999 permanent uncounted\n hostid=ANY issuer=CGP customer=CGP issued=28-dec-2023\n akey=0000-0000-0000-0000 _ck=00 sig=\"00\"" > $out/.license/blackmagic.lic
'';
dontStrip = true;
postFixup = ''
for program in $out/bin/*; do
isELF "$program" || continue
addDriverRunpath "$program"
done
for program in $out/libs/*; do
isELF "$program" || continue
if [[ "$program" != *"libcudnn_cnn_infer"* ]];then
echo $program
addDriverRunpath "$program"
fi
done
'';
desktopItems =
[
(makeDesktopItem {
name = "davinci-resolve${lib.optionalString studioVariant "-studio"}";
desktopName = "Davinci Resolve${lib.optionalString studioVariant " Studio"}";
genericName = "Video Editor";
exec = "davinci-resolve${lib.optionalString studioVariant "-studio"}";
icon = "davinci-resolve${lib.optionalString studioVariant "-studio"}";
comment = "Professional video editing, color, effects and audio post-processing";
categories = [
"AudioVideo"
"AudioVideoEditing"
"Video"
"Graphics"
];
startupWMClass = "resolve";
})
(makeDesktopItem {
name = "blackmagicraw-player";
desktopName = "Blackmagic RAW Player";
exec = "blackmagicraw-player %f";
icon = "blackmagicraw-player";
mimeTypes = [
"application/x-braw-clip"
"application/x-braw-sidecar"
];
categories = [
"Video"
"AudioVideo"
];
})
(makeDesktopItem {
name = "blackmagicraw-speedtest";
desktopName = "Blackmagic RAW Speed Test";
exec = "blackmagicraw-speedtest";
icon = "blackmagicraw-speedtest";
categories = [
"Video"
"AudioVideo"
];
})
(makeDesktopItem {
name = "davinci-control-panels-setup";
desktopName = "DaVinci Control Panels Setup";
exec = "davinci-control-panels-setup";
icon = "davinci-control-panels-setup";
categories = ["Settings"];
})
(makeDesktopItem {
name = "davinci-fairlight-studio-utility";
desktopName = "Fairlight Studio Utility";
exec = "davinci-fairlight-studio-utility";
icon = "davinci-resolve${lib.optionalString studioVariant "-studio"}";
categories = [
"AudioVideo"
"Audio"
];
})
]
++ lib.optional studioVariant (makeDesktopItem {
name = "davinci-remote-monitor";
desktopName = "DaVinci Remote Monitor";
exec = "davinci-remote-monitor";
icon = "davinci-remote-monitor";
comment = "DaVinci Remote Monitor";
categories = [
"AudioVideo"
"Video"
];
});
}
);
in
buildFHSEnv {
inherit (davinci) pname version;
targetPkgs = pkgs:
with pkgs; [
alsa-lib
aprutil
bzip2
davinci
dbus
expat
fontconfig
freetype
glib
libGL
libGLU
libarchive
libcap
librsvg
libtool
libuuid
libxcrypt-legacy # provides libcrypt.so.1
libxkbcommon
nspr
ocl-icd
opencl-headers
python3
python3.pkgs.numpy
libdrm # libdrm.so.2 needed by bundled Qt6 WebEngine (Control Panels Setup)
libxkbfile # libxkbfile.so.1 needed by bundled Qt6 WebEngine (Control Panels Setup)
krb5 # libgssapi_krb5.so.2 needed by bundled Qt6 (Control Panels Setup, Fairlight Studio Utility)
nss # libsmime3.so needed by bundled Qt6 (Control Panels Setup)
libxcb-cursor # libxcb-cursor.so needed by Qt6 xcb platform plugin (Fairlight Studio Utility)
udev
xdg-utils # xdg-open needed to open URLs
libice
libsm
libx11
libxcomposite
libxcursor
libxdamage
libxext
libxfixes
libxi
libxinerama
libxrandr
libxrender
libxt
libxtst
libxxf86vm
libxcb
libxcb-util
libxcb-image
libxcb-keysyms
libxcb-render-util
libxcb-wm
xkeyboard-config
zlib
];
extraPreBwrapCmds = lib.optionalString studioVariant ''
mkdir -p ~/.local/share/DaVinciResolve/Extras || exit 1
'';
extraBwrapArgs = lib.optionals studioVariant [
''--bind "$HOME"/.local/share/DaVinciResolve/Extras ${davinci}/Extras''
];
runScript = "${bash}/bin/bash ${writeText "davinci-wrapper" ''
export QT_XKB_CONFIG_ROOT="${xkeyboard_config}/share/X11/xkb"
export QT_PLUGIN_PATH="${davinci}/libs/plugins:$QT_PLUGIN_PATH"
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib:/usr/lib32:${davinci}/libs
if [ $# -gt 0 ]; then
exec "$@"
else
exec ${davinci}/bin/resolve
fi
''}";
extraInstallCommands = let
execName = "davinci-resolve${lib.optionalString studioVariant "-studio"}";
# Each wrapper re-enters the FHS environment and execs a different binary
mkWrapper = name: bin:
writeShellScript name ''
exec "$(dirname "$0")/${execName}" ${bin} "$@"
'';
wrappers =
{
"blackmagicraw-player" = "${davinci}/BlackmagicRAWPlayer/BlackmagicRAWPlayer";
"blackmagicraw-speedtest" = "${davinci}/BlackmagicRAWSpeedTest/BlackmagicRAWSpeedTest";
"davinci-control-panels-setup" = ''"${davinci}/DaVinci Control Panels Setup/DaVinci Control Panels Setup"'';
"davinci-fairlight-studio-utility" = ''"${davinci}/Fairlight Studio Utility/Fairlight Studio Utility"'';
}
// lib.optionalAttrs studioVariant {
"davinci-remote-monitor" = ''"${davinci}/bin/DaVinci Remote Monitor"'';
};
in ''
# Desktop files
mkdir -p $out/share/applications
ln -s ${davinci}/share/applications/*.desktop $out/share/applications/
# Icons
mkdir -p $out/share/icons/hicolor/{128x128,256x256}/apps
ln -s ${davinci}/graphics/DV_Resolve.png $out/share/icons/hicolor/128x128/apps/davinci-resolve${lib.optionalString studioVariant "-studio"}.png
ln -s ${davinci}/graphics/DV_Panels.png $out/share/icons/hicolor/128x128/apps/davinci-control-panels-setup.png
${lib.optionalString studioVariant ''
ln -s ${davinci}/graphics/Remote_Monitoring.png $out/share/icons/hicolor/128x128/apps/davinci-remote-monitor.png
''}
ln -s ${davinci}/graphics/blackmagicraw-player_256x256_apps.png $out/share/icons/hicolor/256x256/apps/blackmagicraw-player.png
ln -s ${davinci}/graphics/blackmagicraw-speedtest_256x256_apps.png $out/share/icons/hicolor/256x256/apps/blackmagicraw-speedtest.png
# Wrapper scripts for additional programs
${lib.concatStringsSep "\n" (
lib.mapAttrsToList (name: bin: ''
ln -s ${mkWrapper name bin} $out/bin/${name}
'')
wrappers
)}
# MIME type definitions for .drp, .braw, etc.
mkdir -p $out/share/mime/packages
ln -s ${davinci}/share/resolve.xml $out/share/mime/packages/
ln -s ${davinci}/share/blackmagicraw.xml $out/share/mime/packages/
# Expose udev rules so NixOS can aggregate them from environment.systemPackages
mkdir -p $out/lib/udev/rules.d
ln -s ${davinci}/lib/udev/rules.d/99-BlackmagicDevices.rules $out/lib/udev/rules.d/
ln -s ${davinci}/lib/udev/rules.d/99-ResolveKeyboardHID.rules $out/lib/udev/rules.d/
ln -s ${davinci}/lib/udev/rules.d/99-DavinciPanel.rules $out/lib/udev/rules.d/
'';
passthru =
{
inherit davinci;
}
// lib.optionalAttrs (!studioVariant) {
updateScript = lib.getExe (writeShellApplication {
name = "update-davinci-resolve";
runtimeInputs = [
curl
jq
common-updater-scripts
];
text = ''
set -o errexit
drv=pkgs/by-name/da/davinci-resolve/package.nix
currentVersion=${lib.escapeShellArg davinci.version}
downloadsJSON="$(curl --fail --silent https://www.blackmagicdesign.com/api/support/us/downloads.json)"
latestLinuxVersion="$(echo "$downloadsJSON" | jq '[.downloads[] | select(.urls.Linux) | .urls.Linux[] | select(.downloadTitle | test("DaVinci Resolve")) | .downloadTitle]' | grep -oP 'DaVinci Resolve \K\d+\.\d+(\.\d+)?' | sort | tail -n 1)"
update-source-version davinci-resolve "$latestLinuxVersion" --source-key=davinci.src
# Since the standard and studio both use the same version we need to reset it before updating studio
sed -i -e "s/""$latestLinuxVersion""/""$currentVersion""/" "$drv"
latestStudioLinuxVersion="$(echo "$downloadsJSON" | jq '[.downloads[] | select(.urls.Linux) | .urls.Linux[] | select(.downloadTitle | test("DaVinci Resolve")) | .downloadTitle]' | grep -oP 'DaVinci Resolve Studio \K\d+\.\d+(\.\d+)?' | sort | tail -n 1)"
update-source-version davinci-resolve-studio "$latestStudioLinuxVersion" --source-key=davinci.src
'';
});
};
meta = {
description = "Professional video editing, color, effects and audio post-processing";
homepage = "https://www.blackmagicdesign.com/products/davinciresolve";
license = lib.licenses.unfree;
maintainers = with lib.maintainers; [
amarshall
XBagon
toXel
cafkafk
];
platforms = ["x86_64-linux"];
sourceProvenance = with lib.sourceTypes; [binaryNativeCode];
mainProgram = "davinci-resolve${lib.optionalString studioVariant "-studio"}";
};
}
+4 -2
View File
@@ -15,6 +15,7 @@
--add-flags "xcb" --add-flags "xcb"
''; '';
}); });
resolve = pkgs.callPackage ./_davinci-resolve-studio.nix {};
in { in {
options.hive.programs.creative = { options.hive.programs.creative = {
image-management = lib.mkOption { image-management = lib.mkOption {
@@ -55,6 +56,7 @@
}; };
imports = [ imports = [
self.nixosModules.lap-overlay
self.nixosModules.bulk-transcode-overlay self.nixosModules.bulk-transcode-overlay
self.nixosModules.unstable-overlay self.nixosModules.unstable-overlay
]; ];
@@ -62,7 +64,7 @@
config = { config = {
environment.systemPackages = with pkgs; environment.systemPackages = with pkgs;
lib.optionals cfg.image-editing [gimp krita drawio] lib.optionals cfg.image-editing [gimp krita drawio]
++ lib.optional cfg.image-management digikam ++ lib.optionals cfg.image-management [digikam lap]
++ lib.optionals cfg.image-raw-processing [ ++ lib.optionals cfg.image-raw-processing [
enblend-enfuse enblend-enfuse
hdrmerge hdrmerge
@@ -79,7 +81,7 @@
losslesscut-bin losslesscut-bin
] ]
++ lib.optionals cfg.video-editing-heavy [ ++ lib.optionals cfg.video-editing-heavy [
davinci-resolve resolve
kdePackages.kdenlive kdePackages.kdenlive
obs-studio obs-studio
]; ];
+40
View File
@@ -0,0 +1,40 @@
{
appimageTools,
fetchurl,
makeWrapper,
...
}: let
pname = "lap";
version = "0.3.2";
src = fetchurl {
url = "https://github.com/julyx10/lap/releases/download/v${version}/Lap_0.3.2_amd64.AppImage";
sha256 = "sha256-1lUfBBFI7agDdvUX9+U9roaao1Sn4dLhESvhAY9ROqc=";
};
appimageContents = appimageTools.extract {
inherit pname version src;
};
in
appimageTools.wrapType2 {
inherit pname version src;
nativeBuildInputs = [makeWrapper];
extraInstallCommands = ''
wrapProgram $out/bin/${pname} --add-flags "--no-sandbox"
# Create a minimal .desktop file manually
mkdir -p $out/share/applications
cat > $out/share/applications/${pname}.desktop <<EOF
[Desktop Entry]
Name=${pname}
Exec=${pname} %U
Icon=${pname}
Type=Application
Categories=Utility;
EOF
# Optionally extract icon from AppImage (if available)
# You can also manually install an icon here:
mkdir -p $out/share/icons/hicolor/0x0/apps
cp ${appimageContents}/usr/share/icons/hicolor/0x0/apps/${pname}.png $out/share/icons/hicolor/0x0/apps/${pname}.png || true
'';
}
+11
View File
@@ -0,0 +1,11 @@
{self, ...}: {
flake.overlays.lap = final: prev: {
lap = final.callPackage ./_derivation.nix {};
};
flake.nixosModules.lap-overlay = {
nixpkgs.overlays = [self.overlays.lap];
};
perSystem = {pkgs, ...}: {
packages.lap = pkgs.callPackage ./_derivation.nix {};
};
}
-1
View File
@@ -29,7 +29,6 @@
]; ];
enabledExtensions = with pkgs.spicetifyPkgs.extensions; [ enabledExtensions = with pkgs.spicetifyPkgs.extensions; [
betterGenres
catJamSynced catJamSynced
sortPlay sortPlay
wikify wikify
+30 -1
View File
@@ -2,6 +2,7 @@
flake.nixosModules.matrix = { flake.nixosModules.matrix = {
config, config,
lib, lib,
pkgs,
... ...
}: let }: let
cfg = config.hive.matrix; cfg = config.hive.matrix;
@@ -25,6 +26,12 @@
description = "The internal port of the ketesa virtual host"; description = "The internal port of the ketesa virtual host";
}; };
elementWebLocalPort = lib.mkOption {
type = lib.types.int;
default = 8476;
description = "The internal port of the element-web virtual host";
};
hiddenServiceHostnameSopsKey = lib.mkOption { hiddenServiceHostnameSopsKey = lib.mkOption {
type = lib.types.str; type = lib.types.str;
description = "The sops key of the secret containing the hostname of the hidden service"; description = "The sops key of the secret containing the hostname of the hidden service";
@@ -58,12 +65,19 @@
}; };
} }
{ {
port = 8080; port = 8081;
target = { target = {
addr = "127.0.0.1"; addr = "127.0.0.1";
port = cfg.ketesaLocalPort; port = cfg.ketesaLocalPort;
}; };
} }
{
port = 8080;
target = {
addr = "127.0.0.1";
port = cfg.elementWebLocalPort;
};
}
]; ];
}; };
}; };
@@ -81,6 +95,21 @@
root = "${ketesa-web-root}"; root = "${ketesa-web-root}";
}; };
# Virtual host for element web
services.nginx.virtualHosts."element-web-localhost" = {
listen = [
{
addr = "127.0.0.1";
port = cfg.elementWebLocalPort;
}
];
forceSSL = false;
enableACME = false;
root = pkgs.element-web.override {
conf.default_theme = "dark";
};
};
# Secret hostname for matrix-synapse # Secret hostname for matrix-synapse
sops.templates."hidden-matrix-synapse".owner = "matrix-synapse"; sops.templates."hidden-matrix-synapse".owner = "matrix-synapse";
sops.templates."hidden-matrix-synapse".content = '' sops.templates."hidden-matrix-synapse".content = ''