ExtendPornHub

Remove ads, enlarges video, stops autoplay keeping buffering & block pop-ups

θα χρειαστεί να εγκαταστήσετε μια επέκταση όπως το Tampermonkey, το Greasemonkey ή το Violentmonkey για να εγκαταστήσετε αυτόν τον κώδικα.

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

θα χρειαστεί να εγκαταστήσετε μια επέκταση όπως το Tampermonkey ή το Violentmonkey για να εγκαταστήσετε αυτόν τον κώδικα.

θα χρειαστεί να εγκαταστήσετε μια επέκταση όπως το Tampermonkey ή το Userscripts για να εγκαταστήσετε αυτόν τον κώδικα.

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

Θα χρειαστεί να εγκαταστήσετε μια επέκταση διαχείρισης κώδικα χρήστη για να εγκαταστήσετε αυτόν τον κώδικα.

(Έχω ήδη έναν διαχειριστή κώδικα χρήστη, επιτρέψτε μου να τον εγκαταστήσω!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(Έχω ήδη έναν διαχειριστή στυλ χρήστη, επιτρέψτε μου να τον εγκαταστήσω!)

// ==UserScript==
// @author      Jack_mustang
// @version     3.0
// @name        ExtendPornHub
// @description Remove ads, enlarges video, stops autoplay keeping buffering & block pop-ups
// @date        2017 October 3
// @include     *pornhub.com/*
// @include     *pornhubpremium.com/*
// @run-at      document-start
// @grant       none
// @license     Public Domain
// @icon        https://gmgmla.dm2301.livefilestore.com/y2pAKJYeZAp4tG23hG68x1mRuEUQXqb1MxdLbuqVnyyuHFxC7ra5Fc-tfq6hD-r9cNnVufT3egUHaimL547xDlESrOVmQsqNSJ5gzaiSccLYzo/ExtendPornHub-logo.png
// @namespace   649b97180995e878e7e91b2957ef3bbee0f840a0
// ==/UserScript==

if (!!window.location.hostname.match(/premium/)) {
    (function ExtendPornHubPremium(){
        changePlayer();
        window.addEventListener("DOMContentLoaded", function(){
            if(document.querySelector("#player")) {
                videoFunctions();
            }
        }, false);
    })();
    return;
}

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

window.EYP = {};
// stop autoplay
Object.defineProperty(window, "videoTimeTracking", {
    set: function (e) {
        // window.EYP.flashvars = ;
        Object.defineProperty(window, "flashvars_" + e.match(/\d+/)[0], {
            set: function (e) {
                e.autoplay = false;
                e.autoload = true;
                window.EYP.flashvars = e;
            },
            get: function () {
                return window.EYP.flashvars;
            }
        });
        window.EYP.videoTimeTracking = e;
    },
    get: function () {
        return window.EYP.videoTimeTracking;
    }
});

(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 ephcss =
    // Hide ads while we can't remove them
    "iframe, aside, figure," +
    // Ad area in gifs page
 //   ".gifsWrapper > div:first-child," +
    // Video being watched in one line
    ".videos-being-watched.logInHotContainer li:last-child," +
    // Ad Block Message
    ".abAlertShown," +
    // Change language notice
    "#countryRedirectMessage {" +
        "display: none !important;" +
    "}" +
    // Pornstars page
    "ul.top_trending_pornstar {" +
        "display: table !important;" +
        "margin: auto !important;" +
    "}" +
    "ul.top_trending_pornstar li {" +
        "display: table-cell !important;" +
    "}" +
    ".sectionWrapper .pornstarVideosCounter {" +
        "width: 100% !important;" +
    "}" +
    // Gifs page
    ".gifsWrapper ul.gifs li.first {" +
        "margin-right: 12px !important;" +
        "margin-top: 0 !important;" +
        "height: 353px !important;" +
        "margin-bottom: 12px !important;" +
    "}" +
    "@media only screen and (min-width: 1350px) {" +
        ".gifsWrapper ul.gifs li.first {" +
            "height: 381px !important;" +
        "}" +
        ".gifsWrapper ul.gifs li:nth-child(8) {" +
            "display: none !important;" +
        "}" +
    "}" +
    ".gifColumnLeft.float-left {" +
        "width: 100% !important;" +
    "}";

    // Inject created CSS
    var ephnode = document.createElement("style");
    ephnode.type = "text/css";
    ephnode.id = "EPH-style";
    ephnode.appendChild(document.createTextNode(ephcss));
    document.head.appendChild(ephnode);
}());

(function ExtendPornHub() {
    // Scroll, keyboard shortcut
    function videoStuff() {
        // Scroll video to middle of page
        function scrollthere() {
            var player = document.getElementById("player");
            var vh = player.offsetHeight;
            var vd = document.querySelector(".container").offsetTop + document.querySelector(".container").parentNode.offsetTop + document.querySelector(".video-wrapper").offsetTop;
            var fh = window.innerHeight;
            var sc = vd - ((fh - vh) / 2);
            window.scrollTo(0, sc);
            // console.info("** ExtendPornHub **\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 = "EPH-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;" +
                                  "border: 1px solid #313131;" +
                                  "border-top-left-radius: 5px;" +
                                  "color: #acacac;" +
                                  "font-weight: 700;" +
                                  "background: #2f2f2f;" +
                                  "text-align: center;" +
                                  "font-size: 12px;" +
                                  "padding: 7px 15px;" +
                                  "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 = "EPH-scroll";
        document.body.appendChild(node);

        // Add video download when not logged
        if( document.body.classList[0].search("logged-in") < 0 ) {
            var tab = document.querySelector(".download-tab");
            var dwlinks = "";

            for (var key in window.EYP.flashvars) {
                var quality = key.match(/quality_(\d+)p/);
                if (!!quality) {
                    dwlinks += "<a class='downloadBtn greyButton' target='_blank' href='" + EYP.flashvars[key] + "'><i></i>" + (quality[1] > 700 ? "<span>HD</span> " : "") + quality[1] + "</a>"
                }
            }

            tab.innerHTML = dwlinks;
        }
    }

    var observer = new MutationObserver(function (changes) {
        changes.forEach(function (chg) {
            if (!!chg.target.className) {
                // remove ad spaces
                if (!!chg.target.className.match(/removeAdsStyle/)) {
                    var node = chg.target.parentNode;
                    if (!!node.parentNode.className.match(node.className.substr(0, node.className.length - 1))) {
                        node = node.parentNode;
                    }
                    node.parentNode.removeChild(node);
                    return;
                }
                // wide player
                if (!!chg.target.id.match(/\bplayer\b/)) {
                    chg.target.className = "wide";
                    return;
                }
                if (!!chg.target.id.match(/main-container/) && !!chg.previousSibling && !!chg.previousSibling.id && !!chg.previousSibling.id.match(/rightColVideoPage/)) {
                    chg.previousSibling.className = "wide";
                    return;
                }
                // update wide player button / HTML5 only
                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.className.match(/playerFlvContainer/)) {
                    chg.addedNodes.forEach(function (element) {
                        if (!!element && element.id === "pb_template") {
                            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});
}());