diff --git a/pkgs/applications/audio/tone/default.nix b/pkgs/applications/audio/tone/default.nix new file mode 100644 index 00000000000..4f02d4bd642 --- /dev/null +++ b/pkgs/applications/audio/tone/default.nix @@ -0,0 +1,39 @@ +{ lib, stdenv, fetchFromGitHub, fetchNuGet, linkFarmFromDrvs, buildDotnetModule, ffmpeg-full, msbuild, dotnetCorePackages }: + +let + nugetSource = linkFarmFromDrvs "nuget-packages" ( + import ./nuget-deps.nix { inherit fetchNuGet; } + ); + +in buildDotnetModule rec { + pname = "tone"; + version = "0.1.3"; + + src = fetchFromGitHub { + owner = "sandreas"; + repo = pname; + rev = "v${version}"; + sha256 = "sha256-Z3cumXAIJhUB3/EbzB08MfBCrga1JHtDKr44TmRQuno="; + }; + + projectFile = "tone/tone.csproj"; + executables = [ "tone" ]; + nugetDeps = ./nuget-deps.nix; + dotnetBuildFlags = [ "--no-self-contained" ]; + dotnetInstallFlags = [ + "-p:PublishSingleFile=false" + "-p:PublishTrimmed=false" + "-p:PublishReadyToRun=false" + ]; + + dotnet-sdk = dotnetCorePackages.sdk_6_0; + runtimeDeps = [ ffmpeg-full ]; + + meta = with lib; { + homepage = "https://github.com/sandreas/tone"; + description = "tone is a cross platform utility to dump and modify audio metadata for a wide variety of formats"; + license = licenses.asl20; + maintainers = [ maintainers.jvanbruegge ]; + platforms = platforms.linux; + }; +} diff --git a/pkgs/applications/audio/tone/nuget-deps.nix b/pkgs/applications/audio/tone/nuget-deps.nix new file mode 100644 index 00000000000..3e9fa83c354 --- /dev/null +++ b/pkgs/applications/audio/tone/nuget-deps.nix @@ -0,0 +1,55 @@ +# This file was automatically generated by passthru.fetch-deps. +# Please dont edit it manually, your changes might get overwritten! + +{ fetchNuGet }: [ + (fetchNuGet { pname = "CliWrap"; version = "3.6.0"; sha256 = "0x96awy81kn0dr8h5d376cgfzxg5bvmzd610rc017nliv152zkw2"; }) + (fetchNuGet { pname = "CSharp.OperationResult"; version = "0.1.6"; sha256 = "127hjd30vvcks977yxxh59g89dbsf7h1khcr1vignrgk9fanvzyi"; }) + (fetchNuGet { pname = "Esprima"; version = "3.0.0-beta-9"; sha256 = "1gwdi537832z5whyqx58474ys2akgmrkabm51sy7725c91814snz"; }) + (fetchNuGet { pname = "grok.net"; version = "1.1.0"; sha256 = "01vm1b658dwxcxp1l4cpsplg8pwpmbs6v6fbqwg1lvrm7li9bgjz"; }) + (fetchNuGet { pname = "Jint"; version = "3.0.0-beta-2044"; sha256 = "0sy0qy33gn54sszhq4dkiihxd224n58xhcxg46qi4p3i93qn3snl"; }) + (fetchNuGet { pname = "Microsoft.Extensions.Configuration"; version = "7.0.0"; sha256 = "0n1grglxql9llmrsbbnlz5chx8mxrb5cpvjngm0hfyrkgzcwz90d"; }) + (fetchNuGet { pname = "Microsoft.Extensions.Configuration.Abstractions"; version = "7.0.0"; sha256 = "1as8cygz0pagg17w22nsf6mb49lr2mcl1x8i3ad1wi8lyzygy1a3"; }) + (fetchNuGet { pname = "Microsoft.Extensions.Configuration.Binder"; version = "2.0.0"; sha256 = "1prvdbma6r18n5agbhhabv6g357p1j70gq4m9g0vs859kf44nrgc"; }) + (fetchNuGet { pname = "Microsoft.Extensions.Configuration.Binder"; version = "7.0.0"; sha256 = "1qifb1pv7s76lih8wnjk418wdk4qwn87q2n6dx54knfvxai410bl"; }) + (fetchNuGet { pname = "Microsoft.Extensions.Configuration.EnvironmentVariables"; version = "7.0.0"; sha256 = "0nhh7rnh45s39x8sjn88czg7nyfpry85pkm0g619j8b468zj8nb4"; }) + (fetchNuGet { pname = "Microsoft.Extensions.Configuration.FileExtensions"; version = "7.0.0"; sha256 = "1fk7dcz6gfhd1k1d8ksz22rnjvj1waqjzk29ym4i3dz73rsq8j1i"; }) + (fetchNuGet { pname = "Microsoft.Extensions.Configuration.Json"; version = "7.0.0"; sha256 = "05zjmrpp99l128wijp1fy8asskc11ls871qaqr4mjnz3gbfycxnj"; }) + (fetchNuGet { pname = "Microsoft.Extensions.DependencyInjection"; version = "7.0.0"; sha256 = "121zs4jp8iimgbpzm3wsglhjwkc06irg1pxy8c1zcdlsg34cfq1p"; }) + (fetchNuGet { pname = "Microsoft.Extensions.DependencyInjection.Abstractions"; version = "2.0.0"; sha256 = "1pwrfh9b72k9rq6mb2jab5qhhi225d5rjalzkapiayggmygc8nhz"; }) + (fetchNuGet { pname = "Microsoft.Extensions.DependencyInjection.Abstractions"; version = "7.0.0"; sha256 = "181d7mp9307fs17lyy42f8cxnjwysddmpsalky4m0pqxcimnr6g7"; }) + (fetchNuGet { pname = "Microsoft.Extensions.DependencyModel"; version = "3.0.0"; sha256 = "1cm0hycgb33mf1ja9q91wxi3gk13d1p462gdq7gndrya23hw2jm5"; }) + (fetchNuGet { pname = "Microsoft.Extensions.FileProviders.Abstractions"; version = "7.0.0"; sha256 = "0ff20yklyjgyjzdyv7sybczgqhgd557m05dbwxzjznr0x41b180d"; }) + (fetchNuGet { pname = "Microsoft.Extensions.FileProviders.Physical"; version = "7.0.0"; sha256 = "1f1h0l47abw0spssd64qkhgd7b54pyzslyb586zp21milimcfmgv"; }) + (fetchNuGet { pname = "Microsoft.Extensions.FileSystemGlobbing"; version = "7.0.0"; sha256 = "1812vnkn8n0i4yr3k5azcxcfx1bbpcsmms95rdyxjfrzfksr05ai"; }) + (fetchNuGet { pname = "Microsoft.Extensions.Logging"; version = "2.0.0"; sha256 = "1jkwjcq1ld9znz1haazk8ili2g4pzfdp6i7r7rki4hg3jcadn386"; }) + (fetchNuGet { pname = "Microsoft.Extensions.Logging.Abstractions"; version = "2.0.0"; sha256 = "1x5isi71z02khikzvm7vaschb006pqqrsv86ky1x08a4hir4s43h"; }) + (fetchNuGet { pname = "Microsoft.Extensions.Options"; version = "2.0.0"; sha256 = "0g4zadlg73f507krilhaaa7h0jdga216syrzjlyf5fdk25gxmjqh"; }) + (fetchNuGet { pname = "Microsoft.Extensions.Options"; version = "7.0.0"; sha256 = "0b90zkrsk5dw3wr749rbynhpxlg4bgqdnd7d5vdlw2g9c7zlhgx6"; }) + (fetchNuGet { pname = "Microsoft.Extensions.Options.ConfigurationExtensions"; version = "7.0.0"; sha256 = "1liyprh0zha2vgmqh92n8kkjz61zwhr7g16f0gmr297z2rg1j5pj"; }) + (fetchNuGet { pname = "Microsoft.Extensions.Primitives"; version = "2.0.0"; sha256 = "1xppr5jbny04slyjgngxjdm0maxdh47vq481ps944d7jrfs0p3mb"; }) + (fetchNuGet { pname = "Microsoft.Extensions.Primitives"; version = "7.0.0"; sha256 = "1b4km9fszid9vp2zb3gya5ni9fn8bq62bzaas2ck2r7gs0sdys80"; }) + (fetchNuGet { pname = "Microsoft.NETCore.App.Crossgen2.linux-x64"; version = "6.0.13"; sha256 = "0sjd1npl37mky8gqi4bir2fgp0bm6y3jy641asfxa0k0cidbfzwl"; }) + (fetchNuGet { pname = "Newtonsoft.Json"; version = "13.0.2"; sha256 = "1p9splg1min274dpz7xdfgzrwkyfd3xlkygwpr1xgjvvyjvs6b0i"; }) + (fetchNuGet { pname = "Sandreas.AudioMetadata"; version = "0.1.1"; sha256 = "11ibv23h7qj5qshibmlsqmjca51dqbhib9p1gz66c5kqhk7ci38j"; }) + (fetchNuGet { pname = "Sandreas.Files"; version = "1.1.2"; sha256 = "08qk229q2y1dpdxdnp8xi9mgk8fgpjxrxm4z6ak8n09npp67nhn0"; }) + (fetchNuGet { pname = "Sandreas.SpectreConsoleHelpers"; version = "0.0.2"; sha256 = "1vy2fka11n0smgrbwdxabl6cdcsg6fv1gymxrws8m0sf9qm64nd1"; }) + (fetchNuGet { pname = "Serilog"; version = "2.12.0"; sha256 = "0lqxpc96qcjkv9pr1rln7mi4y7n7jdi4vb36c2fv3845w1vswgr4"; }) + (fetchNuGet { pname = "Serilog.Extensions.Logging"; version = "3.1.0"; sha256 = "0lv370ks2fjdn1nsgkbzbmw6hybnincw3jabr471a5w39pp4fl1c"; }) + (fetchNuGet { pname = "Serilog.Settings.Configuration"; version = "3.4.0"; sha256 = "1l6fyy9y5a168i1mm107aqyrwzhqmpy0cp1v13l2b89yv8dc105j"; }) + (fetchNuGet { pname = "Serilog.Sinks.Console"; version = "4.1.0"; sha256 = "1rpkphmqfh3bv3m7v1zwz88wz4sirj4xqyff9ga0c6bqhblj6wii"; }) + (fetchNuGet { pname = "Serilog.Sinks.File"; version = "5.0.0"; sha256 = "097rngmgcrdfy7jy8j7dq3xaq2qky8ijwg0ws6bfv5lx0f3vvb0q"; }) + (fetchNuGet { pname = "Spectre.Console"; version = "0.46.0"; sha256 = "1fr7090f2s7q9cw1k25m439blgicsbgl9k5nhqql9xvp0b00s4n9"; }) + (fetchNuGet { pname = "Spectre.Console.Cli"; version = "0.46.0"; sha256 = "00clv0mw97z8a9r7zam97prdv4ich33m4dhi7v8mjdqwwhj6q4jr"; }) + (fetchNuGet { pname = "System.IO.Abstractions"; version = "19.0.1"; sha256 = "16dasj8bwsdyl5phgqgfgswkbghzdb3sq7sidigr3b5ykna6n96g"; }) + (fetchNuGet { pname = "System.Memory"; version = "4.5.5"; sha256 = "08jsfwimcarfzrhlyvjjid61j02irx6xsklf32rv57x2aaikvx0h"; }) + (fetchNuGet { pname = "System.Runtime.CompilerServices.Unsafe"; version = "4.4.0"; sha256 = "0a6ahgi5b148sl5qyfpyw383p3cb4yrkm802k29fsi4mxkiwir29"; }) + (fetchNuGet { pname = "System.Runtime.CompilerServices.Unsafe"; version = "6.0.0"; sha256 = "0qm741kh4rh57wky16sq4m0v05fxmkjjr87krycf5vp9f0zbahbc"; }) + (fetchNuGet { pname = "System.Text.Encodings.Web"; version = "7.0.0"; sha256 = "1151hbyrcf8kyg1jz8k9awpbic98lwz9x129rg7zk1wrs6vjlpxl"; }) + (fetchNuGet { pname = "System.Text.Json"; version = "4.6.0"; sha256 = "0ism236hwi0k6axssfq58s1d8lihplwiz058pdvl8al71hagri39"; }) + (fetchNuGet { pname = "System.Text.Json"; version = "7.0.0"; sha256 = "0scb0lp7wbgcinaa4kqiqs7b8i5nx4ppfad81138jiwd1sl37pyp"; }) + (fetchNuGet { pname = "System.Threading.Tasks.Extensions"; version = "4.5.4"; sha256 = "0y6ncasgfcgnjrhynaf0lwpkpkmv4a07sswwkwbwb5h7riisj153"; }) + (fetchNuGet { pname = "TestableIO.System.IO.Abstractions"; version = "19.0.1"; sha256 = "01v2wgb6y2z7df4b2dsy0jb4hnhpv5kgyxypzyqdk7h6plad2axd"; }) + (fetchNuGet { pname = "TestableIO.System.IO.Abstractions.Wrappers"; version = "19.0.1"; sha256 = "1ms8wqar5w3z2y2qgxii9pqnsb4f1aikji2vaw01zxvnh2wry42n"; }) + (fetchNuGet { pname = "Ude.NetStandard"; version = "1.2.0"; sha256 = "074yff6g272zpkhk0zvmbfiaaxyp3b05fl24i7ffp2jf9r8bnfpl"; }) + (fetchNuGet { pname = "z440.atl.core"; version = "4.18.0"; sha256 = "0wwqhpl3xw9vf6c5idz1kwpd72kbg7b9fcmj6gmccxa99kcgljzk"; }) +] diff --git a/pkgs/servers/audiobookshelf/default.nix b/pkgs/servers/audiobookshelf/default.nix new file mode 100644 index 00000000000..fb569fc54be --- /dev/null +++ b/pkgs/servers/audiobookshelf/default.nix @@ -0,0 +1,62 @@ +{ lib, stdenv, pkgs, fetchFromGitHub, runCommand, buildNpmPackage, nodejs-16_x, tone, ffmpeg-full, util-linux, libwebp }: + +let + nodejs = nodejs-16_x; + + pname = "audiobookshelf"; + version = "2.2.15"; + + src = fetchFromGitHub { + owner = "advplyr"; + repo = pname; + rev = "v${version}"; + sha256 = "sha256-BrIXbembbcfSPOPknoY2Vn9I85eHyOQLDCMsFOMORgM="; + }; + + client = buildNpmPackage { + pname = "${pname}-client"; + inherit version; + + src = runCommand "cp-source" {} '' + cp -r ${src}/client $out + ''; + + NODE_OPTIONS = "--openssl-legacy-provider"; + + npmBuildScript = "generate"; + npmDepsHash = "sha256-eyZdeBsZ5XBoO/4djXZzOOr/h9kDSUULbqgdOZJNNCg="; + }; + + wrapper = import ./wrapper.nix { + inherit stdenv ffmpeg-full tone pname nodejs; + }; + +in buildNpmPackage { + inherit pname version src; + + buildInputs = [ util-linux ]; + + dontNpmBuild = true; + npmInstallFlags = "--only-production"; + npmDepsHash = "sha256-KbewULna+0mftIcdO5Z4A5rOrheBndpgzjkE1Jytfr4="; + + installPhase = '' + mkdir -p $out/opt/client + cp -r index.js server package* node_modules $out/opt/ + cp -r ${client}/lib/node_modules/${pname}-client/dist $out/opt/client/dist + mkdir $out/bin + + echo '${wrapper}' > $out/bin/${pname} + echo " exec ${nodejs}/bin/node $out/opt/index.js" >> $out/bin/${pname} + + chmod +x $out/bin/${pname} + ''; + + meta = with lib; { + homepage = "https://www.audiobookshelf.org/"; + description = "Self-hosted audiobook and podcast server"; + license = licenses.gpl3; + maintainers = [ maintainers.jvanbruegge ]; + platforms = platforms.linux; + }; +} diff --git a/pkgs/servers/audiobookshelf/wrapper.nix b/pkgs/servers/audiobookshelf/wrapper.nix new file mode 100644 index 00000000000..cbe7e3ebd97 --- /dev/null +++ b/pkgs/servers/audiobookshelf/wrapper.nix @@ -0,0 +1,61 @@ +{ stdenv, ffmpeg-full, tone, pname, nodejs }: '' + #!${stdenv.shell} + + port=8000 + host=0.0.0.0 + config=$(pwd)/config + metadata=$(pwd)/metadata + + LONGOPTS=host:,port:,config:,metadata:,help + args=$(getopt -l "$LONGOPTS" -o h -- "$@") + + eval set -- "$args" + + while [ $# -ge 1 ]; do + case "$1" in + --) + # No more options left. + shift + break + ;; + --host) + host="$2" + shift + ;; + --port) + port="$2" + shift + ;; + --config) + if [[ "''${2:0:1}" = "/" ]]; then + config="$2" + else + config="$(pwd)/$2" + fi + shift + ;; + --metadata) + if [[ "''${2:0:1}" = "/" ]]; then + metadata="$2" + else + metadata="$(pwd)/$2" + fi + shift + ;; + --help|-h) + echo "Usage: audiobookshelf [--host ] [--port ] [--metadata ] [--config ]" + shift + ;; + esac + shift + done + + NODE_ENV=production \ + SOURCE=nixpkgs \ + FFMPEG_PATH=${ffmpeg-full}/bin/ffmpeg \ + FFPROBE_PATH=${ffmpeg-full}/bin/ffprobe \ + TONE_PATH=${tone}/bin/tone \ + CONFIG_PATH="$config" \ + METADATA_PATH="$metadata" \ + PORT="$port" \ + HOST="$host" \'' diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index 7cb25ce5353..63f931ad2a5 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -1433,6 +1433,8 @@ with pkgs; audible-cli = callPackage ../tools/misc/audible-cli { }; + audiobookshelf = callPackage ../servers/audiobookshelf { }; + auditwheel = callPackage ../tools/package-management/auditwheel { }; amidst = callPackage ../tools/games/minecraft/amidst { }; @@ -33961,6 +33963,8 @@ with pkgs; tortoisehg = callPackage ../applications/version-management/tortoisehg { }; + tone = callPackage ../applications/audio/tone { }; + tonelib-gfx = callPackage ../applications/audio/tonelib-gfx { }; tonelib-jam = callPackage ../applications/audio/tonelib-jam { };