{ config, lib, nixosConfig, pkgs, ... }: let mpv-prescalers = pkgs.fetchFromGitHub { owner = "bjin"; repo = "mpv-prescalers"; rev = "b37d0f12223720f5ce48e149678162ae0a984176"; sha256 = "1mmf5827qsyph0wqkyvi7zfng1cskkapngn5hf9073zc61n4398y"; meta.license = lib.licenses.lgpl3Plus; }; shaders = { fsrcnnx_x2 = pkgs.fetchurl { url = "https://github.com/igv/FSRCNN-TensorFlow/releases/download/1.1/FSRCNNX_x2_16-0-4-1.glsl"; sha256 = "1ik99yb424r6qzq4j9pp244yx6c6sq6khqrhv9n6qv4ndi1h2qmq"; meta.license = lib.licenses.mit; }; SSimDownscaler = pkgs.fetchurl { url = "https://gist.github.com/igv/36508af3ffc84410fe39761d6969be10/raw/ac09db2c0664150863e85d5a4f9f0106b6443a12/SSimDownscaler.glsl"; sha256 = "1c3fp6llg0n8zdxadsg6g3kcvhqvikalbc9q61zgwvsx8q3d8rph"; meta.license = lib.licenses.lgpl3Plus; }; KrigBilateral = pkgs.fetchurl { url = "https://gist.github.com/igv/a015fc885d5c22e6891820ad89555637/raw/c471ef6dcbd3c4a977e1c95dc40944ee38fad08a/KrigBilateral.glsl"; sha256 = "11s0h6i0y3h2nrfp6lax6hzwvjbn93akjr6d61jrmz09zdf1iwmc"; meta.license = lib.licenses.lgpl3Plus; }; }; pitchcontrol = (pkgs.stdenvNoCC.mkDerivation rec { name = "pitchcontrol.lua"; scriptName = name; src = pkgs.fetchFromGitHub { owner = "FichteFoll"; repo = "mpv-scripts"; rev = "28ce548e82460b1ca40d3d0149faffff97c874a0"; sha256 = "159bbkk0jj25msqyg0wq5w152g6rvm325nzg0b68qzsszz73bw5p"; }; installPhase = '' mkdir -p $out/share/mpv/scripts/ cp pitchcontrol.lua $out/share/mpv/scripts ''; meta.license = lib.licenses.isc; }); gallery-view = pkgs.fetchFromGitHub { owner = "occivink"; repo = "mpv-gallery-view"; rev = "5139d346de67e8dbee8c8983777026502d6bc627"; sha256 = "1xcl31rpb6kp479kil4srkclw9ly565zavr65ary9s8795ygfcrs"; meta.license = lib.licenses.gpl2; }; cycleShaders = shaders: "cycle-values glsl-shaders ${lib.concatStringsSep " " shaders}"; in { programs.mpv = { enable = nixosConfig.sbruder.gui.enable; config = { # Main application font osd-font = "DINW07-Medium"; # not included in repository (unfree) # Subtitles sub-font = "Gandhi Sans"; # see osd-font sub-bold = true; sub-font-size = 44; sub-use-margins = false; sub-border-size = 2; # Nicer looking vobsub/PGS subtitles sub-gauss = 0.5; sub-gray = true; # Allow higher volumes volume-max = 150; # Downmix to stereo by default audio-channels = "stereo"; # Allow seeking in streamed media force-seekable = true; # Enable hardware decoding when avaliable hwdec = "auto-safe"; # Do not show images only one second image-display-duration = "inf"; # Better quality (but not too high, otherwise too high frame drop) profile = "gpu-hq"; deband = false; dither-depth = "auto"; # Lossless screenshots screenshot-format = "png"; }; bindings = { # Audio filter bs2b (for headphones) "b" = "af toggle bs2b"; # Toggle debanding "D" = "cycle deband"; # Variable correction of audio pitch when changing speed "k" = "cycle-values audio-pitch-correction no yes"; # Reverse cycling for audio and video (shift modifier on german keyboard layout) "'" = "cycle audio down"; "-" = "cycle video down"; # Cycle between audio downmixes "c" = "cycle-values audio-channels stereo mono auto"; # Cycle between smart scalers (and /dev/null = disabled) "K" = cycleShaders [ "${mpv-prescalers}/compute/ravu-lite-r4.hook" "${mpv-prescalers}/compute/ravu-lite-r3.hook" "${mpv-prescalers}/compute/ravu-lite-r2.hook" "/dev/null" ]; "Alt+K" = cycleShaders [ "${mpv-prescalers}/compute/ravu-zoom-r4-yuv.hook" "${mpv-prescalers}/compute/ravu-zoom-r3-yuv.hook" "${mpv-prescalers}/compute/ravu-zoom-r2-yuv.hook" "/dev/null" ]; "Alt+k" = cycleShaders [ "${mpv-prescalers}/compute/nnedi3-nns256-win8x4.hook" "${mpv-prescalers}/compute/nnedi3-nns128-win8x4.hook" "/dev/null" ]; # Toggle pitchcontrol "Ctrl+p" = "script-message-to pitchcontrol toggle"; # more granular panning "Alt+left" = "add video-pan-x 0.05"; "Alt+right" = "add video-pan-x -0.05"; "Alt+up" = "add video-pan-y 0.05"; "Alt+down" = "add video-pan-y -0.05"; # sub-delay for fixing 24 empty frames on blu-ray "Alt+z" = "add sub-delay -1"; "Alt+Z" = "add sub-delay +1"; }; profiles = { musicvideo = { lavfi-complex = "[aid1]asplit=4[ao][a1][a2][a3];[a1]avectorscope=m=lissajous:s=640x600:draw=dot:r=25[avectorscope];[a2]aresample=44100,showwaves=s=1280x600:mode=p2p:colors=red|lightgreen:r=25[showwaves];[a3]showcqt=s=1920x600:axis=0:axis_h=0:r=25[showcqt];[showwaves][avectorscope]hstack=shortest=1[top];[top][showcqt]vstack=shortest=1,fps=25[vo]"; alpha = false; }; musicvideo-1080 = { lavfi-complex = "[aid1]asplit=4[ao][a1][a2][a3];[a1]avectorscope=m=lissajous:s=640x540:draw=dot:r=25[avectorscope];[a2]aresample=44100,showwaves=s=1280x540:mode=p2p:colors=red|lightgreen:r=25[showwaves];[a3]showcqt=s=1920x540:axis=0:axis_h=0:r=25[showcqt];[showwaves][avectorscope]hstack=shortest=1[top];[top][showcqt]vstack=shortest=1,fps=25[vo]"; alpha = false; }; musicvideo-c64 = { lavfi-complex = "[aid1]channelsplit=4.0[mono][c1][c2][c3];[mono]channelmap=mono,asplit=2[ao][a2];[c1][c2][c3]join=inputs=3:channel_layout=3.0[a1];[a1]aresample=44100,showwaves=s=1920x600:mode=p2p:colors=red|lightgreen|yellow:split_channels=1:r=25[showwaves];[a2]showcqt=s=1920x600:axis=0:axis_h=0:r=25[showcqt];[showwaves][showcqt]vstack=shortest=1,fps=25,format=rgba[vo]"; alpha = false; }; hqencode = { ovc = "libx264"; ovcopts-add = "crf=18"; oac = "flac"; audio-format = "s16"; }; lq = { scale = "bicubic_fast"; cscale = "bicubic_fast"; dscale = "bicubic_fast"; }; hq = { scale = "ewa_lanczossharp"; dscale = "mitchell"; linear-downscaling = "no"; # for KrigBilateral cscale = "ewa_lanczos"; glsl-shader = [ "${shaders.SSimDownscaler}" # dscale "${shaders.KrigBilateral}" # cscale "${shaders.fsrcnnx_x2}" # scale ]; }; interpolate = { blend-subtitles = true; video-sync = "display-resample"; interpolation = true; tscale = "box"; tscale-window = "sphinx"; tscale-radius = 1.0; tscale-clamp = 0.0; }; # https://github.com/mpv-player/mpv/issues/4418#issuecomment-368272929 clear-speed.af-add = "scaletempo=stride=28:overlap=.9:search=25"; }; scripts = [ pitchcontrol ]; }; # mpv-gallery-view is not compatible with home-manager’s script injection meachanism xdg.configFile."mpv/scripts/gallery-thumbgen-0.lua".source = "${gallery-view}/scripts/gallery-thumbgen.lua"; xdg.configFile."mpv/scripts/gallery-thumbgen-1.lua".source = "${gallery-view}/scripts/gallery-thumbgen.lua"; xdg.configFile."mpv/scripts/gallery-thumbgen-2.lua".source = "${gallery-view}/scripts/gallery-thumbgen.lua"; xdg.configFile."mpv/scripts/gallery-thumbgen-3.lua".source = "${gallery-view}/scripts/gallery-thumbgen.lua"; xdg.configFile."mpv/scripts/lib/gallery.lua".source = "${gallery-view}/scripts/lib/gallery.lua"; xdg.configFile."mpv/scripts/playlist-view.lua".source = "${gallery-view}/scripts/playlist-view.lua"; xdg.configFile."mpv/script-opts/playlist_view.conf".text = '' thumbs_dir=${config.xdg.cacheHome}/thumbnails/mpv ''; home.file."${config.xdg.cacheHome}/thumbnails/mpv/.create".text = ""; xdg.configFile."mpv/script-opts/stats.conf".text = '' font=DINW07-Regular font_mono=DINW07-Regular font_size=10 redraw_delay=0.25 ''; }