-- chapterskip.lua -- -- Ain't Nobody Got Time for That -- -- This script skips chapters based on their title. local categories = { prologue = "^[Pp]rologue/^[Ii]ntro", opening = "^OP/ OP$/^[Oo]pening/[Oo]pening$", ending = "^ED/ ED$/^[Ee]nding/[Ee]nding$", credits = "^[Cc]redits/[Cc]redits$", preview = "[Pp]review$" } local options = { enabled = false, skip_once = true, categories = "", skip = "" } mp.options = require "mp.options" function matches(i, title) for category in string.gmatch(options.skip, " *([^;]*[^; ]) *") do if categories[category:lower()] then if string.find(category:lower(), "^idx%-") == nil then if title then for pattern in string.gmatch(categories[category:lower()], "([^/]+)") do if string.match(title, pattern) then return true end end end else for pattern in string.gmatch(categories[category:lower()], "([^/]+)") do if tonumber(pattern) == i then return true end end end end end end local skipped = {} local parsed = {} local function toggle_chapterskip() options.enabled = not options.enabled end function chapterskip(_, current) mp.options.read_options(options, "chapterskip") if not options.enabled then return end for category in string.gmatch(options.categories, "([^;]+)") do name, patterns = string.match(category, " *([^+>]*[^+> ]) *[+>](.*)") if name then categories[name:lower()] = patterns elseif not parsed[category] then mp.msg.warn("Improper category definition: " .. category) end parsed[category] = true end local chapters = mp.get_property_native("chapter-list") local skip = false for i, chapter in ipairs(chapters) do if (not options.skip_once or not skipped[i]) and matches(i, chapter.title) then if i == current + 1 or skip == i - 1 then if skip then skipped[skip] = true end skip = i end elseif skip then mp.set_property("time-pos", chapter.time) skipped[skip] = true return end end if skip then if mp.get_property_native("playlist-count") == mp.get_property_native("playlist-pos-1") then return mp.set_property("time-pos", mp.get_property_native("duration")) end mp.commandv("playlist-next") end end mp.observe_property("chapter", "number", chapterskip) mp.register_event("file-loaded", function() skipped = {} end) mp.register_script_message("chapter-skip", toggle_chapterskip)