Skip to content

Commit

Permalink
ndi-6: init at 6.1.1
Browse files Browse the repository at this point in the history
Major update from existing 4.x package.
Compatible with DistroAV obs-studio plugin
https://docs.ndi.video/all/getting-started/release-notes#ndi-6.1.1

ndi-6: added to all-packages.nix

ndi-6: moved package to pkgs/by-name/nd/ndi-6/package.nix

"ndi-6: removed all-packages definition as per check recommandations"

"Changed passthru test to distroav + amend update script"

"Removed passthru.tests directive"
  • Loading branch information
globule655 committed Jan 5, 2025
1 parent 24ff7ae commit 77bc2b2
Show file tree
Hide file tree
Showing 3 changed files with 160 additions and 0 deletions.
82 changes: 82 additions & 0 deletions pkgs/by-name/nd/ndi-6/package.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
{
lib,
stdenv,
fetchurl,
avahi,
obs-studio-plugins,
}:

let
versionJSON = lib.importJSON ./version.json;
ndiPlatform =
if stdenv.hostPlatform.isAarch64 then
"aarch64-rpi4-linux-gnueabi"
else if stdenv.hostPlatform.isAarch32 then
"arm-rpi2-linux-gnueabihf"
else if stdenv.hostPlatform.isx86_64 then
"x86_64-linux-gnu"
else
throw "unsupported platform for NDI SDK";
in
stdenv.mkDerivation rec {
pname = "ndi-6";
version = versionJSON.version;
majorVersion = lib.versions.major version;
installerName = "Install_NDI_SDK_v${majorVersion}_Linux";

src = fetchurl {
url = "https://downloads.ndi.tv/SDK/NDI_SDK_Linux/${installerName}.tar.gz";
hash = versionJSON.hash;
};

buildInputs = [ avahi ];

unpackPhase = ''
unpackFile $src
echo y | ./${installerName}.sh
sourceRoot="NDI SDK for Linux";
'';

installPhase = ''
mkdir $out
mv bin/${ndiPlatform} $out/bin
for i in $out/bin/*; do
if [ -L "$i" ]; then continue; fi
patchelf --set-interpreter "$(cat $NIX_CC/nix-support/dynamic-linker)" "$i"
done
patchelf --set-rpath "${avahi}/lib:${stdenv.cc.libc}/lib" $out/bin/ndi-record
patchelf --set-rpath "${avahi}/lib:${stdenv.cc.libc}/lib" $out/bin/ndi-free-audio
mv lib/${ndiPlatform} $out/lib
for i in $out/lib/*; do
if [ -L "$i" ]; then continue; fi
patchelf --set-rpath "${avahi}/lib:${stdenv.cc.libc}/lib" "$i"
done
rm $out/bin/libndi.so.${majorVersion}
ln -s $out/lib/libndi.so.${version} $out/bin/libndi.so.${majorVersion}
# Fake ndi version 5 for compatibility with DistroAV (obs plugin using NDI)
ln -s $out/lib/libndi.so.${version} $out/bin/libndi.so.5
mv include examples $out/
mkdir -p $out/share/doc/ndi-6
mv licenses $out/share/doc/ndi-6/licenses
mv documentation/* $out/share/doc/ndi-6/
'';

# Stripping breaks ndi-record.
dontStrip = true;

passthru.updateScript = ./update.py;

meta = {
homepage = "https://ndi.video/ndi-sdk/";
description = "NDI Software Developer Kit";
platforms = [
"x86_64-linux"
"i686-linux"
"aarch64-linux"
"armv7l-linux"
];
sourceProvenance = with lib.sourceTypes; [ binaryNativeCode ];
license = lib.licenses.unfree;
maintainers = with lib.maintainers; [ globule655 ];
};
}
77 changes: 77 additions & 0 deletions pkgs/by-name/nd/ndi-6/update.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
#!/usr/bin/env nix-shell
#! nix-shell -i python -p "python3.withPackages (ps: with ps; [ ps.absl-py ps.requests ])"

import hashlib
import io
import json
import os.path
import tarfile

import requests
from absl import app, flags

BASE_NAME = "Install_NDI_SDK_v6_Linux"
NDI_SDK_URL = f"https://downloads.ndi.tv/SDK/NDI_SDK_Linux/{BASE_NAME}.tar.gz"
NDI_EXEC = f"{BASE_NAME}.sh"

NDI_ARCHIVE_MAGIC = b"__NDI_ARCHIVE_BEGIN__\n"

FLAG_out = flags.DEFINE_string("out", None, "Path to read/write version.json from/to.")


def find_version_json() -> str:
if FLAG_out.value:
return FLAG_out.value
try_paths = ["pkgs/by-name/nd/ndi-6/version.json", "version.json"]
for path in try_paths:
if os.path.exists(path):
return path
raise Exception(
"Couldn't figure out where to write version.json; try specifying --out"
)


def fetch_tarball() -> bytes:
r = requests.get(NDI_SDK_URL)
r.raise_for_status()
return r.content


def read_version(tarball: bytes) -> str:
# Find the inner script.
outer_tarfile = tarfile.open(fileobj=io.BytesIO(tarball), mode="r:gz")
eula_script = outer_tarfile.extractfile(NDI_EXEC).read()

# Now find the archive embedded within the script.
archive_start = eula_script.find(NDI_ARCHIVE_MAGIC) + len(NDI_ARCHIVE_MAGIC)
inner_tarfile = tarfile.open(
fileobj=io.BytesIO(eula_script[archive_start:]), mode="r:gz"
)

# Now find Version.txt...
version_txt = (
inner_tarfile.extractfile("NDI SDK for Linux/Version.txt")
.read()
.decode("utf-8")
)
_, _, version = version_txt.strip().partition(" v")
return version


def main(argv):
tarball = fetch_tarball()

sha256 = hashlib.sha256(tarball).hexdigest()
version = {
"hash": f"sha256:{sha256}",
"version": read_version(tarball),
}

out_path = find_version_json()
with open(out_path, "w") as f:
json.dump(version, f)
f.write("\n")


if __name__ == "__main__":
app.run(main)
1 change: 1 addition & 0 deletions pkgs/by-name/nd/ndi-6/version.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"hash": "sha256-6iqjexwILth2muLpXWQjDVTvOuMq4jM8KBYnpPmViU8=", "version": "6.1.1"}

0 comments on commit 77bc2b2

Please sign in to comment.