// ==UserScript== // @name 🌀VIP视频解析——fatcat // @namespace https://greasyfork.org/users/1313123-fei-miao // @version 2.9.2 // @description 适配手机端与电脑端,可自定义解析网址 // @author 暴走的肥猫 // @icon data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' viewBox='0 0 64 64'%3E%3Cdefs%3E%3ClinearGradient id='_5' x1='32' y1='60.96' x2='32' y2='5.18' gradientUnits='userSpaceOnUse'%3E%3Cstop offset='0' stop-color='%230087c9'/%3E%3Cstop offset='1' stop-color='%238fe36d'/%3E%3C/linearGradient%3E%3C/defs%3E%3Crect x='0' width='64' height='64' rx='13.63' ry='13.63' style='fill:url(%23_5); stroke-width:0px;'/%3E%3Cpath d='M53.14,22.76c1.04-1.28.37-2.32-.1-3.28-7.69-15.14-32.73-14.58-41.2-.5-13.44,19.29,7.69,44.27,28.91,34.61,14.13-6.24,14.32-28.05-.2-33.98-10.14-4.77-23.09,3.29-20.59,14.46,1.05,5.91,7.45,10.54,13.95,8.68,6.93-1.56,7.18-11.47.7-13.57-3.5-1.47-4.42,2.67-1.49,3.99,2.87,2.01.95,5.41-2.19,4.95-13.06-4.66.32-19.8,9.11-12.19,15.65,13.58-7.47,31.84-20.36,18.96C1.06,23.14,32.46.23,53.14,22.76Z' style='fill:%23f8faf9; stroke-width:0px;'/%3E%3C/svg%3E // @license GNU AGPLv3 // @match *://*.youku.com/* // @match *://*.iqiyi.com/* // @match *://v.qq.com/* // @match *://*.v.qq.com/* // @match *://*.mgtv.com/* // @match *://tv.sohu.com/* // @match *://film.sohu.com/* // @match *://*.bilibili.com/* // @match *://*.tudou.com/* // @match *://*.pptv.com/* // @compatible safari // @compatible chrome // @compatible edge // @grant GM_getValue // @grant GM_setValue // @grant GM.getValue // @grant GM.setValue // @run-at document-idle // @noframes // @downloadURL none // ==/UserScript== /*jshint esversion: 11 */ (async function () { const ACCESS_POINT = [ { "name": "虾米-1", "url": "https://jx.xmflv.com/?url=" }, { "name": "虾米-2", "url": "https://jx.xmflv.cc/?url=" }, { "name": "1907", "url": "https://im1907.top/?jx=" }, { "name": "M3U8TV", "url": "https://jx.m3u8.tv/jiexi/?url=" }, { "name": "夜幕", "url": "https://www.yemu.xyz/?url=" }, { "name": "777", "url": "https://jx.jsonplayer.com/player/?url=" }, { "name": "CK", "url": "https://www.ckplayer.vip/jiexi/?url=" }, { "name": "YT", "url": "https://jx.yangtu.top/?url=" }, { "name": "Player-JY", "url": "https://jx.playerjy.com/?url=" }, { "name": "Yparse", "url": "https://jx.yparse.com/index.php?url=" }, { "name": "8090", "url": "https://www.8090g.cn/?url=" }, { "name": "剖元", "url": "https://www.pouyun.com/?url=" }, { "name": "全民", "url": "https://43.240.74.102:4433?url=" }, { "name": "爱豆", "url": "https://jx.aidouer.net/?url=" }, { "name": "冰豆", "url": "https://bd.jx.cn/?url=" }, { "name": "Playm3u8", "url": "https://www.playm3u8.cn/jiexi.php?url=" }, { "name": "mmkv", "url": "https://jx.mmkv.cn/tv.php?url=" }, ]; var searchSelector = ['video']; async function getUserConfig(key, defaultVal) { return typeof GM_getValue === 'function' ? GM_getValue(key, defaultVal) : GM.getValue(key, defaultVal); } async function setUserConfig(key, val) { return typeof GM_setValue === 'function' ? GM_setValue(key, val) : GM.setValue(key, val); } function seekSameSizeParentNode(node) { let nodeSize = node.getBoundingClientRect(); let parents = [node]; while (node.parentNode != document.body) { parents.unshift(node.parentNode); node = node.parentNode; }; let parentSize; let sameSizeParent = parents.find(parent => { parentSize = parent.getBoundingClientRect(); return Math.abs(parentSize.width - nodeSize.width) < 1 && Math.abs(parentSize.height - nodeSize.height) < 1 }); return sameSizeParent; } function useInterval(fn, intervalTime, maxTime) { return new Promise((resolve) => { let totalTime = 0; let interval = setInterval(() => { totalTime += intervalTime; if (totalTime >= maxTime || fn()) { clearInterval(interval); resolve(); } }, intervalTime) }) } async function findVideoWrapper() { await useInterval(() => Array.from(document.querySelectorAll(searchSelector.join(','))).find(videoNode => { if (window.getComputedStyle(videoNode).display == 'none') videoNode.style.display = 'revert'; return videoNode.getBoundingClientRect().width > 90 && videoNode.getBoundingClientRect().height > 40 }), 200, Infinity); let maxVideoNode = Array.from(document.querySelectorAll(searchSelector.join(','))).reduce((pre, cur) => { if (cur.getBoundingClientRect().width > (pre?.getBoundingClientRect().width || 0)) return cur; return pre; }); return seekSameSizeParentNode(maxVideoNode); } async function createVideoFrame(videoWrapper, curAccessPoint) { videoWrapper.style.overflow = 'hidden'; if (window.getComputedStyle(videoWrapper).position == 'static') videoWrapper.style.position = 'relative'; let iframeWrapper = document.createElement('div'); iframeWrapper.innerHTML = `