// ==UserScript== // @name Chzzk Theater Mode & Lolcast Sidebar Control // @namespace Chzzk Theater Mode & Lolcast Sidebar Control // @version 0.3 // @description Chzzk에서 채팅창 가리기+넓은 화면, Lolcast에서 사이드바 제어 및 설정 저장 // @author lc2122 // @match https://chzzk.naver.com/* // @match https://lolcast.kr/#/player/* // @grant GM_setValue // @grant GM_getValue // @grant GM_registerMenuCommand // @downloadURL none // ==/UserScript== (function () { 'use strict'; let debug = false; let url = document.location.href; // 공통: 요소가 로드될 때까지 기다리는 함수 function waitForElement(selector, callback) { const existingElement = document.querySelector(selector); if (existingElement) { callback(existingElement); } else { const observer = new MutationObserver(() => { const targetElement = document.querySelector(selector); if (targetElement) { observer.disconnect(); callback(targetElement); } }); observer.observe(document.documentElement, { childList: true, subtree: true }); } } // Chzzk 관련 기능 if (url.indexOf("//chzzk.naver.com/") !== -1) { let isTopWindow = window.self === window.top; if (isTopWindow) return; if (debug) console.log("chzzk embed", url); let player = undefined; let handleVideoReadyFired = false; let handleVideoReady = function () { if (handleVideoReadyFired) return; handleVideoReadyFired = true; let viewmode_buttons = document.querySelectorAll(".pzp-pc__viewmode-button"); if (viewmode_buttons.length === 1) { viewmode_buttons[0].click(); } else { for (let i = 0; i < viewmode_buttons.length; i++) { let button = viewmode_buttons[i]; if (button.getAttribute('aria-label') === '넓은 화면') { button.click(); break; } } } document.querySelector('[class^="live_chatting_header_button__"]').click(); }; waitForElement("video.webplayer-internal-video", function (node) { if (debug) console.log("found video player", node); player = node; if (player.readyState >= 2) { handleVideoReady(); } else { player.addEventListener('loadedmetadata', function once() { player.removeEventListener('loadedmetadata', once); handleVideoReady(); }); } player.muted = false; }); } // Lolcast 관련 기능 if (url.indexOf("//lolcast.kr/") !== -1) { const LEFT_SIDEBAR_KEY = 'hideLeftSidebar'; const RIGHT_SIDEBAR_KEY = 'hideRightSidebar'; // 저장된 설정 적용 function applySavedSettings() { const hideLeft = GM_getValue(LEFT_SIDEBAR_KEY, false); const hideRight = GM_getValue(RIGHT_SIDEBAR_KEY, false); if (hideLeft) { waitForElement('#menu-button', (menuButton) => menuButton.click()); } if (hideRight) { waitForElement('#close-button', (closeButton) => closeButton.click()); } } // 설정창 생성 및 표시 function showSettingsPanel() { // 기존 설정창 제거 (중복 방지) const existingPanel = document.getElementById('sidebar-settings'); if (existingPanel) existingPanel.remove(); // 스타일 추가 const style = document.createElement('style'); style.textContent = ` #sidebar-settings { position: fixed; top: 50%; left: 50%; transform: translate(-50%, -50%); background: #fff; border: 1px solid #ccc; padding: 20px; z-index: 10000; box-shadow: 0 0 15px rgba(0,0,0,0.5); } #sidebar-settings button { margin-top: 10px; margin-right: 10px; } `; document.head.appendChild(style); // 설정창 HTML const panel = document.createElement('div'); panel.id = 'sidebar-settings'; panel.innerHTML = `

사이드바 설정



`; document.body.appendChild(panel); // 저장 버튼 이벤트 document.getElementById('saveSettings').addEventListener('click', () => { const hideLeft = document.getElementById('leftSidebar').checked; const hideRight = document.getElementById('rightSidebar').checked; GM_setValue(LEFT_SIDEBAR_KEY, hideLeft); GM_setValue(RIGHT_SIDEBAR_KEY, hideRight); alert('설정이 저장되었습니다. 새로고침 시 적용됩니다.'); panel.remove(); // 저장 후 설정창 닫기 }); // 닫기 버튼 이벤트 document.getElementById('closeSettings').addEventListener('click', () => { panel.remove(); // 닫기 버튼으로 설정창 닫기 }); } // Tampermonkey 메뉴에 설정 항목 추가 GM_registerMenuCommand('사이드바 설정 열기', showSettingsPanel); // 페이지 로드 시 저장된 설정만 적용 (설정창은 열리지 않음) window.addEventListener('load', applySavedSettings); } })();