将酷狗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 相关文章推荐
PHP 遍历XP文件夹下所有文件
Nov 27 PHP
Uchome1.2 1.5 代码学习 common.php
Apr 24 PHP
php中的观察者模式
Mar 24 PHP
发款php蜘蛛统计插件只要有mysql就可用
Oct 12 PHP
ThinkPHP的截取字符串函数无法显示省略号的解决方法
Jun 25 PHP
怎样搭建PHP开发环境
Jul 28 PHP
两种php去除二维数组的重复项方法
Nov 04 PHP
大家须知简单的php性能优化注意点
Jan 04 PHP
php进程间通讯实例分析
Jul 11 PHP
php mysql 封装类实例代码
Sep 18 PHP
php实现生成带二维码图片并强制下载功能
Feb 24 PHP
解决php用mysql方式连接数据库出现Deprecated报错问题
Dec 25 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
跟我学Laravel之路由
2014/10/15 PHP
表单的一些基本用法与技巧
2006/07/15 Javascript
js实现iframe动态调整高度的代码
2008/01/06 Javascript
jquery ajax跨域解决方法(json方式)
2014/02/04 Javascript
jquery禁止输入数字以外的字符的示例(纯数字验证码)
2014/04/10 Javascript
JQuery异步获取返回值中文乱码的解决方法
2015/01/29 Javascript
对JavaScript的全文搜索实现相关度评分的功能的方法
2015/06/24 Javascript
详解js中class的多种函数封装方法
2016/01/03 Javascript
JS学习之表格的排序简单实例
2016/05/16 Javascript
动态的9*9乘法表效果的实现代码
2016/05/16 Javascript
深入分析javascript中的错误处理机制
2016/07/17 Javascript
jQuery禁用快捷键例如禁用F5刷新 禁用右键菜单等的简单实现
2016/08/31 Javascript
在JavaScript中调用Java类和接口的方法
2016/09/07 Javascript
JS日程管理插件FullCalendar简单实例
2017/02/07 Javascript
从零开始做一个pagination分页组件
2017/03/15 Javascript
js a标签点击事件
2017/03/30 Javascript
原生JS实现圆环拖拽效果
2017/04/07 Javascript
Angular6笔记之封装http的示例代码
2018/07/27 Javascript
JS中数据结构与算法---排序算法(Sort Algorithm)实例详解
2019/06/17 Javascript
javascript实现搜索筛选功能实例代码
2020/11/12 Javascript
优化Python代码使其加快作用域内的查找
2015/03/30 Python
遗传算法之Python实现代码
2017/10/10 Python
Python 字符串换行的多种方式
2018/09/06 Python
对Python生成器、装饰器、递归的使用详解
2019/07/19 Python
Python使用lambda表达式对字典排序操作示例
2019/07/25 Python
Python中的sys.stdout.write实现打印刷新功能
2020/02/21 Python
Python 之 Json序列化嵌套类方式
2020/02/27 Python
python使用gdal对shp读取,新建和更新的实例
2020/03/10 Python
Opencv常见图像格式Data Type及代码实例
2020/11/02 Python
CSS3利用text-shadow属性实现多种效果的文字样式展现方法
2016/08/25 HTML / CSS
Nike香港官网:Nike HK
2019/03/23 全球购物
岗位安全生产责任书
2014/07/28 职场文书
解除劳动合同协议书范本
2014/09/13 职场文书
2014教师评职称工作总结
2014/11/10 职场文书
民事答辩状格式范文
2015/05/21 职场文书
浅谈哪个Python库才最适合做数据可视化
2021/06/28 Python