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