Youtube Faster Fullscreen

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

Tendrás que instalar una extensión para tu navegador como Tampermonkey, Greasemonkey o Violentmonkey si quieres utilizar este script.

You will need to install an extension such as Tampermonkey to install this script.

Necesitarás instalar una extensión como Tampermonkey o Violentmonkey para instalar este script.

Necesitarás instalar una extensión como Tampermonkey o Userscripts para instalar este script.

Necesitará instalar una extensión como Tampermonkey para instalar este script.

Necesitarás instalar una extensión para administrar scripts de usuario si quieres instalar este script.

(Ya tengo un administrador de scripts de usuario, déjame instalarlo)

Necesitará instalar una extensión como Stylus para instalar este estilo.

Necesitará instalar una extensión como Stylus para instalar este estilo.

Necesitará instalar una extensión como Stylus para instalar este estilo.

Necesitará instalar una extensión del gestor de estilos de usuario para instalar este estilo.

Necesitará instalar una extensión del gestor de estilos de usuario para instalar este estilo.

Necesitará instalar una extensión del gestor de estilos de usuario para instalar este estilo.

(Ya tengo un administrador de estilos de usuario, déjame instalarlo)

// ==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);
    }


// }
}) ();