YouTube 720p

change default YouTube video quality

当前为 2015-02-17 提交的版本,查看 最新版本

// ==UserScript==
// @name         YouTube 720p
// @namespace    http://www.youtube.com/
// @version      1.2.2
// @description  change default YouTube video quality
// @match        http://youtube.com/*
// @match        https://youtube.com/*
// @match        http://www.youtube.com/*
// @match        https://www.youtube.com/*
// @grant        none
// @run-at       document-end
// ==/UserScript==


youtubeOverride = function (unsafeWindow) {

    enabled = true;

    // qualities = ['auto', 'hd1080', 'hd720', 'large', 'medium', 'small', 'tiny'];
    // set the quality desired here:
    preferredQuality = 'hd720';

    if (enabled) {
        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() === 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 (window.top === window.self) {
    if (this.unsafeWindow != null) {
        youtubeOverride(unsafeWindow);
    } else {
        var scriptElem = document.createElement('script');
        scriptElem.setAttribute('type', 'text/javascript');
        scriptElem.text = '(' + youtubeOverride.toString() + ')(window);';

        document.documentElement.appendChild(scriptElem);
        document.documentElement.removeChild(scriptElem);
    }
}