From a8d7c643cabbe5ea0a2cd3d9c3a75f79b1cdb73e Mon Sep 17 00:00:00 2001 From: Mike Wilson Date: Mon, 16 Jun 2025 15:49:06 -0400 Subject: [PATCH] Add mpv --- main.yml | 1 + roles/mpv/files/mpv.conf | 143 +++++++++++++++++++++ roles/mpv/files/scripts/ytdlautoformat.lua | 78 +++++++++++ roles/mpv/tasks/main.yml | 15 +++ 4 files changed, 237 insertions(+) create mode 100644 roles/mpv/files/mpv.conf create mode 100644 roles/mpv/files/scripts/ytdlautoformat.lua create mode 100644 roles/mpv/tasks/main.yml diff --git a/main.yml b/main.yml index 946e846..685c0bf 100644 --- a/main.yml +++ b/main.yml @@ -1,5 +1,6 @@ - hosts: localhost connection: local roles: + - mpv - arkenfox - dwm diff --git a/roles/mpv/files/mpv.conf b/roles/mpv/files/mpv.conf new file mode 100644 index 0000000..566b094 --- /dev/null +++ b/roles/mpv/files/mpv.conf @@ -0,0 +1,143 @@ +# +# Example mpv configuration file +# +# Warning: +# +# The commented example options usually do _not_ set the default values. Call +# mpv with --list-options to see the default values for most options. There is +# no builtin or example mpv.conf with all the defaults. +# +# +# Configuration files are read system-wide from /etc/mpv or /usr/local/etc/mpv, +# and per-user from ~/.config/mpv, where per-user settings override +# system-wide settings, all of which are overridden by the command line. +# +# Configuration file settings and the command line options use the same +# underlying mechanisms. Most options can be put into the configuration file +# by dropping the preceding '--'. See the man page for a complete list of +# options. +# +# Lines starting with '#' are comments and are ignored. +# +# See the CONFIGURATION FILES section in the man page +# for a detailed description of the syntax. +# +# Profiles should be placed at the bottom of the configuration file to ensure +# that settings wanted as defaults are not restricted to specific profiles. + +################## +# video settings # +################## + +# Start in fullscreen mode by default. +#fs=yes + +# force starting with centered window +#geometry=50%:50% + +# don't allow a new window to have a size larger than 90% of the screen size +#autofit-larger=90%x90% + +# Do not close the window on exit. +#keep-open=yes + +# Do not wait with showing the video window until it has loaded. (This will +# resize the window once video is loaded. Also always shows a window with +# audio.) +#force-window=immediate + +# Disable the On Screen Controller (OSC). +#osc=no + +# Keep the player window on top of all other windows. +#ontop=yes + +# Specify fast video rendering preset (for --vo= only) +# Recommended for mobile devices or older hardware with limited processing power +#profile=fast + +# Specify high quality video rendering preset (for --vo= only) +# Offers superior image fidelity and visual quality for an enhanced viewing +# experience on capable hardware +#profile=high-quality + +# Force video to lock on the display's refresh rate, and change video and audio +# speed to some degree to ensure synchronous playback - can cause problems +# with some drivers and desktop environments. +#video-sync=display-resample + +# Enable hardware decoding if available. Often, this does not work with all +# video outputs, but should work well with default settings on most systems. +# If performance or energy usage is an issue, forcing the vdpau or vaapi VOs +# may or may not help. +#hwdec=auto + +################## +# audio settings # +################## + +# Specify default audio device. You can list devices with: --audio-device=help +# The option takes the device string (the stuff between the '...'). +#audio-device=alsa/default + +# Do not filter audio to keep pitch when changing playback speed. +#audio-pitch-correction=no + +# Output 5.1 audio natively, and upmix/downmix audio with a different format. +#audio-channels=5.1 +# Disable any automatic remix, _if_ the audio output accepts the audio format. +# of the currently played file. See caveats mentioned in the manpage. +# (The default is "auto-safe", see manpage.) +#audio-channels=auto + +################## +# other settings # +################## + +# Pretend to be a web browser. Might fix playback with some streaming sites, +# but also will break with shoutcast streams. +#user-agent="Mozilla/5.0" + +# cache settings +# +# Use a large seekable RAM cache even for local input. +#cache=yes +# +# Use extra large RAM cache (needs cache=yes to make it useful). +#demuxer-max-bytes=500M +#demuxer-max-back-bytes=100M +# +# Disable the behavior that the player will pause if the cache goes below a +# certain fill size. +#cache-pause=no +# +# Store cache payload on the hard disk instead of in RAM. (This may negatively +# impact performance unless used for slow input such as network.) +#cache-dir=~/.cache/ +#cache-on-disk=yes + +# Display English subtitles if available. +#slang=en + +# Play Finnish audio if available, fall back to English otherwise. +#alang=fi,en + +# Change subtitle encoding. For Arabic subtitles use 'cp1256'. +# If the file seems to be valid UTF-8, prefer UTF-8. +# (You can add '+' in front of the codepage to force it.) +#sub-codepage=cp1256 + +# You can also include other configuration files. +#include=/path/to/the/file/you/want/to/include + +############ +# Profiles # +############ + +# The options declared as part of profiles override global default settings, +# but only take effect when the profile is active. + +# The following profile can be enabled on the command line with: --profile=eye-cancer + +#[eye-cancer] +#sharpen=5 diff --git a/roles/mpv/files/scripts/ytdlautoformat.lua b/roles/mpv/files/scripts/ytdlautoformat.lua new file mode 100644 index 0000000..838f588 --- /dev/null +++ b/roles/mpv/files/scripts/ytdlautoformat.lua @@ -0,0 +1,78 @@ +--[[ + + A simple mpv script to automatically change ytdl-format (yt-dlp) + for specified domains/streams. + + Info: https://github.com/Samillion/mpv-ytdlautoformat + +--]] + +local options = { + -- Which domains should ytdl-format change on? + domains = { + "youtu.be", "youtube.com", "www.youtube.com", + "twitch.tv", "www.twitch.tv", + }, + + -- Set maximum video quality (on load/start) + -- 240, 360, 480, 720, 1080, 1440, 2160, 4320 + -- use 0 to ignore quality + quality = 720, + + -- Prefered codec. avc, hevc, vp9, av1 or novp9 + -- novp9: accept any codec except vp9 + codec = "novp9", + + -- rare: to avoid mpv shutting down if nothing is found with the specified format + -- if true, and format not found, it'll use fallback_format + fallback = true, + fallback_format = "bv+ba/b", +} + +-- Do not edit beyond this point +local msg = require "mp.msg" + +local function create_set(list) + local set = {} + for _, v in pairs(list) do + set[type(v) == "string" and v:lower() or v] = true + end + return set +end + +local function update_ytdl_format() + local codec_list = { + ["avc"] = "[vcodec~='^(avc|h264)']", + ["hevc"] = "[vcodec~='^(hevc|h265)']", + ["vp9"] = "[vcodec~='^(vp0?9)']", + ["av1"] = "[vcodec~='^(av01)']", + ["novp9"] = "[vcodec!~='^(vp0?9)']", + } + + local format = { + quality = options.quality > 0 and "[height<=?" .. options.quality .. "]" or "", + codec = codec_list[options.codec:lower()] or "", + fallback = options.fallback and " / " .. options.fallback_format or "", + } + + local ytdl_custom = "bv" .. format.quality .. format.codec .. "+ba/b" .. format.quality .. format.fallback + + mp.set_property("file-local-options/ytdl-format", ytdl_custom) + msg.info("Changed ytdl-format to: " .. ytdl_custom) +end + +local list = create_set(options.domains) + +mp.add_hook("on_load", 9, function() + local path = mp.get_property("path", "") + + if path:match("^%a+://") then + local hostname = path:lower():match("^%a+://([^/]+)/?") or "" + local domain = hostname:match("([%w%-]+%.%w+%.%w+)$") or hostname:match("([%w%-]+%.%w+)$") or "" + + if list[domain] then + msg.info("Domain match found: " .. domain) + update_ytdl_format() + end + end +end) diff --git a/roles/mpv/tasks/main.yml b/roles/mpv/tasks/main.yml new file mode 100644 index 0000000..00ace8f --- /dev/null +++ b/roles/mpv/tasks/main.yml @@ -0,0 +1,15 @@ +- name: Install mpv + ansible.builtin.package: + name: mpv + state: present + become: true + +- name: Install mpv.conf + ansible.builtin.copy: + src: mpv.conf + dest: "/home/{{ username }}/.config/mpv/mpv.conf" + +- name: Install scripts + ansible.builtin.copy: + src: scripts + dest: "/home/{{ username }}/.config/mpv/"