1{
2 pkgs,
3 lib,
4 config,
5 ...
6}:
7
8let
9 cfg = config.programs.obs-studio;
10in
11{
12 options.programs.obs-studio = {
13 enable = lib.mkEnableOption "Free and open source software for video recording and live streaming";
14
15 package = lib.mkPackageOption pkgs "obs-studio" {
16 nullable = true;
17 example = "obs-studio";
18 };
19
20 finalPackage = lib.mkOption {
21 type = lib.types.nullOr lib.types.package;
22 visible = false;
23 readOnly = true;
24 description = "Resulting customized OBS Studio package.";
25 };
26
27 plugins = lib.mkOption {
28 default = [ ];
29 example = lib.literalExpression "[ pkgs.obs-studio-plugins.wlrobs ]";
30 description = "Optional OBS plugins.";
31 type = lib.types.listOf lib.types.package;
32 };
33
34 enableVirtualCamera = lib.mkOption {
35 type = lib.types.bool;
36 default = false;
37 description = ''
38 Installs and sets up the v4l2loopback kernel module, necessary for OBS
39 to start a virtual camera.
40 '';
41 };
42 };
43
44 config = lib.mkIf cfg.enable {
45 assertions = lib.singleton {
46 assertion = cfg.package == null -> cfg.plugins == [ ];
47 message = "Plugins cannot be set if package is null";
48 };
49
50 programs.obs-studio.finalPackage = lib.mapNullable (
51 obs-studio: pkgs.wrapOBS.override { inherit obs-studio; } { plugins = cfg.plugins; }
52 ) cfg.package;
53
54 environment.systemPackages = lib.optional (cfg.finalPackage != null) cfg.finalPackage;
55
56 boot = lib.mkIf cfg.enableVirtualCamera {
57 kernelModules = [ "v4l2loopback" ];
58 extraModulePackages = [ config.boot.kernelPackages.v4l2loopback ];
59
60 extraModprobeConfig = ''
61 options v4l2loopback devices=1 video_nr=1 card_label="OBS Cam" exclusive_caps=1
62 '';
63 };
64
65 security.polkit.enable = lib.mkIf cfg.enableVirtualCamera true;
66 };
67
68 meta.maintainers = with lib.maintainers; [
69 CaptainJawZ
70 GaetanLepage
71 ];
72}