Iwara Video Player Width Switch (Debug)

切换 Iwara 视频播放器宽度 (带调试日志)

이 스크립트를 설치하려면 Tampermonkey, Greasemonkey 또는 Violentmonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey와 같은 확장 프로그램을 설치해야 합니다.

이 스크립트를 설치하려면 Tampermonkey 또는 Violentmonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey 또는 Userscripts와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 유저 스크립트 관리자 확장 프로그램이 필요합니다.

(이미 유저 스크립트 관리자가 설치되어 있습니다. 설치를 진행합니다!)

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

(이미 유저 스타일 관리자가 설치되어 있습니다. 설치를 진행합니다!)

// ==UserScript==
// @name         Iwara Video Player Width Switch (Debug)
// @namespace    http://tampermonkey.net/
// @version      2026-03-01
// @description  切换 Iwara 视频播放器宽度 (带调试日志)
// @author       detaLee
// @match        *://*.iwara.tv/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=iwara.tv
// @grant        none
// @license      MIT
// ==/UserScript==

(function() {
    'use strict';

    const SCRIPT_NAME = '[IwaraToggler]';

    // 定义样式
    const btnStyle = `
        <style>
            #iwara-width-toggle-btn {
                margin-left: 10px;
                padding: 2px 8px;
                font-size: 0.8em;
                vertical-align: middle;
                cursor: pointer;
                background-color: #f0f0f0;
                border: 1px solid #ccc;
                border-radius: 4px;
                color: #333;
                transition: all 0.2s;
            }
            #iwara-width-toggle-btn:hover {
                background-color: #e0e0e0;
            }
            #iwara-width-toggle-btn.active {
                background-color: #007bff;
                color: white;
                border-color: #0056b3;
            }
        </style>
    `;

    // 注入样式
    document.head.insertAdjacentHTML('beforeend', btnStyle);
    console.log(`${SCRIPT_NAME} 样式已注入`);

    let isWideMode = false;
    let toggleBtn = null;
    let targetContainer = null;

    function createButton() {
        if (toggleBtn) {
            console.log(`${SCRIPT_NAME} 按钮已存在,跳过创建`);
            return toggleBtn;
        }

        console.log(`${SCRIPT_NAME} 正在创建按钮...`);
        toggleBtn = document.createElement('button');
        toggleBtn.id = 'iwara-width-toggle-btn';
        toggleBtn.textContent = '<=>';

        toggleBtn.addEventListener('click', function() {
            console.log(`${SCRIPT_NAME} >>> 按钮被点击!当前模式:${isWideMode ? '宽屏' : '普通'}`);

            if (!targetContainer) {
                console.error(`${SCRIPT_NAME} [错误] 未找到目标容器元素 (.col-md-9),无法切换!`);
                alert('错误:未找到播放器容器,请检查页面结构或刷新重试。');
                return;
            }

            isWideMode = !isWideMode;
            const currentClasses = Array.from(targetContainer.classList).join(', ');
            console.log(`${SCRIPT_NAME} 切换前类名: [${currentClasses}]`);

            if (isWideMode) {
                // 切换到宽屏模式
                console.log(`${SCRIPT_NAME} 执行操作:移除 col-md-9, 添加 col-md-12`);
                targetContainer.classList.remove('col-md-9');
                targetContainer.classList.add('col-md-12');

                toggleBtn.textContent = '>=<';
                toggleBtn.classList.add('active');
                console.log(`${SCRIPT_NAME} <<< 已切换至宽屏模式 (col-md-12)`);
            } else {
                // 还原模式
                console.log(`${SCRIPT_NAME} 执行操作:移除 col-md-12, 添加 col-md-9`);
                targetContainer.classList.remove('col-md-12');
                targetContainer.classList.add('col-md-9');

                toggleBtn.textContent = '<=>';
                toggleBtn.classList.remove('active');
                console.log(`${SCRIPT_NAME} <<< 已还原至普通模式 (col-md-9)`);
            }

            const newClasses = Array.from(targetContainer.classList).join(', ');
            console.log(`${SCRIPT_NAME} 切换后类名: [${newClasses}]`);
        });

        console.log(`${SCRIPT_NAME} 按钮创建完成`);
        return toggleBtn;
    }

    function init() {
        console.group(`${SCRIPT_NAME} 尝试初始化...`);

        // 1. 查找标题元素
        const titleSelector = 'div.page.page-video div.page-video__details > div.text.mb-1.text--h1';
        const titleElement = document.querySelector(titleSelector);

        if (!titleElement) {
            console.warn(`${SCRIPT_NAME} 未找到标题元素 (${titleSelector}),等待页面加载...`);
            console.groupEnd();
            return;
        }
        console.log(`${SCRIPT_NAME} [成功] 找到标题元素:`, titleElement);

        // 2. 检查按钮是否已存在
        if (document.getElementById('iwara-width-toggle-btn')) {
            console.log(`${SCRIPT_NAME} 按钮已存在于页面中,初始化结束。`);
            console.groupEnd();
            return;
        }

        // 3. 查找目标容器 (.page-video__player 的父级)
        const playerElement = document.querySelector('.page-video__player');

        if (!playerElement) {
            console.warn(`${SCRIPT_NAME} 未找到播放器元素 (.page-video__player),等待页面加载...`);
            console.groupEnd();
            return;
        }
        console.log(`${SCRIPT_NAME} [成功] 找到播放器元素:`, playerElement);

        const parent = playerElement.parentElement;
        if (!parent) {
            console.error(`${SCRIPT_NAME} [错误] 播放器元素没有父节点!`);
            console.groupEnd();
            return;
        }

        // 验证父节点类名
        const hasCol12 = parent.classList.contains('col-12');
        const hasColMd9 = parent.classList.contains('col-md-9');

        console.log(`${SCRIPT_NAME} 父节点类名检查: col-12=${hasCol12}, col-md-9=${hasColMd9}`);
        console.log(`${SCRIPT_NAME} 父节点完整类名:`, Array.from(parent.classList).join(' '));

        if (hasCol12 && hasColMd9) {
            targetContainer = parent;
            console.log(`${SCRIPT_NAME} [成功] 锁定目标容器:`, targetContainer);
        } else {
            console.error(`${SCRIPT_NAME} [错误] 父节点不符合预期 (需要同时包含 col-12 和 col-md-9)。可能是网站更新了结构。`);
            console.groupEnd();
            return;
        }

        // 4. 创建并插入按钮
        const btn = createButton();
        titleElement.appendChild(btn);
        console.log(`${SCRIPT_NAME} [完成] 按钮已插入到标题后方。`);

        console.groupEnd();
    }

    // 设置 MutationObserver
    const observer = new MutationObserver((mutations) => {
        // 如果按钮已经存在且目标容器还在文档中,则忽略本次变动,避免重复日志
        if (document.getElementById('iwara-width-toggle-btn') && targetContainer && document.contains(targetContainer)) {
            return;
        }

        // 只有当关键元素缺失时才尝试重新初始化,减少日志噪音
        const titleExists = document.querySelector('div.page.page-video div.page-video__details > div.text.mb-1.text--h1');
        const playerExists = document.querySelector('.page-video__player');

        if (titleExists && playerExists) {
             // 只有当元素出现但脚本还没完全初始化时才运行
             if (!targetContainer || !document.getElementById('iwara-width-toggle-btn')) {
                 console.log(`${SCRIPT_NAME} [Observer] 检测到 DOM 变化,关键元素已就绪,触发初始化...`);
                 init();
             }
        }
    });

    // 开始观察
    if (document.body) {
        observer.observe(document.body, {
            childList: true,
            subtree: true
        });
        console.log(`${SCRIPT_NAME} 观察者已启动,监听 document.body 变化。`);
    } else {
        console.warn(`${SCRIPT_NAME} 文档 body 尚未加载,等待 DOMContentLoaded...`);
        document.addEventListener('DOMContentLoaded', () => {
            observer.observe(document.body, { childList: true, subtree: true });
            console.log(`${SCRIPT_NAME} 观察者已在 DOMContentLoaded 后启动。`);
            init();
        });
    }

    // 初始尝试
    console.log(`${SCRIPT_NAME} 脚本开始执行 (ReadyState: ${document.readyState})`);
    if (document.readyState === 'loading') {
        document.addEventListener('DOMContentLoaded', init);
    } else {
        init();
    }

})();