将酷狗krc歌词解析并转换为lrc歌词php源码

2015-01-24信息快讯网

这篇文章主要介绍了krc歌词解析并转换为lrc歌词的php实现方法,需要的朋友可以参考下

最近在进行一次对酷狗音乐歌词采集时发现酷狗音乐的歌词直接浏览都是“乱码”,自己平时所见的歌词都是lrc格式的文本,这种酷狗专用的krc格式的显然是经过特别处理过的,平时用酷狗听音乐也没仔细看他的歌词有什么不同,只是与天天静听等不同的是可以逐字高亮显示歌词。

对酷狗的flash播放器进行反编译,发现这段krc解密的ActionScript代码:

public function loaderCompleteHandler(param1:ByteArray) : void{ 
 this.newkeyBytes = [64, 71, 97, 119, 94, 50, 116, 71, 81, 54, 49, 45, 206, 210, 110, 105]; 
 var result:* = param1; 
 var krcBytes:* = new ByteArray(); 
 result.position = 4; 
 result.readBytes(krcBytes); 
 var l:* = krcBytes.length; 
 var i:int; 
 while (i < l) {
 krcBytes[i] = krcBytes[i] ^ this.newkeyBytes[i % this.newkeyBytes.length]; 
 i = (i + 1); 
 }
 try { 
 krcBytes.uncompress(); 
 } catch (error:SecurityError) { 
 errorfun("uncompressError");
 return; 
 } 
 krcBytes.position = 0; 
 this.myLyric.dataStr = krcBytes.readUTFBytes(krcBytes.length); 
 this.successfun(); 
 return; 
}

根据这段代码可以很快转换成php解析代码:

$enKey = array(64, 71, 97, 119, 94, 50, 116, 71, 81, 54, 49, 45, 206, 210, 110, 105);
$krc_content = substr($krc_content,4);
$len = strlen($krc_content);
$krc_compress = '';
for ($k = 0; $k < $len; $k++){
 $krc_compress .= chr(ord($krc_content[$k]) ^ $enKey[$k % 16]);
}
$krc_text = gzuncompress($krc_compress);

上面的$krc_content为krc歌词压缩加密的文本内容,得到了解析后的krc明文文本歌词$krc_text,然后就可以很容易的转换成lrc歌词了,如下:

function krc2lrc($krc_content,$glue = "n"){
 $enKey = array(64, 71, 97, 119, 94, 50, 116, 71, 81, 54, 49, 45, 206, 210, 110, 105);
 $krc_content = substr($krc_content,4);
 $len = strlen($krc_content);
 $krc_compress = '';
 for ($k = 0; $k < $len; $k++){
 $krc_compress .= chr(ord($krc_content[$k]) ^ $enKey[$k % 16]);
 }
 $krc_text = gzuncompress($krc_compress);
 preg_match_all("/[(ar|ti|offset):(.+)]/",$krc_text,$matches);
 $lrc_text = implode($glue,$matches[0]).$glue;
 preg_match_all("/[(d{0,8}),(d{0,8})](.+)/",$krc_text,$matches);
 unset($krc_text,$krc_compress,$krc_content,$enKey);
 if(!empty($matches[1])){
 foreach($matches[1] as $k=>$v){
 list($seconds, $millis) = explode('.', $v / 1000); 
 $lrc_time = date('i:s',1388534400 + $seconds).'.'.substr($millis,0,2);
 $lrc_cont = preg_replace("/<d{1,8},d{1,8},d{1,8}>/",'',$matches[3][$k]);
 $lrc_text .= "[{$lrc_time}]{$lrc_cont}{$glue}";
 }
 }
 return $lrc_text;
}

简单示例如下:

$content = file_get_contents('1.krc');
echo krc2lrc($content,'<br/>');
php数组查找函数总结
一个经典的PHP验证码类分享
一个经典实用的PHP图像处理类分享
PHP中一些可以替代正则表达式函数的字符串操作函数
PHP向浏览器输出内容的4个函数总结
浅谈PHP解析URL函数parse_url和parse_str
php json转换成数组形式代码分享
php实现把url转换迅雷thunder资源下载地址的方法
php使用ZipArchive提示Fatal error: Class ZipArchive not found in的解决方法
php cookie名使用点号(句号)会被转换
php中的字符编码转换函数用法示例
php的ZipArchive类用法实例
php中字符集转换iconv函数使用总结
PHP中构造函数和析构函数解析
php生成QRcode实例
php中strstr、strrchr、substr、stristr四个函数的区别总结
PHP使用Mysql事务实例解析
PHP闭包实例解析
ThinkPHP的MVC开发机制实例解析
PHP下通过QRCode类库创建中间带网站LOGO的二维码
PHP提交表单失败后如何保留已经填写的信息
Yii Framework框架获取分类下面的所有子类方法
windows下配置apache+php+mysql时出现问题的处理方法
PHP扩展CURL的用法详解
教你如何解密 “ PHP 神盾解密工具 ”
ThinkPHP3.1查询语言详解
ThinkPHP3.1数据CURD操作快速入门
ThinkPHP3.1新特性之内容解析输出详解
php的SimpleXML方法读写XML接口文件实例解析
php自动识别文件编码并转换为UTF-8的方法
php导出csv格式数据并将数字转换成文本的思路以及代码分享
PHP解析html类库simple_html_dom的转码bug
PHP学习笔记之字符串编码的转换和判断
PHP英文字母大小写转换函数小结
php数组查找函数in_array()、array_search()、array_key_exists()使用实例
php中有关字符串的4个函数substr、strrchr、strstr、ereg介绍和使用例子
php时间戳转换的示例
PHP中redis的用法深入解析
php中sprintf与printf函数用法区别解析
PHP中source #N问题的解决方法
©2014-2024 dbsqp.com