at master 1.9 kB view raw
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}