79 lines
2.3 KiB
Lua
79 lines
2.3 KiB
Lua
--[[
|
|
|
|
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)
|