base16-schemes: unstable-2024-06-21 -> unstable-2024-11-12
[NixPkgs.git] / nixos / modules / services / video / go2rtc / default.nix
blobf74c172907febb8c8f616fbc5b3a03f9357d69c9
1 { lib
2 , config
3 , options
4 , pkgs
5 , ...
6 }:
8 let
9   inherit (lib)
10     literalExpression
11     mkEnableOption
12     mkOption
13     mkPackageOption
14     types
15     ;
17   cfg = config.services.go2rtc;
18   opt = options.services.go2rtc;
20   format = pkgs.formats.yaml {};
21   configFile = format.generate "go2rtc.yaml" cfg.settings;
25   meta.buildDocsInSandbox = false;
27   options.services.go2rtc = with types; {
28     enable = mkEnableOption "go2rtc streaming server";
30     package = mkPackageOption pkgs "go2rtc" { };
32     settings = mkOption {
33       default = {};
34       description = ''
35         go2rtc configuration as a Nix attribute set.
37         See the [wiki](https://github.com/AlexxIT/go2rtc/wiki/Configuration) for possible configuration options.
38       '';
39       type = submodule {
40         freeformType = format.type;
41         options = {
42           # https://github.com/AlexxIT/go2rtc/blob/v1.5.0/README.md#module-api
43           api = {
44             listen = mkOption {
45               type = str;
46               default = ":1984";
47               example = "127.0.0.1:1984";
48               description = ''
49                 API listen address, conforming to a Go address string.
50               '';
51             };
52           };
54           # https://github.com/AlexxIT/go2rtc/blob/v1.5.0/README.md#source-ffmpeg
55           ffmpeg = {
56             bin = mkOption {
57               type = path;
58               default = lib.getExe pkgs.ffmpeg-headless;
59               defaultText = literalExpression "lib.getExe pkgs.ffmpeg-headless";
60               description = ''
61                 The ffmpeg package to use for transcoding.
62               '';
63             };
64           };
66           # TODO: https://github.com/AlexxIT/go2rtc/blob/v1.5.0/README.md#module-rtsp
67           rtsp = {
68           };
70           streams = mkOption {
71             type = attrsOf (either str (listOf str));
72             default = {};
73             example = literalExpression ''
74               {
75                 cam1 = "onvif://admin:password@192.168.1.123:2020";
76                 cam2 = "tcp://192.168.1.123:12345";
77               }
78             '';
79             description = ''
80               Stream source configuration. Multiple source types are supported.
82               Check the [configuration reference](https://github.com/AlexxIT/go2rtc/blob/v${cfg.package.version}/README.md#module-streams) for possible options.
83             '';
84           };
86           # TODO: https://github.com/AlexxIT/go2rtc/blob/v1.5.0/README.md#module-webrtc
87           webrtc = {
88           };
89         };
90       };
91     };
92   };
94   config = lib.mkIf cfg.enable {
95     systemd.services.go2rtc = {
96       wants = [ "network-online.target" ];
97       after = [
98         "network-online.target"
99       ];
100       wantedBy = [
101         "multi-user.target"
102       ];
103       serviceConfig = {
104         DynamicUser = true;
105         User = "go2rtc";
106         SupplementaryGroups = [
107           # for v4l2 devices
108           "video"
109         ];
110         StateDirectory = "go2rtc";
111         ExecStart = "${cfg.package}/bin/go2rtc -config ${configFile}";
112       };
113     };
114   };