nixos-config/modules/castget.nix
Ingolf Wagner 7a6510a4e6
nix fmt
2024-08-29 08:26:04 +07:00

105 lines
2.4 KiB
Nix

{
config,
lib,
pkgs,
...
}:
with lib;
with types;
let
cfg = config.services.castget;
in
{
options.services.castget = {
enable = mkEnableOption "enable services.castget";
feeds = mkOption {
type = attrsOf (submodule {
options = {
url = mkOption {
type = str;
description = ''
url to the rss feed
'';
};
spool = mkOption {
type = path;
description = ''
download enclosures to this directory.
'';
};
};
});
description = ''
configurations for the cast
'';
};
user = mkOption {
type = str;
description = ''
user to run the systemd service as
'';
};
timerConfig = mkOption {
type = attrsOf str;
default = {
OnCalendar = "daily";
};
example = {
OnCalendar = "00:05";
RandomizedDelaySec = "5h";
};
description = ''
When to run the polling script. See man systemd.timer for details.
'';
};
serviceName = mkOption {
type = str;
default = "castget";
description = ''
the name of the castget systemd service
'';
};
};
config = mkIf cfg.enable {
systemd.services."${cfg.serviceName}" = {
description = "castget polling service";
after = [ "network.target" ];
wantedBy = [ "multi-user.target" ];
restartIfChanged = false;
serviceConfig.User = cfg.user;
preStart =
let
mkSpools = mapAttrsToList (ignore: value: "mkdir -p \"${value.spool}\"") cfg.feeds;
in
concatStringsSep "\n" mkSpools;
script =
let
channels = mapAttrsToList (key: ignore: key) cfg.feeds;
castget = "${pkgs.castget}/bin/castget";
configurationFile =
let
configurations = mapAttrsToList (key: value: ''
[${key}]
url=${value.url}
spool=${value.spool}
'') cfg.feeds;
in
(pkgs.writeText "castget-configuration" (concatStringsSep "" configurations));
in
(concatMapStringsSep "\n" (
channel: "${castget} --rcfile ${configurationFile} ${channel}"
) channels);
};
systemd.timers."${cfg.serviceName}" = {
wantedBy = [ "timers.target" ];
timerConfig = cfg.timerConfig;
};
};
}