PHP从千千静听服务器获取lrc歌词
<?php
//转载请注明出处 uenucom
function SingleDecToHex($dec)
{
$tmp="";
$dec=$dec%16;
if($dec<10) return $tmp.$dec;
$arr=array("A","B","C","D","E","F");
return $tmp.$arr[$dec-10];
}
function SetToHexString($str)
{
if(!$str) return false;
$tmp="";
for($i=0;$i<strlen($str);$i++)
{
$ord=ord($str[$i]);
$tmp.=SingleDecToHex(($ord-$ord%16)/16);
$tmp.=SingleDecToHex($ord%16);
}
return $tmp;
}
function qianqian_code($str)
{
$s=strtolower($str);
$s=str_replace(" ","",$s);
$s=str_replace("'","",$s);
return SetToHexString(iconv('GBK','UTF-16LE',$s));}
function conv($num)
{
$tp = bcmod($num,4294967296);
if(bccomp($num,0)>=0 && bccomp($tp,2147483648)>0)
$tp=bcadd($tp,-4294967296);
if(bccomp($num,0)<0 && bccomp($tp,2147483648)<0)
$tp=bcadd($tp,4294967296);
return $tp;
}
function CodeFunc($Id,$artist,$title)
{
$Id=(int)$Id;
$utf8Str=SetToHexString(iconv('GBK','UTF-8',$artist.$title));
$length=strlen($utf8Str)/2;
for($i=0;$i<=$length-1;$i++)
eval('$song['.$i.'] = 0x'.substr($utf8Str,$i*2,2).';');
$tmp2=0;
$tmp3=0;
$tmp1 = ($Id & 0x0000FF00) >> 8; //右移8位后为0x0000015F
//tmp1 0x0000005F
if ( ($Id & 0x00FF0000) == 0 ) {
$tmp3 = 0x000000FF & ~$tmp1; //CL 0x000000E7
} else {
$tmp3 = 0x000000FF & (($Id & 0x00FF0000) >> 16); //右移16位后为0x00000001
}
$tmp3 = $tmp3 | ((0x000000FF & $Id) << 8); //tmp3 0x00001801
$tmp3 = $tmp3 << 8; //tmp3 0x00180100
$tmp3 = $tmp3 | (0x000000FF & $tmp1); //tmp3 0x0018015F
$tmp3 = $tmp3 << 8; //tmp3 0x18015F00
if ( ($Id & 0xFF000000) == 0 ) {
$tmp3 = $tmp3 | (0x000000FF & (~$Id)); //tmp3 0x18015FE7
} else {
$tmp3 = $tmp3 | (0x000000FF & ($Id >> 24)); //右移24位后为0x00000000
}
$i=$length-1;
while($i >= 0){
$char = $song[$i];
if($char >= 0x80) $char = $char - 0x100;
$tmp1 = ($char + $tmp2) & 0x00000000FFFFFFFF;
$tmp2 = ($tmp2 << ($i%2 + 4)) & 0x00000000FFFFFFFF;
$tmp2 = ($tmp1 + $tmp2) & 0x00000000FFFFFFFF;
$i -= 1;
}
$i=0;
$tmp1=0;
while($i<=$length-1){
$char = $song[$i];
if($char >= 128) $char = $char - 256;
$tmp7 = ($char + $tmp1) & 0x00000000FFFFFFFF;
$tmp1 = ($tmp1 << ($i%2 + 3)) & 0x00000000FFFFFFFF;
$tmp1 = ($tmp1 + $tmp7) & 0x00000000FFFFFFFF;
$i += 1;
}
$t = conv($tmp2 ^ $tmp3);
$t = conv(($t+($tmp1 | $Id)));
$t = conv(bcmul($t , ($tmp1 | $tmp3)));
$t = conv(bcmul($t , ($tmp2 ^ $Id)));
if(bccomp($t , 2147483648)>0)
$t = bcadd($t ,- 4294967296);
return $t;}
$artist="央金兰泽";
$title="遇上你是我的缘";
$doc = new DOMDocument();
$doc->load("http://lrccnc.ttplayer.com/dll/lyricsvr.dll?sh?Artist=".qianqian_code($artist)."&Title=".qianqian_code($title)."&Flags=0");
$lrcNode = $doc->getElementsByTagName("lrc");
foreach($lrcNode as $lrc)
{
$id=$lrc->getAttribute("id");
$artist=iconv('UTF-8','GBK',$lrc->getAttribute("artist"));
$title=iconv('UTF-8','GBK',$lrc->getAttribute("title"));
$code=CodeFunc($id,$artist,$title);
$lrcstr=iconv('UTF-8','GBK',file_get_contents("http://lrccnc.ttplayer.com/dll/lyricsvr.dll?dl?Id=".$id."&Code=".$code));
echo $lrcstr;
break;
}
?>
PHP从千千静听服务器获取lrc歌词的更多相关文章
- Java使用正则表达式解析LRC歌词文件
LRC歌词是一种应用广泛的歌词文件,各主流播放器都支持. lrc歌词文本中含有两类标签: 1.标识标签(ID-tags) [ar:艺人名] [ti:曲名] [al:专辑名] [by:编者(指编辑LRC ...
- Lrc歌词批量下载助手 MP3歌词批量下载助手
Lrc歌词批量下载助手 MP3歌词批量下载助手 易歌词的服务器已经挂掉,各个主流播放器已不提供明确的下载Lrc服务,当上G的MP3文件遇上苦逼的播放器,二缺就诞生了!本软件就是在这种背景下诞生的 ...
- 浅析LRC歌词文件
[时间:2018-12] [状态:Open] [关键词:字幕,LRC,歌词,lyric,文件格式] 0 引言 几年前(2010年左右),网络音乐流行与免费的时代,网上有大量的mp3,使用比较常见的播放 ...
- c#解析Lrc歌词文件
看到很多人解析歌词文件时写了一大片的字符处理代码,而且看得不是很明白,所以自己研究了一下, 首先来了解下Lrc文件 时间格式: 1.标准格式: [分钟:秒.毫秒] 歌词 注释:括号.冒号.点号全都要求 ...
- 我的Android进阶之旅------>Android自定义View来实现解析lrc歌词并同步滚动、上下拖动、缩放歌词的功能
前言 一LRC歌词文件简介 1什么是LRC歌词文件 2LRC歌词文件的格式 LRC歌词文件的标签类型 1标识标签 2时间标签 二解析LRC歌词 1读取出歌词文件 2解析得到的歌词内容 1表示每行歌词内 ...
- LRC歌词原理和实现高仿Android网易云音乐
大家好,我们是爱学啊,今天给大家带来一篇关于LRC歌词原理和在Android上如何实现歌词逐行滚动的效果,本文来自[Android开发项目实战我的云音乐]课程:逐字滚动下一篇文章讲解. 效果图 相信大 ...
- android 从服务器获取新闻数据并显示在客户端
新闻客户端案例 第一次进入新闻客户端需要请求服务器获取新闻数据,做listview的展示, 为了第二次再次打开新闻客户端时能快速显示新闻,需要将数据缓存到数据库中,下次打开可以直接去数据库中获取新闻直 ...
- nginx做反向代理负载均衡 Java怎么获取后端服务器获取用户IP
nginx做反向负载均衡,后端服务器获取真实客户端ip 首先,在前端nginx上需要做如下配置: location / proxy_set_hearder host ...
- windows phone 7 通过Post提交URL到服务器,从服务器获取数据(比如登陆时候使用)
原文:windows phone 7 通过Post提交URL到服务器,从服务器获取数据(比如登陆时候使用) HttpWebRequest myRequest = (HttpWebRequest)Web ...
随机推荐
- nginx最大并发连接数的思考:worker_processes、worker_connections、worker_rlimit_nofile
参考nginx官网:http://nginx.org/en/docs/ngx_core_module.html#worker_connections 从用户的角度,http 1.1协议下,由于浏览器默 ...
- C++ 重写重载重定义区别
C++ 重写重载重定义区别 (源自:http://blog.163.com/clevertanglei900@126/blog/static/111352259201102441934870/) 1 ...
- 【Web】Rest API 验证授权如何做?
参考资料: [Web]Rest && 权限管理等:http://www.itdadao.com/2016/03/15/593144/ 无需OAuth就可以设计一个安全的REST (We ...
- 工程web-inf 下文件,路径访问
直接用相对路径../即可 效果:
- 给Swing的GUI组件设置前景色和背景色
JButton btn=new JButton("TEST"); btn.setForeground(Color.white);// 设置前景色(文字颜色)btn.setBackg ...
- iOS 证书管理.p12文件不能导出
iOS证书不能导出p12文件: 首先要确认证书是从你这个电脑上制作生成的! 钥匙串-->我的证书--->右键,就可以导出了!
- POJ2406-Power Strings(kmp循环节)
Power Strings Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 31111 Accepted: 12982 D ...
- jQuery上传插件Uploadify使用介绍
以图纸资料上传为例,介绍Uploadify插件的使用,插件下载地址 http://www.uploadify.com/download/ 上传页面: 选择文件增加未上传界面: 上传成功预览界面: ...
- Eclipse项目上红叉
整个项目可以编译通过并且运行都没问题,但是项目上有个红叉,这个问题一般是有两个原因: 1.查看项目是不是有的引用包报错 解决办法:在项目的build path 中删除不可用引用或者修正 2.项目的编译 ...
- JavaScript-深入理解JavaScript(一、预编译和执行过程)
一.预解析 JavaScript 在执行前会进行类似“预解析”的操作:首先会创建一个在当前执行环境下的活动对象, 并将那些用 var 声明的变量.定义的函数设置为活动对象的属性, 但是此时这些变量的赋 ...