1{ config, lib, pkgs, ... }:
2let
3 cfg = config.services.vdr;
4
5 inherit (lib)
6 mkEnableOption mkPackageOption mkOption types mkIf optional;
7in
8{
9 options = {
10
11 services.vdr = {
12 enable = mkEnableOption "VDR, a video disk recorder";
13
14 package = mkPackageOption pkgs "vdr" {
15 example = "wrapVdr.override { plugins = with pkgs.vdrPlugins; [ hello ]; }";
16 };
17
18 videoDir = mkOption {
19 type = types.path;
20 default = "/srv/vdr/video";
21 description = "Recording directory";
22 };
23
24 extraArguments = mkOption {
25 type = types.listOf types.str;
26 default = [ ];
27 description = "Additional command line arguments to pass to VDR.";
28 };
29
30 enableLirc = mkEnableOption "LIRC";
31
32 user = mkOption {
33 type = types.str;
34 default = "vdr";
35 description = ''
36 User under which the VDR service runs.
37 '';
38 };
39
40 group = mkOption {
41 type = types.str;
42 default = "vdr";
43 description = ''
44 Group under which the VDRvdr service runs.
45 '';
46 };
47 };
48
49 };
50
51 config = mkIf cfg.enable {
52
53 systemd.tmpfiles.rules = [
54 "d ${cfg.videoDir} 0755 ${cfg.user} ${cfg.group} -"
55 "Z ${cfg.videoDir} - ${cfg.user} ${cfg.group} -"
56 ];
57
58 systemd.services.vdr = {
59 description = "VDR";
60 wantedBy = [ "multi-user.target" ];
61 wants = optional cfg.enableLirc "lircd.service";
62 after = [ "network.target" ]
63 ++ optional cfg.enableLirc "lircd.service";
64 serviceConfig = {
65 ExecStart =
66 let
67 args = [
68 "--video=${cfg.videoDir}"
69 ]
70 ++ optional cfg.enableLirc "--lirc=${config.passthru.lirc.socket}"
71 ++ cfg.extraArguments;
72 in
73 "${cfg.package}/bin/vdr ${lib.escapeShellArgs args}";
74 User = cfg.user;
75 Group = cfg.group;
76 CacheDirectory = "vdr";
77 StateDirectory = "vdr";
78 RuntimeDirectory = "vdr";
79 Restart = "on-failure";
80 };
81 };
82
83 environment.systemPackages = [ cfg.package ];
84
85 users.users = mkIf (cfg.user == "vdr") {
86 vdr = {
87 inherit (cfg) group;
88 home = "/run/vdr";
89 isSystemUser = true;
90 extraGroups = [
91 "video"
92 "audio"
93 ]
94 ++ optional cfg.enableLirc "lirc";
95 };
96 };
97
98 users.groups = mkIf (cfg.group == "vdr") { vdr = { }; };
99
100 };
101}