Greasy Fork

Greasy Fork is available in English.

CHZZK.Naver.com 해상도 설정 버튼 추가

채널 이동 시 자동 버튼 생성, 해상도 메뉴가 자동으로 닫히도록 개선

当前为 2024-12-26 提交的版本,查看 最新版本

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name         CHZZK.Naver.com 해상도 설정 버튼 추가
// @namespace    https://chzzk.naver.com/
// @version      2.2
// @description  채널 이동 시 자동 버튼 생성, 해상도 메뉴가 자동으로 닫히도록 개선
// @match        *://chzzk.naver.com/*
// @grant        none
// @license MIT
// ==/UserScript==

(function() {
    'use strict';

    // ------------------------------
    // 1) 해상도 설정 로직 함수
    // ------------------------------
    function setResolution() {
        // 1) 톱니바퀴(설정) 버튼 찾기
        const gearButton = document.querySelector(
            'button.pzp-button.pzp-setting-button.pzp-pc-setting-button.pzp-pc__setting-button'
        );
        if (!gearButton) {
            alert('플레이어 로딩 안 됨: 톱니바퀴 버튼을 찾지 못했습니다.');
            return;
        }

        // 2) 톱니바퀴 클릭 → 설정창 열기
        gearButton.click();

        // 메뉴가 뜨는 시간 기다린 뒤 진행
        setTimeout(() => {
            // 3) 1080p(원본) 또는 1080p 항목 찾기
            const qualityItems = document.querySelectorAll('li.pzp-ui-setting-quality-item');
            if (!qualityItems || qualityItems.length === 0) {
                // 목록 없으면 톱니바퀴 닫기만
                gearButton.click();
                alert('해상도 목록이 안 보여요. (플레이어 상태 확인)');
                return;
            }

            // 1080p(원본)부터 우선 찾기
            let bestOption = Array.from(qualityItems).find(li =>
                li.textContent.includes('1080p(원본)')
            );
            // 없으면 일반 1080p 찾기
            if (!bestOption) {
                bestOption = Array.from(qualityItems).find(li =>
                    li.textContent.includes('1080p')
                );
            }

            if (bestOption) {
                // 해상도 항목 클릭
                bestOption.click();

                // ★ 조그만 지연 후, body (혹은 플레이어 밖) 클릭 → 메뉴 닫기
                setTimeout(() => {
                    // 실제로 메뉴 밖을 클릭해야 닫히는 UI도 있음
                    // 아래처럼 body를 클릭해 보거나, 혹은 다른 영역(예: ".viewer_chat_panel") 등을 클릭
                    document.body.click();
                }, 300);

            } else {
                alert('1080p(원본) 또는 1080p 항목을 찾지 못했습니다...');
                // 톱니바퀴 닫기만
                gearButton.click();
            }
        }, 500);
    }

    // ------------------------------
    // 2) 버튼 생성 함수 (중복 생성 방지)
    // ------------------------------
    function createResolutionButton() {
        // 이미 버튼이 있다면 재생성 방지
        if (document.getElementById('my1080pButton')) {
            return;
        }

        // (a) 삽입할 컨테이너 찾기
        const container = document.querySelector("[class^='video_information_control__']");
        if (!container) return;

        // (b) 새 버튼 만들기
        const newBtn = document.createElement('button');
        newBtn.id = 'my1080pButton';
        newBtn.classList.add(
            'button_container__x044H',
            'button_medium__r15mw',
            'button_capsule__tU-O-',
            'button_dark__cw8hT'
        );
        newBtn.style.marginRight = '7px'; // 다른 버튼과 비슷한 간격
        newBtn.innerText = '1080p 설정';

        // (c) 클릭 이벤트 → 해상도 변경
        newBtn.addEventListener('click', setResolution);

        // (d) 컨테이너 가장 왼쪽에 삽입
        container.insertBefore(newBtn, container.firstChild);
    }

    // ------------------------------
    // 3) MutationObserver 설정
    //    -> DOM 변화를 감시하다가,
    //       video_information_control__ 요소가 생기면 버튼 삽입
    // ------------------------------
    const observer = new MutationObserver((mutations) => {
        // 매 변경마다 한번씩 버튼 삽입 시도 (이미 있으면 함수 내부서 return)
        createResolutionButton();
    });

    // body 전체를 감시(자식 노드 추가/삭제/변경)
    observer.observe(document.body, {
        childList: true,
        subtree: true
    });

    // 혹시 최초 로드 시점에 바로 적용할 수 있도록, 초기에 한번 실행
    setTimeout(createResolutionButton, 2000);

})();