Youtube Downloader

By yager Last update Oct 23, 2009 — Installed 108,144 times.

There are 10 previous versions of this script.

// ==UserScript==
// @name           Youtube Downloader
// @namespace      http://creazy.net/
// @description    Add downloadable links in Youtube Page
// @include        http://*youtube.com/watch*
// ==/UserScript==

//&fmt=22: HD   /MP4/H.264/AAC : 22/2000000/9/0/115
//&fmt=35: HQ   /FLV/H.264/AAC : 35/640000/9/0/115
//&fmt=18: iPod /MP4/H.264/AAC : 18/512000/9/0/115
//Normal : LQ   /FLV/H.263/MP3

(function() {

    var d = document;
    var h = '';
    var w = (typeof(unsafeWindow) != 'undefined') ? unsafeWindow : window;
    var l = location;
    var s = w.yt.config_.SWF_ARGS;
    var u = 'http://'+l.host+'/get_video' + '?video_id='+s['video_id'] + '&t=' + s['t'];
    
    if( !d.getElementById('DL-YT-video') && (location.href.match(/http:\/\/[a-zA-Z\.]*youtube\.com\/watch/)) ) {
        // Create Links Block
        d.getElementById('watch-embed-div').innerHTML
            += '<div id="DL-YT-video">'
            +  '<div id="check_fmt_22">checking fmt=22</div>'
            +  '<div id="check_fmt_35">checking fmt=35</div>'
            +  '<div><a href="'+makeDownloadURL(18)+'">[OK] DL fmt=18 ( iPod /MP4/H.264/AAC)</a></div>'
            +  '<div><a href="'+u+'">[OK] DL normal ( LQ /FLV/H.263/MP3)</a></div>'
            +  '</div>';
        checkHD();
        checkHQ();
    }

    /**
     * create XmlHttpRequest
     */
    function createXHR() {
        if ( w.ActiveXObject ) {
            try {
                return new ActiveXObject("Msxml2.XMLHTTP");
            } catch (e) {
                try {
                    return new ActiveXObject("Microsoft.XMLHTTP");
                } catch (e2) {
                    return null;
                }
            }
        } else if ( w.XMLHttpRequest ) {
            return new XMLHttpRequest();
        } else {
            return null;
        }
    }

    /**
     * check HD(fmt=22)
     */
    function checkHD() {
        var url = 'http://'+location.host+'/watch' + '?v='+s['video_id'];
        var XHR = createXHR();
        XHR.testurl = url;
        XHR.open( 'GET', url, true );
        XHR.onreadystatechange = function() { 
            if (XHR.readyState==4) {
                if ( match = XHR.responseText.match(/'SWF_ARGS': ({.*})/) ) {
                    var block = d.getElementById('check_fmt_22');
                    block.innerHTML = '';
                    var json = eval('('+RegExp.$1+')');
                    var map = decodeURIComponent(json['fmt_url_map']);
                    if ( map.indexOf('22|') > -1 ) {
                        block.innerHTML
                            += '<a href="'+makeDownloadURL(22)+'">[OK] DL fmt=22 ( HD /MP4/H.264/AAC)</a>';
                    } else {
                        block.innerHTML
                            += '[NG] DL fmt=22 ( HD /MP4/H.264/AAC)';
                    }
                }
            }
        }
        XHR.send('');
    }

    /**
     * check HQ(fmt=35)
     */
    function checkHQ() {
        var url = 'http://'+location.host+'/watch' + '?fmt=35&v='+s['video_id'];
        var XHR = createXHR();
        XHR.testurl = url;
        XHR.open( 'GET', url, true );
        XHR.onreadystatechange = function() { 
            if (XHR.readyState==4) {
                if ( match = XHR.responseText.match(/'SWF_ARGS': ({.*})/) ) {
                    var block = d.getElementById('check_fmt_35');
                    block.innerHTML = '';
                    var json = eval('('+RegExp.$1+')');
                    var map = decodeURIComponent(json['fmt_url_map']);
                    if ( map.indexOf('35|') > -1 ) {
                        block.innerHTML
                            += '<a href="'+makeDownloadURL(35)+'">[OK] DL fmt=35 ( HQ /FLV/H.264/AAC)</a>';
                    } else {
                        block.innerHTML
                            += '[NG] DL fmt=35 ( HQ /FLV/H.264/AAC)';
                    }
                }
            }
        }
        XHR.send('');
    }

    /**
     * Make Download URL
     */
    function makeDownloadURL(num) {
        return u+'&fmt='+num;
    }

})();