smap: init at 0.1.12 (#371402)
[NixPkgs.git] / pkgs / applications / audio / pianoteq / default.nix
blob91885898b7d615065f4c5fa76749bd5a945db2c7
1 { lib
2 , stdenv
3 , curl
4 , jq
5 , htmlq
6 , xorg
7 , alsa-lib
8 , freetype
9 , p7zip
10 , autoPatchelfHook
11 , writeShellScript
12 , zlib
13 , libjack2
14 , makeWrapper
15 , copyDesktopItems
16 , makeDesktopItem
17 , librsvg
19 let
20   versionForFile = v: builtins.replaceStrings [ "." ] [ "" ] v;
22   mkPianoteq =
23     { name
24     , mainProgram
25     , startupWMClass
26     , src
27     , version
28     , archdir ? if (stdenv.hostPlatform.system == "aarch64-linux") then "arm-64bit" else "x86-64bit"
29     , ...
30     }:
31     stdenv.mkDerivation rec {
32       inherit src version;
34       pname = "pianoteq-${name}";
36       unpackPhase = ''
37         ${p7zip}/bin/7z x $src
38       '';
40       nativeBuildInputs = [
41         autoPatchelfHook
42         copyDesktopItems
43         makeWrapper
44         librsvg
45       ];
47       buildInputs = [
48         (lib.getLib stdenv.cc.cc)
49         xorg.libX11 # libX11.so.6
50         xorg.libXext # libXext.so.6
51         alsa-lib # libasound.so.2
52         freetype # libfreetype.so.6
53       ];
55       desktopItems = [
56         (makeDesktopItem {
57           name = pname;
58           exec = ''"${mainProgram}"'';
59           desktopName = mainProgram;
60           icon = "pianoteq";
61           comment = meta.description;
62           categories = [ "AudioVideo" "Audio"  "Recorder" ];
63           startupNotify = false;
64           inherit startupWMClass;
65         })
66       ];
68       installPhase = ''
69         runHook preInstall
70         mkdir -p $out/bin
71         mv -t $out/bin Pianoteq*/${archdir}/*
72         for f in $out/bin/Pianoteq*; do
73           if [ -x "$f" ] && [ -f "$f" ]; then
74             wrapProgram "$f" --prefix LD_LIBRARY_PATH : ${
75               lib.makeLibraryPath (buildInputs ++ [
76                 xorg.libXcursor
77                 xorg.libXinerama
78                 xorg.libXrandr
79                 libjack2
80                 zlib
81               ])
82             }
83           fi
84         done
85         install -Dm644 ${./pianoteq.svg} $out/share/icons/hicolor/scalable/apps/pianoteq.svg
86         for size in 16 22 32 48 64 128 256; do
87           dir=$out/share/icons/hicolor/"$size"x"$size"/apps
88           mkdir -p $dir
89           rsvg-convert \
90             --keep-aspect-ratio \
91             --width $size \
92             --height $size \
93             --output $dir/pianoteq.png \
94             ${./pianoteq.svg}
95         done
96         runHook postInstall
97       '';
99       meta = with lib; {
100         homepage = "https://www.modartt.com/pianoteq";
101         description = "Software synthesizer that features real-time MIDI-control of digital physically modeled pianos and related instruments";
102         license = licenses.unfree;
103         inherit mainProgram;
104         platforms = [ "x86_64-linux" "aarch64-linux" ];
105         maintainers = with maintainers; [ mausch ners ];
106         sourceProvenance = [ lib.sourceTypes.binaryNativeCode ];
107       };
108     };
110   fetchWithCurlScript = { name, hash, script, impureEnvVars ? [ ] }:
111     stdenv.mkDerivation {
112       inherit name;
113       builder = writeShellScript "builder.sh" ''
114         source $stdenv/setup
116         curlVersion=$(${curl}/bin/curl -V | head -1 | cut -d' ' -f2)
118         # Curl flags to handle redirects, not use EPSV, handle cookies for
119         # servers to need them during redirects, and work on SSL without a
120         # certificate (this isn't a security problem because we check the
121         # cryptographic hash of the output anyway).
122         curl=(
123             ${curl}/bin/curl
124             --location
125             --max-redirs 20
126             --retry 3
127             --disable-epsv
128             --cookie-jar cookies
129             --insecure
130             --user-agent "curl/$curlVersion Nixpkgs/${lib.trivial.release}"
131             $NIX_CURL_FLAGS
132         )
134         ${script}
136       '';
137       nativeBuildInputs = [ curl ];
138       outputHashAlgo = "sha256";
139       outputHash = hash;
141       impureEnvVars = lib.fetchers.proxyImpureEnvVars ++ impureEnvVars ++ [
142         # This variable allows the user to pass additional options to curl
143         "NIX_CURL_FLAGS"
144       ];
145     };
147   fetchPianoteqTrial = { name, hash }:
148     fetchWithCurlScript {
149       inherit name hash;
150       script = ''
151         html=$(
152           "''${curl[@]}" --silent --request GET \
153             --cookie cookies \
154             --header "accept: */*" \
155             'https://www.modartt.com/try?file=${name}'
156         )
158         signature="$(echo "$html" | ${htmlq}/bin/htmlq '#download-form' --attribute action | cut -f2 -d'&' | cut -f2 -d=)"
160         json=$(
161           "''${curl[@]}" --silent --request POST \
162           --cookie cookies \
163           --header "modartt-json: request" \
164           --header "origin: https://www.modartt.com" \
165           --header "content-type: application/json; charset=UTF-8" \
166           --header "accept: application/json, text/javascript, */*" \
167           --data-raw '{"file": "${name}", "get": "url", "signature": "'"$signature"'"}' \
168           https://www.modartt.com/api/0/download
169         )
171         url=$(echo $json | ${jq}/bin/jq -r .url)
172         if [ "$url" == "null"  ]; then
173           echo "Could not get download URL, open an issue on https://github.com/NixOS/nixpkgs"
174           return 1
175         fi
176         "''${curl[@]}" --progress-bar --cookie cookies -o $out "$url"
177       '';
178     };
180   fetchPianoteqWithLogin = { name, hash }:
181     fetchWithCurlScript {
182       inherit name hash;
184       impureEnvVars = [ "NIX_MODARTT_USERNAME" "NIX_MODARTT_PASSWORD" ];
186       script = ''
187         if [ -z "''${NIX_MODARTT_USERNAME}" -o -z "''${NIX_MODARTT_PASSWORD}" ]; then
188           echo "Error: Downloading a personal Pianoteq instance requires the nix building process (nix-daemon in multi user mode) to have the NIX_MODARTT_USERNAME and NIX_MODARTT_PASSWORD env vars set." >&2
189           exit 1
190         fi
192         "''${curl[@]}" -s -o /dev/null "https://www.modartt.com/user_area"
194         ${jq}/bin/jq -n "{connect: 1, login: \"''${NIX_MODARTT_USERNAME}\", password: \"''${NIX_MODARTT_PASSWORD}\"}" > login.json
196         "''${curl[@]}" --silent --request POST \
197           --cookie cookies \
198           --referer "https://www.modartt.com/user_area" \
199           --header "modartt-json: request" \
200           --header "origin: https://www.modartt.com" \
201           --header "content-type: application/json; charset=UTF-8" \
202           --header "accept: application/json, text/javascript, */*" \
203           --data @login.json \
204           https://www.modartt.com/api/0/session
206         json=$(
207           "''${curl[@]}" --silent --request POST \
208           --cookie cookies \
209           --header "modartt-json: request" \
210           --header "origin: https://www.modartt.com" \
211           --header "content-type: application/json; charset=UTF-8" \
212           --header "accept: application/json, text/javascript, */*" \
213           --data-raw '{"file": "${name}", "get": "url"}' \
214           https://www.modartt.com/api/0/download
215         )
217         url=$(echo $json | ${jq}/bin/jq -r .url)
218         "''${curl[@]}" --progress-bar --cookie cookies -o $out "$url"
219       '';
220     };
224   # TODO currently can't install more than one because `lame` clashes
225   stage-trial = mkPianoteq rec {
226     name = "stage-trial";
227     mainProgram = "Pianoteq 8 STAGE";
228     startupWMClass = "Pianoteq STAGE Trial";
229     version = "8.2.0";
230     src = fetchPianoteqTrial {
231       name = "pianoteq_stage_linux_trial_v${versionForFile version}.7z";
232       hash = "sha256-66xbcqNrnVJ+C9FQ8Bg8A7nj/bFrjt6jKheusrXVWvI=";
233     };
234   };
235   standard-trial = mkPianoteq rec {
236     name = "standard-trial";
237     mainProgram = "Pianoteq 8";
238     startupWMClass = "Pianoteq Trial";
239     version = "8.2.0";
240     src = fetchPianoteqTrial {
241       name = "pianoteq_linux_trial_v${versionForFile version}.7z";
242       hash = "sha256-IFFQMn8EFo5X8sUZV2/vtQOA83NHEFrUsU++CvYbN1c=";
243     };
244   };
245   stage-6 = mkPianoteq rec {
246     name = "stage-6";
247     mainProgram = "Pianoteq 6 STAGE";
248     startupWMClass = "Pianoteq STAGE";
249     version = "6.7.3";
250     archdir = if (stdenv.hostPlatform.system == "aarch64-linux") then throw "Pianoteq stage-6 is not supported on aarch64-linux" else "amd64";
251     src = fetchPianoteqWithLogin {
252       name = "pianoteq_stage_linux_v${versionForFile version}.7z";
253       hash = "0jy0hkdynhwv0zhrqkby0hdphgmcc09wxmy74rhg9afm1pzl91jy";
254     };
255   };
256   stage-7 = mkPianoteq rec {
257     name = "stage-7";
258     mainProgram = "Pianoteq 7 STAGE";
259     startupWMClass = "Pianoteq STAGE";
260     version = "7.3.0";
261     src = fetchPianoteqWithLogin {
262       name = "pianoteq_stage_linux_v${versionForFile version}.7z";
263       hash = "05w7sv9v38r6ljz9xai816w5z2qqwx88hcfjm241fvgbs54125hx";
264     };
265   };
266   standard-8 = mkPianoteq rec {
267     name = "standard-8";
268     mainProgram = "Pianoteq 8";
269     startupWMClass = "Pianoteq";
270     version = "8.2.0";
271     src = fetchPianoteqWithLogin {
272       name = "pianoteq_linux_v${versionForFile version}.7z";
273       hash = "sha256-ME0urUc1jwUKpg+5BdawYo9WhvMsrztYTVOrJTVxtkY=";
274     };
275   };
276   # TODO other paid binaries, I don't own that so I don't know their hash.