nixos-config/nixos/modules/castget.nix

102 lines
2.5 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;
};
};
}