summary refs log tree commit diff
path: root/nixos/modules/services/audio/liquidsoap.nix
blob: 66f84ef207622d869d8b8db3b63c2cc59b4b5a8f (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
{ config, lib, pkgs, ... }:

with lib;

let
  streams = builtins.attrNames config.services.liquidsoap.streams;

  streamService =
    name:
    let stream = builtins.getAttr name config.services.liquidsoap.streams; in
    { inherit name;
      value = {
        after = [ "network-online.target" "sound.target" ];
        description = "${name} liquidsoap stream";
        wantedBy = [ "multi-user.target" ];
        path = [ pkgs.wget ];
        preStart =
          ''
            mkdir -p /var/log/liquidsoap
            chown liquidsoap -R /var/log/liquidsoap
          '';
        serviceConfig = {
          PermissionsStartOnly="true";
          ExecStart = "${pkgs.liquidsoap}/bin/liquidsoap ${stream}";
          User = "liquidsoap";
        };
      };
    };
in
{

  ##### interface

  options = {

    services.liquidsoap.streams = mkOption {

      description =
        ''
          Set of Liquidsoap streams to start,
          one systemd service per stream.
        '';

      default = {};

      example = {
        myStream1 = literalExample "\"/etc/liquidsoap/myStream1.liq\"";
        myStream2 = literalExample "./myStream2.liq";
        myStream3 = literalExample "\"out(playlist(\\\"/srv/music/\\\"))\"";
      };

      type = types.attrsOf (types.either types.path types.str);
    };

  };
  ##### implementation

  config = mkIf (builtins.length streams != 0) {

    users.users.liquidsoap = {
      uid = config.ids.uids.liquidsoap;
      group = "liquidsoap";
      extraGroups = [ "audio" ];
      description = "Liquidsoap streaming user";
      home = "/var/lib/liquidsoap";
      createHome = true;
    };

    users.groups.liquidsoap.gid = config.ids.gids.liquidsoap;

    systemd.services = builtins.listToAttrs ( map streamService streams );
  };

}