设为首页收藏本站

Scripts 学盟

 找回密码
 加入学盟

QQ登录

只需一步,快速开始

查看: 6777|回复: 2
打印 上一主题 下一主题

ASP 版的千千静听 LRC 歌词查询 [jscript] [复制链接]

管理员

超级大菜鸟

Rank: 9Rank: 9Rank: 9

跳转到指定楼层
1#
Alvin 实名认证  发表于 2011-5-1 18:06:12 |只看该作者 |倒序浏览
在网上没有看到有 ASP 版本的代码,也翻译一份放上来,因为图方便,便用 jscript 写

省下许多功夫。
  1. <%@ codepage=\"65001\" %><script runat=\"server\" language=\"jscript\">

  2. /**
  3. * @author 林俊海(ialvin.cn) 广东·普宁·里湖
  4. */

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

  8. function httpGet(strURL) {
  9.     with (Server.CreateObject(\"MSXML2.XMLHTTP\")) {
  10.         open(\"GET\", strURL, false);
  11.         send(null);
  12.         return responseText;
  13.     }
  14. }

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

  23. function loadXML(strXML) {
  24.     var x = Server.CreateObject(\"MSXML2.DOMDocument\");
  25.     x.loadXML(strXML);
  26.     return x;
  27. }


  28. function conv(i) {
  29.     var r = i % 4294967296;
  30.     if (i >= 0 && r > 2147483648)
  31.         r = r - 4294967296;
  32.     if (i < 0 && r < 2147483648)
  33.         r = r + 4294967296;
  34.     return r;
  35. }

  36. function mConv(ia, ib) {
  37.     var o = (ia>0 && ib>0) ? 1 : (ia<0 && ib<0) ? 1 : -1;
  38.     var a = ia.toString(2).replace(/\\D/g,\'\').split(\"\").reverse();
  39.     var b = ib.toString(2).replace(/\\D/g,\'\').split(\"\").reverse();
  40.     var c = []; c.length = 34; c = c.join(\"0\").split(\"\");
  41.     for (var i=0; i<b.length; i++) {
  42.         if (b[i ]==\'1\') {
  43.             for (var j=0; j<a.length && j+i<33; j++)
  44.                 c[j+i] = c[j+i]-(-a[j]);
  45.         }
  46.     }
  47.     for (var i=0; i<32; i++) {
  48.         c[i+1] += parseInt(c[i ]/2);
  49.         c[i ] = c[i ] % 2;
  50.     }
  51.     c = parseInt(c.slice(0, 32).reverse().join(\"\"), 2)*o;
  52.     if (o == 1 && c > 2147483648)
  53.         c = c - 4294967296;
  54.     if (o == -1 && c < 2147483648)
  55.         c = c + 4294967296;
  56.     return c;
  57. }


  58. function verifyCode(artist, title, lrcId) {
  59.     var song = [];
  60.     encodeURIComponent(artist+title).replace(/%(..)|(.)/g, function($, $1, $2) {
  61.         if ($1)
  62.             song.push(parseInt($1, 16));
  63.         else
  64.             song.push($2.charCodeAt(0));
  65.     });
  66.     var intVal2 = 0, intVal3 = 0;
  67.     var intVal1 = (lrcId & 0xFF00) >> 8;
  68.     if ((lrcId & 0xFF0000) == 0) {
  69.         intVal3 = 0xFF & ~intVal1;
  70.     } else {
  71.         intVal3 = 0xFF & ((lrcId & 0xFF0000) >> 16);
  72.     }
  73.     intVal3 = intVal3 | ((0xFF & lrcId) << 8);
  74.     intVal3 = intVal3 << 8;
  75.     intVal3 = intVal3 | (0xFF & intVal1);
  76.     intVal3 = intVal3 << 8;
  77.     if ((lrcId & 0xFF000000) == 0) {
  78.         intVal3 = intVal3 | (0xFF & (~lrcId));
  79.     } else {
  80.         intVal3 = intVal3 | (0xFF & (lrcId >> 24));
  81.     }
  82.     var uBound = song.length - 1;
  83.     while (uBound >= 0) {
  84.         var c = song[uBound];
  85.         if (c >= 0x80)
  86.             c = c - 0x100;
  87.         intVal1 = (c + intVal2) & 0xFFFFFFFF;
  88.         intVal2 = (intVal2 << (uBound % 2 + 4)) & 0xFFFFFFFF;
  89.         intVal2 = (intVal1 + intVal2) & 0xFFFFFFFF;
  90.         uBound -= 1;
  91.     }
  92.     uBound = 0;
  93.     intVal1 = 0;
  94.     while (uBound <= song.length - 1) {
  95.         var c = song[uBound];
  96.         if (c >= 128)
  97.             c = c - 256;
  98.         var intVal4 = (c + intVal1) & 0xFFFFFFFF;
  99.         intVal1 = (intVal1 << (uBound % 2 + 3)) & 0xFFFFFFFF;
  100.         intVal1 = (intVal1 + intVal4) & 0xFFFFFFFF;
  101.         uBound += 1;
  102.     }
  103.     var intVal5 = conv(intVal2 ^ intVal3) & 0xFFFFFFFF;
  104.     intVal5 = conv(intVal5 + (intVal1 | lrcId)) & 0xFFFFFFFF;
  105.     intVal5 = mConv(intVal5 , intVal1 | intVal3);
  106.     intVal5 = mConv(intVal5 , intVal2 ^ lrcId);
  107.     var longVal6 = intVal5;
  108.     if (intVal5 > 2147483648)
  109.         intVal5 = (intVal5 - 4294967296) & 0xFFFFFFFF;
  110.     return intVal5.toString();
  111. }


  112. function query(artist, title) {
  113.     var url = \"http://ttlrcct.qianqian.com/dll/lyricsvr.dll?sh?Artist=\" + encode(artist) + \"&Title=\" + encode(title)+\"&Flags=0\";
  114.     // 这里可能有多个匹配的结果,这里只选取第一个
  115.     var lrc = loadXML(httpGet(url)).selectSingleNode(\"/result/lrc\");
  116.     if  (lrc == null)
  117.         throw new Error(\"在服务器上找不到匹配的歌词。\");
  118.     var lrcId = lrc.getAttribute(\"id\");
  119.     artist = lrc.getAttribute(\"artist\");
  120.     title = lrc.getAttribute(\"title\");
  121.     url = \"http://ttlrcct2.qianqian.com/dll/lyricsvr.dll?dl?Id=\" + lrcId + \"&Code=\" + verifyCode(artist, title, lrcId);
  122.     return {ar:artist, ti:title, lrc:httpGet(url)};
  123. }

  124. Response.ContentType = \"text/html; charset=utf-8\";
  125. try {
  126.     var artist = (Request.QueryString(\"artist\").Item || \'\').trim();
  127.     var title = (Request.QueryString(\"title\").Item || \'\').trim();
  128.     if (title == \'\')
  129.         throw new Error(\"请传入音乐名称!\");
  130.    
  131.     var result = query(artist, title);
  132.     var fileName = result.ar + \" - \" + result.ti + \".lrc\";
  133.     Response.ContentType = \"text/plain; charset=utf-8\";
  134.     Response.AddHeader(\"Content-Disposition\", \"inline; filename=\\\"\" + encodeURIComponent(fileName) + \"\\\"\");
  135.     Response.Write(result.lrc);
  136. } catch(e) {
  137.     Response.Write(\"查询错误:\" + e.message);
  138. }
  139. </script>
复制代码
Java 版的可以参考: http://www.iscripts.org/bbs/viewthread.php?tid=85

当然,这里建议在每查询获得一个音乐的 LRC 歌词的时候,把歌词内容存入本地文件或者数据库中,
这样再下次查询时,可以先从本地查询,查不到了再从千千静听的歌词服务器查询,这样子平均上很大程度的提高 WEB 应用的的响应速度。
分享到: QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
分享分享0 收藏收藏0

Rank: 6Rank: 6

2#
Yisin 发表于 2011-5-1 18:28:53 |只看该作者
嘿嘿 收藏了
路不好走,你却依旧满眼的爱,找不到理由...

使用道具 举报

您需要登录后才可以回帖 登录 | 加入学盟

手机版|Scripts 学盟   |

GMT+8, 2024-12-19 05:45 , Processed in 1.096944 second(s), 14 queries .

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

回顶部