]>
Commit | Line | Data |
---|---|---|
8a05c7fb | 1 | { ldap ? false, sendmail ? false, light ? null, syden ? false, runCommand, libsass |
b639cc33 | 2 | , lib, stdenv, rsync, fetchzip, youtube-dl, fetchurl, mylibs, python, nodejs, nodePackages, yarn2nix-moretea }: |
598aaa37 IB |
3 | let |
4 | nodeHeaders = fetchurl { | |
5 | url = "https://nodejs.org/download/release/v${nodejs.version}/node-v${nodejs.version}-headers.tar.gz"; | |
2053ddac | 6 | sha256 = "12415ss4fxxafp3w8rxp2jbb16y0d7f01b7wv72nmy3cwiqxqkhn"; |
598aaa37 | 7 | }; |
b639cc33 IB |
8 | source = mylibs.fetchedGithub ./peertube.json; |
9 | patchedSource = stdenv.mkDerivation (source // rec { | |
10 | phases = [ "unpackPhase" "patchPhase" "installPhase" ]; | |
8a05c7fb IB |
11 | patches = [ ./yarn_fix_http_node.patch ] |
12 | ++ lib.optionals ldap [ ./ldap.patch ] | |
13 | ++ lib.optionals sendmail [ ./sendmail.patch ] | |
14 | ++ lib.optionals syden [ ./syden.patch ]; | |
b639cc33 IB |
15 | installPhase = let |
16 | # Peertube supports several languages, but they take a very long | |
17 | # time to build. The build script accepts --light which builds | |
18 | # only English, and --light-fr which only builds English + French. | |
19 | # This small hack permits to builds only English + A chosen | |
20 | # language depending on the value of "light" | |
21 | # Default (null) is to build every language | |
22 | lightFix = if light == true || light == null then "" else '' | |
23 | sed -i -e "s/fr-FR/${light}/g" -e "s/--light-fr/--light-language/" $out/scripts/build/client.sh | |
24 | ''; | |
25 | in '' | |
598aaa37 | 26 | mkdir $out |
b639cc33 IB |
27 | cp -a . $out/ |
28 | ${lightFix} | |
598aaa37 IB |
29 | ''; |
30 | }); | |
b639cc33 IB |
31 | serverPatchedPackage = runCommand "server-package" {} '' |
32 | mkdir -p $out | |
33 | cp ${patchedSource}/package.json $out/ | |
34 | cp ${patchedSource}/yarn.lock $out/ | |
35 | ''; | |
36 | clientPatchedPackage = runCommand "client-package" {} '' | |
37 | mkdir -p $out | |
38 | cp ${patchedSource}/client/package.json $out/ | |
39 | cp ${patchedSource}/client/yarn.lock $out/ | |
40 | ''; | |
41 | ||
42 | yarnModulesConfig = { | |
b639cc33 IB |
43 | bcrypt = { |
44 | buildInputs = [ nodePackages.node-pre-gyp ]; | |
45 | postInstall = let | |
2053ddac | 46 | node_module_version = "72"; |
b639cc33 | 47 | bcrypt_lib = fetchurl { |
2053ddac IB |
48 | url = "https://github.com/kelektiv/node.bcrypt.js/releases/download/v3.0.7/bcrypt_lib-v3.0.7-node-v${node_module_version}-linux-x64-glibc.tar.gz"; |
49 | sha256 = "0kpm9j0yc4lqsafldfsql3m72rr1fapljlb6ddxvy3zi13rb7ppx"; | |
b639cc33 IB |
50 | }; |
51 | in | |
52 | '' | |
2053ddac IB |
53 | if [ "$(node -e "console.log(process.versions.modules)")" != "${node_module_version}" ]; then |
54 | echo "mismatching version with nodejs please update bcrypt derivation" | |
55 | false | |
56 | fi | |
b639cc33 IB |
57 | mkdir lib && tar -C lib -xf ${bcrypt_lib} |
58 | patchShebangs ../node-pre-gyp | |
59 | npm run install | |
60 | ''; | |
61 | }; | |
62 | dtrace-provider = { | |
63 | buildInputs = [ python nodePackages.node-gyp ]; | |
64 | postInstall = '' | |
65 | npx node-gyp rebuild --tarball=${nodeHeaders} | |
66 | ''; | |
67 | }; | |
68 | node-sass = { | |
69 | buildInputs = [ libsass python ]; | |
70 | postInstall = | |
71 | '' | |
72 | node scripts/build.js --tarball=${nodeHeaders} | |
73 | ''; | |
74 | }; | |
75 | ||
76 | sharp = { | |
77 | buildInputs = [ python nodePackages.node-gyp ]; | |
78 | postInstall = | |
79 | let | |
80 | tarball = fetchurl { | |
81 | url = "https://github.com/lovell/sharp-libvips/releases/download/v8.8.1/libvips-8.8.1-linux-x64.tar.gz"; | |
82 | sha256 = "0xqv61g6s6rkvc31zq9a3bf8rp56ijnpw0xhr91hc88asqprd5yh"; | |
598aaa37 IB |
83 | }; |
84 | in | |
b639cc33 IB |
85 | '' |
86 | mkdir vendor | |
87 | tar -C vendor -xf ${tarball} | |
88 | patchShebangs ../prebuild-install | |
89 | npx node install/libvips | |
90 | npx node install/dll-copy | |
91 | npx prebuild-install || npx node-gyp rebuild --tarball=${nodeHeaders} | |
92 | ''; | |
93 | }; | |
94 | utf-8-validate = { | |
95 | buildInputs = [ nodePackages.node-gyp-build ]; | |
598aaa37 | 96 | }; |
b639cc33 IB |
97 | youtube-dl = { |
98 | postInstall = '' | |
99 | mkdir bin | |
100 | ln -s ${youtube-dl}/bin/youtube-dl bin/youtube-dl | |
101 | cat > bin/details <<EOF | |
102 | {"version":"${youtube-dl.version}","path":null,"exec":"youtube-dl"} | |
103 | EOF | |
104 | ''; | |
105 | }; | |
106 | }; | |
107 | serverYarnModulesArg = rec { | |
108 | pname = "peertube-server-yarn-modules"; | |
109 | version = source.version; | |
110 | name = "${pname}-${version}"; | |
111 | packageJSON = "${serverPatchedPackage}/package.json"; | |
112 | yarnLock = "${serverPatchedPackage}/yarn.lock"; | |
113 | yarnNix = ./server-yarn-packages.nix; | |
114 | pkgConfig = yarnModulesConfig; | |
598aaa37 | 115 | }; |
b639cc33 IB |
116 | clientYarnModulesArg = rec { |
117 | pname = "peertube-client-yarn-modules"; | |
118 | version = source.version; | |
119 | name = "${pname}-${version}"; | |
120 | packageJSON = "${clientPatchedPackage}/package.json"; | |
121 | yarnLock = "${clientPatchedPackage}/yarn.lock"; | |
122 | yarnNix = ./client-yarn-packages.nix; | |
123 | pkgConfig = yarnModulesConfig; | |
124 | }; | |
125 | yarnModulesNoWorkspace = args: (yarn2nix-moretea.mkYarnModules args).overrideAttrs(old: { | |
126 | buildPhase = builtins.replaceStrings [" ./package.json"] [" /dev/null; cp deps/*/package.json ."] old.buildPhase; | |
127 | }); | |
128 | ||
129 | patchedPackages = stdenv.mkDerivation (source // rec { | |
130 | patches = if ldap then [ ./ldap.patch ] else [ ./yarn_fix_http_node.patch ]; | |
131 | installPhase = '' | |
132 | mkdir $out | |
133 | cp package.json yarn.lock $out/ | |
134 | ''; | |
135 | }); | |
136 | serverYarnModules = yarnModulesNoWorkspace serverYarnModulesArg; | |
137 | serverYarnModulesProd = yarnModulesNoWorkspace (serverYarnModulesArg // { yarnFlags = yarn2nix-moretea.defaultYarnFlags ++ [ "--production" ]; }); | |
138 | clientYarnModules = yarnModulesNoWorkspace clientYarnModulesArg; | |
139 | ||
140 | server = stdenv.mkDerivation ({ | |
141 | pname = "peertube-server"; | |
142 | version = source.version; | |
143 | src = patchedSource; | |
598aaa37 | 144 | buildPhase = '' |
b639cc33 | 145 | ln -s ${serverYarnModules}/node_modules . |
598aaa37 IB |
146 | npm run build:server |
147 | ''; | |
148 | installPhase = '' | |
149 | mkdir $out | |
b639cc33 | 150 | cp -a dist $out |
598aaa37 | 151 | ''; |
b639cc33 | 152 | buildInputs = [ nodejs serverYarnModules ]; |
598aaa37 | 153 | }); |
b639cc33 IB |
154 | |
155 | client = stdenv.mkDerivation ({ | |
156 | pname = "peertube-client"; | |
157 | version = source.version; | |
158 | src = patchedSource; | |
159 | buildPhase = let | |
160 | lightArg = if light == null then "" else if light == true then "--light" else "--light-language"; | |
161 | in '' | |
162 | ln -s ${serverYarnModules}/node_modules . | |
163 | cp -a ${clientYarnModules}/node_modules client/ | |
164 | chmod +w client/node_modules | |
165 | patchShebangs . | |
166 | npm run build:client -- ${lightArg} | |
167 | ''; | |
168 | installPhase = '' | |
169 | mkdir $out | |
170 | cp -a client/dist $out | |
171 | ''; | |
172 | buildInputs = [ nodejs clientYarnModules ]; | |
173 | }); | |
174 | ||
175 | package = stdenv.mkDerivation rec { | |
176 | version = source.version; | |
177 | pname = "peertube"; | |
178 | src = patchedSource; | |
598aaa37 | 179 | buildPhase = '' |
b639cc33 IB |
180 | ln -s ${serverYarnModulesProd}/node_modules . |
181 | ln -s ${clientYarnModules}/node_modules client/ | |
182 | rm -rf dist && cp -a ${server}/dist dist | |
183 | rm -rf client/dist && cp -a ${client}/dist client/ | |
598aaa37 IB |
184 | ''; |
185 | installPhase = '' | |
186 | mkdir $out | |
187 | cp -a * $out | |
188 | ln -s /tmp $out/.cache | |
189 | ''; | |
b639cc33 IB |
190 | |
191 | meta = { | |
192 | description = "A free software to take back control of your videos"; | |
193 | ||
194 | longDescription = '' | |
195 | PeerTube aspires to be a decentralized and free/libre alternative to video | |
196 | broadcasting services. | |
197 | PeerTube is not meant to become a huge platform that would centralize | |
198 | videos from all around the world. Rather, it is a network of | |
199 | inter-connected small videos hosters. | |
200 | Anyone with a modicum of technical skills can host a PeerTube server, aka | |
201 | an instance. Each instance hosts its users and their videos. In this way, | |
202 | every instance is created, moderated and maintained independently by | |
203 | various administrators. | |
204 | You can still watch from your account videos hosted by other instances | |
205 | though if the administrator of your instance had previously connected it | |
206 | with other instances. | |
207 | ''; | |
208 | ||
209 | license = stdenv.lib.licenses.agpl3Plus; | |
210 | ||
211 | homepage = "https://joinpeertube.org/"; | |
212 | ||
213 | platforms = stdenv.lib.platforms.linux; # not sure here | |
214 | maintainers = with stdenv.lib.maintainers; [ matthiasbeyer immae ]; | |
215 | }; | |
216 | }; | |
217 | in | |
218 | package |