-- sponsorblock_minimal.lua -- -- This script skips sponsored segments of YouTube videos -- using data from https://github.com/ajayyy/SponsorBlock local options = { API = "https://sponsor.ajay.app/api/skipSegments", -- Categories to fetch and skip categories = '"sponsor","interaction","music_offtopic"' } function getranges() local args = { "curl", "-s", "-d", "videoID="..youtube_id, "-d", "categories=["..options.categories.."]", "-G", options.API} local sponsors = mp.command_native({name = "subprocess", capture_stdout = true, playback_only = false, args = args}) if string.match(sponsors.stdout,"%[(.-)%]") then ranges = {} for i in string.gmatch(string.sub(sponsors.stdout,2,-2),"%[(.-)%]") do k,v = string.match(i,"(%d+.?%d*),(%d+.?%d*)") ranges[k] = v end end return end function skip_ads(name,pos) if pos ~= nil then for k,v in pairs(ranges) do if tonumber(k) <= pos and tonumber(v) > pos then --this message may sometimes be wrong --it only seems to be a visual thing though mp.osd_message("[sponsorblock] skipping forward "..math.floor(tonumber(v)-mp.get_property("time-pos")).."s") --need to do the +0.01 otherwise mpv will start spamming skip sometimes --example: https://www.youtube.com/watch?v=4ypMJzeNooo mp.set_property("time-pos",tonumber(v)+0.01) return end end end return end function file_loaded() local video_path = mp.get_property("path") local video_title = mp.get_property("media-title") youtube_id = string.match(video_title, ".* %(([%w-_]+)%)") if not string.match(video_path, "https?://.*%.?googlevideo%.com/.*") or not youtube_id or string.len(youtube_id) < 11 then return end youtube_id = string.sub(youtube_id, 1, 11) getranges() if ranges then ON = true mp.add_key_binding("b","sponsorblock",toggle) mp.observe_property("time-pos", "native", skip_ads) end return end function end_file() if not ON then return end mp.unobserve_property(skip_ads) ranges = nil ON = false end function toggle() if ON then mp.unobserve_property(skip_ads) mp.osd_message("[sponsorblock] off") ON = false return end mp.observe_property("time-pos", "native", skip_ads) mp.osd_message("[sponsorblock] on") ON = true return end mp.register_event("file-loaded", file_loaded) mp.register_event("end-file", end_file)