Hide chat on YouTube live videos by default.
// ==UserScript==
// @name YouTube - Hide chat by default
// @namespace amekusa.yt-hide-chat
// @author amekusa
// @version 2.0.0
// @description Hide chat on YouTube live videos by default.
// @match https://www.youtube.com/*
// @run-at document-start
// @grant none
// @license MIT
// @homepage https://github.com/amekusa/monkeyscripts
// ==/UserScript==
(function (doc) {
// --- config ---
let wait = 4000; // initial wait time (ms)
let interval = 2000; // update interval (ms)
let match = /^https:\/\/www\.youtube\.com\/(?:watch\?|clip\/)/; // url pattern
let debug = false ? console.debug : (() => {});
// --------------
let watcher;
let paused;
let hide;
function findCloseButton() {
try {
let fr = doc.querySelector('iframe#chatframe'); // frame
if (!fr) return null;
fr = fr.contentWindow.document;
if (!fr.querySelector('yt-live-chat-item-list-renderer #items [id], yt-live-chat-item-list-renderer #empty-state-message')) return null;
return fr.querySelector('yt-live-chat-header-renderer #close-button button');
} catch (e) {
return null;
}
}
function unhide() {
debug('unhide.');
hide = false;
}
function update() {
if (paused || !hide) return; // do nothing
// find & click the close button
let btn = findCloseButton();
if (btn) {
debug('click:', btn);
return btn.dispatchEvent(new Event('click'));
}
// hook "Show chat" button
btn = doc.querySelector('#chat-container #show-hide-button button');
if (btn) {
btn.removeEventListener('click', unhide);
btn.addEventListener('click', unhide);
}
}
function pause() {
if (paused) return;
debug('pause.');
paused = true;
if (watcher) {
clearTimeout(watcher);
clearInterval(watcher);
watcher = null;
}
}
function init() {
if (watcher) return; // already running
if (!location.href.match(match)) {
debug('url mismatch:', location.href);
return;
}
if (paused) {
debug('resume.');
paused = false;
}
debug('initializing...');
hide = true;
watcher = setTimeout(() => {
watcher = setInterval(update, interval);
debug('initialized.');
update();
}, wait);
}
doc.addEventListener('DOMContentLoaded', init);
doc.addEventListener('yt-navigate-finish', init);
doc.addEventListener('yt-navigate-start', pause);
})(document);