// ==UserScript== // @name 💖 VIP视频解析 // @namespace https://greasyfork.org/zh-CN/users/1409010-i-breathe // @version 2.0 // @description 视频解析、多源切换、简洁易用、UI美观(支持"爱优腾芒"等多平台多解析源切换) // @author I-Breathe // @run-at document-start // @match http*://*.iqiyi.*/* // @match http*://*.qq.*/* // @match http*://*.youku.*/* // @match http*://*.bilibili.*/* // @match http*://*.mgtv.*/* // @match http*://*.sohu.*/* // @match http*://*.pptv.*/* // @match http*://*.le.*/* // @match http*://*.1905.*/* // @match http*://*.acfun.*/* // @grant none // @grant GM_setValue // @grant GM_getValue // @downloadURL none // ==/UserScript== (function() { 'use strict'; const CONFIG = { buttonSize: 55, // 按钮尺寸(PC端60 移动端建议50 可自行微调) buttonRight: '25px', // 图标距底部右侧距离 (PC端35 移动端建议15 可自行微调) buttonBottom: '25px', // 图标距底部距离(PC端35 移动端建议15 可自行微调) imageUrl: 'https://img13.360buyimg.com/ddimg/jfs/t1/121241/11/19612/181715/5fbac680E636138b5/267dd280e727aff4.jpg', opacity: 1, breatheColors: ['#FF00FF95','#00FAFF95','#FFFF0095','#00FFFF95','#00FF0095'], breatheDuration: 15, glowSize: 7, parseUrl: GM_getValue('selectedParseUrl', 'https://www.yemu.xyz/?url='), parseUrls: [ ["https://bd.jx.cn/?url=", "冰豆弹幕"], ["https://am1907.top/?jx=", "1907解析"], ["https://jx.xmflv.cc/?url=", "虾米解析"], ["https://jx.xymp4.cc/?url=", "咸鱼解析"], ["https://www.yemu.xyz/?url=", "夜幕解析"], ["https://jx.77flv.cc/?url=", "77云解析"], ["https://www.8090g.cn/jiexi/?url=", "8090g"], ["https://jx.playerjy.com/?url=", "PlayerJy"], ["https://www.ckplayer.vip/jiexi/?url=", "CkPlay"], ["https://www.pangujiexi.com/jiexi/?url=", "盘古解析"], ["https://jx.hls.one/?url=", "hls解析"], ["https://jx.973973.xyz/?url=", "973播放"], ["https://jx.nnxv.cn/tv.php?url=", "七哥解析"], ["https://jx.2s0.cn/player/?url=", "极速解析"], ["https://rdfplayer.mrgaocloud.com/player/?url=", "红狐解析"], ["https://jx.m3u8.tv/jiexi/?url=", "M3U8"], ["https://www.pouyun.com/?url=", "剖云解析"], ["https://www.playm3u8.cn/jiexi.php?url=", "playm3u8"], ["https://yparse.ik9.cc/?url=", "ik9云解析"], ["https://xiaoapi.cn/API/jx_txsp.php?url=", "腾讯API解析"], ["https://xiaoapi.cn/API/jx_yk.php?url=", "优酷API解析"], ["https://xiaoapi.cn/API/zs_ewm.php?msg=", "网址二维码生成"], ["https://www.yemu.xyz/?url=", "无法播放更换接口尝试"], ["https://bd.jx.cn/?url=", "• • •"] ] }; let floatingButton; let clickTimer; const styleSheet = document.createElement('style'); styleSheet.textContent = ` .floating-button { position: fixed; z-index: 999999; cursor: pointer; border-radius: 50%; transition: all 0.3s ease; } .source-list { position: fixed; background: #fff; border-radius: 16px; box-shadow: 0 2px 10px rgba(0,0,0,0.2); z-index: 999999; padding: 1px 1px; min-width: 150px; background: rgba(0,0,0,0.5); backdrop-filter: blur(10px); border: 1px solid rgba(255,255,255,0.1); color: #fff; font-family: "Microsoft YaHei", sans-serif; } .source-item { padding: 5px 20px; /*字体列表尺寸 建议2-6,15-30px ,根据终端微调 */ border-radius: 50px; cursor: pointer; font-size: 15px; /* 建议字体大小12-16px ,根据终端微调 */ white-space: nowrap; transition: all 0.2s; text-align: center; color: inherit; /* color: #333; */ &:hover { background: rgba(255,255,255,0.1); /* color: #FF4081; */ } &[data-selected="true"] { color: #FF4081; font-weight: bold; } } @keyframes breathe { 0% { box-shadow: 0 0 ${CONFIG.glowSize}px ${CONFIG.glowSize}px ${CONFIG.breatheColors[0]}; } 33% { box-shadow: 0 0 ${CONFIG.glowSize}px ${CONFIG.glowSize}px ${CONFIG.breatheColors[1]}; } 66% { box-shadow: 0 0 ${CONFIG.glowSize}px ${CONFIG.glowSize}px ${CONFIG.breatheColors[2]}; } 100% { box-shadow: 0 0 ${CONFIG.glowSize}px ${CONFIG.glowSize}px ${CONFIG.breatheColors[0]}; } } `; document.head.appendChild(styleSheet); function createFloatingButton() { const btn = document.createElement('img'); btn.src = CONFIG.imageUrl; btn.className = 'floating-button'; btn.style.cssText = ` right: ${CONFIG.buttonRight}; bottom: ${CONFIG.buttonBottom}; width: ${CONFIG.buttonSize}px; height: ${CONFIG.buttonSize}px; opacity: ${CONFIG.opacity}; animation: breathe ${CONFIG.breatheDuration}s infinite; `; return btn; } function createSourceListItem([url, name]) { const item = document.createElement('div'); item.className = 'source-item'; item.textContent = name; item.style.color = url === CONFIG.parseUrl ? '#ECECEC' : '#00000099'; /* 列表选中和字体颜色 , 有需要就自己调吧*/ item.addEventListener('mouseenter', () => item.style.background = '#f5f5f525'); item.addEventListener('mouseleave', () => item.style.background = ''); item.addEventListener('click', (e) => { e.stopPropagation(); CONFIG.parseUrl = url; GM_setValue('selectedParseUrl', url); document.getElementById('parse-source-list')?.remove(); floatingButton.style.boxShadow = `0 0 6px 6px ${CONFIG.breatheColors[0]}`; }); return item; } function createSourceList() { const existingList = document.getElementById('parse-source-list'); if (existingList) existingList.remove(); const list = document.createElement('div'); list.id = 'parse-source-list'; list.className = 'source-list'; list.style.cssText = ` right: ${CONFIG.buttonRight}; bottom: calc(${CONFIG.buttonBottom} + ${CONFIG.buttonSize + 10}px); `; CONFIG.parseUrls.forEach(item => list.appendChild(createSourceListItem(item))); const closeHandler = e => { if (!list.contains(e.target) && e.target !== floatingButton) { list.remove(); document.removeEventListener('click', closeHandler); } }; document.addEventListener('click', closeHandler); return list; } function initButtonEvents() { floatingButton.addEventListener('mouseenter', () => { floatingButton.style.opacity = '1'; floatingButton.style.transform = 'scale(1.1)'; }); floatingButton.addEventListener('mouseleave', () => { floatingButton.style.opacity = CONFIG.opacity; floatingButton.style.transform = 'none'; }); floatingButton.addEventListener('click', () => { clearTimeout(clickTimer); clickTimer = setTimeout(() => window.open(CONFIG.parseUrl + location.href), 300); }); floatingButton.addEventListener('dblclick', () => { clearTimeout(clickTimer); document.body.appendChild(createSourceList()); }); } function init() { floatingButton = createFloatingButton(); document.body.appendChild(floatingButton); initButtonEvents(); } if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', init); } else { init(); } })();