puter/modules/musicomp.nix
2025-01-09 00:15:30 +01:00

117 lines
2.9 KiB
Nix

{
self,
lib,
pkgs,
utils,
config,
...
}: let
inherit (lib) types;
inherit (utils.systemdUtils.unitOptions) unitOption;
in {
options.services.musicomp.jobs = lib.mkOption {
description = ''
Compression jobs to run with musicomp.
'';
default = {};
type = types.attrsOf (types.submodule {
options = {
music = lib.mkOption {
type = types.str;
description = ''
Source directory.
'';
example = "/srv/music";
};
comp = lib.mkOption {
type = types.str;
description = ''
Destination directory for compressed music.
'';
example = "/srv/comp";
};
post = lib.mkOption {
type = types.lines;
default = "";
description = ''
Shell commands that are run after compression has finished.
'';
};
workers = lib.mkOption {
type = lib.types.int;
default = 0;
description = ''
Number of workers.
'';
};
timerConfig = lib.mkOption {
type = lib.types.nullOr (lib.types.attrsOf unitOption);
default = {
OnCalendar = "daily";
Persistent = true;
};
description = ''
When to run the job.
'';
};
package = lib.mkPackageOption self.packages.${pkgs.system} "musicomp" {};
inhibitsSleep = lib.mkOption {
default = false;
type = lib.types.bool;
example = true;
description = ''
Prevents the system from sleeping while running the job.
'';
};
};
});
};
config = {
systemd.services =
lib.mapAttrs'
(
name: job:
lib.nameValuePair "musicomp-jobs-${name}" {
wantedBy = ["multi-user.target"];
restartIfChanged = false;
script = ''
${lib.optionalString job.inhibitsSleep ''
${lib.getExe' pkgs.systemd "systemd-inhibit"} \
--mode block \
--who musicomp \
--what sleep \
--why ${lib.escapeShellArg "Scheduled musicomp ${name}"}
''}
${lib.getExe job.package} \
${lib.optionalString (job.workers > 0) "--workers ${job.workers}"} \
--verbose \
-- ${job.music} ${job.comp}
'';
postStart = job.post;
serviceConfig.Type = "oneshot";
}
)
config.services.musicomp.jobs;
systemd.timers =
lib.mapAttrs'
(name: job:
lib.nameValuePair "musicomp-jobs-${name}" {
wantedBy = ["timers.target"];
inherit (job) timerConfig;
})
(lib.filterAttrs (_: job: job.timerConfig != null) config.services.musicomp.jobs);
};
}