From 16c1dd9c791e4c50176a57f34dd36620150bc42a Mon Sep 17 00:00:00 2001 From: Wroclaw Date: Sun, 3 Nov 2024 16:21:38 +0100 Subject: [PATCH] nixos/generic/mpv: init --- nix-os/generic/mpv.nix | 90 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 nix-os/generic/mpv.nix diff --git a/nix-os/generic/mpv.nix b/nix-os/generic/mpv.nix new file mode 100644 index 0000000..58eddef --- /dev/null +++ b/nix-os/generic/mpv.nix @@ -0,0 +1,90 @@ +{config, lib, options, pkgs, ... }: + +let + cfg = config.programs.mpv; + opts = options.programs.mpv; + + toMpvIniString = attrset: lib.pipe attrset [ + (lib.mapAttrsToList (name: value: "${name}=${value}")) + (lib.concatStringsSep "\n") + ]; + + configDir = pkgs.symlinkJoin { + name = "mpv-config-dir"; + paths = lib.optional opts.settings.mpv.isDefined (pkgs.writeTextFile { + name = "mpv-config-dir-mpv.conf"; + destination = "/share/mpv/mpv.conf"; + text = toMpvIniString cfg.settings.mpv; + }) ++ lib.optional opts.settings.input.isDefined (pkgs.writeTextFile { + name = "mpv-config-dir-input.conf"; + destination = "/share/mpv/input.conf"; + text = cfg.settings.input; + }) ++ lib.mapAttrsToList (filename: opts: pkgs.writeTextFile { + name = "mpv-config-dir-script-opts-${filename}"; + destination = "/share/mpv/script-opts/${filename}"; + text = toMpvIniString opts; + }) cfg.settings.script-opts; + }; + + wrappedMpv = pkgs.wrapMpv cfg.package { + youtubeSupport = cfg.youtubeSupport; + scripts = cfg.scripts; + extraMakeWrapperArgs = lib.optionals (lib.any (x: x) [ + opts.settings.mpv.isDefined + opts.settings.input.isDefined + (lib.length (lib.attrNames cfg.settings.script-opts) > 0) + ]) [ + "--add-flags" "--config-dir='${configDir}/share/mpv'" + ]; + }; +in +{ + options.programs.mpv = { + enable = lib.mkEnableOption "mpv"; + package = lib.mkPackageOption pkgs "mpv-unwrapped" {}; + scripts = lib.mkOption { + type = lib.types.listOf lib.types.package; + default = []; + }; + youtubeSupport = lib.mkEnableOption "yt-dlp support for mpv" // { + default = true; + }; + settings = let + mpvini = lib.types.attrsOf lib.types.str; + in { + script-opts = lib.mkOption { + type = lib.types.attrsOf mpvini; + default = {}; + example = { + "crop.conf".draw_crosshair = "yes"; + }; + description = '' + A map of script options for mpv scripts. + The key is the filename of the script, and the value is a map of options. + ''; + }; + input = lib.mkOption { + type = lib.types.separatedString "\n"; + example = '' + Alt+1 set window-scale 0.125 + ''; + description = '' + A list of input commands to be added to the input.conf file. + ''; + }; + mpv = lib.mkOption { + type = mpvini; + example = { + keep-open = "yes"; + osd-fractions = "yes"; + }; + description = '' + A map of mpv options. + ''; + }; + }; + }; + config = lib.mkIf cfg.enable { + environment.systemPackages = [ wrappedMpv ]; + }; +}