您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Helper for protocol_hook.lua
- // ==UserScript==
- // @name Handlers Helper
- // @include *://*/*
- // @grant GM_getValue
- // @grant GM_setValue
- // @grant GM_deleteValue
- // @grant GM_addStyle
- // @grant GM_registerMenuCommand
- // @version 3.7
- // @author -
- // @description Helper for protocol_hook.lua
- // @namespace Violentmonkey Scripts
- // ==/UserScript==
- //'iptv'
- const guide = 'Value: pipe ytdl stream mpv iptv';
- const live_window_width = 400;
- const live_window_height = 640;
- var total_direction = 4;
- var livechat = false;
- var hlsdomain = 'cdn.animevui.com';
- var UP = 'pipe';
- var DOWN = 'ytdl';
- var LEFT = 'stream';
- var RIGHT = 'mpv';
- var UP = GM_getValue('UP', UP);
- var DOWN = GM_getValue('DOWN', DOWN);
- var LEFT = GM_getValue('LEFT', LEFT);
- var RIGHT = GM_getValue('RIGHT', RIGHT);
- var hlsdomain = GM_getValue('hlsdomain', hlsdomain);
- var livechat = GM_getValue('livechat', livechat);
- var total_direction = GM_getValue('total_direction', total_direction);
- GM_registerMenuCommand('↑: ' + UP.toString(), function() {var p = window.prompt(guide, UP);if(!p){return;};GM_setValue('UP', p);window.location.reload();});
- GM_registerMenuCommand('↓: ' + DOWN.toString(), function() {var p = window.prompt(guide, DOWN);if(!p){return;};GM_setValue('DOWN', p);window.location.reload();});
- GM_registerMenuCommand('←: ' + LEFT.toString(), function() {var p = window.prompt(guide, LEFT);if(!p){return;};GM_setValue('LEFT', p);window.location.reload();});
- GM_registerMenuCommand('→: ' + RIGHT.toString(), function() {var p = window.prompt(guide, RIGHT);if(!p){return;};GM_setValue('RIGHT', p);window.location.reload();});
- GM_registerMenuCommand('HLS Force', function() {var p = window.prompt('Example: 1.com,2.com,3.com,4.com', hlsdomain);if(!p){return;};GM_setValue('hlsdomain', p);});
- GM_registerMenuCommand('Live Chat: ' + livechat.toString(), function() {var v = livechat;if(v == true){GM_setValue('livechat', false);}else{GM_setValue('livechat', true);};window.location.reload();});
- GM_registerMenuCommand('Total Direction: ' + total_direction.toString(), function() {var v = total_direction;if(v == 4){GM_setValue('total_direction', 8);}else{GM_setValue('total_direction', 4);};window.location.reload();});
- console.log(UP, DOWN, LEFT, RIGHT, hlsdomain, livechat, total_direction);
- var hlsdomain = hlsdomain.split(',');
- 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 popout(chaturl) {
- window.open(chaturl, "", "fullscreen=no,toolbar=no,titlebar=no,menubar=no,location=no,width=" + live_window_width + ",height=" + live_window_height);
- }
- function livechatopener(url) {
- var nurl = new URL(url);
- if (nurl.href.indexOf('www.youtube.com/watch') != -1 || nurl.href.indexOf('m.youtube.com/watch') != -1) {
- popout("https://www.youtube.com/live_chat?is_popout=1&v=" + nurl.search.split("v=")[1]);
- } else if (nurl.href.match('https://.*?.twitch.tv/.')) {
- popout("https://www.twitch.tv/popout" + nurl.pathname + "/chat?popout=");
- } else if (nurl.href.match('https://.*?.nimo.tv/.')) {
- var streamid = document.querySelector('a[href="' + nurl.pathname + '"] .nimo-player.n-as-full').id.replace('home-hot-', '');
- popout("https://www.nimo.tv/popout/chat/" + streamid);
- }
- }
- function EA(attr, type) {
- var url = '';
- var subs = '';
- var s = '';
- var app = 'play';
- var hls = false;
- console.log(attr, type)
- for (i in hlsdomain) {
- if (attr.indexOf(hlsdomain[i]) != -1 || document.domain.indexOf(hlsdomain[i]) != -1) {
- if (type == 'stream') {
- attr = attr.replace(/https?:/, 'hls:');
- }
- hls = true;
- }
- }
- 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 = {};
- if (type == 'pipe') {
- app = 'mpvy';
- }
- else if (type == 'iptv') {
- app = 'list';
- }
- else if (type == 'mpv' || type == 'vid') {
- app = 'play';
- }
- else {
- app = type;
- }
- var bs = GM_btoaUrl(s);
- var url2 = 'mpv://' + app + '/' + bs + '/' + "?referer=" + GM_btoaUrl(location.href);
- if (subs != '') {
- url2 = url2 + '?subs=' + GM_btoaUrl(subs);
- }
- if (hls == true) {
- url2 = url2 + '?hls=1';
- }
- if (app == 'stream' && livechat == true) {
- livechatopener(url);
- }
- console.log(url2);
- 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('RIGHT: ' + targetHref);
- EA(targetHref, RIGHT);
- break;
- case DirectionEnum.LEFT:
- console.log('LEFT: ' + targetHref);
- EA(targetHref, LEFT);
- break;
- case DirectionEnum.UP:
- console.log('UP: ' + targetHref);
- EA(targetHref, UP);
- break;
- case DirectionEnum.DOWN:
- console.log('DOWN: ' + targetHref);
- EA(targetHref, DOWN);
- 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);
- }
- }
- });
- if (document.domain == 'www.youtube.com' || document.domain == 'm.youtube.com') {
- let state = GM_getValue('hh_mobile', 'unset');
- let dm = location.host || '';
- let dmc = dm.charAt(0) || '';
- /*if (state == true && dmc == 'w') {
- location.host = location.host.replace('www.youtube.com', 'm.youtube.com');
- } else if (state == false && dmc == 'm') {
- location.host = location.host.replace('m.youtube.com', 'www.youtube.com');
- }*/
- function addMenuCommand(s, url, b) {
- GM_registerMenuCommand(s, function () {
- if (b == true) {
- if (url.indexOf('m.youtube.com') != -1) {
- GM_setValue('hh_mobile', true);
- } else if (url.indexOf('www.youtube.com') != -1) {
- GM_setValue('hh_mobile', false);
- }
- } else {
- GM_deleteValue('hh_mobile');
- }
- location.replace(url);
- });
- }
- if (dmc == 'w') {
- addMenuCommand("Switch to YouTube Mobile persistently", "https://m.youtube.com/?persist_app=1&app=m", true);
- addMenuCommand("Switch to YouTube Mobile temporarily", "https://m.youtube.com/?persist_app=0&app=m", false);
- } else if (dmc == 'm') {
- addMenuCommand("Switch to YouTube Dekstop persistently", "http://www.youtube.com/?persist_app=1&app=desktop", true);
- addMenuCommand("Switch to YouTube Dekstop temporarily", "http://www.youtube.com/?persist_app=0&app=desktop", false);
- }
- if (dmc == 'm') {
- GM_addStyle('ytm-rich-item-renderer {width: 33%!important;margin: 1px!important;padding: 0px!important;}');
- }
- }