聚合 管理  

          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 林俊海 閱讀(375) 評論(0)  編輯  收藏 所屬分類: 其它相關
          主站蜘蛛池模板: 磐石市| 呼伦贝尔市| 温泉县| 肇源县| 太和县| 靖州| 于田县| 临清市| 灵璧县| 兴仁县| 磴口县| 沁阳市| 龙里县| 高尔夫| 大洼县| 金山区| 苏尼特右旗| 房产| 大港区| 彩票| 甘谷县| 平武县| 望城县| 曲阜市| 舒兰市| 安国市| 德钦县| 绥阳县| 镇江市| 林口县| 比如县| 十堰市| 蒲城县| 宜春市| 敦煌市| 湘西| 桐庐县| 竹山县| 团风县| 洛扎县| 柯坪县|