1{ config, lib, pkgs, ... }:
2
3with lib;
4
5let
6
7 cfg = config.services.mjpg-streamer;
8
9in {
10
11 options = {
12
13 services.mjpg-streamer = {
14
15 enable = mkEnableOption (lib.mdDoc "mjpg-streamer webcam streamer");
16
17 inputPlugin = mkOption {
18 type = types.str;
19 default = "input_uvc.so";
20 description = lib.mdDoc ''
21 Input plugin. See plugins documentation for more information.
22 '';
23 };
24
25 outputPlugin = mkOption {
26 type = types.str;
27 default = "output_http.so -w @www@ -n -p 5050";
28 description = lib.mdDoc ''
29 Output plugin. `@www@` is substituted for default mjpg-streamer www directory.
30 See plugins documentation for more information.
31 '';
32 };
33
34 user = mkOption {
35 type = types.str;
36 default = "mjpg-streamer";
37 description = lib.mdDoc "mjpg-streamer user name.";
38 };
39
40 group = mkOption {
41 type = types.str;
42 default = "video";
43 description = lib.mdDoc "mjpg-streamer group name.";
44 };
45
46 };
47
48 };
49
50 config = mkIf cfg.enable {
51
52 users.users = optionalAttrs (cfg.user == "mjpg-streamer") {
53 mjpg-streamer = {
54 uid = config.ids.uids.mjpg-streamer;
55 group = cfg.group;
56 };
57 };
58
59 systemd.services.mjpg-streamer = {
60 description = "mjpg-streamer webcam streamer";
61 wantedBy = [ "multi-user.target" ];
62
63 serviceConfig = {
64 User = cfg.user;
65 Group = cfg.group;
66 Restart = "on-failure";
67 RestartSec = 1;
68 };
69
70 script = ''
71 IPLUGIN="${cfg.inputPlugin}"
72 OPLUGIN="${cfg.outputPlugin}"
73 OPLUGIN="''${OPLUGIN//@www@/${pkgs.mjpg-streamer}/share/mjpg-streamer/www}"
74 exec ${pkgs.mjpg-streamer}/bin/mjpg_streamer -i "$IPLUGIN" -o "$OPLUGIN"
75 '';
76 };
77
78 };
79
80}