🏠 Home 

Shift Space Toggle Youtube CE Element

This is to toggle annoying Youtube CE Element near the end of the video

// ==UserScript==
// @name         Shift Space Toggle Youtube CE Element
// @name:en         Shift Space Toggle Youtube CE Element
// @name:ja         Shift Space Toggle Youtube CE Element
// @name:zh-TW         Shift Space Toggle Youtube CE Element
// @name:zh-CN         Shift Space Toggle Youtube CE Element
// @name         Shift Space Toggle Youtube CE Element
// @namespace    http://tampermonkey.net/
// @version      0.5.1
// @description  This is to toggle annoying Youtube CE Element near the end of the video
// @description:en  This is to toggle annoying Youtube CE Element near the end of the video
// @description:ja  これは、ビデオの終わり近くにある迷惑な Youtube CE 要素を切り替えるためのものです。
// @description:zh-TW  這是為了切換在影片結尾附近煩人的 Youtube CE 元素
// @description:zh-CN  這是為了切換在影片結尾附近煩人的 Youtube CE 元素
// @author       CY Fung
// @match        https://www.youtube.com/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=youtube.com
// @grant        none
// @license      MIT
// ==/UserScript==
/* jshint esversion:6 */
(function() {
'use strict';
let videoElm = null;
const ceElems = [];
let isPassiveAvailable = null
let earliestShown = -1;
let endTime = -1;
const WeakRef = window?.WeakRef;
let videoReady = false
let lastPress = -1
const allowList = [
'DIV', 'SPAN', 'BODY', 'HTML', 'VIDEO', 'A',
'YTD-PLAYER', 'YTD-WATCH-FLEXY', 'YTD-PAGE-MANAGER', 'YTD-MINIPLAYER'
];
function cacheCEElems() {
const m = document.querySelectorAll('ytd-player#ytd-player .ytp-ce-element');
if (m.length === 0) return false;
ceElems.length = 0;
for (const elm of m) {
ceElems.push(new WeakRef(elm))
}
return true;
}
function videoTimeUpdate(evt) {
//passive = true
//capture = false
if (!videoReady) {
if (evt?.target?.matches('ytd-player#ytd-player video')) {
videoReady = true
if (cacheCEElems() === false) setTimeout(cacheCEElems, 180);
}
}
if (ceElems.length === 0) return;
const video = evt.target;
const anyShown = ceElems.some((elmRef) => elmRef.deref()?.classList?.contains('ytp-ce-element-show') === true)
//console.log(135, anyShown, video.currentTime)
if (anyShown) {
if (earliestShown > 0 && -earliestShown < -video.currentTime) {
earliestShown = video.currentTime
endTime = video.duration
} else if (earliestShown < 0) {
videoElm = new WeakRef(video);
earliestShown = video.currentTime
endTime = video.duration
}
}
}
function initialForVideoDetection(evt) {
//passive = true
//capture = true
const video = evt?.target;
if (video?.nodeName === 'VIDEO' && typeof video.src == 'string') {} else return;
videoReady = false;
ceElems.length = 0;
videoElm = null;
earliestShown = -1;
endTime = -1;
new Promise(function() {
if (video.hasAttribute('usr-video-cem')) return;
video.setAttribute('usr-video-cem', '');
if (isPassiveAvailable === null) isPassiveAvailable = checkPassive();
video.addEventListener('timeupdate', videoTimeUpdate, optCapture(true, false));
})
}
function pageKeyDownfunction(evt) {
//passive = false
//capture = true
if (evt.code === 'Space' && evt.shiftKey) {
if (!allowList.includes(evt.target.nodeName)) return;
if (endTime > earliestShown && earliestShown > 0) {
let video = videoElm?.deref();
if (!video) return;
let p = (video.currentTime - earliestShown) / (endTime - earliestShown);
if (p >= 0 && p <= 1) {
evt.preventDefault();
evt.stopPropagation();
evt.stopImmediatePropagation();
for (const ceElem of ceElems) {
ceElem?.deref()?.classList.toggle('ytp-ce-element-show');
}
}
}
}
}
function checkPassive() {
let passiv###pported = false;
try {
const options = {
get passive() {
passiv###pported = true;
return false;
}
};
window.addEventListener("test", null, options);
window.removeEventListener("test", null, options);
} catch (err) {
passiv###pported = false;
}
return passiv###pported
}
const optCapture = (passive, capture) => isPassiveAvailable ? { passive, capture } : capture;
new Promise(function() {
if (isPassiveAvailable === null) isPassiveAvailable = checkPassive();
document.addEventListener('canplay', initialForVideoDetection, optCapture(true, true));
})
document.addEventListener('keydown', pageKeyDownfunction, true)
//ytp-ce-video ytp-ce-top-left-quad ytp-ce-size-853 ytp-ce-element-show
// Your code here...
})();