Luke Granger-Brown
57725ef3ec
git-subtree-dir: third_party/nixpkgs git-subtree-split: 76612b17c0ce71689921ca12d9ffdc9c23ce40b2
295 lines
9.2 KiB
Nix
295 lines
9.2 KiB
Nix
{ stdenv
|
|
, lib
|
|
, cacert
|
|
, curl
|
|
, runCommandLocal
|
|
, unzip
|
|
, appimage-run
|
|
, addDriverRunpath
|
|
, dbus
|
|
, libGLU
|
|
, xorg
|
|
, buildFHSEnv
|
|
, buildFHSEnvChroot
|
|
, bash
|
|
, writeText
|
|
, ocl-icd
|
|
, xkeyboard_config
|
|
, glib
|
|
, libarchive
|
|
, libxcrypt
|
|
, python3
|
|
, aprutil
|
|
, makeDesktopItem
|
|
, copyDesktopItems
|
|
, jq
|
|
|
|
, studioVariant ? false
|
|
|
|
, common-updater-scripts
|
|
, writeShellApplication
|
|
}:
|
|
|
|
let
|
|
davinci = (
|
|
stdenv.mkDerivation rec {
|
|
pname = "davinci-resolve${lib.optionalString studioVariant "-studio"}";
|
|
version = "19.0.2";
|
|
|
|
nativeBuildInputs = [
|
|
(appimage-run.override { buildFHSEnv = buildFHSEnvChroot; } )
|
|
addDriverRunpath
|
|
copyDesktopItems
|
|
unzip
|
|
];
|
|
|
|
# Pretty sure, there are missing dependencies ...
|
|
buildInputs = [
|
|
libGLU
|
|
xorg.libXxf86vm
|
|
];
|
|
|
|
src = runCommandLocal "${pname}-src.zip"
|
|
rec {
|
|
outputHashMode = "recursive";
|
|
outputHashAlgo = "sha256";
|
|
outputHash =
|
|
if studioVariant
|
|
then "sha256-q11stWFWRDUebAUzGH23R3Spd3EdDG85+6yB/srYCJY="
|
|
else "sha256-dYTrO0wpIN68WhBovmYLK5uWOQ1nubpSyKqPCDMPMiM=";
|
|
|
|
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-run ${lib.escapeShellArg appimageName} -i -y -n -C $out
|
|
|
|
mkdir -p $out/{configs,DolbyVision,easyDCP,Fairlight,GPUCache,logs,Media,"Resolve Disk Database",.crashreport,.license,.LUT}
|
|
runHook postInstall
|
|
'';
|
|
|
|
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
|
|
ln -s $out/libs/libcrypto.so.1.1 $out/libs/libcrypt.so.1
|
|
'';
|
|
|
|
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"
|
|
];
|
|
})
|
|
];
|
|
}
|
|
);
|
|
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 # provides libcrypt.so.1
|
|
libxkbcommon
|
|
nspr
|
|
ocl-icd
|
|
opencl-headers
|
|
python3
|
|
python3.pkgs.numpy
|
|
udev
|
|
xdg-utils # xdg-open needed to open URLs
|
|
xorg.libICE
|
|
xorg.libSM
|
|
xorg.libX11
|
|
xorg.libXcomposite
|
|
xorg.libXcursor
|
|
xorg.libXdamage
|
|
xorg.libXext
|
|
xorg.libXfixes
|
|
xorg.libXi
|
|
xorg.libXinerama
|
|
xorg.libXrandr
|
|
xorg.libXrender
|
|
xorg.libXt
|
|
xorg.libXtst
|
|
xorg.libXxf86vm
|
|
xorg.libxcb
|
|
xorg.xcbutil
|
|
xorg.xcbutilimage
|
|
xorg.xcbutilkeysyms
|
|
xorg.xcbutilrenderutil
|
|
xorg.xcbutilwm
|
|
xorg.xkeyboardconfig
|
|
zlib
|
|
];
|
|
|
|
extraPreBwrapCmds = lib.optionalString studioVariant ''
|
|
mkdir -p ~/.local/share/DaVinciResolve/license || exit 1
|
|
'';
|
|
|
|
extraBwrapArgs = lib.optionals studioVariant [
|
|
"--bind \"$HOME\"/.local/share/DaVinciResolve/license ${davinci}/.license"
|
|
];
|
|
|
|
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
|
|
${davinci}/bin/resolve
|
|
''
|
|
}";
|
|
|
|
extraInstallCommands = ''
|
|
mkdir -p $out/share/applications $out/share/icons/hicolor/128x128/apps
|
|
ln -s ${davinci}/share/applications/*.desktop $out/share/applications/
|
|
ln -s ${davinci}/graphics/DV_Resolve.png $out/share/icons/hicolor/128x128/apps/davinci-resolve${lib.optionalString studioVariant "-studio"}.png
|
|
'';
|
|
|
|
passthru = {
|
|
inherit davinci;
|
|
updateScript = lib.getExe (writeShellApplication {
|
|
name = "update-davinci-resolve";
|
|
runtimeInputs = [ curl jq common-updater-scripts ];
|
|
text = ''
|
|
set -o errexit
|
|
drv=pkgs/applications/video/davinci-resolve/default.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 = with lib; {
|
|
description = "Professional video editing, color, effects and audio post-processing";
|
|
homepage = "https://www.blackmagicdesign.com/products/davinciresolve";
|
|
license = licenses.unfree;
|
|
maintainers = with maintainers; [ amarshall jshcmpbll orivej ];
|
|
platforms = [ "x86_64-linux" ];
|
|
sourceProvenance = with sourceTypes; [ binaryNativeCode ];
|
|
mainProgram = "davinci-resolve${lib.optionalString studioVariant "-studio"}";
|
|
};
|
|
}
|