您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Helper for protocol_hook.lua
当前为
// ==UserScript== // @name Handlers Helper // @include *://*/* // @grant none // @version 2.0 // @author - // @description Helper for protocol_hook.lua // @namespace Violentmonkey Scripts // ==/UserScript== const livechat = false; const live_window_width = 400; const live_window_height = 640; const total_direction = 8; const hlsdomain = ['cdn.animevui.com'] var collected_urls = {}; function GM_getParentByTagName(el, tagName) { tagName = tagName.toLowerCase(); if (el.tagName.toLowerCase() == tagName) { return el; } while (el && el.parentNode) { el = el.parentNode; if (el.tagName && el.tagName.toLowerCase() == tagName) { return el; } } return "undefined"; } function attachDrag(elem) { function GM_btoaUrl(url) { return btoa(url).replace(/\//g, "_").replace(/\+/g, "-").replace(/\=/g, ""); } function EA(attr, type) { var url = ''; var subs = ''; var s = ''; console.log(attr, type) for (i in hlsdomain) { if (attr.indexOf(hlsdomain[i]) != -1) { attr = attr.replace(/https?/, 'hls'); } } if (attr.startsWith('http') || attr.startsWith('hls')) { url = attr; } else if (attr.startsWith('mpv://')) { location.href = attr; return; } if (url == '') { url = location.href; } console.log(collected_urls); if (Object.keys(collected_urls).length > 0) { for (link in collected_urls) { console.log(link, collected_urls[link]); collected_urls[link].style.boxSizing = 'unset'; collected_urls[link].style.border = 'unset'; s += link + ' '; } s = s.trim(' '); console.log(s); //var s = collected_urls.join(" "); } else { var s = url; } collected_urls = {}; var app = 'play'; if (type != 'vid') { var app = type.toLowerCase(); } var bs = GM_btoaUrl(s); var url2 = 'mpv://' + app + '/' + bs + '/' + "?referer=" + GM_btoaUrl(location.href); if (subs != '') { url2 = url2 + '?subs=' + GM_btoaUrl(subs); } //alert(url2); if (app == 'stream' && livechat == true) { var nurl = new URL(url); if (nurl.href.indexOf('www.youtube.com/watch') != -1 || nurl.href.indexOf('m.youtube.com/watch') != -1) { window.open("https://www.youtube.com/live_chat?is_popout=1&v=" + nurl.search.split("v=")[1], "", "fullscreen=no,toolbar=no,titlebar=no,menubar=no,location=no,width=" + live_window_width + ",height=" + live_window_height) } else if (nurl.href.match('https://.*?.twitch.tv/.')) { window.open("https://www.twitch.tv/popout" + nurl.pathname + "/chat?popout=", "", "fullscreen=no,toolbar=no,titlebar=no,menubar=no,location=no,width=" + live_window_width + ",height=" + live_window_height) } } location.href = url2; } // Define the enum-like directory const DirectionEnum = { RIGHT: 6, LEFT: 4, UP: 2, DOWN: 8, UP_LEFT: 1, UP_RIGHT: 3, DOWN_LEFT: 7, DOWN_RIGHT: 9 }; function getDirection(x, y, cx, cy) { /*================= | | | 1↖ 2↑ 3↗ | | | | 4← 5 6→ | | | | 7↙ 8↓ 9↘ | | | |=================*/ let d, t; if (cx == 0 && cy == 0) { return 5; } if ((cx - x) >= -50 && (cx - x) <= 50 && (cy - y) >= -50 && (cy - y) <= 50) { return 5; } // Change (4 == 4) to (8 == 4) to enable 8 directions if (total_direction == 4) { //4 directions if (Math.abs(cx - x) < Math.abs(cy - y)) { d = cy > y ? "8" : "2"; } else { d = cx > x ? "6" : "4"; } } else { //8 directions t = (cy - y) / (cx - x); if (-0.4142 <= t && t < 0.4142) d = cx > x ? '6' : "4"; else if (2.4142 <= t || t < -2.4142) d = cy > y ? '8' : '2'; else if (0.4142 <= t && t < 2.4142) d = cx > x ? '9' : '1'; else d = cy > y ? '7' : '3'; } return d; } elem.addEventListener('dragstart', function(e) { //console.log(e.target); //console.log(e.target.shadowRoot); /*if (e.target.nodeName != "A") { e.stopPropagation(); e.stopImmediatePropagation(); //e.preventDefault(); }*/ console.log('dragstart'); var x1 = e.clientX; var y1 = e.clientY; var dragend = elem.addEventListener('dragend', function doEA(e) { var x2 = e.clientX; var y2 = e.clientY; var direction = getDirection(x1, y1, x2, y2); //if ((x2 - x1) >= -50 && (x2 - x1) <= 50 && (y2 - y1) >= -50 && (y2 - y1) <= 50) {direction = 5;console.log(5);} //if (e.target.nodeName == "A" && e.target.href.match(/youtube.com|youtu.be|streamable.com/)) { console.log('Direction: ' + direction); console.log(x1, y1, x2, y2, direction); const targetHref = e.target.href || e.target.src; switch (+direction) { case DirectionEnum.RIGHT: console.log('MPV: ' + targetHref); EA(targetHref, 'vid'); break; case DirectionEnum.LEFT: console.log('Streamlink: ' + targetHref); EA(targetHref, 'stream'); break; case DirectionEnum.UP: console.log('Pipe: ' + targetHref); EA(targetHref, 'mpvy'); break; case DirectionEnum.DOWN: console.log('YTDL: ' + targetHref); EA(targetHref, 'ytdl'); break; case DirectionEnum.UP_LEFT: console.log('List: ' + targetHref); EA(targetHref, 'list'); break; case DirectionEnum.UP_RIGHT: case DirectionEnum.DOWN_LEFT: case DirectionEnum.DOWN_RIGHT: default: break; } //} console.log(direction); this.removeEventListener('dragend', doEA); }, false); }, false); } var count = 0; var mouseIsDown = false; var held = false; document.addEventListener("mousedown", function (e) { var link = GM_getParentByTagName(e.target, 'A'); if (link.nodeName == 'A') { mouseIsDown = true; document.addEventListener("mouseup", function mouseup(e) { mouseIsDown = false; this.removeEventListener('mouseup', mouseup); }); document.addEventListener("contextmenu", function contextmenu(e) { if (held == true) { held = false; e.preventDefault(); } held = false; this.removeEventListener('contextmenu', contextmenu); }); if (e.button === 2) { setTimeout(function () { if (mouseIsDown) { if (collected_urls[link.href] == undefined) { //var ele = GM_eleTOPele(e.target); //document.body.appendChild(ele); //collected_urls[link.href] = ele; collected_urls[link.href] = e.target; e.target.style.boxSizing = 'border-box'; e.target.style.border = 'solid yellow 4px'; //popup('Added: ' + link.href, e.clientX, e.clientY) } else { //collected_urls[link.href].parentNode.removeChild(collected_urls[link.href]); collected_urls[link.href].style.boxSizing = 'unset'; collected_urls[link.href].style.border = 'unset'; delete collected_urls[link.href]; //e.target.style.boxSizing = 'unset'; //e.target.style.border = 'unset'; } console.log(collected_urls); count = 0; mouseIsDown = false; held = true; } }, 200); } } }); attachDrag(document); var attachedeles = []; document.addEventListener('mouseover', function(e) { if (e.target.shadowRoot) { if (attachedeles.includes(e.target) == false) { console.log(attachedeles); attachedeles.push(e.target); attachDrag(e.target.shadowRoot); } } });
QingJ © 2025
镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址