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 ...
随机推荐
- window进入本地组策略编辑器和计算机管理界面
win+R 进入运行窗口 输入gpedit.msc 进入本地组策略编辑器, 右键我的电脑,点击管理 进入计算机管理界面
- DIV强制不换行
一.单个DIV:1.用nobr元素 <html> <head> </head> <body> <div><nobr>不换行不换行 ...
- Oracle imp关于fromuser 和 touser的用法
fromuser就是把当前的dmp文件中的某一个用户下的数据取出.touser就是把现在dmp文件中的数据导入到目标库的指定user下.具体命令这样.exp userid=system/manager ...
- java.lang.UnsupportedOperationException:This parser does not support specification "null" version "null"
java.lang.UnsupportedOperationException: This parser does not support specification "null" ...
- maven install时报错Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.12.4:test
事故现场: 解决办法: 一是命令行, mvn clean package -Dmaven.test.skip=true 二是写入pom文件, <plugin> <groupId> ...
- meta文件是什么东西
meta是用来在HTML文档中模拟HTTP协议的响应头报文.meta 标签用于网页的<head>与</head>中,meta 标签的用处很多.meta 的属性有两种:name和 ...
- Android 如何增大开机铃声 M
前言 欢迎大家我分享和推荐好用的代码段~~ 声明 欢迎转载,但请保留文章原始出处: CSDN:http://www.csdn.net ...
- 算法笔记_097:蓝桥杯练习 算法提高 P1001(Java)
目录 1 问题描述 2 解决方案 1 问题描述 当两个比较大的整数相乘时,可能会出现数据溢出的情形.为避免溢出,可以采用字符串的方法来实现两个大数之间的乘法.具体来说,首先以字符串的形式输入两个整 ...
- 运用Unity实现依赖注入[有参构造注入]
上一篇章讲到关于使用Unity实现依赖注入的简单功能,针对有博友提出关于有参构造注入的问题; 本文同样通过一个实例来讲解如何实现此功能,文中一些分层讲解可以看上一文章(运用Unity实现依赖注入[结合 ...
- SchemaExport
不在xml中配置 <!-- Drop and re-create the database schema on startup <property name ...