You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
89 lines
2.4 KiB
89 lines
2.4 KiB
-- 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)
|
|
|