diff --git a/pkgs/by-name/sl/slsk-batchdl/deps.json b/pkgs/by-name/sl/slsk-batchdl/deps.json
new file mode 100644
index 000000000000..e2c86476f9d0
--- /dev/null
+++ b/pkgs/by-name/sl/slsk-batchdl/deps.json
@@ -0,0 +1,217 @@
+[
+ {
+ "pname": "AngleSharp",
+ "version": "1.2.0",
+ "hash": "sha256-l8+Var9o773VL6Ybih3boaFf9sYjS7eqtLGd8DCIPsk="
+ },
+ {
+ "pname": "EmbedIO",
+ "version": "3.5.2",
+ "hash": "sha256-e6GfVHXxYeUw3ntCrHokNoAS6mXArO7+vdMeUFnsSo8="
+ },
+ {
+ "pname": "Goblinfactory.ProgressBar",
+ "version": "1.0.0",
+ "hash": "sha256-tV3Fw792zfYhB2dN97VKXBwS5eypqKExgAJy+bcDo8I="
+ },
+ {
+ "pname": "Google.Apis",
+ "version": "1.69.0",
+ "hash": "sha256-/9JN0CZIFZnmGS69ki38RlNzQiwp4yO0MFDeRk1slsg="
+ },
+ {
+ "pname": "Google.Apis.Auth",
+ "version": "1.69.0",
+ "hash": "sha256-T6n3hc+KpgHNqQQeJLOmgHQWkjBvnhIob5giHabREV8="
+ },
+ {
+ "pname": "Google.Apis.Core",
+ "version": "1.69.0",
+ "hash": "sha256-IW1AOY8o6hHkrc/tINsS/VCOUrOSoXb6OCSEF6gamkc="
+ },
+ {
+ "pname": "Google.Apis.YouTube.v3",
+ "version": "1.69.0.3680",
+ "hash": "sha256-3aNScBqmchnDkLejK5HYHiLVVDexrFUtZ6xe8cGP28M="
+ },
+ {
+ "pname": "HtmlAgilityPack",
+ "version": "1.11.72",
+ "hash": "sha256-MRt7yj6+/ORmr2WBERpQ+1gMRzIaPFKddHoB4zZmv2k="
+ },
+ {
+ "pname": "Microsoft.ApplicationInsights",
+ "version": "2.22.0",
+ "hash": "sha256-mUQ63atpT00r49ca50uZu2YCiLg3yd6r3HzTryqcuEA="
+ },
+ {
+ "pname": "Microsoft.Bcl.AsyncInterfaces",
+ "version": "9.0.1",
+ "hash": "sha256-A3W2Hvhlf1ODx1NYWHwUyziZOGMaDPvXHZ/ubgNLYJA="
+ },
+ {
+ "pname": "Microsoft.CodeCoverage",
+ "version": "17.9.0",
+ "hash": "sha256-OaGa4+jRPHs+T+p/oekm2Miluqfd2IX8Rt+BmUx8kr4="
+ },
+ {
+ "pname": "Microsoft.CSharp",
+ "version": "4.7.0",
+ "hash": "sha256-Enknv2RsFF68lEPdrf5M+BpV1kHoLTVRApKUwuk/pj0="
+ },
+ {
+ "pname": "Microsoft.NET.Test.Sdk",
+ "version": "17.9.0",
+ "hash": "sha256-q/1AJ7eNlk02wvN76qvjl2xBx5iJ+h5ssiE/4akLmtI="
+ },
+ {
+ "pname": "Microsoft.Testing.Extensions.Telemetry",
+ "version": "1.5.3",
+ "hash": "sha256-bIXwPSa3jkr2b6xINOqMUs6/uj/r4oVFM7xq3uVIZDU="
+ },
+ {
+ "pname": "Microsoft.Testing.Extensions.TrxReport.Abstractions",
+ "version": "1.5.3",
+ "hash": "sha256-IfMRfcyaIKEMRtx326ICKtinDBEfGw/Sv8ZHawJ96Yc="
+ },
+ {
+ "pname": "Microsoft.Testing.Extensions.VSTestBridge",
+ "version": "1.5.3",
+ "hash": "sha256-XpM/yFjhLSsuzyDV+xKubs4V1zVVYiV05E0+N4S1h0g="
+ },
+ {
+ "pname": "Microsoft.Testing.Platform",
+ "version": "1.5.3",
+ "hash": "sha256-y61Iih6w5D79dmrj2V675mcaeIiHoj1HSa1FRit2BLM="
+ },
+ {
+ "pname": "Microsoft.Testing.Platform.MSBuild",
+ "version": "1.5.3",
+ "hash": "sha256-YspvjE5Jfi587TAfsvfDVJXNrFOkx1B3y1CKV6m7YLY="
+ },
+ {
+ "pname": "Microsoft.TestPlatform.ObjectModel",
+ "version": "17.12.0",
+ "hash": "sha256-3XBHBSuCxggAIlHXmKNQNlPqMqwFlM952Av6RrLw1/w="
+ },
+ {
+ "pname": "Microsoft.TestPlatform.ObjectModel",
+ "version": "17.9.0",
+ "hash": "sha256-iiXUFzpvT8OWdzMj9FGJDqanwHx40s1TXVY9l3ii+s0="
+ },
+ {
+ "pname": "Microsoft.TestPlatform.TestHost",
+ "version": "17.9.0",
+ "hash": "sha256-1BZIY1z+C9TROgdTV/tq4zsPy7Q71GQksr/LoMKAzqU="
+ },
+ {
+ "pname": "MSTest.Analyzers",
+ "version": "3.7.3",
+ "hash": "sha256-6mNfHtx9FBWA6/QrRUepwbxXWG/54GRyeZYazDiMacg="
+ },
+ {
+ "pname": "MSTest.TestAdapter",
+ "version": "3.7.3",
+ "hash": "sha256-3O/AXeS+3rHWstinivt73oa0QDp+xQpTc9p46EF+Mtc="
+ },
+ {
+ "pname": "MSTest.TestFramework",
+ "version": "3.7.3",
+ "hash": "sha256-RweCMMf14GI6HqjDIP68JM67IaJKYQTZy0jk5Q4DFxs="
+ },
+ {
+ "pname": "Newtonsoft.Json",
+ "version": "13.0.1",
+ "hash": "sha256-K2tSVW4n4beRPzPu3rlVaBEMdGvWSv/3Q1fxaDh4Mjo="
+ },
+ {
+ "pname": "Newtonsoft.Json",
+ "version": "13.0.3",
+ "hash": "sha256-hy/BieY4qxBWVVsDqqOPaLy1QobiIapkbrESm6v2PHc="
+ },
+ {
+ "pname": "SmallestCSVParser",
+ "version": "1.1.1",
+ "hash": "sha256-64E87w+4FcQtYsFIOMGGmYmjXVGBwsBqgLVb7p0wc04="
+ },
+ {
+ "pname": "Soulseek",
+ "version": "7.1.0",
+ "hash": "sha256-n6LUNuPmmy9QYNNALR0ObYyR9LJalf0H8P+SKnoqfFc="
+ },
+ {
+ "pname": "SpotifyAPI.Web",
+ "version": "7.2.1",
+ "hash": "sha256-gbTLJaj7DSXZQlo0xpegZ8HLruMe6WmDyD8+l6YE3hg="
+ },
+ {
+ "pname": "SpotifyAPI.Web.Auth",
+ "version": "7.2.1",
+ "hash": "sha256-uzpyPlXNCuSHrcK4SKH0ydY2HlDKXU51W5ahk2Oqu98="
+ },
+ {
+ "pname": "System.CodeDom",
+ "version": "7.0.0",
+ "hash": "sha256-7IPt39cY+0j0ZcRr/J45xPtEjnSXdUJ/5ai3ebaYQiE="
+ },
+ {
+ "pname": "System.Diagnostics.DiagnosticSource",
+ "version": "5.0.0",
+ "hash": "sha256-6mW3N6FvcdNH/pB58pl+pFSCGWgyaP4hfVtC/SMWDV4="
+ },
+ {
+ "pname": "System.IO.Pipelines",
+ "version": "9.0.1",
+ "hash": "sha256-CnmDanknCGbNnoDjgZw62M/Grg8IMTJDa8x3P07UR2A="
+ },
+ {
+ "pname": "System.Management",
+ "version": "7.0.2",
+ "hash": "sha256-bJ21ILQfbHb8mX2wnVh7WP/Ip7gdVPIw+BamQuifTVY="
+ },
+ {
+ "pname": "System.Memory",
+ "version": "4.6.0",
+ "hash": "sha256-OhAEKzUM6eEaH99DcGaMz2pFLG/q/N4KVWqqiBYUOFo="
+ },
+ {
+ "pname": "System.Reflection.Metadata",
+ "version": "1.6.0",
+ "hash": "sha256-JJfgaPav7UfEh4yRAQdGhLZF1brr0tUWPl6qmfNWq/E="
+ },
+ {
+ "pname": "System.Text.Encodings.Web",
+ "version": "9.0.1",
+ "hash": "sha256-iuAVcTiiZQLCZjDfDqdLLPHqZdZqvFabwLFHiVYdRJo="
+ },
+ {
+ "pname": "System.Text.Json",
+ "version": "9.0.1",
+ "hash": "sha256-2dqE+Mx5eJZ8db74ofUiUXHOSxDCmXw5n9VC9w4fUr0="
+ },
+ {
+ "pname": "System.Threading.Tasks.Extensions",
+ "version": "4.6.0",
+ "hash": "sha256-OwIB0dpcdnyfvTUUj6gQfKW2XF2pWsQhykwM1HNCHqY="
+ },
+ {
+ "pname": "System.ValueTuple",
+ "version": "4.5.0",
+ "hash": "sha256-niH6l2fU52vAzuBlwdQMw0OEoRS/7E1w5smBFoqSaAI="
+ },
+ {
+ "pname": "TagLibSharp",
+ "version": "2.3.0",
+ "hash": "sha256-PD9bVZiPaeC8hNx2D+uDUf701cCaMi2IRi5oPTNN+/w="
+ },
+ {
+ "pname": "Unosquare.Swan.Lite",
+ "version": "3.1.0",
+ "hash": "sha256-PL8N3CqIz/wku8/mkRMC3X868Byv47C20/rBLBhkS3o="
+ },
+ {
+ "pname": "YoutubeExplode",
+ "version": "6.5.4",
+ "hash": "sha256-5sexIiBj5XP9rP5DA0NQ+vHJ9lpjwp00EvVux901WLc="
+ }
+]
diff --git a/pkgs/by-name/sl/slsk-batchdl/package.nix b/pkgs/by-name/sl/slsk-batchdl/package.nix
new file mode 100644
index 000000000000..5967bd8ed2ee
--- /dev/null
+++ b/pkgs/by-name/sl/slsk-batchdl/package.nix
@@ -0,0 +1,58 @@
+{
+ lib,
+ buildDotnetModule,
+ dotnetCorePackages,
+ fetchFromGitHub,
+ nix-update-script,
+}:
+buildDotnetModule (finalAttrs: {
+ pname = "slsk-batchdl";
+ version = "2.4.7";
+
+ src = fetchFromGitHub {
+ owner = "fiso64";
+ repo = "slsk-batchdl";
+ tag = "v${finalAttrs.version}";
+ hash = "sha256-P7V7YJUA1bkfp13Glb1Q+NJ7iTya/xgO1TM88z1Nddc=";
+ };
+
+ postPatch = ''
+ # .NET 6 is EOL, .NET 8 works fine modulo the trimming flag.
+ # See: https://github.com/fiso64/slsk-batchdl/issues/112
+ substituteInPlace \
+ slsk-batchdl/slsk-batchdl.csproj \
+ slsk-batchdl.Tests/slsk-batchdl.Tests.csproj \
+ --replace-fail "net6.0" "net8.0"
+ '';
+
+ projectFile = "slsk-batchdl/slsk-batchdl.csproj";
+
+ # Tests fail to build.
+ # See: https://github.com/fiso64/slsk-batchdl/issues/111
+ # testProjectFile = "slsk-batchdl.Tests/slsk-batchdl.Tests.csproj";
+
+ dotnet-sdk = dotnetCorePackages.sdk_8_0;
+ nugetDeps = ./deps.json;
+ executables = [ "sldl" ];
+
+ dotnetFlags = [
+ "--property:PublishSingleFile=true"
+ # Note: This breaks Spotify authentication!
+ # See: https://github.com/fiso64/slsk-batchdl/issues/112
+ # "--property:PublishTrimmed=true"
+ ];
+
+ selfContainedBuild = true;
+
+ passthru.updateScript = nix-update-script { };
+
+ meta = {
+ homepage = "https://github.com/fiso64/slsk-batchdl";
+ description = "Advanced download tool for Soulseek";
+ license = lib.licenses.gpl3Only;
+ maintainers = [
+ lib.maintainers._9999years
+ ];
+ mainProgram = "sldl";
+ };
+})