Greasy Fork

baidu-music-download

快速免费下载百度音乐

当前为 2014-12-03 提交的版本,查看 最新版本

// ==UserScript==
// @name        baidu-music-download
// @namespace   [email protected]
// @description 快速免费下载百度音乐
// @author	thunderhit
// @include     http://music.baidu.com/song/*
// @grant       GM_xmlhttpRequest
// @version     1.07
// @run-at      document-end
// ==/UserScript==

var bdml = function(){
    var baiduid = document.cookie.substring(8, 40);
    var songid = location.pathname.substr(6);
    var ajax = function(callback,url){
        GM_xmlhttpRequest({
            method:"GET",
            url:url,
            onload:callback,
            onerror:function(e){
                console.log(url);
                //console.log(e);
                //console.log(callback.toString());
            }
        });
    };
    var Eajax = function(callback,url){
        var xhr = new XMLHttpRequest();
        xhr.open("GET",url,true);
        xhr.onreadystatechange = function(){
            if (xhr.readyState==4){
                if(xhr.status == 200){
                    callback(xhr.response);
                }
            }
        }
        xhr.send(null);
    }
    var collect = function(callback){
        var url = "http://tingapi.ting.baidu.com/v1/restserver/ting?"+
                "method=baidu.ting.favorite.addSongFavorite&format=json&from=bmpc&version=1.0.0&version_d=9.0.4.7&&baiduid="
                + baiduid + "&songId=" + songid + "&time=" + (Math.round(new Date() .getTime() / 1000));
        ajax(callback,url);//ajax回来的json待处理判断
    };
    var iscollect = function(callback){
        var url = "http://music.baidu.com/data/user/isCollect?type=song&ids=" + songid +
                    '&r=' + Math.round(Math.random() * 1e5) + (new Date).getTime();
        Eajax(function(data){
            callback(JSON.parse(data).data["isCollect"]);//
        },url);
    };
    var getsong = function(callback){
        var url = "http://yinyueyun.baidu.com/data/cloud/download?songIds=" + songid;
        ajax(function(data){
            callback(JSON.parse(data.responseText));
        },url);
    };

    var hasrate = function(rate,callback){
        getsong(function(json){
            if(rate == 999 && json.data.data["flac"]){
                callback(json.data.data["flac"]["rate"],json.data.data["flac"]["format"],true);
            }
            else if(json.data.data[rate]){
                callback(json.data.data[rate]["rate"],json.data.data[rate]["format"],true);
            }
            else{
                callback(null,null,false);
            }
        });
    }

    var download = function(rate,target){
        hasrate(rate,function(truerate,format,ishas){
            if(ishas){
                var finalurl = "http://yinyueyun.baidu.com/data/cloud/downloadsongfile?songIds=" 
                                + songid + "&rate=" + truerate + "&format=" + format;
                location.assign(finalurl);
                target.click = null;
                target.href = finalurl;
            }
            else{
                target.click = null;
                target.text = "无资源";
                alert("没有该资源!");
            }
        });
    };
    var main = function(rate,target){
        iscollect(function(collect_flag){
            if(collect_flag){
                download(rate,target);
            }
            else{
                collect(function(data){
                    download(rate,target);
                });
            }
        });
    };
    var init = function(){
        location.assign("javascript:(" + function(){
            var button = $(".add-song-btn") .clone().attr("id","dlbutton");
            $(".btn.btn-b.down-song-btn") .after(button);
            $("#dlbutton i") .removeClass("icon btn-icon-add").addClass("icon btn-icon-down");
            $("#dlbutton .txt") .html("<font color=\"pink\">下载</font>");
            $("#dlbutton .addlayer") .attr("id","dlbutton-menu");
            $("#dlbutton-menu a") .remove();
            $("#dlbutton-menu") .append("<a class=\"dlbutton-rate\" rate=\"128\" href=\"javascript:void(0);\">128kbps</a><a class=\"dlbutton-rate\" rate=\"192\" href=\"javascript:void(0);\">192kbps</a><a class=\"dlbutton-rate\" rate=\"320\" href=\"javascript:void(0);\">320kbps</a><a class=\"dlbutton-rate\" rate=\"999\" href=\"javascript:void(0);\">无损</a>");
            button .hover(function () {
                $("#dlbutton-menu") .toggle();
            });
        } + ")();void(0);");
    };
    init();

    setTimeout(function(){
        var elements = document.getElementsByClassName("dlbutton-rate");
        for(var i=0;i<elements.length;i++){
            elements[i].addEventListener("click",function(event){
                var rate = event.target.getAttribute("rate");
                main(rate,event.target);
        },false);
        }
    },1024);

};
bdml();