2022-01-16 11:22:44 +00:00
|
|
|
|
{ lib, crystal, fetchFromGitHub, librsvg, pkg-config, libxml2, openssl, sqlite
|
|
|
|
|
, lsquic, shards }:
|
2022-01-10 20:52:18 +00:00
|
|
|
|
let
|
|
|
|
|
# When updating, always update the following:
|
|
|
|
|
# * the git revision
|
|
|
|
|
# * the version attribute
|
|
|
|
|
# * the source hash (sha256)
|
|
|
|
|
# If the shards.lock file changed, also the following:
|
|
|
|
|
# * shards.nix (by running `crystal2nix` in invidious’ source tree)
|
|
|
|
|
# * If the lsquic.cr dependency changed: lsquic in lsquic.nix (version, sha256)
|
|
|
|
|
# * If the lsquic version changed: boringssl' in lsquic.nix (version, sha256)
|
|
|
|
|
rev = "d928b9eaadc8298f2e92a766fdd10c79e6048858";
|
2022-01-16 11:22:44 +00:00
|
|
|
|
in crystal.buildCrystalPackage rec {
|
2022-01-10 20:52:18 +00:00
|
|
|
|
pname = "invidious";
|
|
|
|
|
version = "master";
|
|
|
|
|
|
|
|
|
|
src = fetchFromGitHub {
|
|
|
|
|
owner = "iv-org";
|
|
|
|
|
repo = pname;
|
|
|
|
|
inherit rev;
|
|
|
|
|
sha256 = "sha256-WojYv9HMqS3UcZFewgE/svbpqeAY6BIyAtxAMfdn1xk=";
|
|
|
|
|
};
|
|
|
|
|
|
2022-01-16 11:22:44 +00:00
|
|
|
|
postPatch = let
|
|
|
|
|
# Replacing by the value (templates) of the variables ensures that building
|
|
|
|
|
# fails if upstream changes the way the metadata is formatted.
|
|
|
|
|
branchTemplate = ''{{ "#{`git branch | sed -n '/* /s///p'`.strip}" }}'';
|
|
|
|
|
commitTemplate =
|
|
|
|
|
''{{ "#{`git rev-list HEAD --max-count=1 --abbrev-commit`.strip}" }}'';
|
|
|
|
|
versionTemplate = ''
|
|
|
|
|
{{ "#{`git log -1 --format=%ci | awk '{print $1}' | sed s/-/./g`.strip}" }}'';
|
|
|
|
|
# This always uses the latest commit which invalidates the cache even if
|
|
|
|
|
# the assets were not changed
|
|
|
|
|
assetCommitTemplate = ''
|
|
|
|
|
{{ "#{`git rev-list HEAD --max-count=1 --abbrev-commit -- assets`.strip}" }}'';
|
|
|
|
|
in ''
|
|
|
|
|
# Use the version metadata from the derivation instead of using git at
|
|
|
|
|
# build-time
|
|
|
|
|
substituteInPlace src/invidious.cr \
|
|
|
|
|
--replace ${lib.escapeShellArg branchTemplate} '"master"' \
|
|
|
|
|
--replace ${lib.escapeShellArg commitTemplate} '"${
|
|
|
|
|
lib.substring 0 7 rev
|
|
|
|
|
}"' \
|
|
|
|
|
--replace ${lib.escapeShellArg versionTemplate} '"${
|
|
|
|
|
lib.replaceChars [ "-" ] [ "." ] (lib.substring 9 10 version)
|
|
|
|
|
}"' \
|
|
|
|
|
--replace ${lib.escapeShellArg assetCommitTemplate} '"${
|
|
|
|
|
lib.substring 0 7 rev
|
|
|
|
|
}"'
|
2022-01-10 20:52:18 +00:00
|
|
|
|
|
2022-01-16 11:22:44 +00:00
|
|
|
|
# Patch the assets and locales paths to be absolute
|
|
|
|
|
substituteInPlace src/invidious.cr \
|
|
|
|
|
--replace 'public_folder "assets"' 'public_folder "${
|
|
|
|
|
placeholder "out"
|
|
|
|
|
}/share/invidious/assets"'
|
|
|
|
|
substituteInPlace src/invidious/helpers/i18n.cr \
|
|
|
|
|
--replace 'File.read("locales/' 'File.read("${
|
|
|
|
|
placeholder "out"
|
|
|
|
|
}/share/invidious/locales/'
|
2022-01-10 20:52:18 +00:00
|
|
|
|
|
2022-01-16 11:22:44 +00:00
|
|
|
|
# Reference sql initialisation/migration scripts by absolute path
|
|
|
|
|
substituteInPlace src/invidious/database/base.cr \
|
|
|
|
|
--replace 'config/sql' '${
|
|
|
|
|
placeholder "out"
|
|
|
|
|
}/share/invidious/config/sql'
|
2022-01-10 20:52:18 +00:00
|
|
|
|
|
2022-01-16 11:22:44 +00:00
|
|
|
|
substituteInPlace src/invidious/users.cr \
|
|
|
|
|
--replace 'Process.run(%(rsvg-convert' 'Process.run(%(${
|
|
|
|
|
lib.getBin librsvg
|
|
|
|
|
}/bin/rsvg-convert'
|
|
|
|
|
'';
|
2022-01-10 20:52:18 +00:00
|
|
|
|
|
|
|
|
|
# shards required for spectator
|
|
|
|
|
nativeBuildInputs = [ pkg-config shards ];
|
|
|
|
|
buildInputs = [ libxml2 openssl sqlite ];
|
|
|
|
|
|
|
|
|
|
format = "crystal";
|
|
|
|
|
shardsFile = ./shards.nix;
|
|
|
|
|
crystalBinaries.invidious.src = "src/invidious.cr";
|
|
|
|
|
|
|
|
|
|
postConfigure = ''
|
|
|
|
|
# lib includes nix store paths which can’t be patched, so the links have to
|
|
|
|
|
# be dereferenced first.
|
|
|
|
|
cp -rL lib lib2
|
|
|
|
|
rm -r lib
|
|
|
|
|
mv lib2 lib
|
|
|
|
|
chmod +w -R lib
|
|
|
|
|
cp ${lsquic}/lib/liblsquic.a lib/lsquic/src/lsquic/ext
|
|
|
|
|
'';
|
|
|
|
|
|
|
|
|
|
postInstall = ''
|
|
|
|
|
mkdir -p $out/share/invidious/config
|
|
|
|
|
|
|
|
|
|
# Copy static parts
|
|
|
|
|
cp -r assets locales $out/share/invidious
|
|
|
|
|
cp -r config/sql $out/share/invidious/config
|
|
|
|
|
'';
|
|
|
|
|
|
|
|
|
|
# Invidious tries to open config/config.yml and connect to the database, even
|
|
|
|
|
# when running --help. This specifies a minimal configuration in an
|
|
|
|
|
# environment variable. Even though the database is bogus, --help still
|
|
|
|
|
# works.
|
|
|
|
|
installCheckPhase = ''
|
|
|
|
|
INVIDIOUS_CONFIG="database_url: sqlite3:///dev/null" $out/bin/invidious --help
|
|
|
|
|
'';
|
|
|
|
|
}
|