您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
치지직 광고 차단 감지 스크립트를 우회합니다.
// ==UserScript== // @name CHZZK Ad Block Auto Quality Change // @version 1.0.8 // @match https://chzzk.naver.com/* // @description 치지직 광고 차단 감지 스크립트를 우회합니다. // @run-at document-start // @grant none // @author k22pr // @namespace k22pr/chzzk-ad-block-auto-quality-change // @license MIT // ==/UserScript== console.log("auto-quality.js"); (function () { const VIDEO_ELEMENT_NAME = "video.webplayer-internal-video"; const QUALITY_ELEMENT_NAME = "li.pzp-ui-setting-quality-item"; let qualityInterval = null; let processed = false; function pressEnterOnElement(el) { if (!el) return; el.focus?.({ preventScroll: true }); el.click(); el.dispatchEvent( new KeyboardEvent("keydown", { bubbles: true, key: "Enter", code: "Enter", }) ); el.dispatchEvent( new KeyboardEvent("keyup", { bubbles: true, key: "Enter", code: "Enter" }) ); } async function tick() { await new Promise((r) => requestAnimationFrame(() => requestAnimationFrame(r)) ); const hasLive = location.pathname.includes("/live/"); const videoEl = document.querySelector(VIDEO_ELEMENT_NAME); const items = [ ...new Set([...document.querySelectorAll(QUALITY_ELEMENT_NAME)]), ]; const target = items.find((li) => /1080p|720p/.test(li.innerText)); if (!target) return false; const isNowHighQuality = target?.classList.contains("pzp-ui-setting-pane-item--checked") ?? false; if (hasLive && !isNowHighQuality && !processed) { pressEnterOnElement(target); videoEl.play().catch(() => {}); processed = true; return; } if (isNowHighQuality && videoEl && !videoEl.paused) { stopQualityInterval(); } } function startQualityInterval() { if (qualityInterval !== null) return; qualityInterval = setInterval(tick, 100); } function stopQualityInterval() { if (qualityInterval === null) return; clearInterval(qualityInterval); qualityInterval = null; } function restartQualityInterval() { processed = false; stopQualityInterval(); startQualityInterval(); setTimeout(stopQualityInterval, 3000); } // test: Alt+H window.addEventListener("keydown", (e) => { if (e.altKey && e.key.toLowerCase() === "h") pressEnterOnElement(); }); function tryMount() { const videoElement = document.querySelector(VIDEO_ELEMENT_NAME); videoElement?.addEventListener("loadedmetadata", () => { tick(); restartQualityInterval(); }); } (function () { const fireLoc = () => setTimeout(restartQualityInterval, 0); const _ps = history.pushState, _rs = history.replaceState; history.pushState = function () { const r = _ps.apply(this, arguments); fireLoc(); return r; }; history.replaceState = function () { const r = _rs.apply(this, arguments); fireLoc(); return r; }; window.addEventListener("popstate", fireLoc); })(); if (document.readyState === "loading") { document.addEventListener("DOMContentLoaded", tryMount, { once: true }); } else { tryMount(); } new MutationObserver((list) => { for (const m of list) { for (const n of m.addedNodes) { if (n.nodeType !== 1) continue; if ( n.matches?.(VIDEO_ELEMENT_NAME) || n.querySelector?.(VIDEO_ELEMENT_NAME) ) tryMount(); } } }).observe(document.documentElement, { childList: true, subtree: true }); })();