105 lines
2.4 KiB
Nix
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;
|
|
};
|
|
|
|
};
|
|
}
|