YouTube HD Override

Makes every YouTube video run in the highest definition

目前为 2015-04-03 提交的版本。查看 最新版本

// ==UserScript==
// @name			YouTube HD Override
// @namespace		http://www.youtube.com/
// @version			2.5
// @description		Makes every YouTube video run in the highest definition
// @include			http://*.youtube.com/*
// @include			https://*.youtube.com/*
// @exclude			http://apiblog.youtube.com/*
// @exclude			https://apiblog.youtube.com/*
// @run-at			document-end
// @copyright		Prehistoricman Inc. 2015
// ==/UserScript==

console.log("YouTube HD Override loaded")
var CurrentVersion = 2.3
HDOSettings = {}
if (localStorage.HDOLastUpdate == undefined | (localStorage.HDOLastUpdate < CurrentVersion)) { //Old stats, reset all
	HDOSettings.HD = true
	HDOSettings.VideoAutoPlay = false
	HDOSettings.ChannelAutoPlay = false
	HDOSettings.DASHPlayback = false
	HDOSettings.PauseInvisible = true
	localStorage.HDOverride = JSON.stringify(HDOSettings)
	localStorage.HDOLastUpdate = CurrentVersion
} else {
	HDOSettings = JSON.parse(localStorage.HDOverride)
}
function SaveHDOSettings() {
	localStorage.HDOverride = JSON.stringify(HDOSettings)
}

var LastUrl = ""
var LastHREF = ""

var Debugging = false

if (Debugging) {
	console.trace()
}

function Print(output) { //It would be immoral to spam others' consoles.
	if (Debugging) {
		console.log(output)
	}
}

function DetectPageType() {
	if (location.href.substring(0, 31) == "https://www.youtube.com/channel" |
	location.href.substring(0, 31) == "http://www.youtube.com/channel/"     |
	location.href.substring(0, 28) == "https://www.youtube.com/user"        |
	location.href.substring(0, 28) == "http://www.youtube.com/user/"        |
	location.href.substring(0, 25) == "http://www.youtube.com/c/)"          |
	location.href.substring(0, 26) == "https://www.youtube.com/c/"){
		return "channel"
	} else if (location.href.substring(0, 29) == "https://www.youtube.com/watch" |
	location.href.substring(0, 29) == "http://www.youtube.com/watch?") {
		return "video"
	} else {
		return "else"
	}
}

function GetVideoElement() {
	if (DetectPageType() == "video") {
		return document.getElementById("movie_player")
	} else if (DetectPageType() == "channel") {
		return document.getElementById("c4-player")
	} else {
		return "nope"
	}
}

function PauseChannelVideo() {
	var PauseInterval = setInterval(function () {
		var ChannelPlayer = document.getElementById("c4-player")
		if (document.getElementById("c4-player")) {
			ChannelPlayer.pauseVideo()
			Print("Paused channel video")
			if (document.getElementById("c4-player").getPlayerState() == 2) {
				clearInterval(PauseInterval)
				Print("Pause interval stopped")
			}
		} else {
			Print("Channel player not found yet")
		}
	}, 30)
}

function SetHD() {
	var HDInterval = setInterval(function () {
		var OverridePlayer = document.getElementById("movie_player")
		if (OverridePlayer) {
			if (OverridePlayer.setPlaybackQuality) {
				OverridePlayer.setPlaybackQuality(OverridePlayer.getAvailableQualityLevels()[0])
				Print("HD'd video")
				Print(document.visibilityState)
				if (HDOSettings.PauseInvisible && document.visibilityState && document.visibilityState != "visible") { //A non-prefixed property on document? Is this the future??????
					OverridePlayer.pauseVideo()
					Print("Paused inactive tab")
				}
				
				if (!HDOSettings.DASHPlayback && ytplayer && ytplayer.config && ytplayer.config.args) {
					ytplayer.config.args.dash = "0"
					ytplayer.config.args.dashmpd = ""
					Print("Set DASH")
				} else if (!HDOSettings.DASHPlayback) { //if we can't find ytplayer
					Print("DASH set failed")
				}
				Print("Set quality")
			}
			if (OverridePlayer.getPlaybackQuality() == OverridePlayer.getAvailableQualityLevels()[0]) {
				clearInterval(HDInterval)
				Print("Quality interval stopped")
			} else {
				Print("check fail")
				Print(OverridePlayer.getPlaybackQuality())
				Print(OverridePlayer.getAvailableQualityLevels()[0])
			}
		} else {
			Print("Player not found yet")
		}
	}, 30)
}

function ApplyFixes() {
	Print("ApplyFixes at " + location.href)
	if (DetectPageType() == "channel") {
		if (!HDOSettings.ChannelAutoPlay) { //Everybody hates this shit
			PauseChannelVideo() //Pause video on channel pages
		}
	} else if (HDOSettings.HD & DetectPageType() == "video") { 
		SetHD() //Set HD on video pages
	} else {
		Print("Who knows???")
		Print(location.href)
		Print(HDOSettings)
	}
}

if (GetVideoElement() && GetVideoElement() != "nope") {
	ApplyFixes()
}

setInterval(function () {
	if (location.href != LastHREF) { //href has changed
		LastHREF = location.href
		Print("Href change")
		var count = 0
		var ApplyInterval = setInterval(function () { //Waits for a new player to load
			count++
			Print("Apply interval for " + ApplyInterval)
			var getvid = GetVideoElement()
			if (getvid && getvid != "nope" && getvid.getVideoUrl() != LastUrl) {
				Print("applyinterval check pass for " + ApplyInterval)
				LastUrl = getvid.getVideoUrl()
				LastHREF = location.href
				ApplyFixes()
				clearInterval(ApplyInterval)
			} else if (getvid == "nope") {
				Print(getvid)
				LastUrl = ""
				Print("stopped on main page")
				clearInterval(ApplyInterval)
			}
			if (count > 70) {
				clearInterval(ApplyInterval) //No freaking excuses
				LastUrl = ""
				Print("stopped on timeout")
			}
		}, 30)
	}
}, 200)

setInterval(function () {
	var mov = document.getElementById("movie_player")
	if (!HDOSettings.VideoAutoPlay && mov && mov.setAutonavState) {
		mov.setAutonavState(1) //Disable auto-nav
	}
}, 1000)