From dd8111c4748396675d049f69141640c640aee67b Mon Sep 17 00:00:00 2001 From: Jesper Handskemager Date: Thu, 20 Jan 2022 05:09:17 +0100 Subject: [PATCH] Initalize Project --- youtube-stats.lua | 114 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 114 insertions(+) create mode 100644 youtube-stats.lua diff --git a/youtube-stats.lua b/youtube-stats.lua new file mode 100644 index 0000000..ab4c6c5 --- /dev/null +++ b/youtube-stats.lua @@ -0,0 +1,114 @@ +-- youtube-stats.lua +-- +-- This script shows youtube video stats +-- using data from https://returnyoutubedislike.com + +-- Press the 'H' key to show video stats + +-- Also check out this amazing plugin 'https://codeberg.org/jouni/mpv_sponsorblock_minimal' + +server = "https://returnyoutubedislikeapi.com/votes?" + +function print_stats() + local video_path = mp.get_property("path", "") + local video_referer = string.match(mp.get_property("http-header-fields", ""), "Referer:([^,]+)") or "" + + local urls = { + "https?://youtu%.be/([%w-_]+).*", + "https?://w?w?w?%.?youtube%.com/v/([%w-_]+).*", + "/watch.*[?&]v=([%w-_]+).*", + "/embed/([%w-_]+).*", + "-([%w-_]+)%." + } + youtube_id = nil + local purl = mp.get_property("metadata/by-key/PURL", "") + for i,url in ipairs(urls) do + youtube_id = youtube_id or string.match(video_path, url) or string.match(video_referer, url) or string.match(purl, url) + end + + if not youtube_id or string.len(youtube_id) < 11 then return end + youtube_id = string.sub(youtube_id, 1, 11) + + local luacurl_available, cURL = pcall(require,'cURL') + local vstr = ("videoID=%s"):format(youtube_id) + + if not(luacurl_available) then -- if Lua-cURL is not available on this system + local API = server .. vstr + local curl_cmd = { + "curl", + "-L", + "-s", + "-G", + API + } + print("Requesting:", API) + local call = mp.command_native{ + name = "subprocess", + capture_stdout = true, + playback_only = false, + args = curl_cmd + } + res = call.stdout + + -- NEEDS TESTING IF LUA-CURL IS AVAILABLE! + else -- otherwise use Lua-cURL (binding to libcurl) + local API = server .. vstr + print("Requesting: ", API) + local buf={} + local c = cURL.easy_init() + c:setopt_followlocation(1) + c:setopt_url(API) + c:setopt_writefunction(function(chunk) table.insert(buf,chunk); return true; end) + c:perform() + res = table.concat(buf) + end + -- TO HERE + + L = "return "..res:gsub('("[^"]-"):','[%1]=') + data = loadstring(L)() + + mp.osd_message("Likes: " .. numformat(data.likes) .. "\nDislikes: " .. numformat(data.dislikes) .. "\nRatio: " .. string.sub(data.rating,1,3) .. "/5\nViews: " .. numformat(data.viewCount), 5) +end + +mp.add_key_binding("h", "print_stats", print_stats) + + +-- Thank you "https://authors.curseforge.com/forums/world-of-warcraft/general-chat/lua-code-discussion/225712-number-format-with-commas?comment=6" +function numformat(number) + if number < 0 or number == 0 or not number then + return 0 + elseif number > 0 and number < 1000000 then + local t = {} + thousands = '.' + decimal = ',' + local int = math.floor(number) + local rest = number % 1 + if int == 0 then + t[#t+1] = 0 + else + local digits = math.log10(int) + local segments = math.floor(digits / 3) + t[#t+1] = math.floor(int / 1000^segments) + for i = segments-1, 0, -1 do + t[#t+1] = thousands + t[#t+1] = ("%03d"):format(math.floor(int / 1000^i) % 1000) + end + end + if rest ~= 0 then + t[#t+1] = decimal + rest = math.floor(rest * 10^6) + while rest % 10 == 0 do + rest = rest / 10 + end + t[#t+1] = rest + end + local s = table.concat(t) + return s + elseif number >= 1000000 and number < 1000000000 then + return format("%.1f|cff93E74F%s|r", number * 0.000001, "m") + elseif number >= 1000000000 then + return format("%.1f|cff93E74F%s|r", number * 0.000000001, "bil") + else + return number + end +end