Skip to content

Instantly share code, notes, and snippets.

@xaolanx
Last active November 1, 2025 21:22
Show Gist options
  • Select an option

  • Save xaolanx/4c88d0cbc0dee90764bae767006103f8 to your computer and use it in GitHub Desktop.

Select an option

Save xaolanx/4c88d0cbc0dee90764bae767006103f8 to your computer and use it in GitHub Desktop.
{
description = "Tidal-dl-ng flake";
inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
outputs = {
self,
nixpkgs,
}: let
system = "x86_64-linux";
pkgs = import nixpkgs {
inherit system;
};
# Custom pinned dependencies
requests_2_32_4 = pkgs.python3Packages.requests.overridePythonAttrs (old: {
version = "2.32.4";
src = pkgs.python3Packages.fetchPypi {
inherit (old) pname;
version = "2.32.4";
sha256 = "sha256-J9AxZoLIopg00yZIIAJLYqNpQgg9Usry8UwFkTNtNCI=";
};
patches =
builtins.filter (
p:
!pkgs.lib.strings.hasInfix "CVE-2024-47081" (toString p)
)
old.patches;
});
pycryptodome_3_23_0 = pkgs.python3Packages.pycryptodome.overridePythonAttrs (old: {
version = "3.23.0";
src = pkgs.python3Packages.fetchPypi {
inherit (old) pname;
version = "3.23.0";
sha256 = "sha256-RHcAplcYLWAzi6sJ/bJ1GPiFauzYCuTGvd22f/XaRO8=";
};
});
pathvalidate_3_3_1 = pkgs.python3Packages.pathvalidate.overridePythonAttrs (old: {
version = "3.3.1";
src = pkgs.python3Packages.fetchPypi {
inherit (old) pname;
version = "3.3.1";
sha256 = "sha256-sYwHISv+rWJDRbuOHWFBzc8Vo5c2mU6guUA1rSsboXc=";
};
});
typer_0_16_0 = pkgs.python3Packages.typer.overridePythonAttrs (old: {
version = "0.16.0";
src = pkgs.python3Packages.fetchPypi {
inherit (old) pname;
version = "0.16.0";
sha256 = "sha256-rzd/+u4dvjeulEDLTo8RaG6lzk6brgG4SufGO4fx3Ts=";
};
});
# Base Python package
tidalDlNgBase = pkgs.python3Packages.buildPythonPackage rec {
pname = "tidal-dl-ng";
version = "v0.26.2";
src = pkgs.fetchFromGitHub {
owner = "exislow";
repo = "tidal-dl-ng";
rev = version;
sha256 = "sha256-9C7IpLKeR08/nMbePltwGrzIgXfdaVfyOeFQnfCwMKg=";
};
doCheck = false;
format = "pyproject";
nativeBuildInputs = with pkgs.python3Packages; [
poetry-core
setuptools
];
propagatedBuildInputs = with pkgs.python3Packages; [
requests_2_32_4
coloredlogs
dataclasses-json
m3u8
mpegdash
mutagen
pathvalidate_3_3_1
pycryptodome_3_23_0
python-ffmpeg
rich
tidalapi
toml
typer_0_16_0
pyside6
pyqtdarktheme
];
};
tidalDlNg = tidalDlNgBase.overrideAttrs (_: {
outputs = ["out"];
pythonOutputDistPhase = ''echo "⚠️ Skipping pythonOutputDistPhase (no 'dist' output)"'';
pythonCatchConflictsPhase = ''echo "🛑 Skipping pythonCatchConflictsPhase (duplicate-dependency check)"'';
});
# Wrappers
# cli
tdn = pkgs.writeShellApplication {
name = "tdn";
runtimeInputs = [tidalDlNg];
text = ''
exec tidal-dl-ng "$@"
'';
};
# gui
tdng = pkgs.writeShellApplication {
name = "tdng";
runtimeInputs = [
tidalDlNg
pkgs.kdePackages.qtbase
pkgs.kdePackages.qtsvg
];
text = ''
export QT_QPA_PLATFORM=xcb
export QT_PLUGIN_PATH=${pkgs.kdePackages.qtbase}/lib/qt-6/plugins
exec tidal-dl-ng-gui "$@"
'';
};
tdngDesktop = pkgs.stdenv.mkDerivation {
pname = "tdng";
version = "0.26.2";
dontUnpack = true;
nativeBuildInputs = [pkgs.makeWrapper];
installPhase = ''
mkdir -p $out/bin
cp ${tdng}/bin/tdng $out/bin/
mkdir -p $out/share/applications
cat > $out/share/applications/tdng.desktop <<EOF
[Desktop Entry]
Name=Tidal Downloader NG
Comment=Download music from Tidal
Exec=tdng
Icon=audio-x-generic
Terminal=false
Type=Application
Categories=AudioVideo;Audio;Player;
EOF
'';
};
in {
packages.${system} = {
# Default = both tdn and tdng
default = pkgs.buildEnv {
name = "tidal-dl-ng";
paths = [tdn tdngDesktop];
};
tdn = tdn;
tdng = tdngDesktop;
};
};
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment