nixpkgs mirror (for testing)
github.com/NixOS/nixpkgs
nix
1{
2 stdenv,
3 lib,
4 cacert,
5 curl,
6 runCommandLocal,
7 unzip,
8 appimage-run,
9 addDriverRunpath,
10 dbus,
11 libGLU,
12 xorg,
13 buildFHSEnv,
14 buildFHSEnvChroot,
15 bash,
16 writeText,
17 ocl-icd,
18 xkeyboard_config,
19 glib,
20 libarchive,
21 libxcrypt,
22 python3,
23 aprutil,
24 makeDesktopItem,
25 copyDesktopItems,
26 jq,
27
28 studioVariant ? false,
29
30 common-updater-scripts,
31 writeShellApplication,
32}:
33
34let
35 davinci = (
36 stdenv.mkDerivation rec {
37 pname = "davinci-resolve${lib.optionalString studioVariant "-studio"}";
38 version = "20.0";
39
40 nativeBuildInputs = [
41 (appimage-run.override { buildFHSEnv = buildFHSEnvChroot; })
42 addDriverRunpath
43 copyDesktopItems
44 unzip
45 ];
46
47 # Pretty sure, there are missing dependencies ...
48 buildInputs = [
49 libGLU
50 xorg.libXxf86vm
51 ];
52
53 src =
54 runCommandLocal "${pname}-src.zip"
55 rec {
56 outputHashMode = "recursive";
57 outputHashAlgo = "sha256";
58 outputHash =
59 if studioVariant then
60 "sha256-q0jfP/DtroK7Dzj/BiB1JmYPihCma/OgcGmQOE/uwGY="
61 else
62 "sha256-JM/V449KUEXuQmRpyQC2z9DRmID7hJ3Mnt5N6p/HOXA=";
63
64 impureEnvVars = lib.fetchers.proxyImpureEnvVars;
65
66 nativeBuildInputs = [
67 curl
68 jq
69 ];
70
71 # ENV VARS
72 SSL_CERT_FILE = "${cacert}/etc/ssl/certs/ca-bundle.crt";
73
74 # Get linux.downloadId from HTTP response on https://www.blackmagicdesign.com/products/davinciresolve
75 REFERID = "263d62f31cbb49e0868005059abcb0c9";
76 DOWNLOADSURL = "https://www.blackmagicdesign.com/api/support/us/downloads.json";
77 SITEURL = "https://www.blackmagicdesign.com/api/register/us/download";
78 PRODUCT = "DaVinci Resolve${lib.optionalString studioVariant " Studio"}";
79 VERSION = version;
80
81 USERAGENT = builtins.concatStringsSep " " [
82 "User-Agent: Mozilla/5.0 (X11; Linux ${stdenv.hostPlatform.linuxArch})"
83 "AppleWebKit/537.36 (KHTML, like Gecko)"
84 "Chrome/77.0.3865.75"
85 "Safari/537.36"
86 ];
87
88 REQJSON = builtins.toJSON {
89 "firstname" = "NixOS";
90 "lastname" = "Linux";
91 "email" = "someone@nixos.org";
92 "phone" = "+31 71 452 5670";
93 "country" = "nl";
94 "street" = "-";
95 "state" = "Province of Utrecht";
96 "city" = "Utrecht";
97 "product" = PRODUCT;
98 };
99
100 }
101 ''
102 DOWNLOADID=$(
103 curl --silent --compressed "$DOWNLOADSURL" \
104 | jq --raw-output '.downloads[] | .urls.Linux?[]? | select(.downloadTitle | test("^'"$PRODUCT $VERSION"'( Update)?$")) | .downloadId'
105 )
106 echo "downloadid is $DOWNLOADID"
107 test -n "$DOWNLOADID"
108 RESOLVEURL=$(curl \
109 --silent \
110 --header 'Host: www.blackmagicdesign.com' \
111 --header 'Accept: application/json, text/plain, */*' \
112 --header 'Origin: https://www.blackmagicdesign.com' \
113 --header "$USERAGENT" \
114 --header 'Content-Type: application/json;charset=UTF-8' \
115 --header "Referer: https://www.blackmagicdesign.com/support/download/$REFERID/Linux" \
116 --header 'Accept-Encoding: gzip, deflate, br' \
117 --header 'Accept-Language: en-US,en;q=0.9' \
118 --header 'Authority: www.blackmagicdesign.com' \
119 --header 'Cookie: _ga=GA1.2.1849503966.1518103294; _gid=GA1.2.953840595.1518103294' \
120 --data-ascii "$REQJSON" \
121 --compressed \
122 "$SITEURL/$DOWNLOADID")
123 echo "resolveurl is $RESOLVEURL"
124
125 curl \
126 --retry 3 --retry-delay 3 \
127 --header "Upgrade-Insecure-Requests: 1" \
128 --header "$USERAGENT" \
129 --header "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8" \
130 --header "Accept-Language: en-US,en;q=0.9" \
131 --compressed \
132 "$RESOLVEURL" \
133 > $out
134 '';
135
136 # The unpack phase won't generate a directory
137 sourceRoot = ".";
138
139 installPhase =
140 let
141 appimageName = "DaVinci_Resolve_${lib.optionalString studioVariant "Studio_"}${version}_Linux.run";
142 in
143 ''
144 runHook preInstall
145
146 export HOME=$PWD/home
147 mkdir -p $HOME
148
149 mkdir -p $out
150 test -e ${lib.escapeShellArg appimageName}
151 appimage-run ${lib.escapeShellArg appimageName} -i -y -n -C $out
152
153 mkdir -p $out/{configs,DolbyVision,easyDCP,Fairlight,GPUCache,logs,Media,"Resolve Disk Database",.crashreport,.license,.LUT}
154 runHook postInstall
155 '';
156
157 dontStrip = true;
158
159 postFixup = ''
160 for program in $out/bin/*; do
161 isELF "$program" || continue
162 addDriverRunpath "$program"
163 done
164
165 for program in $out/libs/*; do
166 isELF "$program" || continue
167 if [[ "$program" != *"libcudnn_cnn_infer"* ]];then
168 echo $program
169 addDriverRunpath "$program"
170 fi
171 done
172 ln -s $out/libs/libcrypto.so.1.1 $out/libs/libcrypt.so.1
173 '';
174
175 desktopItems = [
176 (makeDesktopItem {
177 name = "davinci-resolve${lib.optionalString studioVariant "-studio"}";
178 desktopName = "Davinci Resolve${lib.optionalString studioVariant " Studio"}";
179 genericName = "Video Editor";
180 exec = "davinci-resolve${lib.optionalString studioVariant "-studio"}";
181 icon = "davinci-resolve${lib.optionalString studioVariant "-studio"}";
182 comment = "Professional video editing, color, effects and audio post-processing";
183 categories = [
184 "AudioVideo"
185 "AudioVideoEditing"
186 "Video"
187 "Graphics"
188 ];
189 })
190 ];
191 }
192 );
193in
194buildFHSEnv {
195 inherit (davinci) pname version;
196
197 targetPkgs =
198 pkgs: with pkgs; [
199 alsa-lib
200 aprutil
201 bzip2
202 davinci
203 dbus
204 expat
205 fontconfig
206 freetype
207 glib
208 libGL
209 libGLU
210 libarchive
211 libcap
212 librsvg
213 libtool
214 libuuid
215 libxcrypt # provides libcrypt.so.1
216 libxkbcommon
217 nspr
218 ocl-icd
219 opencl-headers
220 python3
221 python3.pkgs.numpy
222 udev
223 xdg-utils # xdg-open needed to open URLs
224 xorg.libICE
225 xorg.libSM
226 xorg.libX11
227 xorg.libXcomposite
228 xorg.libXcursor
229 xorg.libXdamage
230 xorg.libXext
231 xorg.libXfixes
232 xorg.libXi
233 xorg.libXinerama
234 xorg.libXrandr
235 xorg.libXrender
236 xorg.libXt
237 xorg.libXtst
238 xorg.libXxf86vm
239 xorg.libxcb
240 xorg.xcbutil
241 xorg.xcbutilimage
242 xorg.xcbutilkeysyms
243 xorg.xcbutilrenderutil
244 xorg.xcbutilwm
245 xorg.xkeyboardconfig
246 zlib
247 ];
248
249 extraPreBwrapCmds = lib.optionalString studioVariant ''
250 mkdir -p ~/.local/share/DaVinciResolve/license || exit 1
251 '';
252
253 extraBwrapArgs = lib.optionals studioVariant [
254 "--bind \"$HOME\"/.local/share/DaVinciResolve/license ${davinci}/.license"
255 ];
256
257 runScript = "${bash}/bin/bash ${writeText "davinci-wrapper" ''
258 export QT_XKB_CONFIG_ROOT="${xkeyboard_config}/share/X11/xkb"
259 export QT_PLUGIN_PATH="${davinci}/libs/plugins:$QT_PLUGIN_PATH"
260 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib:/usr/lib32:${davinci}/libs
261 ${davinci}/bin/resolve
262 ''}";
263
264 extraInstallCommands = ''
265 mkdir -p $out/share/applications $out/share/icons/hicolor/128x128/apps
266 ln -s ${davinci}/share/applications/*.desktop $out/share/applications/
267 ln -s ${davinci}/graphics/DV_Resolve.png $out/share/icons/hicolor/128x128/apps/davinci-resolve${lib.optionalString studioVariant "-studio"}.png
268 '';
269
270 passthru = {
271 inherit davinci;
272 updateScript = lib.getExe (writeShellApplication {
273 name = "update-davinci-resolve";
274 runtimeInputs = [
275 curl
276 jq
277 common-updater-scripts
278 ];
279 text = ''
280 set -o errexit
281 drv=pkgs/by-name/da/davinci-resolve/package.nix
282 currentVersion=${lib.escapeShellArg davinci.version}
283 downloadsJSON="$(curl --fail --silent https://www.blackmagicdesign.com/api/support/us/downloads.json)"
284
285 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)"
286 update-source-version davinci-resolve "$latestLinuxVersion" --source-key=davinci.src
287
288 # Since the standard and studio both use the same version we need to reset it before updating studio
289 sed -i -e "s/""$latestLinuxVersion""/""$currentVersion""/" "$drv"
290
291 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)"
292 update-source-version davinci-resolve-studio "$latestStudioLinuxVersion" --source-key=davinci.src
293 '';
294 });
295 };
296
297 meta = with lib; {
298 description = "Professional video editing, color, effects and audio post-processing";
299 homepage = "https://www.blackmagicdesign.com/products/davinciresolve";
300 license = licenses.unfree;
301 maintainers = with maintainers; [
302 amarshall
303 jshcmpbll
304 orivej
305 XBagon
306 ];
307 platforms = [ "x86_64-linux" ];
308 sourceProvenance = with sourceTypes; [ binaryNativeCode ];
309 mainProgram = "davinci-resolve${lib.optionalString studioVariant "-studio"}";
310 };
311}