// ==UserScript==
// @name 💖 VIP视频解析
// @namespace https://gf.qytechs.cn/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
// ==/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();
}
})();