-{ ldap ? false
-, lib, stdenv, fetchzip, youtube-dl, fetchurl, mylibs, python, nodejs, nodePackages }:
+{ ldap ? false, sendmail ? false, light ? null, syden ? false, runCommand, libsass
+, lib, stdenv, rsync, fetchzip, youtube-dl, fetchurl, mylibs, python, nodejs, nodePackages, yarn2nix-moretea }:
let
nodeHeaders = fetchurl {
url = "https://nodejs.org/download/release/v${nodejs.version}/node-v${nodejs.version}-headers.tar.gz";
- sha256 = "1g6zi96k8sbim8wa8rzskxy44mgpcv1mn2bs8p4mq36w3kwglwyj";
+ sha256 = "12415ss4fxxafp3w8rxp2jbb16y0d7f01b7wv72nmy3cwiqxqkhn";
};
- patchedPackages = stdenv.mkDerivation (mylibs.fetchedGithub ./peertube.json // rec {
- patches = if ldap then [ ./ldap.patch ././yarn_fix_bluebird_ldap.patch ] else [ ./yarn_fix_bluebird.patch ];
- installPhase = ''
+ source = mylibs.fetchedGithub ./peertube.json;
+ patchedSource = stdenv.mkDerivation (source // rec {
+ phases = [ "unpackPhase" "patchPhase" "installPhase" ];
+ patches = [ ./yarn_fix_http_node.patch ]
+ ++ lib.optionals ldap [ ./ldap.patch ]
+ ++ lib.optionals sendmail [ ./sendmail.patch ]
+ ++ lib.optionals syden [ ./syden.patch ];
+ installPhase = let
+ # Peertube supports several languages, but they take a very long
+ # time to build. The build script accepts --light which builds
+ # only English, and --light-fr which only builds English + French.
+ # This small hack permits to builds only English + A chosen
+ # language depending on the value of "light"
+ # Default (null) is to build every language
+ lightFix = if light == true || light == null then "" else ''
+ sed -i -e "s/fr-FR/${light}/g" -e "s/--light-fr/--light-language/" $out/scripts/build/client.sh
+ '';
+ in ''
mkdir $out
- cp package.json yarn.lock $out/
+ cp -a . $out/
+ ${lightFix}
'';
});
- # if yarn complains about
- # TypeError: Cannot read property 'lang' of undefined yarn
- # make sure that all package names in yarn-packages.nix finish in
- # .tar.gz where due (especially jsonld-signatures)
- # Most errors where due to jsonld-signature (name, git version, etc.)
- # or bluebird (3.5.18 instead vs 3.5.21)
- yarnModulesArg = rec {
- pname = "peertube-yarn-modules";
- version = "1.2.0";
- name = "peertube-yarn-modules-${version}";
- packageJSON = "${patchedPackages}/package.json";
- yarnLock = "${patchedPackages}/yarn.lock";
- yarnNix = ./yarn-packages.nix;
- pkgConfig = {
- all = {
- buildInputs = [ mylibs.yarn2nixPackage.src ];
- };
- bcrypt = {
- buildInputs = [ nodePackages.node-pre-gyp ];
- postInstall = let
- bcrypt_lib = fetchurl {
- url = "https://github.com/kelektiv/node.bcrypt.js/releases/download/v3.0.2/bcrypt_lib-v3.0.2-node-v64-linux-x64-glibc.tar.gz";
- sha256 = "0i0dx4h52fqi3mda2zzqrxp2fh7spbvf7h88mjk218h8d7vl53yx";
+ serverPatchedPackage = runCommand "server-package" {} ''
+ mkdir -p $out
+ cp ${patchedSource}/package.json $out/
+ cp ${patchedSource}/yarn.lock $out/
+ '';
+ clientPatchedPackage = runCommand "client-package" {} ''
+ mkdir -p $out
+ cp ${patchedSource}/client/package.json $out/
+ cp ${patchedSource}/client/yarn.lock $out/
+ '';
+
+ yarnModulesConfig = {
+ bcrypt = {
+ buildInputs = [ nodePackages.node-pre-gyp ];
+ postInstall = let
+ node_module_version = "72";
+ bcrypt_lib = fetchurl {
+ 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";
+ sha256 = "0kpm9j0yc4lqsafldfsql3m72rr1fapljlb6ddxvy3zi13rb7ppx";
+ };
+ in
+ ''
+ if [ "$(node -e "console.log(process.versions.modules)")" != "${node_module_version}" ]; then
+ echo "mismatching version with nodejs please update bcrypt derivation"
+ false
+ fi
+ mkdir lib && tar -C lib -xf ${bcrypt_lib}
+ patchShebangs ../node-pre-gyp
+ npm run install
+ '';
+ };
+ dtrace-provider = {
+ buildInputs = [ python nodePackages.node-gyp ];
+ postInstall = ''
+ npx node-gyp rebuild --tarball=${nodeHeaders}
+ '';
+ };
+ node-sass = {
+ buildInputs = [ libsass python ];
+ postInstall =
+ ''
+ node scripts/build.js --tarball=${nodeHeaders}
+ '';
+ };
+
+ sharp = {
+ buildInputs = [ python nodePackages.node-gyp ];
+ postInstall =
+ let
+ tarball = fetchurl {
+ url = "https://github.com/lovell/sharp-libvips/releases/download/v8.8.1/libvips-8.8.1-linux-x64.tar.gz";
+ sha256 = "0xqv61g6s6rkvc31zq9a3bf8rp56ijnpw0xhr91hc88asqprd5yh";
};
in
- ''
- mkdir lib && tar -C lib -xf ${bcrypt_lib}
- patchShebangs ../node-pre-gyp
- npm run install
- '';
- };
- dtrace-provider = {
- buildInputs = [ python nodePackages.node-gyp ];
- postInstall = ''
- npx node-gyp rebuild --tarball=${nodeHeaders}
- '';
- };
- rdf-canonize = {
- buildInputs = [ python nodePackages.node-gyp ];
- postInstall = ''
- npx node-gyp rebuild --tarball=${nodeHeaders}
- '';
- };
- sharp = {
- buildInputs = [ python nodePackages.node-gyp ];
- postInstall =
- let
- tarball = fetchurl {
- url = "https://github.com/lovell/sharp-libvips/releases/download/v8.7.0/libvips-8.7.0-linux-x64.tar.gz";
- sha256 = "1sq7qrp1q1pcrd165c3sky7qjx1kqihfpr4ailb5k73rwyh8lxg4";
- };
- in
- ''
- mkdir vendor
- tar -C vendor -xf ${tarball}
- patchShebangs ../prebuild-install
- npx node install/libvips
- npx node install/dll-copy
- npx prebuild-install || npx node-gyp rebuild --tarball=${nodeHeaders}
- '';
- };
- utf-8-validate = {
- buildInputs = [ nodePackages.node-gyp-build ];
- };
- youtube-dl = {
- postInstall = ''
- mkdir bin
- ln -s ${youtube-dl}/bin/youtube-dl bin/youtube-dl
- cat > bin/details <<EOF
- {"version":"${youtube-dl.version}","path":null,"exec":"youtube-dl"}
- EOF
- '';
- };
+ ''
+ mkdir vendor
+ tar -C vendor -xf ${tarball}
+ patchShebangs ../prebuild-install
+ npx node install/libvips
+ npx node install/dll-copy
+ npx prebuild-install || npx node-gyp rebuild --tarball=${nodeHeaders}
+ '';
+ };
+ utf-8-validate = {
+ buildInputs = [ nodePackages.node-gyp-build ];
};
+ youtube-dl = {
+ postInstall = ''
+ mkdir bin
+ ln -s ${youtube-dl}/bin/youtube-dl bin/youtube-dl
+ cat > bin/details <<EOF
+ {"version":"${youtube-dl.version}","path":null,"exec":"youtube-dl"}
+ EOF
+ '';
+ };
+ };
+ serverYarnModulesArg = rec {
+ pname = "peertube-server-yarn-modules";
+ version = source.version;
+ name = "${pname}-${version}";
+ packageJSON = "${serverPatchedPackage}/package.json";
+ yarnLock = "${serverPatchedPackage}/yarn.lock";
+ yarnNix = ./server-yarn-packages.nix;
+ pkgConfig = yarnModulesConfig;
};
- yarnModules = mylibs.yarn2nixPackage.mkYarnModules yarnModulesArg;
- yarnModulesProd = mylibs.yarn2nixPackage.mkYarnModules (yarnModulesArg // { yarnFlags = mylibs.yarn2nixPackage.defaultYarnFlags ++ [ "--production" ]; });
- patchedServer = stdenv.mkDerivation (mylibs.fetchedGithub ./peertube.json // rec {
- patches = lib.optionals ldap [ ./ldap.patch ] ++ [ ./sendmail.patch ];
+ clientYarnModulesArg = rec {
+ pname = "peertube-client-yarn-modules";
+ version = source.version;
+ name = "${pname}-${version}";
+ packageJSON = "${clientPatchedPackage}/package.json";
+ yarnLock = "${clientPatchedPackage}/yarn.lock";
+ yarnNix = ./client-yarn-packages.nix;
+ pkgConfig = yarnModulesConfig;
+ };
+ yarnModulesNoWorkspace = args: (yarn2nix-moretea.mkYarnModules args).overrideAttrs(old: {
+ buildPhase = builtins.replaceStrings [" ./package.json"] [" /dev/null; cp deps/*/package.json ."] old.buildPhase;
+ });
+
+ patchedPackages = stdenv.mkDerivation (source // rec {
+ patches = if ldap then [ ./ldap.patch ] else [ ./yarn_fix_http_node.patch ];
+ installPhase = ''
+ mkdir $out
+ cp package.json yarn.lock $out/
+ '';
+ });
+ serverYarnModules = yarnModulesNoWorkspace serverYarnModulesArg;
+ serverYarnModulesProd = yarnModulesNoWorkspace (serverYarnModulesArg // { yarnFlags = yarn2nix-moretea.defaultYarnFlags ++ [ "--production" ]; });
+ clientYarnModules = yarnModulesNoWorkspace clientYarnModulesArg;
+
+ server = stdenv.mkDerivation ({
+ pname = "peertube-server";
+ version = source.version;
+ src = patchedSource;
buildPhase = ''
- ln -s ${yarnModules}/node_modules .
+ ln -s ${serverYarnModules}/node_modules .
npm run build:server
'';
installPhase = ''
mkdir $out
- cp -a dist/server $out
+ cp -a dist $out
'';
- buildInputs = [ nodejs yarnModules ];
+ buildInputs = [ nodejs serverYarnModules ];
});
-in
- stdenv.mkDerivation rec {
- version = "v1.2.0";
- name = "peertube-${version}";
- src = fetchzip {
- url = "https://github.com/Chocobozzz/PeerTube/releases/download/${version}/${name}.zip";
- sha256 = "18fp3fy1crw67gdpc29nr38b5zy2f68l70w47zwp7dzhd8bbbipp";
- };
- patches = lib.optionals ldap [ ./ldap_yarn.patch ];
+
+ client = stdenv.mkDerivation ({
+ pname = "peertube-client";
+ version = source.version;
+ src = patchedSource;
+ buildPhase = let
+ lightArg = if light == null then "" else if light == true then "--light" else "--light-language";
+ in ''
+ ln -s ${serverYarnModules}/node_modules .
+ cp -a ${clientYarnModules}/node_modules client/
+ chmod +w client/node_modules
+ patchShebangs .
+ npm run build:client -- ${lightArg}
+ '';
+ installPhase = ''
+ mkdir $out
+ cp -a client/dist $out
+ '';
+ buildInputs = [ nodejs clientYarnModules ];
+ });
+
+ package = stdenv.mkDerivation rec {
+ version = source.version;
+ pname = "peertube";
+ src = patchedSource;
buildPhase = ''
- ln -s ${yarnModulesProd}/node_modules .
- rm -rf dist/server && cp -a ${patchedServer}/server dist
+ ln -s ${serverYarnModulesProd}/node_modules .
+ ln -s ${clientYarnModules}/node_modules client/
+ rm -rf dist && cp -a ${server}/dist dist
+ rm -rf client/dist && cp -a ${client}/dist client/
'';
installPhase = ''
mkdir $out
cp -a * $out
ln -s /tmp $out/.cache
'';
- buildInputs = [ yarnModulesProd ];
- }
+
+ meta = {
+ description = "A free software to take back control of your videos";
+
+ longDescription = ''
+ PeerTube aspires to be a decentralized and free/libre alternative to video
+ broadcasting services.
+ PeerTube is not meant to become a huge platform that would centralize
+ videos from all around the world. Rather, it is a network of
+ inter-connected small videos hosters.
+ Anyone with a modicum of technical skills can host a PeerTube server, aka
+ an instance. Each instance hosts its users and their videos. In this way,
+ every instance is created, moderated and maintained independently by
+ various administrators.
+ You can still watch from your account videos hosted by other instances
+ though if the administrator of your instance had previously connected it
+ with other instances.
+ '';
+
+ license = stdenv.lib.licenses.agpl3Plus;
+
+ homepage = "https://joinpeertube.org/";
+
+ platforms = stdenv.lib.platforms.linux; # not sure here
+ maintainers = with stdenv.lib.maintainers; [ matthiasbeyer immae ];
+ };
+ };
+in
+ package