change default YouTube video quality to 720p or highest available below 720p. can be used for other video qualities by changing preferredQuality in the code below.
// ==UserScript==
// @name YouTube 720p
// @namespace http://www.youtube.com/
// @version 1.4.3
// @description change default YouTube video quality to 720p or highest available below 720p. can be used for other video qualities by changing preferredQuality in the code below.
// @match http://youtube.com/*
// @match https://youtube.com/*
// @match http://www.youtube.com/*
// @match https://www.youtube.com/*
// @grant none
// @run-at document-end
// ==/UserScript==
youtubeOverride = function (unsafeWindow) {
// qualities = ['auto', 'hd1080', 'hd720', 'large', 'medium', 'small', 'tiny'];
// set the quality desired here:
preferredQuality = 'hd720';
// overrideMaxAttempts = 30;
overrideTryDelay = 1000;
console.log('override script starting');
if (location.pathname.indexOf("/embed/") === 0) {
var player = unsafeWindow.yt.player.getPlayerByElement(unsafeWindow.document.getElementById("player"));
if (player != null) {
overridePlayer(player);
} else {
console.log('cannot get player api');
}
} else {
tryToOverride();
var target = document.getElementById('player');
var MutationObserver = window.MutationObserver;
var observer = new MutationObserver(function (mutations) {
mutations.forEach(function (mutation) {
if (mutation.target.id === 'player-unavailable') {
console.log('player mutation detected');
var player = unsafeWindow.document.getElementById('movie_player');
if (player != null) {
overridePlayer(player);
} else {
console.log('cannot get player api2');
}
}
});
});
observer.observe(target, { childList: true, subtree: true });
}
function getPlayerApi() {
if (location.pathname.indexOf("/embed/") === 0) {
var player = unsafeWindow.yt.player.getPlayerByElement(unsafeWindow.document.getElementById("player"));
return player;
} else {
return unsafeWindow.document.getElementById('movie_player');
}
}
function tryToOverride(player) {
console.log('quality override starting');
player = player != null ? player : getPlayerApi();
if (player == null || !('setPlaybackQuality' in player)) {
console.log('error: setPlaybackQuality not available');
return false;
}
var qualityLevels = player.getAvailableQualityLevels();
var qualityToSet = null;
for (var i = 0; i < qualityLevels.length; i++) {
if (qualityLevels[i].trim().toLowerCase() === preferredQuality) {
qualityToSet = qualityLevels[i];
break;
}
}
if (qualityToSet == null) {
qualityToSet = qualityLevels[0];
}
if (qualityToSet == null) {
console.log('error: no quality levels available');
return false;
}
player.setPlaybackQuality(qualityToSet);
console.log('set quality to ' + qualityToSet);
return qualityToSet == player.getPlaybackQuality();
}
function overridePlayer(player) {
if (overridePlayer.running) {
return;
}
overridePlayer.running = true;
overrideTimeoutFunc.attempts = 0;
overrideTimeoutFunc();
function overrideTimeoutFunc() {
overrideTimeoutFunc.attempts++;
var success = tryToOverride(player);
if (!success /*&& overrideTimeoutFunc.attempts < overrideMaxAttempts*/) {
setTimeout(overrideTimeoutFunc, overrideTryDelay)
} else {
overridePlayer.running = false;
}
}
}
};
(function () {
// inject script into page
if (this.unsafeWindow != null) {
youtubeOverride(unsafeWindow);
} else {
var scriptElem = document.createElement('script');
scriptElem.setAttribute('type', 'text/javascript');
scriptElem.text = '(' + youtubeOverride.toString() + ')(window);';
document.documentElement.appendChild(scriptElem);
document.documentElement.removeChild(scriptElem);
}
})();