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


Posted in PHP onJune 20, 2014

最近在进行一次对酷狗音乐歌词采集时发现酷狗音乐的歌词直接浏览都是“乱码”,自己平时所见的歌词都是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 相关文章推荐
Get或Post提交值的非法数据处理
Oct 09 PHP
PHP4引用文件语句的对比
Oct 09 PHP
php批量删除数据
Jan 18 PHP
dedecms中常见问题修改方法总结
Mar 21 PHP
PHP 采集获取指定网址的内容
Jan 05 PHP
注意:php5.4删除了session_unregister函数
Aug 05 PHP
php的webservice的wsdl的XML无法显示问题的解决方法
Mar 11 PHP
ThinkPHP CURD方法之data方法详解
Jun 18 PHP
在Win7 中为php扩展配置Xcache
Oct 08 PHP
php一个解析字符串排列数组的方法
May 12 PHP
CodeIgniter使用smtp服务发送html邮件的方法
Jun 10 PHP
详解php 使用Callable Closure强制指定回调类型
Oct 26 PHP
Yii Framework框架获取分类下面的所有子类方法
Jun 20 #PHP
windows下配置apache+php+mysql时出现问题的处理方法
Jun 20 #PHP
PHP扩展CURL的用法详解
Jun 20 #PHP
教你如何解密 “ PHP 神盾解密工具 ”
Jun 20 #PHP
ThinkPHP3.1查询语言详解
Jun 19 #PHP
ThinkPHP3.1数据CURD操作快速入门
Jun 19 #PHP
ThinkPHP3.1.3版本新特性概述
Jun 19 #PHP
You might like
PHP include_path设置技巧分享
2011/07/03 PHP
php从数组中随机抽取一些元素的代码
2012/11/05 PHP
php 深入理解strtotime函数的使用详解
2013/05/23 PHP
php中的观察者模式简单实例
2015/01/20 PHP
PHP自定义函数实现格式化秒的方法
2016/09/14 PHP
纯js简单日历实现代码
2013/10/05 Javascript
JS中window.open全屏命令解析及使用示例
2013/12/11 Javascript
javascript获取元素偏移量的方法有哪些
2014/06/24 Javascript
AngularJS快速入门
2015/04/02 Javascript
基于JavaScript实现手机短信按钮倒计时(超简单)
2015/12/30 Javascript
jquery实现点击页面回到顶部
2016/11/23 Javascript
Sequelize中用group by进行分组聚合查询
2016/12/12 Javascript
JS实现数组按升序及降序排列的方法
2017/04/26 Javascript
微信小程序支付前端源码
2018/08/29 Javascript
纯javascript实现选择框的全选与反选功能
2019/04/08 Javascript
nodejs实现用户登录路由功能
2019/05/22 NodeJs
js实现简单扫雷
2020/11/27 Javascript
python list 合并连接字符串的方法
2013/03/09 Python
Python中的条件判断语句与循环语句用法小结
2016/03/21 Python
Python实现的基数排序算法原理与用法实例分析
2017/11/23 Python
Python3非对称加密算法RSA实例详解
2018/12/06 Python
使用OpenCV实现仿射变换—旋转功能
2019/08/29 Python
如何解决tensorflow恢复模型的特定值时出错
2020/02/06 Python
python-地图可视化组件folium的操作
2020/12/14 Python
一文读懂python Scrapy爬虫框架
2021/02/24 Python
Html5 video标签视频的最佳实践
2020/02/26 HTML / CSS
毕业生教师求职信
2013/10/20 职场文书
个人评价范文分享
2014/01/11 职场文书
人事专员职责
2014/02/22 职场文书
坚守艰苦奋斗精神坚决反对享乐主义整改措施
2014/09/17 职场文书
四风批评与自我批评发言稿
2014/10/14 职场文书
工作失误检讨书范文
2015/01/26 职场文书
2015年加油站工作总结
2015/05/13 职场文书
导游词之南京汤山温泉
2019/11/26 职场文书
详解Vue中$props、$attrs和$listeners的使用方法
2022/02/18 Vue.js
Tomcat安装使用及部署Web项目的3种方法汇总
2022/08/14 Servers