Chzzk Auto High Quality

Chzzk자동으로 최고화질로 설정

Bu betiği kurabilmeniz için Tampermonkey, Greasemonkey ya da Violentmonkey gibi bir kullanıcı betiği eklentisini kurmanız gerekmektedir.

You will need to install an extension such as Tampermonkey to install this script.

Bu betiği kurabilmeniz için Tampermonkey ya da Violentmonkey gibi bir kullanıcı betiği eklentisini kurmanız gerekmektedir.

Bu betiği kurabilmeniz için Tampermonkey ya da Userscripts gibi bir kullanıcı betiği eklentisini kurmanız gerekmektedir.

Bu betiği indirebilmeniz için ayrıca Tampermonkey gibi bir eklenti kurmanız gerekmektedir.

Bu komut dosyasını yüklemek için bir kullanıcı komut dosyası yöneticisi uzantısı yüklemeniz gerekecek.

(Zaten bir kullanıcı komut dosyası yöneticim var, kurmama izin verin!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(Zateb bir user-style yöneticim var, yükleyeyim!)

// ==UserScript==
// @name         Chzzk Auto High Quality
// @namespace    http://tampermonkey.net/
// @version      3.3
// @description  Chzzk자동으로 최고화질로 설정
// @author       DSK
// @match        https://chzzk.naver.com/*
// @grant        none
// @license MIT
// ==/UserScript==
(function() {
    'use strict';

    let lastUrl = location.href;
    let adBlockInterval = null;
    let qualityInterval = null;
    let playbackInterval = null;

    function handleAdBlockPopup() {
        const popupContainer = document.querySelector('div[class^="popup_container"]');
        if (popupContainer && popupContainer.textContent.includes('광고 차단 프로그램을 사용 중이신가요')) {
            popupContainer.remove();

            // Remove existing keydown event listener first
            const existingListener = (event) => {
                if (!(event.target.tagName === 'INPUT' || event.target.tagName === 'TEXTAREA' || event.target.tagName === 'PRE')) {
                    let button;
                    switch (event.key) {
                        case 'k':
                        case ' ':
                            button = document.querySelector('button.pzp-playback-switch');
                            button?.click();
                            break;
                        case 'm':
                            button = document.querySelector('button.pzp-pc-volume-button');
                            button?.click();
                            break;
                        case 't':
                            button = document.querySelector('button.pzp-pc-viewmode-button');
                            button?.click();
                            break;
                        case 'f':
                            button = document.querySelector('button.pzp-pc-fullscreen-button');
                            button?.click();
                            break;
                    }
                }
            };
            document.removeEventListener('keydown', existingListener);
            document.addEventListener('keydown', existingListener);
            if (adBlockInterval) {
                clearInterval(adBlockInterval);
                adBlockInterval = null;
            }
            return true;
        }
        return false;
    }

    function handlePlaybackButton() {
        const playbackSwitchButton = document.querySelector('button.pzp-playback-switch');
        if (playbackSwitchButton) {
            const animateElement = playbackSwitchButton.querySelector('animate');
            if (!animateElement) {
                playbackSwitchButton.click();
                return false;
            }
        }
        if (playbackInterval) {
            clearInterval(playbackInterval);
            playbackInterval = null;
        }
        return true;
    }

    function selectHighestQuality() {
        const settingsButton = document.querySelector('button[class*="pzp-setting-button"]');
        if (!settingsButton) return false;

        settingsButton.click();

        const qualityButton = document.querySelector('div[class*="pzp-pc-setting-intro-quality"]');
        if (!qualityButton) return false;
        qualityButton.click();

        const qualityOptions = document.querySelectorAll('li[class*="quality-item"]');
        let qualityOption = Array.from(qualityOptions).find(option => option.textContent.includes('1080'));
        if (!qualityOption) {
            qualityOption = Array.from(qualityOptions).find(option => option.textContent.includes('720'));
        }
        if (!qualityOption) return false;

        qualityOption.focus();
        const enterEvent = new KeyboardEvent('keydown', {
            bubbles: true,
            cancelable: true,
            key: 'Enter',
            code: 'Enter',
            keyCode: 13,
            which: 13
        });

        if (!playbackInterval) {
            playbackInterval = setInterval(handlePlaybackButton, 100);
        }

        qualityOption.dispatchEvent(enterEvent);

        if (qualityInterval) {
            clearInterval(qualityInterval);
            qualityInterval = null;
        }
        return true;
    }

    function startIntervals() {
        if (!adBlockInterval) {
            adBlockInterval = setInterval(handleAdBlockPopup, 100);
        }
        if (!qualityInterval) {
            qualityInterval = setInterval(selectHighestQuality, 100);
        }
    }

    // Listen for click events
    document.addEventListener('click', () => {
        if (location.href !== lastUrl) {
            lastUrl = location.href;
            if (lastUrl.includes('/live/') || lastUrl.includes('/video/')) {
                startIntervals();
            }
            document.body.style.overflow = 'auto';
            document.documentElement.style.overflow = 'auto';
            document.body.style.position = 'relative';
            document.documentElement.style.position = 'relative';
        }
    });
    // Execute once when page loads
    startIntervals();

})();