ExtendPornHub

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

Vous devrez installer une extension telle que Tampermonkey, Greasemonkey ou Violentmonkey pour installer ce script.

Vous devrez installer une extension telle que Tampermonkey pour installer ce script.

Vous devrez installer une extension telle que Tampermonkey ou Violentmonkey pour installer ce script.

Vous devrez installer une extension telle que Tampermonkey ou Userscripts pour installer ce script.

Vous devrez installer une extension telle que Tampermonkey pour installer ce script.

Vous devrez installer une extension de gestionnaire de script utilisateur pour installer ce script.

(J'ai déjà un gestionnaire de scripts utilisateur, laissez-moi l'installer !)

Vous devrez installer une extension telle que Stylus pour installer ce style.

Vous devrez installer une extension telle que Stylus pour installer ce style.

Vous devrez installer une extension telle que Stylus pour installer ce style.

Vous devrez installer une extension du gestionnaire de style pour utilisateur pour installer ce style.

Vous devrez installer une extension du gestionnaire de style pour utilisateur pour installer ce style.

Vous devrez installer une extension du gestionnaire de style pour utilisateur pour installer ce style.

(J'ai déjà un gestionnaire de style utilisateur, laissez-moi l'installer!)

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