YouTube Highest Quality on Fullscreen

Set YouTube video to highest available resolution when entering fullscreen (e.g. 4K, 1440p, 1080p, etc.)

// ==UserScript==
// @name         YouTube Highest Quality on Fullscreen
// @namespace    http://tampermonkey.net/
// @version      1.5
// @description  Set YouTube video to highest available resolution when entering fullscreen (e.g. 4K, 1440p, 1080p, etc.)
// @author       Rehan Ahmad
// @match        https://www.youtube.com/*
// @icon         https://raw.githubusercontent.com/r280822a/YouTube-Highest-Quality-Fullscreen/refs/heads/main/icon/icon.png
// @grant        none
// ==/UserScript==

(function () {
    'use strict';

    function showToast(message) {
        let toast = document.querySelector('tp-yt-paper-toast#fullscreen-quality-toast');
        if (toast) { // Delete if still visible to avoid unnecessary queueing
            toast.remove();
        }

        toast = document.createElement('tp-yt-paper-toast');
        toast.id = 'fullscreen-quality-toast'
        toast.innerText = message;
        document.body.appendChild(toast);

        toast.show();
    }

    function setHighestQuality() {
        if (!document.fullscreenElement) return;
        const player = document.getElementById('movie_player');
        if (!player) return;

        let qualityData = player.getAvailableQualityData?.();
        const currentQuality = player.getPlaybackQuality?.();

        // Full list of all qualities: ['2160p60','2160p','1440p60','1440p','1080p60','1080p','720p60','720p','480p','360p','240p','144p']
        //
        // Add any of the above to ignoredQualities if you don't want that quality to be selected
        // Example: const ignoredQualities = ['2160p60', '2160p'];
        // If you don't want 4k
        const ignoredQualities = [];
        qualityData = qualityData.filter(q => !ignoredQualities.includes(q.qualityLabel));
        if (!qualityData || qualityData.length === 0) {
            console.warn('No available quality levels found.');
            return;
        }

        const highest = qualityData[0]; // YouTube lists highest quality first
        const highestQuality = highest.quality;
        if (currentQuality != highestQuality && highest.isPlayable) {
            player.setPlaybackQualityRange?.(highestQuality);
            player.setPlaybackQuality?.(highestQuality);
            console.log('Quality set to highest available after entering fullscreen:', highestQuality);
            showToast('Quality set to ' + highest.qualityLabel);
        }
    }

    document.addEventListener('fullscreenchange', () => {
        setTimeout(setHighestQuality, 500);
    });

    // If already fullscreen on load
    window.addEventListener('load', () => {
        setTimeout(setHighestQuality, 2000);
    });
    // Detect URL changes
    let lastUrl = location.href;
    new MutationObserver(() => {
        const currentUrl = location.href;
        if (currentUrl !== lastUrl) {
            lastUrl = currentUrl;
            setTimeout(setHighestQuality, 2000);
        }
    }).observe(document, { subtree: true, childList: true });
})();