ExtendPornHub

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

As of 2016-08-10. See the latest version.

You will need to install an extension such as Tampermonkey, Greasemonkey or Violentmonkey to install this script.

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

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

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

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

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

(I already have a user script manager, let me install it!)

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.

(I already have a user style manager, let me install it!)

// ==UserScript==
// @author			Jack_mustang
// @version			1.15
// @name			ExtendPornHub
// @description		Remove ads, enlarges video, stops autoplay keeping buffering & block pop-ups
// @date			2016 August 10
// @include			*pornhub.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==
// Block popups
function NoOpen(e){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;}

// Block ads
window.__defineGetter__("adDelivery", function() {return null})
window.__defineSetter__("adDelivery", function() {return null})

window.g367CB268B1094004A3689751E7AC568F = {
	Core: "stop mouse tracking and popups"
}
window.blockpops = document.createElement("iframe")
blockpops.src = "http://ss.phncdn.com/iframe-1.1"
addBlock()
function addBlock() {
	if (!document.querySelector("body"))
		return setTimeout(addBlock, 50)
	document.body.appendChild(blockpops)
}

// Begin page manipulation
var ExtendPH = function ExtendPornHub(){
	// Pop-up killer, we trick PH to think we are old Presto Opera, this kills the pop-ups
	if (!window.opera)
		window.opera = true

	addStyle()
	changePlayer()

	window.addEventListener('DOMContentLoaded', function(){
		// Remove ads functions
		function removeQuery(query) {
			var ifr = document.querySelectorAll(query)
			if(ifr.length > 0)
				for(var i=0; i < ifr.length; i++)
					if(query !== "iframe" || ifr[i].src !== "http://ss.phncdn.com/iframe-1.1") // This page yelds 404 and it blocks popups, seriously
						ifr[i].parentNode.removeChild(ifr[i])
		}
		// Remove those elements because they are ads
		removeQuery("iframe")
		removeQuery("aside")
		removeQuery("figure")

		// Video page
		if(document.getElementById('player')) {
			document.getElementById("hd-rightColVideoPage").setAttribute("class", "wide")
			document.getElementById("player").setAttribute("class", "wide")

			checkImage()

			// wait while player doesn't load
			function html5player() {
				var flash = document.querySelector("#player object"),
					html5 = document.querySelector("#player video")
				if (flash == null && html5 == null)
					return setTimeout(html5player, 50)
			
				var vidId = parseInt(document.getElementById('player').getAttribute("data-video-id")),
					playerDiv = document.getElementById("playerDiv_"+vidId)
				playerDiv.setAttribute("class", playerDiv.getAttribute("class") + " wide")
				scrollthere()
			}

			// Scroll video to middle of page
			function scrollthere() {
				var player = document.getElementById('player'),
					vh = player.offsetHeight,
					vd = document.querySelector(".container").offsetTop + document.querySelector(".container").parentNode.offsetTop + document.querySelector(".video-wrapper").offsetTop,
					fh = window.innerHeight;
					sc = vd-((fh-vh)/2)
				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() + html5player.toString() + "html5player();"
			script.id = "EPH-scrollVid"
			document.body.appendChild(script)

			// 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: #676767; font-weight: 700; background: #101010; 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 = "Center video"
			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"),
					dwlinks

				if(player_quality_720p)
					dwlinks = '<a class="downloadBtn greyButton" target="_blank" href="'+player_quality_720p+'"><i></i><span>HD</span> 720p</a>'
				if(player_quality_480p)
					dwlinks += '<a class="downloadBtn greyButton" target="_blank" href="'+player_quality_480p+'"><i></i>480p</a>'
				if(player_quality_240p)
					dwlinks += '<a class="downloadBtn greyButton" target="_blank" href="'+player_quality_240p+'"><i></i>240p</a>'

				tab.innerHTML = dwlinks
			}
		}
	},false)

	// Autoplay, autoload, etc.
	function changePlayer() {
		if (!document.getElementById('noPlayerMsg'))
			return setTimeout(changePlayer, 50)
			
		var player = document.getElementById('player'),
			vidId = parseInt(player.getAttribute("data-video-id")),
			newflashvars = document.createElement("script")
		newflashvars.setAttribute("type", "text/javascript")
		newflashvars.id = "EPH-newflashvars"
		newflashvars.innerHTML =
			'flashvars_'+vidId+'.autoplay = false;'+
			'flashvars_'+vidId+'.autoload = true;'+
			'flashvars_'+vidId+'.htmlPauseRoll = false;'+
			'flashvars_'+vidId+'.htmlPostRoll = false;'+
			'flashvars_'+vidId+'.video_unavailable_country = false;'
		document.head.appendChild(newflashvars)
	}

	// Add thumbnail tab
	function checkImage() {
		if (!document.querySelector(".mhp1138_thumbnailPreload"))
			return setTimeout(checkImage, 50)

		var thumbs = document.querySelector(".mhp1138_thumbnailPreload").childNodes,
			tabsHolder = document.querySelector("#js-shareData").firstChild,
			tabsContentHolder = document.querySelector(".video-actions-tabs"),
			thumbstab = document.createElement("div"),
			thumbstabContent = document.createElement("div")

		thumbstab.setAttribute("class", "tab-menu-wrapper-cell")
		thumbstab.innerHTML = "<div class='tab-menu-item tooltipTrig' data-tab='thumbnails-tab' data-title='View thumbnails'><span>Thumbnails</span></div>"
		tabsHolder.appendChild(thumbstab)

		thumbstabContent.setAttribute("class", "video-action-tab thumbnails-tab")
		for (var i = 0; i < thumbs.length; i++)
			thumbstabContent.innerHTML += "<img src='"+thumbs[i].src+"'/>"
		tabsContentHolder.appendChild(thumbstabContent)
	}

	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," +
		// Remove Ads links, Ads by TrafficJunkie notice
		".removeAdsStyle, .ad-link," +
		// Video being watched in one line, Ad Block Message, Change language notice
		".videos-being-watched li:last-child, .abAlertShown, #countryRedirectMessage {\
			display: none !important;\
		}" +
		// Where ads once were the element has a fixed width, this zeros the width if there are no childs
		".sectionTitle + div, .sectionTitle + div div, .recommendationsHiddenMessage + div, .recommendationsHiddenMessage + div div, .reset + div,  .reset + div div, .nf-videos > .sectionWrapper > .clear + div, .nf-videos > .sectionWrapper > .clear + div div {\
			width: auto !important;\
		}" +
		// Gifs page
		".gifsWrapper ul.gifs li.first {\
			margin-right: 12px !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)
	}
}();