Greasy Fork

Greasy Fork is available in English.

🫧404小站 — 🎬VIP追剧神器 | 完全免费 | 支持多平台 | (电脑/手机/平板...自适应)

▶在线VIP视频解析工具 (电脑/手机/平板...) | free | 支持多平台【爱奇艺】【腾讯视频】【优酷土豆】【芒果TV】【乐视视频】【哔哩哔哩】【搜狐视频】等常见平台。✨50+解析接口任选 ✨内嵌播放无广告 ✨智能切集追剧 ✨自定义播放器尺寸 ✨一键自动解析 制作不易,有问题可加微信咨询:Why15236444193 [如果加微信未能及时回复,请多多包涵哈!]

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name         🫧404小站 — 🎬VIP追剧神器 | 完全免费 | 支持多平台 | (电脑/手机/平板...自适应)
// @namespace    http://tampermonkey.net/
// @version      3.1.2
// @description  ▶在线VIP视频解析工具 (电脑/手机/平板...) | free | 支持多平台【爱奇艺】【腾讯视频】【优酷土豆】【芒果TV】【乐视视频】【哔哩哔哩】【搜狐视频】等常见平台。✨50+解析接口任选 ✨内嵌播放无广告 ✨智能切集追剧 ✨自定义播放器尺寸 ✨一键自动解析  制作不易,有问题可加微信咨询:Why15236444193 [如果加微信未能及时回复,请多多包涵哈!]
// @author       yyy.
// @match        *://*/*
// @grant        GM_registerMenuCommand
// @grant        GM_addStyle
// @grant        GM_notification
// @grant        GM_getValue
// @grant        GM_setValue
// @grant        GM_openInTab
// @require      https://cdn.jsdelivr.net/npm/sweetalert2@11
// @run-at       document-start
// @icon         data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiIgdmlld0JveD0iMCAwIDMyIDMyIj48cmVjdCB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiBmaWxsPSIjZmZmIi8+PHBhdGggZD0iTTE2IDMuNWMtNi45IDAtMTIuNSA1LjYtMTIuNSAxMi41UzkuMSAyOC41IDE2IDI4LjUgMjguNSAyMi45IDI4LjUgMTYgMjIuOSAzLjUgMTYgMy41eiIgZmlsbD0iI2ZmNjliNCIvPjxwYXRoIGQ9Ik0xNiA2LjVjLTUuMiAwLTkuNSA0LjMtOS41IDkuNXM0LjMgOS41IDkuNSA5LjUgOS41LTQuMyA5LjUtOS41LTQuMy05LjUtOS41LTkuNXptMCAxNmMtMy42IDAtNi41LTIuOS02LjUtNi41czIuOS02LjUgNi41LTYuNSA2LjUgMi45IDYuNSA2LjUtMi45IDYuNS02LjUgNi41eiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGQ9Ik0xMiAxNWgydjJoLTJ6bTQtMmgzdjJoLTN6IiBmaWxsPSIjZmZmIi8+PHBhdGggZD0iTTE0IDIyaC0ydjJoMnoiIGZpbGw9IiNmZmYiLz48cGF0aCBkPSJNMTggMjJoLTJ2MmgyeiIgZmlsbD0iI2ZmZiIvPjxwYXRoIGQ9Ik0xNSAyN2gydjJoLTJ6IiBmaWxsPSIjZmZmIi8+PC9zdmc+
// ==/UserScript==
/*
   ┏┓   ┏┓
   ┏┛┻━━━━━━┛ ┻┓
  ┃       ┃
  ┃   ━   ┃
  ┃ ┳┛ ┗┳  ┃
  ┃      ┃
  ┃   ┻   ┃
  ┃      ┃
  ┗━━━┓   ┏━┛Codes are far away from bugs with the animal protecting
    ┃   ┃    神兽保佑,代码无bug
    ┃   ┃
    ┃   ┗━━━┓
    ┃      ┣┓
    ┃     ┏┛
    ┗┓┓┏━┳┓┏┛
     ┃┫┫ ┃┫┫
     ┗┻┛ ┗┻┛
*/

(function() {
    'use strict';

    // ===== 防止在iframe中重复执行 =====
    if (window.self !== window.top) {
        console.log('VIP解析脚本:检测到iframe环境,跳过执行');
        return;
    }

    const parseApis = [
        {"name": "789", "type": "1,3", "url": "https://jiexi.789jiexi.icu:4433/?url=", "recommended": true},
        {"name": "虾米", "type": "1,3", "url": "https://jx.xmflv.cc/?url=", "recommended": true},
        {"name": "HLS", "type": "1,3", "url": "https://jx.hls.one/?url="},
        {"name": "极速", "type": "1,3", "url": "https://jx.2s0.cn/player/?url="},
        {"name": "Play", "type": "1,3", "url": "https://jx.playerjy.com/?url="},
        {"name": "冰豆", "type": "1,3", "url": "https://bd.jx.cn/?url="},
        {"name": "973", "type": "1,3", "url": "https://jx.973973.xyz/?url="},
        {"name": "麒麟", "type": "3", "url": "https://rdfplayer.mrgaocloud.com/player/?url="},
        {"name": "纯净1", "type": "1,2,3", "url": "https://im1907.top/?jx="},
        {"name": "B站1", "type": "1,3", "url": "https://jx.jsonplayer.com/player/?url="},
        {"name": "爱豆", "type": "1,3", "url": "https://jx.aidouer.net/?url="},
        {"name": "BL", "type": "1,3", "url": "https://vip.bljiex.com/?v="},
        {"name": "百域", "type": "1,3", "url": "https://jx.618g.com/?url="},
        {"name": "CK", "type": "1,3", "url": "https://www.ckplayer.vip/jiexi/?url="},
        {"name": "CHok", "type": "1,3", "url": "https://www.gai4.com/?url="},
        {"name": "ckmov", "type": "1,3", "url": "https://www.ckmov.vip/api.php?url="},
        {"name": "H8", "type": "1,3", "url": "https://www.h8jx.com/jiexi.php?url="},
        {"name": "JY", "type": "1,3", "url": "https://jx.playerjy.com/?url="},
        {"name": "通用", "type": "1,3", "url": "https://ckmov.ccyjjd.com/ckmov/?url="},
        {"name": "la", "type": "1,3", "url": "https://api.jiexi.la/?url="},
        {"name": "老板", "type": "1,3", "url": "https://vip.laobandq.com/jiexi.php?url="},
        {"name": "MAO", "type": "1,3", "url": "https://www.mtosz.com/m3u8.php?url="},
        {"name": "M3U8", "type": "1,3", "url": "https://jx.m3u8.tv/jiexi/?url="},
        {"name": "诺讯", "type": "1,3", "url": "https://www.nxflv.com/?url="},
        {"name": "OK", "type": "1,3", "url": "https://okjx.cc/?url="},
        {"name": "PM", "type": "1,3", "url": "https://www.playm3u8.cn/jiexi.php?url="},
        {"name": "盘古", "type": "1,3", "url": "https://www.pangujiexi.cc/jiexi.php?url="},
        {"name": "RDHK", "type": "1,3", "url": "https://jx.rdhk.net/?v="},
        {"name": "人人迷", "type": "1,3", "url": "https://jx.blbo.cc:4433/?url="},
        {"name": "思云", "type": "1,3", "url": "https://jx.ap2p.cn/?url="},
        {"name": "思古3", "type": "1,3", "url": "https://jsap.attakids.com/?url="},
        {"name": "听乐", "type": "1,3", "url": "https://jx.dj6u.com/?url="},
        {"name": "维多", "type": "1,3", "url": "https://jx.ivito.cn/?url="},
        {"name": "YT", "type": "1,3", "url": "https://jx.yangtu.top/?url="},
        {"name": "云端", "type": "1,3", "url": "https://sb.5gseo.net/?url="},
        {"name": "0523", "type": "1,3", "url": "https://go.yh0523.cn/y.cy?url="},
        {"name": "17云", "type": "1,3", "url": "https://www.1717yun.com/jx/ty.php?url="},
        {"name": "180", "type": "1,3", "url": "https://jx.000180.top/jx/?url="},
        {"name": "4K", "type": "1,3", "url": "https://jx.4kdv.com/?url="},
        {"name": "8090", "type": "1,3", "url": "https://www.8090g.cn/?url="},
        {"name": "剖元", "type": "1,3", "url": "https://www.pouyun.com/?url="},
        {"name": "全民", "type": "1,3", "url": "https://43.240.74.102:4433?url="},
        {"name": "夜幕", "type": "1,3", "url": "https://www.yemu.xyz/?url="},
        {"name": "M3U8TV", "type": "1,3", "url": "https://jx.m3u8.tv/jiexi/?url="},
        {"name": "playm3u8", "type": "1,3", "url": "https://www.playm3u8.cn/jiexi.php?url="},
        {"name": "综合", "type": "1,3", "url": "https://jx.jsonplayer.com/player/?url="},
        {"name": "七七云", "type": "1,3", "url": "https://jx.77flv.cc/?url="},
        {"name": "芒果TV1", "type": "1,3", "url": "https://video.isyour.love/player/getplayer?url="},
        {"name": "七哥", "type": "1,3", "url": "https://jx.nnxv.cn/tv.php?url="},
        {"name": "im1907", "type": "2", "url": "https://im1907.top/?jx="},
        {"name": "云析(带选集)", "type": "2", "url": "https://jx.yparse.com/index.php?url="},
    ];

    const uniqueApis = [];
    const seenUrls = new Set();
    parseApis.forEach(api => {
        if (!seenUrls.has(api.url)) {
            seenUrls.add(api.url);
            uniqueApis.push(api);
        }
    });

    let customApis = GM_getValue("custom_parse_apis", []);
    let allApis = [...uniqueApis, ...customApis];

    const vipBoxId = 'vip_jx_box_' + Math.ceil(Math.random() * 100000000);

    // 播放器容器配置
    const PLAYER_CONTAINERS = [
        {
            host: "v.qq.com",
            container: "#mod_player,#player-container,.container-player",
            displayNodes: ["#mask_layer", ".mod_vip_popup", "#mask_layer", ".panel-tip-pay"]
        },
        {
            host: "m.v.qq.com",
            container: ".mod_player,#player",
            displayNodes: [".mod_vip_popup", "[class^=app_],[class^=app-],[class*=_app_],[class*=-app-],[class$=_app],[class$=-app]", "div[dt-eid=open_app_bottom]", "div.video_function.video_function_new", "a[open-app]", "section.mod_source", "section.mod_box.mod_sideslip_h.mod_multi_figures_h,section.mod_sideslip_privileges,section.mod_game_rec"]
        },
        {host: "w.mgtv.com", container: "#mgtv-player-wrap", displayNodes: []},
        {host: "www.mgtv.com", container: "#mgtv-player-wrap", displayNodes: []},
        {
            host: "m.mgtv.com",
            container: ".video-area",
            displayNodes: ["div.adFixedContain,div.ad-banner,div.m-list-graphicxcy.fstp-mark", "div[class^=mg-app],div#comment-id.video-comment div.ft,div.bd.clearfix,div.v-follower-info", "div.ht.mgui-btn.mgui-btn-nowelt", "div.personal", "div[data-v-41c9a64e]"]
        },
        {host: "www.bilibili.com", container: "#player_module,#bilibiliPlayer,#bilibili-player", displayNodes: []},
        {host: "m.bilibili.com", container: ".player-wrapper,.player-container,.mplayer", displayNodes: []},
        {host: "www.iqiyi.com", container: "#outlayer,.iqp-player-videolayer", displayNodes: ["#playerPopup", "#vipCoversBox" ,"div.iqp-player-vipmask", "div.iqp-player-paymask","div.iqp-player-loginmask", "div[class^=qy-header-login-pop]",".covers_cloudCover__ILy8R","#videoContent > div.loading_loading__vzq4j",".iqp-player-guide", ".defaultController_playCtrl__Smes8", ".tips_textsBackImg__svIhR", "[class*='defaultController']", "[class*='player-buttons']", "[class*='tips_']", ".qy-player-controller", ".qy-player-tips", "[class*='danmu']", "[class*='Danmu']", ".iqp-danmu", ".qy-player-danmu", "[class*='barrage']", ".XPlayer_heatMapContainer__17MIj", ".progressBar_container__0x13u", ".XPlayer_bottom__xzRnb"]},
        {
            host: "m.iqiyi.com",
            container: ".m-video-player-wrap,.iqp-player-videolayer",
            displayNodes: ["div.m-iqyGuide-layer", "a[down-app-android-url]", "div.iqp-player-vipmask", ".loading_loading__vzq4j","[name=m-extendBar]", "[class*=ChannelHomeBanner]", "section.m-hotWords-bottom"]
        },
        {host: "www.iq.com", container: ".intl-video-wrap", displayNodes: []},
        {host: "v.youku.com", container: "#playerMouseWheel", displayNodes: ["#iframaWrapper", ".kui-dashboard-timer-container", ".kui-dashboard-bar-container", ".kui-dashboard-dashboard-panel"]},
        {host: "m.youku.com", container: "#playerMouseWheel,.h5-detail-player", displayNodes: []},
        {host: "tv.sohu.com", container: "#player", displayNodes: []},
        {host: "film.sohu.com", container: "#playerWrap", displayNodes: []},
        {host: "www.le.com", container: "#le_playbox", displayNodes: []},
        {host: "video.tudou.com", container: ".td-playbox", displayNodes: []},
        {host: "v.pptv.com", container: "#pptv_playpage_box", displayNodes: []},
        {host: "vip.pptv.com", container: ".w-video", displayNodes: []},
        {host: "www.wasu.cn", container: "#flashContent", displayNodes: []},
        {host: "www.acfun.cn", container: "#player", displayNodes: []},
        {host: "vip.1905.com", container: "#player,#vodPlayer", displayNodes: []},
        {host: "www.1905.com", container: "#player,#vodPlayer", displayNodes: []},
    ];
    const DEFAULT_STYLE = {
        bgColor: '#3f4149',
        fontColor: '#DCDCDC',
        opacity: 0.95,
        width: '380px'
    };
    const DEFAULT_SHORTCUT = {
        toggle: 'v',
        refresh: 'r',
        style: 's'
    };
    const CONFIG = {
        vipBoxId: vipBoxId,
        autoPlayerKey: "auto_player_key_" + window.location.host,
        autoPlayerVal: "auto_player_value_" + window.location.host,
        flag: "flag_vip",
        currentTypeKey: "current_type_key_" + window.location.host,
        panelPosKey: "vip_panel_pos_" + window.location.host,
        customStyleKey: "vip_custom_style_" + vipBoxId,
        customShortcutKey: "vip_custom_shortcut_" + vipBoxId,
        shortcut: GM_getValue("vip_custom_shortcut_" + vipBoxId, DEFAULT_SHORTCUT)
    };

    const DOM_CACHE = {
        vipBox: null,
        vipList: null,
        vipTab: null,
        donateTab: null,
        simpleApiList: null,
        complexApiList: null,
        addApiForm: null,
        styleSetPanel: null,
        shortcutSetPanel: null,
        autoParseSetPanel: null,
        apiNameInput: null,
        apiUrlInput: null,
        apiTypeSelect: null
    };

    // 全局播放器控制
    let lastPageUrl = window.location.href;

    GM_addStyle(`
        #${CONFIG.vipBoxId} {
            cursor: pointer;
            position: fixed;
            top: 120px;
            left: 0px;
            z-index: 9999999;
            text-align: left;
            transition: left 0.3s ease;
        }
        #${CONFIG.vipBoxId}.visible {
            left: 0px;
        }
        #${CONFIG.vipBoxId} .img_box {
            width: 32px;
            height: 32px;
            line-height: 32px;
            text-align: center;
            background-color: lightgreen;
            margin: 10px 0px;
            color: white;
            font-size: 16px;
            font-weight: bold;
            border-radius: 5px;
        }
        #${CONFIG.vipBoxId} .vip_list {
            display: none;
            position: absolute;
            border-radius: 5px;
            left: 32px;
            top: 0;
            text-align: center;
            border: 1px solid white;
            padding: 10px 0px;
            max-height: 80vh;
            overflow-y: auto;
            opacity: 0;
            transform: translateX(-10px);
            transition: all 0.3s cubic-bezier(0.23, 1, 0.32, 1);
        }
        #${CONFIG.vipBoxId} .vip_list.visible {
            display: block;
            opacity: 1;
            transform: translateX(0);
        }
        #${CONFIG.vipBoxId} .vip_list ul {
            padding-left: 10px;
            margin: 0;
        }
        #${CONFIG.vipBoxId} .vip_list li {
            border-radius: 2px;
            font-size: 12px;
            text-align: center;
            width: calc(25% - 14px);
            line-height: 21px;
            float: left;
            border: 1px solid gray;
            padding: 0 4px;
            margin: 4px 2px;
            overflow: hidden;
            white-space: nowrap;
            text-overflow: ellipsis;
            -o-text-overflow: ellipsis;
            opacity: 0;
            transform: translateY(10px);
            cursor: pointer;
        }
        #${CONFIG.vipBoxId} .vip_list.visible li {
            opacity: 1;
            transform: translateY(0);
            transition: all 0.4s cubic-bezier(0.23, 1, 0.32, 1) 0.1s;
        }
        #${CONFIG.vipBoxId} .complex-api-list li {
            width: calc(50% - 14px);
        }
        #${CONFIG.vipBoxId} .vip_list li:hover {
            border: 1px solid #1c84c6;
        }
        #${CONFIG.vipBoxId} .vip_list::-webkit-scrollbar {
            width: 5px;
            height: 1px;
        }
        #${CONFIG.vipBoxId} .vip_list::-webkit-scrollbar-thumb {
            box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.2);
            background: #A8A8A8;
        }
        #${CONFIG.vipBoxId} .vip_list::-webkit-scrollbar-track {
            box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.2);
            background: #F1F1F1;
        }
        #${CONFIG.vipBoxId} li.selected {
            border: 1px solid #1c84c6;
        }
        #${CONFIG.vipBoxId} #vip_auto {
            background-color: #ff69b4;
        }
        #${CONFIG.vipBoxId} #add_api_btn, #${CONFIG.vipBoxId} #open-style-set-btn, #${CONFIG.vipBoxId} #open-shortcut-set-btn, #${CONFIG.vipBoxId} #open-auto-parse-set-btn {
            background-color: #36383f;
            color: #ccc;
            border: 1px solid #5a5a5a;
            font-size: 12px;
            width: auto;
            padding: 6px 12px;
            margin-top: 5px;
            border-radius: 3px;
            cursor: pointer;
            margin-left: 5px;
        }
        #${CONFIG.vipBoxId} #add_api_btn:hover, #${CONFIG.vipBoxId} #open-style-set-btn:hover, #${CONFIG.vipBoxId} #open-shortcut-set-btn:hover, #${CONFIG.vipBoxId} #open-auto-parse-set-btn:hover {
            background-color: #42444a;
        }
        .mode-toggle {
            cursor: pointer;
            margin-left: 2px;
        }
        .section-title {
            font-weight: bold;
            font-size: 14px;
            padding: 5px 0px;
            clear: both;
            opacity: 0;
            transform: translateY(10px);
        }
        #${CONFIG.vipBoxId} .vip_list.visible .section-title {
            opacity: 1;
            transform: translateY(0);
            transition: all 0.4s cubic-bezier(0.23, 1, 0.32, 1) 0.05s;
        }
        #${CONFIG.vipBoxId} #donate_section {
            clear: both;
            margin-top: 10px;
            padding: 10px;
            text-align: center !important;
            border-top: 1px solid #555;
            opacity: 0;
            transform: translateY(10px);
        }
        #${CONFIG.vipBoxId} .vip_list.visible #donate_section {
            opacity: 1;
            transform: translateY(0);
            transition: all 0.4s cubic-bezier(0.23, 1, 0.32, 1) 0.15s;
        }
        #${CONFIG.vipBoxId} #donate_section .donate-title {
            font-size: 12px;
            margin-bottom: 5px;
        }
        #${CONFIG.vipBoxId} #qr-code-img {
            max-width: 100px;
            max-height: 100px;
            margin: 5px auto 0 auto !important;
            border: 1px solid #ddd;
            background: white;
            display: block !important;
        }
        #${CONFIG.vipBoxId} .tab-header {
            display: flex;
        }
        #${CONFIG.vipBoxId} .tab-button {
            flex: 1;
            padding: 5px 0;
            border: none;
            cursor: pointer;
            outline: none;
            font-size: 12px;
            background: none;
        }
        #${CONFIG.vipBoxId} .tab-button.active {
            font-weight: bold;
            color: #1c84c6 !important;
        }
        #${CONFIG.vipBoxId} .tab-divider {
            width: 1px;
            background-color: #5a5a5a;
            margin: 5px 0;
        }
        #${CONFIG.vipBoxId} .tab-content {
            display: none;
        }
        #${CONFIG.vipBoxId} .tab-content.active {
            display: block;
        }
        #${CONFIG.vipBoxId} .add-api-form {
            padding: 10px;
            border-radius: 4px;
            margin: 10px;
            display: none;
        }
        #${CONFIG.vipBoxId} .add-api-form input,
        #${CONFIG.vipBoxId} .add-api-form select,
        #vip-style-set-panel input,
        #vip-shortcut-set-panel input,
        #vip-auto-parse-set-panel select {
            width: 100%;
            padding: 6px;
            margin: 5px 0;
            border-radius: 3px;
            border: 1px solid #5a5a5a;
            background-color: #2c2e34;
            color: #ccc;
        }
        #${CONFIG.vipBoxId} .add-api-form button {
            padding: 8px 12px;
            margin: 5px 2px;
            border: none;
            border-radius: 3px;
            cursor: pointer;
            background-color: #1c84c6;
            color: white;
            font-size: 12px;
        }
        #${CONFIG.vipBoxId} .add-api-form .cancel-btn {
            background-color: #72747a;
        }
        #vip-style-set-panel, #vip-shortcut-set-panel, #vip-auto-parse-set-panel {
            padding: 10px;
            margin: 10px;
            border-top: 1px solid #555;
            display: none;
        }
        #vip-style-set-panel .style-item, #vip-shortcut-set-panel .shortcut-item, #vip-auto-parse-set-panel .auto-parse-item {
            display: flex;
            align-items: center;
            margin: 8px 0;
            gap: 8px;
        }
        #vip-style-set-panel .style-item label, #vip-shortcut-set-panel .shortcut-item label, #vip-auto-parse-set-panel .auto-parse-item label {
            font-size: 12px;
            width: 80px;
            text-align: left;
        }
        #vip-style-set-panel .style-item input, #vip-shortcut-set-panel .shortcut-item input, #vip-auto-parse-set-panel .auto-parse-item select {
            flex: 1;
            padding: 4px;
        }
        #vip-style-set-panel button,
        #vip-shortcut-set-panel button,
        #vip-auto-parse-set-panel button {
            width: 40%;
            padding: 8px 12px;
            margin: 5px 1%;
            border: none;
            border-radius: 3px;
            cursor: pointer;
            font-size: 12px;
            display: inline-block;
        }
        #reset-style-btn, #reset-shortcut-btn, #disable-auto-parse-btn {
            background: #ff69b4 !important;
            color: white !important;
        }
        #save-auto-parse-btn, #save-shortcut-btn, #save-style-btn {
            background: #1c84c6 !important;
            color: white !important;
        }
        .shortcut-tip {
            font-size: 10px;
            color: #ccc;
            margin-top: 5px;
            text-align: left;
            line-height: 1.4;
        }

        /* 播放器控制按钮样式 */
        .vip-player-close-btn {
            position: absolute;
            top: 15px;
            right: 15px;
            z-index: 10000000;
            width: auto;
            height: auto;
            padding: 5px 10px;
            background: transparent;
            border: none;
            cursor: pointer;
            font-size: 32px;
            color: rgba(255, 255, 255, 0.8);
            transition: all 0.3s ease;
            opacity: 1;
            text-shadow: 0 2px 4px rgba(0,0,0,0.5);
            pointer-events: auto;
        }
        .vip-player-close-btn:hover {
            color: rgba(255, 255, 255, 1);
            transform: scale(1.2);
        }
        .vip-player-close-btn.hidden {
            opacity: 0;
            pointer-events: none;
        }
        .vip-player-tip {
            position: absolute;
            top: 20px;
            left: 50%;
            transform: translateX(-50%);
            z-index: 10000000;
            background: transparent;
            color: rgba(255, 255, 255, 0.9);
            padding: 0;
            border-radius: 0;
            font-size: 14px;
            border: none;
            transition: opacity 0.5s ease;
            text-shadow: 0 2px 4px rgba(0,0,0,0.8);
            pointer-events: none;
        }
        .vip-mouse-catcher {
            position: absolute;
            top: 0;
            left: 0;
            width: 100%;
            height: 100%;
            z-index: 9999999;
            pointer-events: auto;
        }
        .vip-mouse-catcher.inactive {
            pointer-events: none;
        }
        .vip-original-player-mask {
            position: absolute;
            top: 0;
            left: 0;
            width: 100%;
            height: 100%;
            z-index: 999998;
            pointer-events: auto;
            background: transparent;
        }
    `);

    function findTargetElement(targetContainer) {
        const body = window.document;
        let tabContainer;
        let tryTime = 0;
        const maxTryTime = 120;
        let startTimestamp;
        return new Promise((resolve, reject) => {
            function tryFindElement(timestamp) {
                if (!startTimestamp) {
                    startTimestamp = timestamp;
                }
                const elapsedTime = timestamp - startTimestamp;
                if (elapsedTime >= 500) {
                    tabContainer = body.querySelector(targetContainer);
                    if (tabContainer) {
                        resolve(tabContainer);
                    } else if (++tryTime === maxTryTime) {
                        reject();
                    } else {
                        startTimestamp = timestamp;
                    }
                }
                if (!tabContainer && tryTime < maxTryTime) {
                    requestAnimationFrame(tryFindElement);
                }
            }
            requestAnimationFrame(tryFindElement);
        });
    }

    function encodeVideoUrl(url) {
        if (!url) return '';
        return encodeURIComponent(url).replace(/%20/g, '+');
    }

    function renderApiLists() {
        if (!DOM_CACHE.vipTab) return;
        let simpleApisHtml = "<div class='section-title'>[内嵌播放+弹窗无选集]</div><ul class='simple-api-list'>";
        let complexApisHtml = "<div class='section-title'>[弹窗带选集]</div><ul class='complex-api-list'>";

        allApis.forEach((item, index) => {
            const types = item.type.split(',');
            const name = item.name;
            if (types.includes("1") || types.includes("3")) {
                if ((types.includes("1") || types.includes("3")) && !types.includes("2")) {
                    if (types.includes("1") && types.includes("3")) {
                        simpleApisHtml += `<li class="api-item combined-simple" data-index="${index}" data-modes="1,3" data-current-mode="1" title="${name}">${name} | <span class="mode-toggle">内嵌</span></li>`;
                    } else if (types.includes("1")) {
                        simpleApisHtml += `<li class="api-item" data-index="${index}" data-mode="1" title="${name}">${name} | 内嵌</li>`;
                    } else if (types.includes("3")) {
                        simpleApisHtml += `<li class="api-item" data-index="${index}" data-mode="3" title="${name}">${name} | 弹窗</li>`;
                    }
                }
                if (types.includes("1") && types.includes("2") && types.includes("3")) {
                    simpleApisHtml += `<li class="api-item combined-simple" data-index="${index}" data-modes="1,3" data-current-mode="1" title="${name}">${name} | <span class="mode-toggle">内嵌</span></li>`;
                }
            }
            if (types.includes("2")) {
                complexApisHtml += `<li class="api-item" data-index="${index}" data-mode="2" title="${name}">${name}</li>`;
            }
        });
        simpleApisHtml += "<div style='clear:both;'></div></ul>";
        complexApisHtml += "<div style='clear:both;'></div></ul>";
        const tabContent = DOM_CACHE.vipTab.innerHTML;
        const descText = tabContent.match(/(<div style="text-align:left;color:#FFF;font-size:10px;padding:0px 10px;margin-top:10px;">[\s\S]*?<\/div>)/)[0];
        DOM_CACHE.vipTab.innerHTML = simpleApisHtml + complexApisHtml + descText;
        DOM_CACHE.simpleApiList = DOM_CACHE.vipTab.querySelector('.simple-api-list');
        DOM_CACHE.complexApiList = DOM_CACHE.vipTab.querySelector('.complex-api-list');
        applyPanelStyle();
    }

    function applyPanelStyle(style = null) {
        const customStyle = style || GM_getValue(CONFIG.customStyleKey, DEFAULT_STYLE);
        if (!DOM_CACHE.vipList) return;
        const fontColor = customStyle.fontColor;
        const bgColor = customStyle.bgColor;

        // 应用背景色和字体色
        DOM_CACHE.vipList.style.backgroundColor = bgColor;
        DOM_CACHE.vipList.style.color = fontColor;
        DOM_CACHE.vipList.style.opacity = customStyle.opacity;
        DOM_CACHE.vipList.style.width = customStyle.width;

        // 应用到所有子元素
        DOM_CACHE.vipList.querySelectorAll('.section-title').forEach(el => {
            el.style.color = fontColor;
        });

        DOM_CACHE.vipList.querySelectorAll('.api-item').forEach(el => {
            el.style.color = fontColor;
            el.style.borderColor = 'rgba(128,128,128,0.5)';
        });

        DOM_CACHE.vipList.querySelectorAll('.mode-toggle').forEach(el => {
            el.style.color = '#1c84c6';
        });

        DOM_CACHE.vipList.querySelectorAll('.tab-button').forEach(el => {
            if (!el.classList.contains('active')) {
                el.style.color = fontColor;
            }
        });

        DOM_CACHE.vipList.querySelectorAll('.tab-header').forEach(el => {
            el.style.backgroundColor = bgColor;
        });

        DOM_CACHE.vipList.querySelectorAll('#donate_section').forEach(el => {
            el.style.color = fontColor;
        });

        DOM_CACHE.vipList.querySelectorAll('.add-api-form').forEach(el => {
            el.style.backgroundColor = bgColor;
        });

        // 应用到样式设置面板
        if (DOM_CACHE.styleSetPanel) {
            DOM_CACHE.styleSetPanel.style.backgroundColor = bgColor;
            DOM_CACHE.styleSetPanel.style.color = fontColor;
        }

        // 应用到快捷键设置面板
        if (DOM_CACHE.shortcutSetPanel) {
            DOM_CACHE.shortcutSetPanel.style.backgroundColor = bgColor;
            DOM_CACHE.shortcutSetPanel.style.color = fontColor;
        }

        // 应用到自动解析设置面板
        if (DOM_CACHE.autoParseSetPanel) {
            DOM_CACHE.autoParseSetPanel.style.backgroundColor = bgColor;
            DOM_CACHE.autoParseSetPanel.style.color = fontColor;
        }

        GM_setValue(CONFIG.customStyleKey, customStyle);
    }

    function createStyleSetPanel() {
        if (DOM_CACHE.styleSetPanel) return;
        const customStyle = GM_getValue(CONFIG.customStyleKey, DEFAULT_STYLE);
        const panel = document.createElement('div');
        panel.id = 'vip-style-set-panel';
        panel.innerHTML = `
            <div class="style-item">
                <label>面板背景色:</label>
                <input type="color" id="style-bgcolor" value="${customStyle.bgColor}">
            </div>
            <div class="style-item">
                <label>文字颜色:</label>
                <input type="color" id="style-fontcolor" value="${customStyle.fontColor}">
            </div>
            <div class="style-item">
                <label>面板透明度:</label>
                <input type="range" id="style-opacity" min="0.5" max="1" step="0.05" value="${customStyle.opacity}">
            </div>
            <div class="style-item">
                <label>面板宽度:</label>
                <input type="text" id="style-width" placeholder="如380px" value="${customStyle.width}">
            </div>
            <div style="text-align: center; margin-top: 10px;">
                <button id="save-style-btn">保存</button>
                <button id="reset-style-btn">重置</button>
            </div>
        `;
        DOM_CACHE.donateTab.appendChild(panel);
        DOM_CACHE.styleSetPanel = panel;

        // 实时预览功能
        panel.querySelector('#style-bgcolor').addEventListener('input', (e) => {
            applyPanelStyle({
                ...GM_getValue(CONFIG.customStyleKey, DEFAULT_STYLE),
                bgColor: e.target.value
            });
        });
        panel.querySelector('#style-fontcolor').addEventListener('input', (e) => {
            applyPanelStyle({
                ...GM_getValue(CONFIG.customStyleKey, DEFAULT_STYLE),
                fontColor: e.target.value
            });
        });
        panel.querySelector('#style-opacity').addEventListener('input', (e) => {
            applyPanelStyle({
                ...GM_getValue(CONFIG.customStyleKey, DEFAULT_STYLE),
                opacity: e.target.value
            });
        });
        panel.querySelector('#style-width').addEventListener('blur', (e) => {
            if (!e.target.value) return;
            applyPanelStyle({
                ...GM_getValue(CONFIG.customStyleKey, DEFAULT_STYLE),
                width: e.target.value
            });
        });

        // 保存按钮
        panel.querySelector('#save-style-btn').addEventListener('click', () => {
            const bgColor = panel.querySelector('#style-bgcolor').value;
            const fontColor = panel.querySelector('#style-fontcolor').value;
            const opacity = panel.querySelector('#style-opacity').value;
            const width = panel.querySelector('#style-width').value;

            const newStyle = { bgColor, fontColor, opacity, width };
            GM_setValue(CONFIG.customStyleKey, newStyle);
            applyPanelStyle(newStyle);

            Swal.fire({
                title: '保存成功',
                text: '样式设置已保存',
                icon: 'success',
                timer: 1500,
                showConfirmButton: false
            });
        });

        // 重置按钮
        panel.querySelector('#reset-style-btn').addEventListener('click', () => {
            applyPanelStyle(DEFAULT_STYLE);
            panel.querySelector('#style-bgcolor').value = DEFAULT_STYLE.bgColor;
            panel.querySelector('#style-fontcolor').value = DEFAULT_STYLE.fontColor;
            panel.querySelector('#style-opacity').value = DEFAULT_STYLE.opacity;
            panel.querySelector('#style-width').value = DEFAULT_STYLE.width;

            Swal.fire({
                title: '重置成功',
                text: '已恢复默认样式',
                icon: 'success',
                timer: 1500,
                showConfirmButton: false
            });
        });
    }

    function createShortcutSetPanel() {
        if (DOM_CACHE.shortcutSetPanel) return;
        const customShortcut = GM_getValue(CONFIG.customShortcutKey, DEFAULT_SHORTCUT);
        const panel = document.createElement('div');
        panel.id = 'vip-shortcut-set-panel';
        panel.innerHTML = `
            <div class="shortcut-item">
                <label>呼出/隐藏面板:</label>
                <input type="text" id="shortcut-toggle" maxlength="1" value="${customShortcut.toggle}">
            </div>
            <div class="shortcut-item">
                <label>刷新解析接口:</label>
                <input type="text" id="shortcut-refresh" maxlength="1" value="${customShortcut.refresh}">
            </div>
            <div class="shortcut-item">
                <label>打开样式设置:</label>
                <input type="text" id="shortcut-style" maxlength="1" value="${customShortcut.style}">
            </div>
            <div class="shortcut-tip">提示:仅支持单字母/数字,使用方式为 Alt + 自定义键</div>
            <div style="text-align: center; margin-top: 10px;">
                <button id="save-shortcut-btn">保存</button>
                <button id="reset-shortcut-btn">重置</button>
            </div>
        `;
        DOM_CACHE.donateTab.appendChild(panel);
        DOM_CACHE.shortcutSetPanel = panel;
        panel.querySelector('#save-shortcut-btn').addEventListener('click', () => {
            const toggle = panel.querySelector('#shortcut-toggle').value.trim().toLowerCase();
            const refresh = panel.querySelector('#shortcut-refresh').value.trim().toLowerCase();
            const style = panel.querySelector('#shortcut-style').value.trim().toLowerCase();
            if (!toggle || !refresh || !style) {
                Swal.fire('提示', '快捷键不能为空!', 'warning');
                return;
            }
            const newShortcut = { toggle, refresh, style };
            GM_setValue(CONFIG.customShortcutKey, newShortcut);
            CONFIG.shortcut = newShortcut;
            Swal.fire({
                title: '保存成功',
                text: '快捷键已保存,立即生效',
                icon: 'success',
                timer: 1500,
                showConfirmButton: false
            });
        });
        panel.querySelector('#reset-shortcut-btn').addEventListener('click', () => {
            GM_setValue(CONFIG.customShortcutKey, DEFAULT_SHORTCUT);
            CONFIG.shortcut = DEFAULT_SHORTCUT;
            panel.querySelector('#shortcut-toggle').value = DEFAULT_SHORTCUT.toggle;
            panel.querySelector('#shortcut-refresh').value = DEFAULT_SHORTCUT.refresh;
            panel.querySelector('#shortcut-style').value = DEFAULT_SHORTCUT.style;
            Swal.fire({
                title: '重置成功',
                text: '已恢复默认快捷键',
                icon: 'success',
                timer: 1500,
                showConfirmButton: false
            });
        });
    }

    function createPlayerSizeSetPanel() {
        if (DOM_CACHE.playerSizeSetPanel) return;
        const customSize = GM_getValue(CONFIG.customPlayerSizeKey, DEFAULT_PLAYER_SIZE);
        // 提取数字部分
        const widthNum = customSize.width.replace('px', '');
        const heightNum = customSize.minHeight.replace('px', '');

        const panel = document.createElement('div');
        panel.id = 'vip-player-size-set-panel';
        panel.innerHTML = `
            <div class="style-item">
                <label>播放器宽度:</label>
                <input type="number" id="player-width" placeholder="如1000" value="${widthNum}" min="300" max="3000">
                <span style="margin-left: 5px; color: #ccc;">px</span>
            </div>
            <div class="style-item">
                <label>播放器最小高度:</label>
                <input type="number" id="player-min-height" placeholder="如600" value="${heightNum}" min="200" max="2000">
                <span style="margin-left: 5px; color: #ccc;">px</span>
            </div>
            <div class="style-item">
                <label>宽高比:</label>
                <select id="player-aspect-ratio">
                    <option value="auto" ${customSize.aspectRatio === 'auto' ? 'selected' : ''}>自动</option>
                    <option value="16:9" ${customSize.aspectRatio === '16:9' ? 'selected' : ''}>16:9</option>
                    <option value="4:3" ${customSize.aspectRatio === '4:3' ? 'selected' : ''}>4:3</option>
                </select>
            </div>
            <div class="shortcut-tip">提示:修改后立即生效,下次解析时应用新尺寸</div>
            <div style="text-align: center; margin-top: 10px;">
                <button id="save-player-size-btn">保存</button>
                <button id="reset-player-size-btn">重置</button>
            </div>
        `;
        DOM_CACHE.donateTab.appendChild(panel);
        DOM_CACHE.playerSizeSetPanel = panel;
        panel.querySelector('#save-player-size-btn').addEventListener('click', () => {
            const width = panel.querySelector('#player-width').value.trim();
            const minHeight = panel.querySelector('#player-min-height').value.trim();
            const aspectRatio = panel.querySelector('#player-aspect-ratio').value;
            if (!minHeight || !width) {
                Swal.fire('提示', '请输入宽度和最小高度!', 'warning');
                return;
            }
            // 自动添加px单位
            const newSize = {
                width: width + 'px',
                minHeight: minHeight + 'px',
                aspectRatio
            };
            GM_setValue(CONFIG.customPlayerSizeKey, newSize);
            Swal.fire({
                title: '保存成功',
                text: '播放器尺寸已保存,下次解析时生效',
                icon: 'success',
                timer: 1500,
                showConfirmButton: false
            });
        });

        panel.querySelector('#reset-player-size-btn').addEventListener('click', () => {
            GM_setValue(CONFIG.customPlayerSizeKey, DEFAULT_PLAYER_SIZE);
            panel.querySelector('#player-width').value = DEFAULT_PLAYER_SIZE.width.replace('px', '');
            panel.querySelector('#player-min-height').value = DEFAULT_PLAYER_SIZE.minHeight.replace('px', '');
            panel.querySelector('#player-aspect-ratio').value = DEFAULT_PLAYER_SIZE.aspectRatio;
            Swal.fire({
                title: '重置成功',
                text: '已恢复默认尺寸',
                icon: 'success',
                timer: 1500,
                showConfirmButton: false
            });
        });
    }

    function createAutoParseSetPanel() {
        if (DOM_CACHE.autoParseSetPanel) return;

        const panel = document.createElement('div');
        panel.id = 'vip-auto-parse-set-panel';

        // 构建接口选项列表(只包含支持内嵌播放的接口)
        let optionsHtml = '<option value="-1">请选择解析接口</option>';
        allApis.forEach((api, index) => {
            if (api.type.includes("1")) {
                optionsHtml += `<option value="${index}">${api.name}</option>`;
            }
        });

        const currentIndex = GM_getValue(CONFIG.autoPlayerVal, 0);
        const isAutoEnabled = !!GM_getValue(CONFIG.autoPlayerKey, null);

        panel.innerHTML = `
            <div class="auto-parse-item">
                <label>自动解析接口:</label>
                <select id="auto-parse-api-select">
                    ${optionsHtml}
                </select>
            </div>
            <div class="shortcut-tip">提示:选择后点击保存,然后通过顶部"开/关"按钮控制自动解析</div>
            <div style="text-align: center; margin-top: 10px;">
                <button id="save-auto-parse-btn">保存</button>
                <button id="disable-auto-parse-btn">关闭</button>
            </div>
        `;
        DOM_CACHE.donateTab.appendChild(panel);
        DOM_CACHE.autoParseSetPanel = panel;

        // 设置当前选中的接口
        const selectElement = panel.querySelector('#auto-parse-api-select');
        selectElement.value = currentIndex;

        // 保存并开启按钮
        panel.querySelector('#save-auto-parse-btn').addEventListener('click', () => {
            const selectedIndex = parseInt(selectElement.value);
            if (selectedIndex === -1) {
                Swal.fire('提示', '请先选择一个解析接口!', 'warning');
                return;
            }

            const selectedApi = allApis[selectedIndex];
            GM_setValue(CONFIG.autoPlayerVal, selectedIndex);

            Swal.fire({
                title: '保存成功',
                html: `已设置 <b>${selectedApi.name}</b> 为自动解析接口<br><small>通过顶部"开/关"按钮控制自动解析</small>`,
                icon: 'success',
                timer: 2000,
                showConfirmButton: false
            });

            // 更新自动解析按钮的提示
            const autoBtn = DOM_CACHE.vipBox.querySelector("#vip_auto");
            if (autoBtn && !!GM_getValue(CONFIG.autoPlayerKey, null)) {
                autoBtn.title = `自动解析源:${selectedApi.name}`;
            }
        });

        // 关闭自动解析按钮
        panel.querySelector('#disable-auto-parse-btn').addEventListener('click', () => {
            GM_setValue(CONFIG.autoPlayerKey, null);

            Swal.fire({
                title: '已关闭自动解析',
                text: '刷新页面后生效',
                icon: 'info',
                timer: 1500,
                showConfirmButton: false
            });

            // 更新自动解析按钮状态
            const autoBtn = DOM_CACHE.vipBox.querySelector("#vip_auto");
            if (autoBtn) {
                autoBtn.innerHTML = "关";
                autoBtn.title = "点击开启自动解析";
            }

            setTimeout(() => {
                window.location.reload();
            }, 1500);
        });
    }

    function createVipButton() {
        // ===== 修复3:防止重复创建浮标 =====
        // 检查当前文档和顶层文档是否已存在浮标
        if (document.getElementById(CONFIG.vipBoxId) ||
            (window.top && window.top.document && window.top.document.getElementById(CONFIG.vipBoxId))) {
            console.log('VIP浮标已存在,跳过创建');
            return;
        }

        let currentType = GM_getValue(CONFIG.currentTypeKey, "1");
        let simpleApisHtml = "<div class='section-title'>[内嵌播放+弹窗无选集]</div><ul class='simple-api-list'>";
        let complexApisHtml = "<div class='section-title'>[弹窗带选集]</div><ul class='complex-api-list'>";
        allApis.forEach((item, index) => {
            const types = item.type.split(',');
            const name = item.name;
            if (types.includes("1") || types.includes("3")) {
                if ((types.includes("1") || types.includes("3")) && !types.includes("2")) {
                    if (types.includes("1") && types.includes("3")) {
                        simpleApisHtml += `<li class="api-item combined-simple" data-index="${index}" data-modes="1,3" data-current-mode="1" title="${name}">${name} | <span class="mode-toggle">内嵌</span></li>`;
                    } else if (types.includes("1")) {
                        simpleApisHtml += `<li class="api-item" data-index="${index}" data-mode="1" title="${name}">${name} | 内嵌</li>`;
                    } else if (types.includes("3")) {
                        simpleApisHtml += `<li class="api-item" data-index="${index}" data-mode="3" title="${name}">${name} | 弹窗</li>`;
                    }
                }
                if (types.includes("1") && types.includes("2") && types.includes("3")) {
                    simpleApisHtml += `<li class="api-item combined-simple" data-index="${index}" data-modes="1,3" data-current-mode="1" title="${name}">${name} | <span class="mode-toggle">内嵌</span></li>`;
                }
            }
            if (types.includes("2")) {
                complexApisHtml += `<li class="api-item" data-index="${index}" data-mode="2" title="${name}">${name}</li>`;
            }
        });
        simpleApisHtml += "<div style='clear:both;'></div></ul>";
        complexApisHtml += "<div style='clear:both;'></div></ul>";
        let customAndDonateHtml = `
            <div style="padding: 10px; text-align: center;">
                <div id="donate_section" style="margin-bottom: 10px; padding-bottom: 10px; border-bottom: 1px solid #555;">
                   <div style="font-size: 12px; margin-bottom: 5px;">如果觉得好用,欢迎打赏支持</div>
                    <img id="qr-code-img" src="data:image/jpeg;base64,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" alt="爱与正义" style="max-width: 100px; max-height: 100px; border: 1px solid #ddd; background: white;">
                </div>
                <button id="add_api_btn">添加自定义接口</button>
                <button id="open-style-set-btn">面板样式设置</button>
                <button id="open-shortcut-set-btn">自定义快捷键</button>
                <button id="open-auto-parse-set-btn">自动解析设置</button>
                <div class="add-api-form" id="add-api-form">
                    <input type="text" id="api-name" placeholder="接口名称">
                    <input type="text" id="api-url" placeholder="接口地址 (例: https://jx.example.com/?url=)">
                    <select id="api-type">
                        <option value="1">内嵌播放</option>
                        <option value="2">弹窗播放带选集</option>
                        <option value="3">弹窗播放不带选集</option>
                    </select>
                    <button id="save-api-btn">添加</button>
                    <button class="cancel-btn" id="cancel-api-btn">取消</button>
                </div>
            </div>
        `;
        let autoPlay = !!GM_getValue(CONFIG.autoPlayerKey, null) ? "开" : "关";
        const vipBox = document.createElement('div');
        vipBox.id = CONFIG.vipBoxId;
        vipBox.innerHTML = `
            <div class="vip_icon">
                <div class="img_box" title="选择解析源">
                    <span style="color: white;">V</span>I<span style="color: white;">P</span>
                </div>
                <div class="vip_list">
                    <div class="tab-header">
                        <button class="tab-button active" data-tab="vip">VIP视频解析</button>
                        <div class="tab-divider"></div>
                        <button class="tab-button" data-tab="donate">赞赏与自定义</button>
                    </div>
                    <div class="tab-content active" id="vip-tab">
                        ${simpleApisHtml}
                        ${complexApisHtml}
                        <div style="text-align:left;color:#FFF;font-size:10px;padding:0px 10px;margin-top:10px;">
                            <b>📖 使用说明:</b>
                            <br>&nbsp;&nbsp;1、<b>自定义设置</b>:可自定义面板大小、样式、快捷键、添加解析接口等(手机平板用户自定义面板大小适配) ——以下不懂详情请看脚本主页
                            <br>&nbsp;&nbsp;2、<b>解析视频</b>:点击内嵌播放接口即可解析当前视频(推荐"789"或"虾米")
                            <br>&nbsp;&nbsp;3、<b>播放模式</b>:点击接口名称右侧的"内嵌/弹窗"可切换播放模式
                            <br>&nbsp;&nbsp;4、<b>解析切集后</b>:解析完切换新集数后会自动关闭旧播放器,如开启自动解析则自动解析新集数
                            <br>&nbsp;&nbsp;5、<b>自动解析</b>:在"自动解析设置"中选择接口(默认789),点击顶部"开/关"按钮控制
                            <br>&nbsp;&nbsp;6、<b>快捷键</b>:Alt+V 呼出/隐藏浮标,Alt+R 刷新接口,Alt+S 打开样式设置
                            <br>&nbsp;&nbsp;7、<b>播放器接管</b>:解析时原播放器暂停,关闭解析后可继续播放原视频
                        </div>
                    </div>
                    <div class="tab-content" id="donate-tab">
                        ${customAndDonateHtml}
                    </div>
                </div>
            </div>
            <div class="img_box" id="vip_auto" title="点击开启/关闭自动解析(需先在自动解析设置中选择接口)">
                ${autoPlay}
            </div>
        `;
        const savePos = GM_getValue(CONFIG.panelPosKey, { top: 120, left: 0 });
        vipBox.style.top = savePos.top + 'px';
        vipBox.style.left = savePos.left + 'px';

        // ===== 确保浮标只添加到顶层body =====
        const targetBody = window.top.document.body || document.body;
        if (targetBody) {
            targetBody.appendChild(vipBox);
            initDOMCache(vipBox);
            if (!!GM_getValue(CONFIG.autoPlayerKey, null)) {
                setTimeout(() => {
                    autoPlayVideo();
                }, 2500);
            }
        } else {
            // 如果body还未加载,等待DOM加载完成
            findTargetElement('body')
                .then((container) => {
                    container.appendChild(vipBox);
                    initDOMCache(vipBox);
                    if (!!GM_getValue(CONFIG.autoPlayerKey, null)) {
                        setTimeout(() => {
                            autoPlayVideo();
                        }, 2500);
                    }
                })
                .catch(() => {
                    document.body.appendChild(vipBox);
                    initDOMCache(vipBox);
                    if (!!GM_getValue(CONFIG.autoPlayerKey, null)) {
                        setTimeout(() => {
                            autoPlayVideo();
                        }, 2500);
                    }
                });
        }
    }

    function initDOMCache(vipBox) {
        DOM_CACHE.vipBox = vipBox;
        DOM_CACHE.vipList = vipBox.querySelector('.vip_list');
        DOM_CACHE.vipTab = vipBox.querySelector('#vip-tab');
        DOM_CACHE.donateTab = vipBox.querySelector('#donate-tab');
        DOM_CACHE.addApiForm = vipBox.querySelector('#add-api-form');
        DOM_CACHE.apiNameInput = vipBox.querySelector('#api-name');
        DOM_CACHE.apiUrlInput = vipBox.querySelector('#api-url');
        DOM_CACHE.apiTypeSelect = vipBox.querySelector('#api-type');
        DOM_CACHE.simpleApiList = vipBox.querySelector('.simple-api-list');
        DOM_CACHE.complexApiList = vipBox.querySelector('.complex-api-list');
        createStyleSetPanel();
        createShortcutSetPanel();
        createAutoParseSetPanel();
        applyPanelStyle();
        bindEvents();
    }

    function togglePlayMode(element) {
        const listItem = element.closest('.api-item');
        const modes = listItem.dataset.modes.split(',');
        const currentMode = listItem.dataset.currentMode;
        let nextModeIndex = modes.indexOf(currentMode) + 1;
        if (nextModeIndex >= modes.length) nextModeIndex = 0;
        const nextMode = modes[nextModeIndex];
        let modeText = nextMode === "1" ? "内嵌" : "弹窗";
        element.textContent = modeText;
        listItem.dataset.currentMode = nextMode;
    }

    function bindEvents() {
        const vipBox = DOM_CACHE.vipBox;
        const vipList = DOM_CACHE.vipList;
        vipBox.querySelector(".vip_icon").addEventListener("mouseover", () => {
            vipBox.classList.add("visible");
            vipList.classList.add("visible");
            setTimeout(() => {
                const items = vipList.querySelectorAll('li, .section-title, #donate_section');
                items.forEach((item, index) => {
                    setTimeout(() => {
                        item.style.transitionDelay = '0ms';
                    }, index * 30);
                });
            }, 50);
        });
        vipBox.querySelector(".vip_icon").addEventListener("mouseout", (e) => {
            // 检查鼠标是否移动到vipList上
            const relatedTarget = e.relatedTarget;
            if (relatedTarget && (vipList.contains(relatedTarget) || relatedTarget === vipList)) {
                return; // 如果移动到列表上,不隐藏
            }
            vipList.classList.remove("visible");
            vipBox.classList.remove("visible");
            const items = vipList.querySelectorAll('li, .section-title, #donate_section');
            items.forEach(item => {
                item.style.transitionDelay = '';
            });
        });

        // vipList的鼠标事件
        vipList.addEventListener("mouseenter", () => {
            vipBox.classList.add("visible");
            vipList.classList.add("visible");
        });
        vipList.addEventListener("mouseleave", () => {
            vipList.classList.remove("visible");
            vipBox.classList.remove("visible");
            const items = vipList.querySelectorAll('li, .section-title, #donate_section');
            items.forEach(item => {
                item.style.transitionDelay = '';
            });
        });
        const tabButtons = vipBox.querySelectorAll(".tab-button");
        tabButtons.forEach(button => {
            button.addEventListener("click", function() {
                tabButtons.forEach(btn => btn.classList.remove("active"));
                vipBox.querySelectorAll(".tab-content").forEach(content => content.classList.remove("active"));
                this.classList.add("active");
                const tabId = this.getAttribute("data-tab");
                vipBox.querySelector(`#${tabId}-tab`).classList.add("active");
            });
        });
        vipBox.querySelector('#open-style-set-btn').addEventListener('click', (e) => {
            e.stopPropagation();
            const stylePanel = DOM_CACHE.styleSetPanel;
            const isVisible = stylePanel.style.display === 'block';

            // 隐藏所有设置面板
            DOM_CACHE.addApiForm.style.display = 'none';
            DOM_CACHE.styleSetPanel.style.display = 'none';
            DOM_CACHE.shortcutSetPanel.style.display = 'none';
            DOM_CACHE.autoParseSetPanel.style.display = 'none';

            // 切换当前面板
            stylePanel.style.display = isVisible ? 'none' : 'block';
        });
        vipBox.querySelector('#open-shortcut-set-btn').addEventListener('click', (e) => {
            e.stopPropagation();
            const shortcutPanel = DOM_CACHE.shortcutSetPanel;
            const isVisible = shortcutPanel.style.display === 'block';

            // 隐藏所有设置面板
            DOM_CACHE.addApiForm.style.display = 'none';
            DOM_CACHE.styleSetPanel.style.display = 'none';
            DOM_CACHE.shortcutSetPanel.style.display = 'none';
            DOM_CACHE.autoParseSetPanel.style.display = 'none';

            // 切换当前面板
            shortcutPanel.style.display = isVisible ? 'none' : 'block';
        });

        vipBox.querySelector('#open-auto-parse-set-btn').addEventListener('click', (e) => {
            e.stopPropagation();
            const autoParsePanel = DOM_CACHE.autoParseSetPanel;
            const isVisible = autoParsePanel.style.display === 'block';

            // 隐藏所有设置面板
            DOM_CACHE.addApiForm.style.display = 'none';
            DOM_CACHE.styleSetPanel.style.display = 'none';
            DOM_CACHE.shortcutSetPanel.style.display = 'none';
            DOM_CACHE.autoParseSetPanel.style.display = 'none';

            // 切换当前面板
            autoParsePanel.style.display = isVisible ? 'none' : 'block';
        });
        const addApiBtn = vipBox.querySelector("#add_api_btn");
        if (addApiBtn) {
            addApiBtn.addEventListener("click", function(e) {
                e.stopPropagation();
                const isVisible = DOM_CACHE.addApiForm.style.display === "block";

                // 隐藏所有设置面板
                DOM_CACHE.addApiForm.style.display = 'none';
                DOM_CACHE.styleSetPanel.style.display = 'none';
                DOM_CACHE.shortcutSetPanel.style.display = 'none';
                DOM_CACHE.autoParseSetPanel.style.display = 'none';

                // 切换当前面板
                DOM_CACHE.addApiForm.style.display = isVisible ? "none" : "block";
            });
        }
        const saveApiBtn = vipBox.querySelector("#save-api-btn");
        if (saveApiBtn) {
            saveApiBtn.addEventListener("click", function(e) {
                e.stopPropagation();
                const name = DOM_CACHE.apiNameInput.value.trim();
                const url = DOM_CACHE.apiUrlInput.value.trim();
                const type = DOM_CACHE.apiTypeSelect.value;
                if (!name || !url) {
                    alert('请填写完整信息');
                    return;
                }
                if (!url.includes('?url=') && !url.includes('&url=')) {
                    alert('接口地址必须包含 "?url=" 或 "&url=" 参数占位符');
                    return;
                }
                const newApi = { name, type, url };
                customApis.push(newApi);
                allApis = [...uniqueApis, ...customApis];
                GM_setValue("custom_parse_apis", customApis);
                DOM_CACHE.addApiForm.reset();
                DOM_CACHE.addApiForm.style.display = "none";
                renderApiLists();
                Swal.fire('添加成功', '自定义接口已添加,直接使用无需刷新!', 'success');
            });
        }
        const cancelApiBtn = vipBox.querySelector("#cancel-api-btn");
        if (cancelApiBtn) {
            cancelApiBtn.addEventListener("click", function(e) {
                e.stopPropagation();
                DOM_CACHE.addApiForm.style.display = "none";
            });
        }
        vipBox.querySelector('#vip-tab').addEventListener("click", (e) => {
            if (e.target.classList.contains('mode-toggle')) {
                togglePlayMode(e.target);
                return;
            }
            const apiItem = e.target.closest('.api-item');
            if (!apiItem) return;
            const index = parseInt(apiItem.getAttribute("data-index"));
            const videoObj = allApis[index];
            let apiType;
            if (apiItem.classList.contains('combined-simple')) {
                apiType = apiItem.dataset.currentMode;
            } else {
                apiType = apiItem.getAttribute("data-mode");
            }
            if (apiType === "1") {
                // 保存选中的接口索引(用于自动解析)
                GM_setValue(CONFIG.autoPlayerVal, index);
                GM_setValue(CONFIG.flag, "true"); // 标记手动解析过
                playVideo(videoObj, true, encodeVideoUrl(window.location.href));
                vipBox.querySelectorAll(".api-item").forEach(li => li.classList.remove("selected"));
                apiItem.classList.add("selected");

                // 更新自动解析按钮的提示
                if (!!GM_getValue(CONFIG.autoPlayerKey, null)) {
                    vipBox.querySelector("#vip_auto").title = `自动解析源:${videoObj.name}`;
                }
            } else {
                const encodedUrl = encodeVideoUrl(window.location.href);
                const parseUrl = videoObj.url + encodedUrl;
                GM_openInTab(parseUrl, {active: true, insert: true, setParent: true});
            }
        });
        vipBox.querySelector("#vip_auto").addEventListener("click", function() {
            if (!!GM_getValue(CONFIG.autoPlayerKey, null)) {
                // 如果已开启,点击关闭
                GM_setValue(CONFIG.autoPlayerKey, null);
                this.innerHTML = "关";
                this.title = "点击开启自动解析";
                Swal.fire({
                    title: '已关闭自动解析',
                    text: '刷新页面后生效',
                    icon: 'info',
                    timer: 1500,
                    showConfirmButton: false
                });
                setTimeout(() => {
                    window.location.reload();
                }, 1500);
            } else {
                // 检查是否已设置接口
                const selectedIndex = GM_getValue(CONFIG.autoPlayerVal, 0);
                const selectedApi = allApis[selectedIndex];

                if (!selectedApi || !selectedApi.type.includes("1")) {
                    Swal.fire({
                        title: '请先设置自动解析接口',
                        text: '点击下方"自动解析设置"按钮选择解析接口',
                        icon: 'info',
                        confirmButtonText: '知道了'
                    });
                    return;
                }

                // 开启自动解析
                GM_setValue(CONFIG.autoPlayerKey, "true");
                this.innerHTML = "开";
                this.title = `自动解析源:${selectedApi.name}`;

                Swal.fire({
                    title: '已开启自动解析',
                    html: `使用 <b>${selectedApi.name}</b> 自动解析<br>刷新页面后生效`,
                    icon: 'success',
                    timer: 1500,
                    showConfirmButton: false
                });

                setTimeout(() => {
                    window.location.reload();
                }, 1500);
            }
        });
        vipBox.addEventListener("mousedown", function(e) {
            if (e.button !== 0) return;
            const target = e.target;
            const vipIcon = vipBox.querySelector(".vip_icon");
            const autoBtn = vipBox.querySelector("#vip_auto");
            if (vipBox.querySelector(".vip_list").contains(target)) return;
            if (!vipIcon.contains(target) && target !== autoBtn) return;
            e.preventDefault();
            vipBox.style.cursor = "move";
            const oldTransition = vipBox.style.transition;
            vipBox.style.transition = "none";
            const positionDiv = vipBox.getBoundingClientRect();
            let distenceX = e.clientX - positionDiv.left;
            let distenceY = e.clientY - positionDiv.top;
            document.addEventListener("mousemove", moveHandler);
            document.addEventListener("mouseup", upHandler);
            function moveHandler(e) {
                let x = e.clientX - distenceX;
                let y = e.clientY - distenceY;
                const windowWidth = window.innerWidth;
                const windowHeight = window.innerHeight;
                if (x < 0) x = 0;
                else if (x > windowWidth - vipBox.offsetWidth - 100) {
                    x = windowWidth - vipBox.offsetWidth - 100;
                }
                if (y < 0) y = 0;
                else if (y > windowHeight - vipBox.offsetHeight) {
                    y = windowHeight - vipBox.offsetHeight;
                }
                vipBox.style.left = x + "px";
                vipBox.style.top = y + "px";
            }
            function upHandler() {
                document.removeEventListener("mousemove", moveHandler);
                document.removeEventListener("mouseup", upHandler);
                vipBox.style.cursor = "pointer";
                vipBox.style.transition = oldTransition;
                GM_setValue(CONFIG.panelPosKey, {
                    left: parseInt(vipBox.style.left),
                    top: parseInt(vipBox.style.top)
                });
            }
        });
    }

    function addCustomApi() {
        Swal.fire({
            title: '添加自定义解析接口',
            html: `
                <input type="text" id="api-name" class="swal2-input" placeholder="接口名称">
                <input type="text" id="api-url" class="swal2-input" placeholder="接口地址 (例: https://jx.example.com/?url=)">
                <select id="api-type" class="swal2-select">
                    <option value="1">内嵌播放</option>
                    <option value="2">弹窗播放带选集</option>
                    <option value="3">弹窗播放不带选集</option>
                </select>
            `,
            confirmButtonText: '添加',
            focusConfirm: false,
            preConfirm: () => {
                const name = document.getElementById('api-name').value;
                const url = document.getElementById('api-url').value;
                const type = document.getElementById('api-type').value;
                if (!name || !url) {
                    Swal.showValidationMessage('请填写完整信息');
                    return false;
                }
                if (!url.includes('?url=') && !url.includes('&url=')) {
                    Swal.showValidationMessage('接口地址必须包含 "?url=" 或 "&url=" 参数占位符');
                    return false;
                }
                return { name, url, type };
            }
        }).then(result => {
            if (result.isConfirmed) {
                const newApi = {
                    name: result.value.name,
                    type: result.value.type,
                    url: result.value.url
                };
                customApis.push(newApi);
                allApis = [...uniqueApis, ...customApis];
                GM_setValue("custom_parse_apis", customApis);
                renderApiLists();
                Swal.fire('添加成功', '自定义接口已添加,直接使用无需刷新!', 'success');
            }
        });
    }

    // 使用别人的简单粗暴方式:直接清空容器+持续清理video
    function playVideo(videoObj, isEmbed, encodedUrl = null) {
        if (!isEmbed) return;

        const finalUrl = encodedUrl || encodeVideoUrl(window.location.href);
        const parseUrl = videoObj.url + finalUrl;

        // 获取当前网站的播放器容器配置
        const host = window.location.hostname;
        const playerConfig = PLAYER_CONTAINERS.find(config => host.includes(config.host));

        if (!playerConfig) {
            console.warn('未找到当前网站的播放器配置');
            return;
        }

        // 隐藏displayNodes中的元素
        if (playerConfig.displayNodes && playerConfig.displayNodes.length > 0) {
            // 立即隐藏一次
            const hideElements = () => {
                playerConfig.displayNodes.forEach(selector => {
                    try {
                        const elements = document.querySelectorAll(selector);
                        elements.forEach(el => {
                            el.style.display = 'none';
                            el.style.visibility = 'hidden';
                            el.style.opacity = '0';
                            el.style.pointerEvents = 'none';
                            el.style.zIndex = '-9999';
                        });
                    } catch (e) {
                        // 忽略选择器错误
                    }
                });
            };

            // 立即执行一次
            hideElements();

            // 持续隐藏机制:每500ms检查并隐藏这些元素
            const hideInterval = setInterval(hideElements, 500);

            // 将定时器保存,以便后续清理
            window._vipHideInterval = hideInterval;
        }

        // 查找原播放器容器
        findTargetElement(playerConfig.container)
            .then((container) => {
                // 完全清空容器
                container.innerHTML = '';

                // 持续移除video
                const videoCleanupInterval = setInterval(() => {
                    for (let video of document.getElementsByTagName("video")) {
                        if (video.src) {
                            video.removeAttribute("src");
                            video.muted = true;
                            video.load();
                            video.pause();
                        }
                    }
                }, 500);

                // 创建iframe容器
                const iframeWrapper = document.createElement('div');
                iframeWrapper.style.cssText = 'position:absolute;top:0;left:0;width:100%;height:100%;';

                const iframe = document.createElement('iframe');
                iframe.src = parseUrl;
                iframe.frameBorder = '0';
                iframe.allow = 'autoplay; encrypted-media; fullscreen';
                iframe.allowFullscreen = true;
                iframe.referrerPolicy = 'no-referrer';
                iframe.style.cssText = 'width:100%;height:100%;border:none;';

                // 创建鼠标捕获层(透明遮罩,用于捕获鼠标移动事件)
                const mouseCatcher = document.createElement('div');
                mouseCatcher.style.cssText = `
                    position: absolute;
                    top: 0;
                    left: 0;
                    width: 100%;
                    height: 100%;
                    z-index: 9999999;
                    pointer-events: auto;
                    background: transparent;
                `;

                // 创建关闭按钮
                const closeBtn = document.createElement("div");
                closeBtn.className = "vip-player-close-btn";
                closeBtn.innerHTML = "×";
                closeBtn.title = "关闭解析(刷新页面恢复原视频)";
                closeBtn.style.cssText = `
                    position: absolute;
                    top: 15px;
                    right: 15px;
                    z-index: 10000000;
                    width: auto;
                    height: auto;
                    padding: 5px 10px;
                    background: transparent;
                    border: none;
                    cursor: pointer;
                    font-size: 32px;
                    color: rgba(255, 255, 255, 0.8);
                    transition: all 0.3s ease;
                    text-shadow: 0 2px 4px rgba(0,0,0,0.5);
                    opacity: 0;
                    pointer-events: none;
                `;

                // 显示关闭按钮并设置3秒后自动隐藏
                let hideTimer = null;
                const showCloseBtn = () => {
                    clearTimeout(hideTimer);
                    closeBtn.style.opacity = '1';
                    closeBtn.style.pointerEvents = 'auto';
                    // 鼠标在按钮上时,禁用鼠标捕获层,让按钮可以点击
                    mouseCatcher.style.pointerEvents = 'none';
                    hideTimer = setTimeout(() => {
                        closeBtn.style.opacity = '0';
                        closeBtn.style.pointerEvents = 'none';
                        // 按钮隐藏后,重新启用鼠标捕获层
                        mouseCatcher.style.pointerEvents = 'auto';
                    }, 3000);
                };

                // 在鼠标捕获层上监听鼠标移动和进入事件
                mouseCatcher.onmousemove = showCloseBtn;
                mouseCatcher.onmouseenter = showCloseBtn;

                closeBtn.onmouseover = () => {
                    clearTimeout(hideTimer);
                    closeBtn.style.color = 'rgba(255, 255, 255, 1)';
                    closeBtn.style.transform = 'scale(1.2)';
                };
                closeBtn.onmouseout = () => {
                    closeBtn.style.color = 'rgba(255, 255, 255, 0.8)';
                    closeBtn.style.transform = 'scale(1)';
                    showCloseBtn(); // 鼠标离开按钮时重新开始1秒倒计时
                };

                closeBtn.onclick = () => {
                    clearInterval(videoCleanupInterval);
                    // 清理持续隐藏的定时器
                    if (window._vipHideInterval) {
                        clearInterval(window._vipHideInterval);
                        window._vipHideInterval = null;
                    }
                    window.location.reload();
                };

                iframeWrapper.appendChild(iframe);
                iframeWrapper.appendChild(mouseCatcher);
                iframeWrapper.appendChild(closeBtn);
                container.appendChild(iframeWrapper);
            })
            .catch(() => {
                console.warn('未找到播放器容器');
            });
    }

    function autoPlayVideo() {
        let index = GM_getValue(CONFIG.autoPlayerVal, 0);
        let autoObj = allApis[index];
        if (autoObj && autoObj.type.includes("1")) {
            playVideo(autoObj, true, encodeVideoUrl(window.location.href));
            const vipBox = DOM_CACHE.vipBox;
            if (vipBox) {
                const selectedItem = vipBox.querySelector(`.api-item[data-index="${index}"]`);
                if (selectedItem) {
                    selectedItem.classList.add("selected");
                }
                vipBox.querySelector("#vip_auto").title = `自动解析源:${autoObj.name}`;
            }
        }
    }

    // 监听URL变化
    function monitorUrlChange() {
        if (!!GM_getValue(CONFIG.autoPlayerKey, null)) {
            // 如果开启了自动解析,URL变化时刷新页面
            const oldHref = window.location.href;
            setInterval(() => {
                let newHref = window.location.href;
                if (oldHref !== newHref) {
                    window.location.reload();
                }
            }, 500);
        } else {
            // 如果没开启自动解析,检测到手动解析后URL变化时刷新
            let oldHref = window.location.href;
            setInterval(() => {
                let newHref = window.location.href;
                if (oldHref !== newHref) {
                    oldHref = newHref;
                    if (!!GM_getValue(CONFIG.flag, null)) {
                        window.location.reload();
                    }
                }
            }, 1000);
        }
    }

    function waitForBody() {
        if (document.body) {
            createVipButton();
        } else {
            requestAnimationFrame(waitForBody);
        }
    }

    document.addEventListener('keydown', (e) => {
        if (!e.altKey) return;
        const vipBox = DOM_CACHE.vipBox;
        if (!vipBox) return;
        switch (e.key.toLowerCase()) {
            case CONFIG.shortcut.toggle:
                e.preventDefault();
                vipBox.style.display = vipBox.style.display === 'none' ? 'block' : 'none';
                if (vipBox.style.display === 'block') {
                    vipBox.classList.add('visible');
                    vipBox.querySelector('.vip_list').classList.add('visible');
                }
                break;
            case CONFIG.shortcut.refresh:
                e.preventDefault();
                customApis = GM_getValue("custom_parse_apis", []);
                allApis = [...uniqueApis, ...customApis];
                renderApiLists();
                Swal.fire('刷新成功', '接口列表已重新加载!', 'success');
                break;
            case CONFIG.shortcut.style:
                e.preventDefault();
                const stylePanel = DOM_CACHE.styleSetPanel;
                if (stylePanel) {
                    stylePanel.style.display = stylePanel.style.display === 'block' ? 'none' : 'block';
                    DOM_CACHE.vipBox.querySelector('.tab-button[data-tab="donate"]').click();
                }
                break;
        }
    });

    (function registerMenu() {
        GM_registerMenuCommand('🎬 VIP解析窗口', function() {
            const vipBox = document.getElementById(CONFIG.vipBoxId);
            if (vipBox) {
                const isVisible = vipBox.style.display !== 'none';
                vipBox.style.display = isVisible ? 'none' : 'block';
                if (!isVisible) {
                    vipBox.classList.add('visible');
                    vipBox.querySelector('.vip_list').classList.add('visible');
                }
            } else {
                createVipButton();
            }
        }, 'v');
        GM_registerMenuCommand('📊 脚本状态', function() {
            const version = GM_info.script.version;
            alert('当前版本:' + version + '\\n解析工具已启动,支持多平台VIP视频解析\\n共整合 '+ allApis.length +' 个解析接口\\n支持样式自定义、快捷键自定义、接口动态添加!');
        });
    })();

    const util = {
        findTargetEle: (targetEle) => findTargetElement(targetEle)
    };

    const SUPPORT_HOSTS = [
        "iqiyi.com", "youku.com", "v.qq.com", "mgtv.com", "bilibili.com",
        "le.com", "sohu.com", "pptv.com", "1905.com", "iq.com",
        "qq.com", "tudou.com"
    ];

    const host = window.location.hostname;
    const isSupportSite = SUPPORT_HOSTS.some(h => host.includes(h));

    if (isSupportSite) {
        // 确保只创建一次VIP浮标
        let vipButtonCreated = false;

        // 初始化flag
        GM_setValue(CONFIG.flag, null);

        util.findTargetEle('body')
            .then(() => {
                if (!vipButtonCreated) {
                    vipButtonCreated = true;
                    createVipButton();
                    monitorUrlChange(); // 启动URL监听
                }
            })
            .catch(() => {
                if (document.readyState === "loading") {
                    document.addEventListener("DOMContentLoaded", () => {
                        if (!vipButtonCreated) {
                            vipButtonCreated = true;
                            waitForBody();
                            monitorUrlChange(); // 启动URL监听
                        }
                    });
                } else {
                    if (!vipButtonCreated) {
                        vipButtonCreated = true;
                        waitForBody();
                        monitorUrlChange(); // 启动URL监听
                    }
                }
            });
    }
})();