// ==UserScript== // @name Replace Kick Embed with Channel Page and Enable Theatre Mode // @namespace https://player.kick.com/ // @version 1.2 // @description Replaces Kick embed with a full channel page and enables theatre mode on Kick.com only when loaded as an embed replacement // @author nobody // @match *://player.kick.com/* // @match *://kick.com/* // @grant GM_setValue // @grant GM_getValue // @run-at document-start // @license GPL-3.0-or-later // @downloadURL none // ==/UserScript== if (window.location.host.includes("player.kick.com")) { // Code for the embed page: Replace the Kick player with a full channel page const observer = new MutationObserver(() => { const playerContainer = document.querySelector(".video-container"); if (playerContainer) { // Extract channel information from the URL const channelUrl = window.location.href; console.log("Channel URL:", channelUrl); const channelId = channelUrl.split("/")[3]; // Assumes URL is like: https://player.kick.com/channel/{channelId} console.log("Channel ID:", channelId); // Create an iframe for the full Kick channel page const iframe = document.createElement("iframe"); iframe.src = `https://kick.com/${channelId}`; iframe.style.width = "100%"; iframe.style.height = "100vh"; // Full viewport height iframe.style.border = "none"; // Replace the embed with the full channel page playerContainer.innerHTML = ""; playerContainer.appendChild(iframe); // Stop observing and mark that we replaced the embed observer.disconnect(); GM_setValue("embedReplaced", true); } }); observer.observe(document.body, { subtree: true, childList: true, }); } else if (window.location.host.includes("kick.com")) { // Code for kick.com: Only run if the embed was replaced and the referrer indicates it came from player.kick.com const embedReplacedValue = GM_getValue("embedReplaced", false); if (embedReplacedValue && document.referrer.includes("player.kick.com")) { console.log("Embed replacement detected via referrer. Enabling theatre mode..."); const observer2 = new MutationObserver(() => { setTimeout(() => { const clickEvent = new MouseEvent('click', { bubbles: true, cancelable: true }); document.querySelector('#channel-chatroom > div:first-child > div > button')?.dispatchEvent(clickEvent); // Uncomment the line below if you want the expand chat button to be deleted document.querySelector("html body > div > div:nth-of-type(2) > div:nth-of-type(4) > main > div:first-of-type > div:first-of-type > button")?.remove(); }, 300); setTimeout(() => { // const keydownEvent = new KeyboardEvent('keydown', { // key: 't', // code: 'KeyT', // keyCode: 84, // deprecated, but sometimes needed for compatibility // which: 84, // deprecated, but sometimes needed for compatibility // bubbles: true, // cancelable: true // }); const clickEvent = new MouseEvent('click', { bubbles: true, cancelable: true }); document.querySelector("#injected-embedded-channel-player-video > div > div > div:nth-of-type(2) > button:nth-of-type(3)")?.dispatchEvent(clickEvent); //document.querySelector('#video-player')?.dispatchEvent(keydownEvent); }, 500); observer2.disconnect(); // Clear the flag so subsequent direct visits to kick.com don't trigger theatre mode GM_setValue("embedReplaced", false); }); observer2.observe(document.body, { subtree: true, childList: true, }); } }