YouTube Default Override

change default YouTube video quality

当前为 2015-01-14 提交的版本,查看 最新版本

// ==UserScript==
// @name        YouTube Default Override
// @namespace   http://www.youtube.com/
// @version     1.1.2
// @description change default YouTube video quality
// @include     http://youtube.com/*
// @include     https://youtube.com/*
// @include     http://www.youtube.com/*
// @include     https://www.youtube.com/*
// @grant       none
// @run-at      document-end
// ==/UserScript==


youtubeOverride = {};

youtubeOverride.enabled = true;

// qualities = ["auto", "hd1080", "hd720", "large", "medium", "small", "tiny"];
youtubeOverride.preferredQuality = "hd720";

youtubeOverride.run = function () {
    console.log("override script starting")

    var player = unsafeWindow.document.getElementById('movie_player');
    if (player != null) {
        overridePlayer(player);
    } else {
        console.log("cannot get player api");

        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');
                    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 overridePlayer(player) {
        if (overridePlayer.running) {
            return;
        }
        overridePlayer.running = true;
        
        overrideTimeoutFunc.attempts = 0;
        setTimeout(overrideTimeoutFunc, 300);
        
        function overrideTimeoutFunc() {
            overrideTimeoutFunc.attempts++;
            var success = tryToOverride(player);
            if (!success && overrideTimeoutFunc.attempts < 30) {
                setTimeout(overrideTimeoutFunc, 1000)
            } else {
                overridePlayer.running = false;
            }
        }
        
        function tryToOverride(player) {
            console.log("quality override starting");

            if (!('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() === youtubeOverride.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();
        }
    }
}

if (youtubeOverride.enabled) {
    youtubeOverride.run();
}