diff --git a/nixarr/lib/arr-settings-options.nix b/nixarr/lib/arr-settings-options.nix new file mode 100644 index 0000000..290d433 --- /dev/null +++ b/nixarr/lib/arr-settings-options.nix @@ -0,0 +1,93 @@ +# Utilities for defining *arr service settings, options, and configs. +# +# Copied from nixpkgs master as of 2025-11-11: https://raw.githubusercontent.com/NixOS/nixpkgs/cf540f8c9840457ed90a315dd635bceecb78495a/nixos/modules/services/misc/servarr/settings-options.nix +{ + lib, + pkgs, +}: { + mkServarrSettingsOptions = name: port: + lib.mkOption { + type = lib.types.submodule { + freeformType = (pkgs.formats.ini {}).type; + options = { + update = { + mechanism = lib.mkOption { + type = with lib.types; + nullOr (enum [ + "external" + "builtIn" + "script" + ]); + description = "which update mechanism to use"; + default = "external"; + }; + automatically = lib.mkOption { + type = lib.types.bool; + description = "Automatically download and install updates."; + default = false; + }; + }; + server = { + port = lib.mkOption { + type = lib.types.port; + description = "Port Number"; + default = port; + }; + }; + log = { + analyticsEnabled = lib.mkOption { + type = lib.types.bool; + description = "Send Anonymous Usage Data"; + default = false; + }; + }; + }; + }; + example = lib.options.literalExpression '' + { + update.mechanism = "internal"; + server = { + urlbase = "localhost"; + port = ${toString port}; + bindaddress = "*"; + }; + } + ''; + default = {}; + description = '' + Attribute set of arbitrary config options. + Please consult the documentation at the [wiki](https://wiki.servarr.com/useful-tools#using-environment-variables-for-config). + + WARNING: this configuration is stored in the world-readable Nix store! + For secrets use [](#opt-services.${name}.environmentFiles). + ''; + }; + + mkServarrEnvironmentFiles = name: + lib.mkOption { + type = lib.types.listOf lib.types.path; + default = []; + description = '' + Environment file to pass secret configuration values. + Each line must follow the `${lib.toUpper name}__SECTION__KEY=value` pattern. + Please consult the documentation at the [wiki](https://wiki.servarr.com/useful-tools#using-environment-variables-for-config). + ''; + }; + + mkServarrSettingsEnvVars = name: settings: + lib.pipe settings [ + (lib.mapAttrsRecursive ( + path: value: + lib.optionalAttrs (value != null) { + name = lib.toUpper "${name}__${lib.concatStringsSep "__" path}"; + value = toString ( + if lib.isBool value + then lib.boolToString value + else value + ); + } + )) + (lib.collect (x: lib.isString x.name or false && lib.isString x.value or false)) + lib.listToAttrs + ]; +} diff --git a/nixarr/readarr-audiobook/default.nix b/nixarr/readarr-audiobook/default.nix index c32c5ab..92e9d68 100644 --- a/nixarr/readarr-audiobook/default.nix +++ b/nixarr/readarr-audiobook/default.nix @@ -11,12 +11,7 @@ with lib; let nixarr = config.nixarr; port = 9494; - settings-options = pkgs.fetchurl { - # Master as of 2025-11-11 - url = "https://raw.githubusercontent.com/NixOS/nixpkgs/cf540f8c9840457ed90a315dd635bceecb78495a/nixos/modules/services/misc/servarr/settings-options.nix"; - hash = "sha256-7fh2fpYphR7kBV0zleRK+gL8gHLqVbjRbuv1B6x748s="; - }; - servarr = import settings-options {inherit lib pkgs;}; + arr-settings-options = import ../lib/arr-settings-options.nix {inherit lib pkgs;}; in { options.nixarr.readarr-audiobook = { enable = mkOption { @@ -97,10 +92,10 @@ in { # Uses name in description to refer to # `services.readarr-audiobook.environmentFiles`. - settings = servarr.mkServarrSettingsOptions "readarr-audiobook" port; + settings = arr-settings-options.mkServarrSettingsOptions "readarr-audiobook" port; # Uses name in description to document `READARR__*` environment variables. - environmentFiles = servarr.mkServarrEnvironmentFiles "readarr"; + environmentFiles = arr-settings-options.mkServarrEnvironmentFiles "readarr"; user = lib.mkOption { type = lib.types.str; @@ -160,7 +155,7 @@ in { wantedBy = ["multi-user.target"]; # Uses name to define `READARR__*` environment variables. - environment = servarr.mkServarrSettingsEnvVars "readarr" service-cfg.settings; + environment = arr-settings-options.mkServarrSettingsEnvVars "readarr" service-cfg.settings; serviceConfig = { Type = "simple";