Youtube Automatic Max Quality

Set Youtube player automatically to max quality.

As of 2024-02-15. See the latest version.

// ==UserScript==
// @name         Youtube Automatic Max Quality
// @namespace    http://tampermonkey.net/
// @version      2024-02-15
// @description  Set Youtube player automatically to max quality.
// @author       Santeri Hetekivi
// @match        https://www.youtube.com/watch?v=*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=youtube.com
// @grant        none
// ==/UserScript==

(function () {
    'use strict';
    /**
     * Get element with selector and call callback with it.
     * @param {string} selector Selector for the element.
     * @param {function} callback Callback function to call with the element.
     */
    function forElement(selector, callback) {
        // Init forElement.timeoutCount.
        if (forElement.timeoutCount === undefined) {
            forElement.timeoutCount = {}
        }
        // Init forElement.timeoutCount[selector].
        if (forElement.timeoutCount[selector] === undefined) {
            forElement.timeoutCount[selector] = 0
        }

        // Get element.
        const element = document.querySelector(selector)

        // If element not found.
        if (element === null) {
            // try again after timeout.
            setTimeout(
                function () {
                    forElement(selector, callback)
                },
                (
                    // Base timeout.
                    100
                    *
                    // Increase timeout after each try.
                    (forElement.timeoutCount[selector]++)
                )
            )
        }
        // If element found
        else {
            // reset timeout count
            forElement.timeoutCount[selector] = 0
            // and call callback with element.
            callback(element)
        }
    }

    // Run for
    forElement(
        // settings button
        ".ytp-settings-button",
        function (buttonSettings) {
            // click settings button
            buttonSettings.click()
            // and run for
            forElement(
                // quality selection button
                ".ytp-panel .ytp-menuitem:nth-child(5)",
                function (buttonSelectQuality) {
                    // click quality selection button
                    buttonSelectQuality.click()
                    // and run for first quality option
                    forElement(
                        ".ytp-quality-menu .ytp-menuitem:nth-child(1)",
                        function (buttonMaxQuality) {
                            // click max quality option.
                            buttonMaxQuality.click()
                        }
                    )
                }
            )
        }
    )

    // NOTE: If you dont have Youtube Premium or dont care for 1080p Premium, you could just use this:
    /*
    // Run for
    forElement(
        // video player
        ".html5-video-player",
        function (player) {
            // get max quality (cannot use getMaxPlaybackQuality because it returns 'auto')
            const maxQuality = player.getAvailableQualityLevels()[0]
            // set max quality.
            player.setPlaybackQualityRange(maxQuality, maxQuality)
        }
    )
    */
})();