ExtendYouPorn

Remove ads, enlarges video, stops autoplay keeping buffering, fixes the overhaul style & block pop-ups

// ==UserScript==
// @author          Jack_mustang
// @version         5.0
// @name            ExtendYouPorn
// @description     Remove ads, enlarges video, stops autoplay keeping buffering, fixes the overhaul style & block pop-ups
// @date            2017 October 3
// @include         *youporn.com/*
// @include         *youporngay.com/*
// @run-at          document-start
// @grant           none
// @license         Public Domain
// @icon            https://gmgmla.dm2301.livefilestore.com/y2pYluU8jK3EnLV1U8D92pYCC9wU5O04Il4j64Ft_pjKGpUG_I5L0fUHrsLpUB4oDCLIJdWp9Bwmr0RPMdhJhl5Bo362RwjatCFUpNjEdMosGA/EYP-logo.jpg
// @namespace       14fac5d83892686b90beea51d35d1d7dbcfe49b6
// ==/UserScript==

// Block popups fallback
function NoOpen() { return 1; }
parent.open = NoOpen;
this.open = NoOpen;
window.open = NoOpen;
open = NoOpen;
window.open = function () { return; };
open = function () { return; };
this.open = function () { return; };
parent.open = function () { return; };

function fnull() {
    return null;
}

// Block ads
Object.defineProperty(window, "adDelivery", {
    get: fnull,
    set: fnull
});
Object.defineProperty(window, "tj_ads", {
    get: fnull,
    set: fnull
});
Object.defineProperty(window, "tj_channels", {
    get: fnull,
    set: fnull
});

// stop autoplay
Object.defineProperty(window, "MHP1138", {
    set: function (e) {
        if (!!e.players.videoContainer) {
            e.players.videoContainer.autoplay = false;
            e.players.videoContainer.autoPlayVideo.enabled = false;
            e.players.videoContainer.flashSettings.autoplay = false;
        }
        window.MHP1138a = e;
    },
    get: function () {
        return window.MHP1138a;
    }
});

// YouPorn overrides this function, we need to to auto-centre
window.scrollVid = window.scrollTo;

(function addStyle() {
    // While <head> is not loaded we keep trying
    if (!document.querySelector("head")) {
        return setTimeout(addStyle, 50);
    }

    // We create an object and start including its content to include in DOM at the end
    var eypcss =
    // Hide ads while we can't remove them
    "iframe,\
    figure,\
    aside,\
    .ad-links-text,\
    .channelSideAd,\
    .sixteen-column.channel-header," +
    // Ad block message
    "#adblock_1," +
    // Change pause button
    "#pb_template > :not(.mhp1138_playerStateIcon)," +
    // Pornstars page, pornstars in one line
    ".nine-column .porn-star-list:last-child {\
        display: none !important;\
    }" +
    // vids in one line, on pornstars page
    ".column-flex,\
    div.eight-column:not(.title-select),\
    div.eight-column .row,\
    .pornstars-list .nine-column,\
    .pornstars-list .nine-column .row {\
        width: 100% !important;\
    }";

    // Inject created CSS
    var eypnode = document.createElement("style");
    eypnode.type = "text/css";
    eypnode.id = "EYP-style";
    eypnode.appendChild(document.createTextNode(eypcss));
    document.head.appendChild(eypnode);
}());

(function ExtendYouPorn(){
    function videoStuff() {
        // Scroll video to middle of page
        function scrollthere() {
            var player = document.getElementById('videoContainer');
            var vh = player.offsetHeight;
            var vd = ((document.querySelector("#network-bar").offsetHeight > 0) ? 0 : 25) + ((player.parentNode.offsetTop == 0)? ((document.querySelector('#studioCanvas'))? document.querySelector('.grid_8.alpha').offsetTop : document.querySelector('.watchWrapper').offsetTop+document.querySelector('#videoCanvas').offsetTop ) : player.parentNode.offsetTop);
            var fh = window.innerHeight;
            sc = vd - ((fh - vh) / 2);
            scrollVid(0, sc);
            // console.info("** ExtendYouPorn **\ntop: " + vd + ", height: " + vh + ", scrolled: " + sc + ", window: " + fh);
        }
        // Inject this function to page
        var script = document.createElement("script");
        script.setAttribute("type", "text/javascript");
        script.innerHTML = scrollthere.toString();
        script.id = "EYP-scrollVid";
        document.body.appendChild(script);
        scrollthere();

        // Keyboard Shortcut for centring
        window.addEventListener('keyup', function (e) {
            if (e.ctrlKey && e.altKey && (e.code === "KeyC" || (e.code === undefined && e.keyCode === 67))) {
                scrollthere();
            }
        }, false);

        // Include button in right corner to center video on screen
        var node = document.createElement("div");
        node.setAttribute("style","position: fixed;" +
                                  "bottom: 0;" +
                                  "right: 0;" +
                                  "cursor: pointer;" +
                                  "color: #fff;" +
                                  "background: #ec567c;" +
                                  "border-top-left-radius: 3px;" +
                                  "text-align: center;" +
                                  "font-size: 12px;" +
                                  "padding: 7px;" +
                                  "z-index: 999999;");
        node.setAttribute("onclick", "scrollthere();");
        node.setAttribute("title", "Use the keyboard shortcut Ctrl+Alt+C (For other keyboard layouts use the key where C should be on the QWERTY layout)");
        node.innerHTML = "Centre";
        node.id = "EYP-scroll";
        document.body.appendChild(node);
    }

    var observer = new MutationObserver(function (changes) {
        changes.forEach(function (chg) {
            if (!!chg.target.className) {
                // remove ad spaces
                if (!!chg.target.className.match(/responsiveIframe/)) {
                    var node = chg.target.parentNode;
                    if (node.parentNode.children.length === 1 && !node.parentNode.className.match(/column/)) {
                        node = node.parentNode.parentNode;
                    }
                    node.parentNode.removeChild(node);
                    return;
                }
                // wide player
                if (!!chg.target.className.match(/playWrapper/)) {
                    chg.target.className = "playWrapper sixteen-column";
                    return;
                }
                // update wide player button
                if (!!chg.target.className.match(/mhp1138_front/)) {
                    chg.target.childNodes.forEach(function (node) {
                        if (!!node.className.match(/mhp1138_cinema/)) {
                            node.className = "mhp1138_cinema mhp1138_cinemaState";
                            return;
                        }
                    });
                    return;
                }
                // centre video
                if (chg.target.id === "videoContainer") {
                    chg.addedNodes.forEach(function (element) {
                        if (!!element && element.id === "pb_template") {
                            console.log(element);
                            var node = document.createElement("div");
                            node.className = "mhp1138_playerStateIcon";
                            node.setAttribute("style", "opacity: 1");
                            node.innerHTML =
                                    "<div class='mhp1138_play' style='display: block'>" +
                                    "    <div class='mhp1138_icon mhp1138_icon-play'></div>" +
                                    "</div>" +
                                    "<div class='mhp1138_background'></div>";
                            element.appendChild(node);

                            videoStuff();
                            return;
                        }
                    });
                }
                return;
            }
        });
    });

    observer.observe(document, {childList: true, subtree: true});
}());