Greasy Fork

Greasy Fork is available in English.

💖 VIP视频解析

视频解析、多源切换、简洁易用、UI美观(支持"爱优腾芒"等多平台多解析源切换)

当前为 2025-03-03 提交的版本,查看 最新版本

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name        💖 VIP视频解析
// @namespace   http://greasyfork.icu/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();
    }
})();