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 ...
随机推荐
- dedecms会员注册注入漏洞
一.首先访问“/data/admin/ver.txt”页面获取系统最后升级时间,(判断是否是dede的cms 以及看看是否和这个漏洞相对应)二.然后访问“/member/ajax_membergrou ...
- WINXP上安装及使用SqlMap之方法
1.首先下载SqlMap 点击下载.2.其次下载用于Windows系统的Python ……点击这里…… 3.然后安装Python:Python默认安装的路径是“C:\Python”(你也可以修改安装路 ...
- Razor语法(五)
约定:客户端代码称C域,服务器端代码称S域 0. 基本原则Razor模板默认是C域(与php.aspx相同)任何C域都可以内嵌S域行内S域不可内嵌C域,多行S域可内嵌任何C域@符号是关键符号,使用@从 ...
- phpstorm快速跳转到错误行
phpstorm的快捷键,在网上可以搜索出很多,唯有“快速跳到错误行”的快捷键几乎搜索不出来. 看着错误提示,要一行一行的用眼睛去看,心累. 贴在这里,随时取用,再也不怕忘记了. Shift + F2 ...
- 转:超实用的IOS 9人机界面指南(1):UI设计基础 (腾讯力作)
转: http://www.uisdc.com/ios9-interface-guideline-ui
- limit是mysql的语法
select * from table limit m,n 其中m是指记录开始的index,从0开始,表示第一条记录 n是指从第m+1条开始,取n条. , 即取出第3条至第6条,4条记录 转自:htt ...
- Android编程心得-使用ActionBar+Fragment+ViewPager实现动态切换Menu效果
1.首先上效果图 2.本例实现的效果主要适用于当前页面有多个页签时.进行Fragment切换时,能够利用不同的Menu样式与当前Fragment中的内容进行配合,能够大大添加复用性,看到效果图后,以下 ...
- liunx系统安装jdk的方法
1.下载jdk 下载地址: http://www.oracle.com/technetwork/java/javasebusiness/downloads/java-archive-downloads ...
- web 表单,脚本验证
1.不能含有中文 var obj = document.form1.txtName.value; if(/.*[\u4e00-\u9fa5]+.*$/.test(obj)) { alert(" ...
- centos下安装pyspider
环境: * CentOS release 6.4 (Final) * Python 2.6.6 pip install pyspider ,发现lxml没有安装好 直接sudo yum insta ...