218 lines
7.1 KiB
Nix
218 lines
7.1 KiB
Nix
{
|
|
lib,
|
|
stdenv,
|
|
callPackage,
|
|
fetchurl,
|
|
fetchFromGitHub,
|
|
fetchYarnDeps,
|
|
nixosTests,
|
|
brotli,
|
|
fixup-yarn-lock,
|
|
jq,
|
|
fd,
|
|
nodejs,
|
|
which,
|
|
yarn,
|
|
}:
|
|
let
|
|
bcryptHostPlatformAttrs = {
|
|
x86_64-linux = {
|
|
arch = "linux-x64";
|
|
libc = "glibc";
|
|
hash = "sha256-C5N6VgFtXPLLjZt0ZdRTX095njRIT+12ONuUaBBj7fQ=";
|
|
};
|
|
aarch64-linux = {
|
|
arch = "linux-arm64";
|
|
libc = "glibc";
|
|
hash = "sha256-TerDujO+IkSRnHYlSbAKSP9IS7AT7XnQJsZ8D8pCoGc=";
|
|
};
|
|
x86_64-darwin = {
|
|
arch = "darwin-x64";
|
|
libc = "unknown";
|
|
hash = "sha256-gphOONWujbeCCr6dkmMRJP94Dhp1Jvp2yt+g7n1HTv0=";
|
|
};
|
|
aarch64-darwin = {
|
|
arch = "darwin-arm64";
|
|
libc = "unknown";
|
|
hash = "sha256-JMnELVUxoU1C57Tzue3Sg6OfDFAjfCnzgDit0BWzmlo=";
|
|
};
|
|
};
|
|
bcryptAttrs =
|
|
bcryptHostPlatformAttrs."${stdenv.hostPlatform.system}"
|
|
or (throw "Unsupported architecture: ${stdenv.hostPlatform.system}");
|
|
bcryptVersion = "5.1.1";
|
|
bcryptLib = fetchurl {
|
|
url = "https://github.com/kelektiv/node.bcrypt.js/releases/download/v${bcryptVersion}/bcrypt_lib-v${bcryptVersion}-napi-v3-${bcryptAttrs.arch}-${bcryptAttrs.libc}.tar.gz";
|
|
inherit (bcryptAttrs) hash;
|
|
};
|
|
in
|
|
stdenv.mkDerivation rec {
|
|
pname = "peertube";
|
|
version = "6.3.3";
|
|
|
|
src = fetchFromGitHub {
|
|
owner = "Chocobozzz";
|
|
repo = "PeerTube";
|
|
rev = "refs/tags/v${version}";
|
|
hash = "sha256-kPZcCJtnoqE1g0fAuM98IhuDy1E9QBDkFNWrWIpFIDA=";
|
|
};
|
|
|
|
yarnOfflineCacheServer = fetchYarnDeps {
|
|
yarnLock = "${src}/yarn.lock";
|
|
hash = "sha256-I6TC5KO+NQ0NAtoJzYQPLelp8/hYUtIeof+UI45qpdk=";
|
|
};
|
|
|
|
yarnOfflineCacheClient = fetchYarnDeps {
|
|
yarnLock = "${src}/client/yarn.lock";
|
|
hash = "sha256-ADck9+5TDZ3OGInZ+NYYpBg9XXHugtiwyxYCYqSIOzM=";
|
|
};
|
|
|
|
yarnOfflineCacheAppsCli = fetchYarnDeps {
|
|
yarnLock = "${src}/apps/peertube-cli/yarn.lock";
|
|
hash = "sha256-t5MwysPVLbtIfDhvnwWoGocck1ntP8OP9Vf9DF6L7Cg=";
|
|
};
|
|
|
|
yarnOfflineCacheAppsRunner = fetchYarnDeps {
|
|
yarnLock = "${src}/apps/peertube-runner/yarn.lock";
|
|
hash = "sha256-x5qFCprn8q0xC88HudLV7W53X1Nkbz3F52RMp2PxIu8=";
|
|
};
|
|
|
|
outputs = [
|
|
"out"
|
|
"cli"
|
|
"runner"
|
|
];
|
|
|
|
nativeBuildInputs = [
|
|
brotli
|
|
fixup-yarn-lock
|
|
jq
|
|
which
|
|
yarn
|
|
fd
|
|
];
|
|
|
|
buildInputs = [ nodejs ];
|
|
|
|
buildPhase = ''
|
|
# Build node modules
|
|
export HOME=$PWD
|
|
fixup-yarn-lock ~/yarn.lock
|
|
fixup-yarn-lock ~/client/yarn.lock
|
|
fixup-yarn-lock ~/apps/peertube-cli/yarn.lock
|
|
fixup-yarn-lock ~/apps/peertube-runner/yarn.lock
|
|
yarn config --offline set yarn-offline-mirror $yarnOfflineCacheServer
|
|
yarn install --offline --frozen-lockfile --ignore-engines --ignore-scripts --no-progress
|
|
cd ~/client
|
|
yarn config --offline set yarn-offline-mirror $yarnOfflineCacheClient
|
|
yarn install --offline --frozen-lockfile --ignore-engines --ignore-scripts --no-progress
|
|
cd ~/apps/peertube-cli
|
|
yarn config --offline set yarn-offline-mirror $yarnOfflineCacheAppsCli
|
|
yarn install --offline --frozen-lockfile --ignore-engines --ignore-scripts --no-progress
|
|
cd ~/apps/peertube-runner
|
|
yarn config --offline set yarn-offline-mirror $yarnOfflineCacheAppsRunner
|
|
yarn install --offline --frozen-lockfile --ignore-engines --ignore-scripts --no-progress
|
|
|
|
patchShebangs ~/{node_modules,client/node_modules,/apps/peertube-cli/node_modules,apps/peertube-runner/node_modules,scripts}
|
|
|
|
# Fix bcrypt node module
|
|
cd ~/node_modules/bcrypt
|
|
if [ "${bcryptVersion}" != "$(cat package.json | jq -r .version)" ]; then
|
|
echo "Mismatching version please update bcrypt in derivation"
|
|
exit
|
|
fi
|
|
mkdir -p ./lib/binding && tar -C ./lib/binding -xf ${bcryptLib}
|
|
|
|
# Return to home directory
|
|
cd ~
|
|
|
|
# Build PeerTube server
|
|
npm run build:server
|
|
|
|
# Build PeerTube client
|
|
npm run build:client
|
|
|
|
# Build PeerTube cli
|
|
npm run build:peertube-cli
|
|
patchShebangs ~/apps/peertube-cli/dist/peertube.js
|
|
|
|
# Build PeerTube runner
|
|
npm run build:peertube-runner
|
|
patchShebangs ~/apps/peertube-runner/dist/peertube-runner.js
|
|
|
|
# Clean up declaration files
|
|
find ~/dist/ \
|
|
~/packages/core-utils/dist/ \
|
|
~/packages/ffmpeg/dist/ \
|
|
~/packages/models/dist/ \
|
|
~/packages/node-utils/dist/ \
|
|
~/packages/server-commands/dist/ \
|
|
~/packages/transcription/dist/ \
|
|
~/packages/typescript-utils/dist/ \
|
|
\( -name '*.d.ts' -o -name '*.d.ts.map' \) -type f -delete
|
|
'';
|
|
|
|
installPhase = ''
|
|
mkdir -p $out/dist
|
|
mv ~/dist $out
|
|
mv ~/node_modules $out/node_modules
|
|
mkdir $out/client
|
|
mv ~/client/{dist,node_modules,package.json,yarn.lock} $out/client
|
|
mkdir -p $out/packages/{core-utils,ffmpeg,models,node-utils,server-commands,transcription,typescript-utils}
|
|
mv ~/packages/core-utils/{dist,package.json} $out/packages/core-utils
|
|
mv ~/packages/ffmpeg/{dist,package.json} $out/packages/ffmpeg
|
|
mv ~/packages/models/{dist,package.json} $out/packages/models
|
|
mv ~/packages/node-utils/{dist,package.json} $out/packages/node-utils
|
|
mv ~/packages/server-commands/{dist,package.json} $out/packages/server-commands
|
|
mv ~/packages/transcription/{dist,package.json} $out/packages/transcription
|
|
mv ~/packages/typescript-utils/{dist,package.json} $out/packages/typescript-utils
|
|
mv ~/{config,support,CREDITS.md,FAQ.md,LICENSE,README.md,package.json,yarn.lock} $out
|
|
|
|
mkdir -p $cli/bin
|
|
mv ~/apps/peertube-cli/{dist,node_modules,package.json,yarn.lock} $cli
|
|
ln -s $cli/dist/peertube.js $cli/bin/peertube-cli
|
|
|
|
mkdir -p $runner/bin
|
|
mv ~/apps/peertube-runner/{dist,node_modules,package.json,yarn.lock} $runner
|
|
ln -s $runner/dist/peertube-runner.js $runner/bin/peertube-runner
|
|
|
|
# Create static gzip and brotli files
|
|
fd -e css -e eot -e html -e js -e json -e svg -e webmanifest -e xlf \
|
|
--type file --search-path $out/client/dist --threads $NIX_BUILD_CORES \
|
|
--exec gzip -9 -n -c {} > {}.gz \;\
|
|
--exec brotli --best -f {} -o {}.br
|
|
'';
|
|
|
|
passthru.tests.peertube = nixosTests.peertube;
|
|
|
|
meta = with lib; {
|
|
description = "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 = licenses.agpl3Plus;
|
|
homepage = "https://joinpeertube.org/";
|
|
platforms = [
|
|
"x86_64-linux"
|
|
"aarch64-linux"
|
|
# feasible, looking for maintainer to help out
|
|
# "x86_64-darwin" "aarch64-darwin"
|
|
];
|
|
maintainers = with maintainers; [
|
|
immae
|
|
izorkin
|
|
stevenroose
|
|
];
|
|
};
|
|
}
|