{ lib, userName, pkgs, sources, ... }:
{
  home-manager.users.${userName} = { config, ... }: {
    programs.mpv = {
      enable = true;
      package = pkgs.symlinkJoin {
        inherit (pkgs.mpv) name;
        paths = [(pkgs.mpv.override {
          scripts = [
            (pkgs.stdenv.mkDerivation (sources.mpv-reload // rec {
              installPhase = ''
                install -d $out/share/mpv/scripts
                install -m 0644 reload.lua $out/share/mpv/scripts/${passthru.scriptName}
              '';

              passthru.scriptName = "reload.lua";
            }))
            (pkgs.stdenv.mkDerivation (sources.mpv-createchapter // rec {
              installPhase = ''
                install -d $out/share/mpv/scripts
                install -m 0644 createchapter.lua $out/share/mpv/scripts/${passthru.scriptName}
              '';

              passthru.scriptName = "createchapter.lua";
            }))
            (pkgs.stdenv.mkDerivation (sources.mpv-autosave // rec {
              installPhase = ''
                install -d $out/share/mpv/scripts
                install -m 0644 autosave.lua $out/share/mpv/scripts/${passthru.scriptName}
              '';

              passthru.scriptName = "autosave.lua";
            }))
            (pkgs.stdenv.mkDerivation (sources.mpv-mpris // rec {
              installPhase = ''
                install -d $out/share/mpv/scripts
                install -m 0644 mpris.so $out/share/mpv/scripts/${passthru.scriptName}
              '';

              nativeBuildInputs = with pkgs; [ pkg-config glib mpv ffmpeg.dev ];

              passthru.scriptName = "mpris.so";
            }))
            (pkgs.stdenv.mkDerivation (sources.mpv-chapterskip // rec {
              installPhase = ''
                install -d $out/share/mpv/scripts
                install -m 0644 chapterskip.lua $out/share/mpv/scripts/${passthru.scriptName}
              '';

              passthru.scriptName = "chapterskip.lua";
            }))
            (pkgs.stdenv.mkDerivation (sources.mpv-subselect // rec {
              installPhase = ''
                install -d $out/share/mpv/scripts
                install -m 0644 sub-select.lua $out/share/mpv/scripts/${passthru.scriptName}
              '';

              passthru.scriptName = "sub-select.lua";
            }))
            (pkgs.stdenv.mkDerivation (sources.mpv-youtube-quality // rec {
              patches = [
                (pkgs.fetchpatch { url = "https://github.com/jgreco/mpv-youtube-quality/pull/31.patch"; hash = "sha256-2aTTkW48uRe8XC1ZQ8J5T9sUmZ5F3YAoYCMxqEs2AY8="; })
                (pkgs.fetchpatch { url = "https://github.com/jgreco/mpv-youtube-quality/pull/20.patch"; hash = "sha256-X5BwDsxziYbeiQvrBt8+IS+6oH1i0LvaaYtugL790gg="; })
              ];

              installPhase = ''
                install -d $out/share/mpv/scripts
                install -m 0644 youtube-quality.lua $out/share/mpv/scripts/${passthru.scriptName}
              '';

              passthru.scriptName = "youtube-quality.lua";
            }))
          ];
        })];
        buildInputs = [ pkgs.makeWrapper ];
        postBuild = ''
          makeWrapper $out/bin/mpv $out/bin/mpvrm \
            --add-flags "--script=${pkgs.writeTextDir "share/mpv/scripts/delete.lua" ''
              del_path = '''
              do_del = false

              mp.add_hook('on_load', 50, function()
                  del_path = '''
              end)
              mp.add_hook('on_unload', 50, function()
                  del_path = mp.get_property('path')
              end)

              mp.add_key_binding('Ctrl+q', function()
                do_del = true
                mp.commandv('quit', '4')
              end)
              mp.register_event('end-file', function(params)
                  print('end-file: '..params.reason..', '..tostring(do_del)..', '..del_path)
                  if (params.reason == 'eof' or params.reason == 'stop' or (do_del and params.reason == 'quit')) and del_path ~= ''' then
                      print('deleting: '..del_path)
                      os.remove(del_path)
                  end
              end)
            ''}/share/mpv/scripts/delete.lua"
        '';
      };
      bindings = {
        # "CTRL+n" = "af toggle \"lavfi=[dynaudnorm=f=100:g=31:s=20.0]\"";
      };
      config = {
        ytdl = true;
        ytdl-raw-options = "sub-langs=\"${config.programs.yt-dlp.settings.sub-langs}\"";
        subs-with-matching-audio = false;
        audio-display = false;
        osd-font = "Fira Sans";
        sub-font = "Fira Sans";
        # vo = "gpu";
        vo = "gpu-next";
        hwdec = "auto";
        scale = "bilinear";
        force-window = "yes";
        # af = "lavfi=[dynaudnorm=f=100:g=31:s=20.0]";
        script-opts = lib.concatStringsSep "," [
          "osc-layout=topbar"
          "vidscale=no"
          "deadzonesize=0.9"
          "ytdl_hook-ytdl_path=${pkgs.yt-dlp}/bin/yt-dlp"
          "chapterskip-skip=sponsor;intro;endcard;interact"
          "chapterskip-categories=sponsor>%[SponsorBlock%]: .*Sponsor.*;intro>%[SponsorBlock%]: .*Intro Animation.*;endcard>%[SponsorBlock%]: .*Endcards.*;interact>%[SponsorBlock%]: .*Interaction Reminder.*"
          "sub_select-config=${pkgs.writeTextDir "sub-select.json" (builtins.toJSON [
            {
              alang = "*";
              slang = "forced";
            }
            {
              alang = ["jpn" "ja"];
              slang = "eng?";
              blacklist = [ "sign" ];
            }
            {
              alang = ["jpn" "ja"];
              slang = "und";
              blacklist = [ "sign" ];
            }
            {
              alang = ["eng?" "deu?"];
              slang = "no";
            }
            {
              alang = "*";
              slang = "eng?";
            }
            {
              alang = "*";
              slang = "und";
            }
          ])}"
        ];
        watch-later-options = lib.concatStringsSep "," [ "start" ];
      };
    };

    xdg.configFile."mpv/youtube-dl".source = "${pkgs.yt-dlp}/bin/yt-dlp";
  };
}