about summary refs log tree commit diff
path: root/nixpkgs/pkgs/development/libraries/ndi
diff options
context:
space:
mode:
Diffstat (limited to 'nixpkgs/pkgs/development/libraries/ndi')
-rw-r--r--nixpkgs/pkgs/development/libraries/ndi/default.nix71
-rwxr-xr-xnixpkgs/pkgs/development/libraries/ndi/update.py77
-rw-r--r--nixpkgs/pkgs/development/libraries/ndi/version.json1
3 files changed, 149 insertions, 0 deletions
diff --git a/nixpkgs/pkgs/development/libraries/ndi/default.nix b/nixpkgs/pkgs/development/libraries/ndi/default.nix
new file mode 100644
index 000000000000..1c15455b6add
--- /dev/null
+++ b/nixpkgs/pkgs/development/libraries/ndi/default.nix
@@ -0,0 +1,71 @@
+{ lib, stdenv, requireFile, avahi, obs-studio-plugins }:
+
+let
+  versionJSON = lib.importJSON ./version.json;
+in
+stdenv.mkDerivation rec {
+  pname = "ndi";
+  version = versionJSON.version;
+  majorVersion = builtins.head (builtins.splitVersion version);
+  installerName = "Install_NDI_SDK_v${majorVersion}_Linux";
+
+  src = requireFile rec {
+    name    = "${installerName}.tar.gz";
+    sha256  = versionJSON.hash;
+    message = ''
+      In order to use NDI SDK version ${version}, you need to comply with
+      NewTek's license and download the appropriate Linux tarball from:
+
+        ${meta.homepage}
+
+      Once you have downloaded the file, please use the following command and
+      re-run the installation:
+
+        \$ nix-prefetch-url file://\$PWD/${name}
+    '';
+  };
+
+  buildInputs = [ avahi ];
+
+  unpackPhase = ''
+    unpackFile ${src}
+    echo y | ./${installerName}.sh
+    sourceRoot="NDI SDK for Linux";
+  '';
+
+  installPhase = ''
+    mkdir $out
+    mv bin/x86_64-linux-gnu $out/bin
+    for i in $out/bin/*; do
+      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
+    mv lib/x86_64-linux-gnu $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
+    mv include examples $out/
+    mkdir -p $out/share/doc/${pname}-${version}
+    mv licenses $out/share/doc/${pname}-${version}/licenses
+    mv logos $out/share/doc/${pname}-${version}/logos
+    mv documentation/* $out/share/doc/${pname}-${version}/
+  '';
+
+  # Stripping breaks ndi-record.
+  dontStrip = true;
+
+  passthru.tests = {
+    inherit (obs-studio-plugins) obs-ndi;
+  };
+  passthru.updateScript = ./update.py;
+
+  meta = with lib; {
+    homepage = "https://ndi.tv/sdk/";
+    description = "NDI Software Developer Kit";
+    platforms = ["x86_64-linux"];
+    hydraPlatforms = [];
+    sourceProvenance = with sourceTypes; [ binaryNativeCode ];
+    license = licenses.unfree;
+  };
+}
diff --git a/nixpkgs/pkgs/development/libraries/ndi/update.py b/nixpkgs/pkgs/development/libraries/ndi/update.py
new file mode 100755
index 000000000000..e80260210368
--- /dev/null
+++ b/nixpkgs/pkgs/development/libraries/ndi/update.py
@@ -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_v5_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/development/libraries/ndi/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)
diff --git a/nixpkgs/pkgs/development/libraries/ndi/version.json b/nixpkgs/pkgs/development/libraries/ndi/version.json
new file mode 100644
index 000000000000..d751aa79e431
--- /dev/null
+++ b/nixpkgs/pkgs/development/libraries/ndi/version.json
@@ -0,0 +1 @@
+{"hash": "sha256:70e04c2e7a629a9854de2727e0f978175b7a4ec6cf4cd9799a22390862f6fa27", "version": "5.5.2"}