change default YouTube video quality to 1080p or highest available below 1080p. can be used for other video qualities by changing preferred Quality in the code below.
// Reorganized and cleaned up the code for better readability. // Removed global variables and used local variables within the script. // Simplified the quality override logic. // Added a limit on the number of override attempts to prevent infinite looping. // Combined the initial quality override and mutation observer into a single script. // Used consistent code style and comments for clarity.
// ==UserScript== // @name YouTube 1080p // @namespace http://www.youtube.com/ // @version 1.4.5 // @description Change default YouTube video quality to 1080p or the highest available below 1080p. // @match *://*.youtube.com/* // @grant none // @run-at document-end // ==/UserScript==
const player = getPlayerApi(); if (player == null || !('setPlaybackQuality' in player)) { console.log('Error: setPlaybackQuality not available'); return; }
// Improvements and changes made:
// Reorganized and cleaned up the code for better readability.
// Removed global variables and used local variables within the script.
// Simplified the quality override logic.
// Added a limit on the number of override attempts to prevent infinite looping.
// Combined the initial quality override and mutation observer into a single script.
// Used consistent code style and comments for clarity.
// ==UserScript==
// @name YouTube 1080p
// @namespace http://www.youtube.com/
// @version 1.4.5
// @description Change default YouTube video quality to 1080p or the highest available below 1080p.
// @match *://*.youtube.com/*
// @grant none
// @run-at document-end
// ==/UserScript==
(function() {
const preferredQuality = 'hd1080';
const overrideTryDelay = 1000;
const maxAttempts = 30;
let attempts = 0;
console.log('YouTube 1080p script starting');
function tryToOverride() {
console.log('Quality override starting (Attempt ' + (attempts + 1) + ')');
const player = getPlayerApi();
if (player == null || !('setPlaybackQuality' in player)) {
console.log('Error: setPlaybackQuality not available');
return;
}
const qualityLevels = player.getAvailableQualityLevels();
let qualityToSet = qualityLevels.includes(preferredQuality) ? preferredQuality : qualityLevels[0];
player.setPlaybackQuality(qualityToSet);
console.log('Set quality to ' + qualityToSet);
if (qualityToSet === player.getPlaybackQuality() || attempts >= maxAttempts) {
console.log('Quality override complete');
return;
}
attempts++;
setTimeout(tryToOverride, overrideTryDelay);
}
function getPlayerApi() {
const player = document.getElementById('movie_player') || unsafeWindow.yt.player.getPlayerByElement(unsafeWindow.document.getElementById('player'));
return player;
}
// Initial quality override attempt
tryToOverride();
// Observe mutations on the player element
const target = document.getElementById('player');
if (target) {
const observer = new MutationObserver(function(mutations) {
mutations.forEach(function(mutation) {
if (mutation.target.id === 'player-unavailable') {
console.log('Player mutation detected');
tryToOverride();
}
});
});
observer.observe(target, { childList: true, subtree: true });
}
})();