Youtube Automatic Max Quality

Set Youtube player automatically to max quality.

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

You will need to install an extension such as Tampermonkey, Greasemonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey to install this script.

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Userscripts to install this script.

You will need to install an extension such as Tampermonkey to install this script.

You will need to install a user script manager extension to install this script.

(I already have a user script manager, let me install it!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(I already have a user style manager, let me install it!)

// ==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)
        }
    )
    */
})();