nixos-config/users/simon/modules/mpv.nix

237 lines
7.9 KiB
Nix
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

{ 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-managers 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
'';
}