<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    聚合 管理  

    Blog Stats

    News

    我使用新博客啦:
    http://www.linjunhai.com/
    大家到我的新博客上看看吧!

    隨筆分類(28)

    文章分類(4)

    隨筆檔案(53)

    文章檔案(4)

    相冊

    相關鏈接


    林俊海的博客

    超級大菜鳥,每天要自強!

    在網上沒有看到有 ASP 版本的代碼,也翻譯一份放上來,因為圖方便,便用 jscript 寫 省下許多功夫。

    <%@ codepage="65001" %><script runat="server" language="jscript">

    /**
    * @author 林俊海(ialvin.cn) 廣東·普寧·里湖
    */

    String.prototype.trim 
    = function() {
        
    return this.replace(/^\s+|\s+$/g, '');
    };

    function httpGet(strURL) {
        
    with (Server.CreateObject("MSXML2.XMLHTTP")) {
            open(
    "GET", strURL, false);
            send(
    null);
            
    return responseText;
        }
    }

    function encode(str) {
        str 
    = (str||"").replace(/[ ']/g, "").toLowerCase();
        
    return escape(str).replace(/%u(..)(..)|%(..)|(.)/g, function($, $1, $2, $3, $4) {
            
    if ($1return $2 + $1;
            
    if ($3return $3 + "00";
            
    return ("0"+$4.charCodeAt(0).toString(16)).slice(-2);
        });
    }

    function loadXML(strXML) {
        
    var x = Server.CreateObject("MSXML2.DOMDocument");
        x.loadXML(strXML);
        
    return x;
    }


    function conv(i) {
        
    var r = i % 4294967296;
        
    if (i >= 0 && r > 2147483648)
            r 
    = r - 4294967296;
        
    if (i < 0 && r < 2147483648)
            r 
    = r + 4294967296;
        
    return r;
    }

    function mConv(ia, ib) {
        
    var o = (ia>0 && ib>0? 1 : (ia<0 && ib<0? 1 : -1;
        
    var a = ia.toString(2).replace(/\D/g,'').split("").reverse();
        
    var b = ib.toString(2).replace(/\D/g,'').split("").reverse();
        
    var c = []; c.length = 34; c = c.join("0").split("");
        
    for (var i=0; i<b.length; i++) {
            
    if (b[i]=='1') {
                
    for (var j=0; j<a.length && j+i<33; j++)
                    c[j
    +i] = c[j+i]-(-a[j]);
            }
        }
        
    for (var i=0; i<32; i++) {
            c[i
    +1+= parseInt(c[i]/2);
            c[i] 
    = c[i] % 2;
        }
        c 
    = parseInt(c.slice(032).reverse().join(""), 2)*o;
        
    if (o == 1 && c > 2147483648)
            c 
    = c - 4294967296;
        
    if (o == -1 && c < 2147483648)
            c 
    = c + 4294967296;
        
    return c;
    }


    function verifyCode(artist, title, lrcId) {
        
    var song = [];
        encodeURIComponent(artist
    +title).replace(/%(..)|(.)/g, function($, $1, $2) {
            
    if ($1)
                song.push(parseInt($
    116));
            
    else
                song.push($
    2.charCodeAt(0));
        });
        
    var intVal2 = 0, intVal3 = 0;
        
    var intVal1 = (lrcId & 0xFF00>> 8;
        
    if ((lrcId & 0xFF0000== 0) {
            intVal3 
    = 0xFF & ~intVal1;
        } 
    else {
            intVal3 
    = 0xFF & ((lrcId & 0xFF0000>> 16);
        }
        intVal3 
    = intVal3 | ((0xFF & lrcId) << 8);
        intVal3 
    = intVal3 << 8;
        intVal3 
    = intVal3 | (0xFF & intVal1);
        intVal3 
    = intVal3 << 8;
        
    if ((lrcId & 0xFF000000== 0) {
            intVal3 
    = intVal3 | (0xFF & (~lrcId));
        } 
    else {
            intVal3 
    = intVal3 | (0xFF & (lrcId >> 24));
        }
        
    var uBound = song.length - 1;
        
    while (uBound >= 0) {
            
    var c = song[uBound];
            
    if (c >= 0x80)
                c 
    = c - 0x100;
            intVal1 
    = (c + intVal2) & 0xFFFFFFFF;
            intVal2 
    = (intVal2 << (uBound % 2 + 4)) & 0xFFFFFFFF;
            intVal2 
    = (intVal1 + intVal2) & 0xFFFFFFFF;
            uBound 
    -= 1;
        }
        uBound 
    = 0;
        intVal1 
    = 0;
        
    while (uBound <= song.length - 1) {
            
    var c = song[uBound];
            
    if (c >= 128)
                c 
    = c - 256;
            
    var intVal4 = (c + intVal1) & 0xFFFFFFFF;
            intVal1 
    = (intVal1 << (uBound % 2 + 3)) & 0xFFFFFFFF;
            intVal1 
    = (intVal1 + intVal4) & 0xFFFFFFFF;
            uBound 
    += 1;
        }
        
    var intVal5 = conv(intVal2 ^ intVal3) & 0xFFFFFFFF;
        intVal5 
    = conv(intVal5 + (intVal1 | lrcId)) & 0xFFFFFFFF;
        intVal5 
    = mConv(intVal5 , intVal1 | intVal3);
        intVal5 
    = mConv(intVal5 , intVal2 ^ lrcId);
        
    var longVal6 = intVal5;
        
    if (intVal5 > 2147483648)
            intVal5 
    = (intVal5 - 4294967296& 0xFFFFFFFF;
        
    return intVal5.toString();
    }


    function query(artist, title) {
        
    var url = "http://ttlrcct.qianqian.com/dll/lyricsvr.dll?sh?Artist=" + encode(artist) + "&Title=" + encode(title)+"&Flags=0";
        
    // 這里可能有多個匹配的結果,這里只選取第一個
        var lrc = loadXML(httpGet(url)).selectSingleNode("/result/lrc");
        
    if  (lrc == null)
            
    throw new Error("在服務器上找不到匹配的歌詞。");
        
    var lrcId = lrc.getAttribute("id");
        artist 
    = lrc.getAttribute("artist");
        title 
    = lrc.getAttribute("title");
        url 
    = "http://ttlrcct2.qianqian.com/dll/lyricsvr.dll?dl?Id=" + lrcId + "&Code=" + verifyCode(artist, title, lrcId);
        
    return {ar:artist, ti:title, lrc:httpGet(url)};
    }

    Response.ContentType 
    = "text/html; charset=utf-8";
    try {
        
    var artist = (Request.QueryString("artist").Item || '').trim();
        
    var title = (Request.QueryString("title").Item || '').trim();
        
    if (title == '')
            
    throw new Error("請傳入音樂名稱!");
        
        
    var result = query(artist, title);
        
    var fileName = result.ar + " - " + result.ti + ".lrc";
        Response.ContentType 
    = "text/plain; charset=utf-8";
        Response.AddHeader(
    "Content-Disposition""inline; filename=\"" + encodeURIComponent(fileName) + "\"");
        Response.Write(result.lrc);
    catch(e) {
        Response.Write(
    "查詢錯誤:" + e.message);
    }
    </script>

    Java 版的可以參考: http://www.iscripts.org/forum.php?mod=viewthread&tid=85

    當然,這里建議在每查詢獲得一個音樂的 LRC 歌詞的時候,把歌詞內容存入本地文件或者數據庫中,
    這樣再下次查詢時,可以先從本地查詢,查不到了再從千千靜聽的歌詞服務器查詢,這樣子平均上很大程度的提高 WEB 應用的的響應速度。

    原文鏈接:http://www.iscripts.org/forum.php?mod=viewthread&tid=86

    posted on 2011-05-02 16:56 林俊海 閱讀(377) 評論(0)  編輯  收藏 所屬分類: 其它相關
    主站蜘蛛池模板: 一本天堂ⅴ无码亚洲道久久| 亚洲天堂视频在线观看| 伊人久久亚洲综合影院首页| 99久久久国产精品免费蜜臀| 亚洲AV日韩AV永久无码绿巨人 | 亚洲精品无码久久千人斩| 一区二区三区免费在线观看| 免费h成人黄漫画嘿咻破解版| 99亚洲乱人伦aⅴ精品| 亚洲电影日韩精品 | 好吊妞在线成人免费| 亚洲一级黄色大片| 久久久久免费看黄A片APP| 亚洲日韩看片无码电影| 日韩视频免费在线| 边摸边吃奶边做爽免费视频99| 亚洲国产精品13p| 最近中文字幕大全免费版在线| 亚洲人成网站在线播放影院在线 | 国产精品亚洲αv天堂无码| 久久久久久久久久免免费精品 | 亚洲另类古典武侠| 女人18毛片水最多免费观看| 深夜a级毛片免费视频| 亚洲色无码一区二区三区| 91精品啪在线观看国产线免费| 亚洲一卡二卡三卡| 又黄又大又爽免费视频| 在线观看免费无码专区| 亚洲国产一区在线观看| 免费看国产一级特黄aa大片| 国产精品内射视频免费| 亚洲午夜一区二区电影院| 韩国二级毛片免费播放| 抽搐一进一出gif免费视频| 亚洲av无码不卡久久| 亚洲人妻av伦理| 成年人免费的视频| 国产精品免费一区二区三区| 亚洲制服在线观看| 国产黄色一级毛片亚洲黄片大全|