Youtube Faster Fullscreen

Tries to replace player with embed player so we get faster fullscreen and no scrolling/comments/description while in fullscreen.

// ==UserScript==
// @name         Youtube Faster Fullscreen
// @namespace    http://tampermonkey.net/
// @version      0.20
// @description  Tries to replace player with embed player so we get faster fullscreen and no scrolling/comments/description while in fullscreen.
// @author       Filipe Henriques
// @match        https://www.youtube.com/*
// @icon         https://cdn-icons-png.flaticon.com/512/124/124015.png
// @grant        none
// @run-at       document-start
// @noframes
// ==/UserScript==

(function () {
    // 'use strict';

// Only run the userscript outside iframes
// if ( !(window.location !== window.parent.location) ) {

    // Keyboard shortcut support for the iframe
    (window.opera ? document.body : document).addEventListener('keydown', function(e) {
        console.log(e);
        if (e.srcElement.nodeName == "INPUT" || e.srcElement.id == "contenteditable-root") {return false;}
        // Fullscreen
        if (e.key === "f" && !e.ctrlKey) {
            e.cancelBubble = true;
            e.stopImmediatePropagation();

            // we are inside the iframe. else -> outside iframe
            if(!document.querySelector(".ytp-fullscreen-button.ytp-button")){
                let button = document.getElementById("myFrame").contentWindow.document.getElementsByClassName("ytp-fullscreen-button ytp-button")[0];
                button.click();
            } else { document.querySelector(".ytp-fullscreen-button.ytp-button").click(); }
        }
        // Pause
        if (e.code === "Space" || e.code == "KeyK") {
            e.cancelBubble = true;
            e.stopImmediatePropagation();
            e.preventDefault();
            // outside iframe
            if(!document.querySelector(".ytp-fullscreen-button.ytp-button")){
                let video = document.getElementById("myFrame").contentWindow.document.querySelector("video");
                if (video.paused) {video.play();}
                else {video.pause();}
            }
        }
        // Mute
        if (e.code === 'KeyM') {
            e.cancelBubble = true;
            e.stopImmediatePropagation();
            let mute = document.querySelector('.ytp-mute-button.ytp-button');
            // we are inside the iframe. else -> outside iframe
            if(!mute){
                let button = document.getElementById("myFrame").contentWindow.document.getElementsByClassName('ytp-mute-button ytp-button')[0];
                button.click();
            } else { mute.click(); }
        }
        // Captions
        if (e.code === 'KeyC') {
            e.cancelBubble = true;
            e.stopImmediatePropagation();
            let captions = document.querySelector('.ytp-subtitles-button.ytp-button');
            // we are inside the iframe. else -> outside iframe
            if(!captions){
                let button = document.getElementById("myFrame").contentWindow.document.getElementsByClassName(' ytp-subtitles-button ytp-button')[0];
                button.click();
            } else { captions.click(); }
        }
        // TODO ADD SEEKING WITH ARROW KEYS OUTSIDE IFRAMEm
        return false;
    }, !window.opera);

// ######################################################################################################

    // Global observer waits until elements we want appear
    var href = document.location.href;
    var ytd_found = false;        var ytd = null;
    var player_found = false;     var player = null;
    var orig_found = false;       var original_player = null;
    var skeleton_found = false;   var skeleton_theater = null;
    var watch_on_yt_fnd = false;  var watch_on_yt_bt = null;
    var player_replaced = false;
    var observer = new MutationObserver(function (mutations, me) {
        // Check if we are navigating somewhere else and force page reload
        if (href != document.location.href) {
            let oldref = href;
            href = document.location.href;
            if ( oldref.includes('watch') && !document.location.href.includes('watch')) {
                let frame = document.getElementById("myFrame");
                frame.contentWindow.document.querySelector("video").pause();
                frame.parentElement.remove();
                frame.remove();
            } if ( !oldref.includes('watch') && !document.location.href.includes('watch')) {
                // do nothing
            } else {document.location.href = href;}
        }
        // First original player in page
        if (!orig_found) {original_player = document.querySelector("video");}
        if (original_player && !orig_found) {

            orig_found = true;
            original_player.pause();
            original_player.addEventListener('play', (event) => {
                event.target.pause();
            // }, { once: true });
            });
        }
        // Intercept first appearance of skeleton theater
        if (!skeleton_found) {skeleton_theater = document.querySelector('#player.skeleton.theater');}
        if (skeleton_theater && !skeleton_found) {

            skeleton_found = true;
            replacePlayer(skeleton_theater);
            let o = new MutationObserver(function (mutations, me) {
                mutations[0].target.removeAttribute("hidden");
                document.getElementById("myFrame").style = 'width: 100%; height: 100%; position: relative';
            });
            o.observe(skeleton_theater, {attributes: true});

        }
        // Remove player theater which is the final original player as soon as it appears
        if (!player_found) { player = document.getElementById('player-theater-container');}
        if (player && !player_found) {
            player_found = true;
            player.firstChild.remove();
        }
        // Remove Watch on Youtube button
        if (!watch_on_yt_fnd) { watch_on_yt_bt = document.getElementById("myFrame").contentWindow.document.querySelector(".ytp-youtube-button.ytp-button.yt-uix-sessionlink");}
        if ( watch_on_yt_bt && !watch_on_yt_fnd) {
            watch_on_yt_bt.remove();
        }
        return;
    });
    observer.observe(document, {
        childList: true,
        subtree: true
    });


    // Replace player with an iframe embed player
    function replacePlayer(element) {
        let video_id = window.location.search.split('v=')[1];
        let ampersandPosition = video_id.indexOf('&');
        if(ampersandPosition != -1) {video_id = video_id.substring(0, ampersandPosition);}
        let start_time = 0;
        let t = window.location.search.split('t=')[1];
        if (t) { start_time = t.slice(0, -1);}

        let iframe = document.createElement('iframe');
        iframe.src = 'https://www.youtube.com/embed/' + video_id + '?autoplay=1&enablejsapi=1&start=' + start_time;
        iframe.title = 'Youtube video player';
        iframe.style = 'width: inherit; height: inherit; position: fixed';
        iframe.frameborder = '0';
        iframe.allow = 'accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture';
        iframe.setAttribute('allowFullScreen', '');
        iframe.id = 'myFrame';
        element.prepend(iframe);
    }


// }
}) ();