将酷狗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模拟ping命令(php exec函数的使用方法)
Oct 25 PHP
修改ThinkPHP缓存为Memcache的方法
Jun 25 PHP
Laravel框架表单验证详解
Sep 04 PHP
ThinkPHP模板输出display用法分析
Nov 26 PHP
PHP中使用imagick实现把PDF转成图片
Jan 26 PHP
百度工程师讲PHP函数的实现原理及性能分析(二)
May 13 PHP
启用Csrf后POST数据时出现的400错误
Jul 05 PHP
php简单解析mysqli查询结果的方法(2种方法)
Jun 29 PHP
教你在header中隐藏php的版本信息
Aug 10 PHP
PHP面向对象之里氏替换原则简单示例
Apr 08 PHP
Laravel 验证码认证学习记录小结
Dec 20 PHP
laravel框架路由分组,中间件,命名空间,子域名,路由前缀实例分析
Feb 18 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
上海无线电三厂简史修改版
2021/03/01 无线电
JSQL 基于客户端的成绩统计实现方法
2010/05/05 Javascript
JavaScript的继承的封装介绍
2013/10/15 Javascript
jQuery避免$符和其他JS库冲突的方法对比
2014/02/20 Javascript
JS图片无缝、平滑滚动代码
2014/03/11 Javascript
Spring mvc 接收json对象
2015/12/10 Javascript
基于jQuery实现弹幕APP
2017/02/10 Javascript
解决vue项目打包后提示图片文件路径错误的问题
2018/07/04 Javascript
JavaScript计算出两个数的差值
2020/03/19 Javascript
微信小程序收藏功能的实现代码
2020/06/19 Javascript
jQuery实现动态加载瀑布流
2020/09/01 jQuery
Python使用pygame模块编写俄罗斯方块游戏的代码实例
2015/12/08 Python
深入浅析Python传值与传址
2018/07/10 Python
解决Pycharm运行时找不到文件的问题
2018/10/29 Python
django框架模型层功能、组成与用法分析
2019/07/30 Python
Python3查找列表中重复元素的个数的3种方法详解
2020/02/13 Python
Python读取表格类型文件代码实例
2020/02/17 Python
使用pygame编写Flappy bird小游戏
2020/03/14 Python
基于python爬取有道翻译过程图解
2020/03/31 Python
vscode调试django项目的方法
2020/08/06 Python
Python如何创建装饰器时保留函数元信息
2020/08/07 Python
python pymysql库的常用操作
2020/10/16 Python
英国定做窗帘和纺织品面料一站式商店:Dekoria
2018/08/29 全球购物
如何编写优秀的食品项目创业计划书
2014/01/23 职场文书
财务科科长岗位职责
2014/03/10 职场文书
建筑工程造价专业自荐信
2014/07/08 职场文书
工作粗心大意检讨书
2014/09/18 职场文书
2015年班主任个人工作总结
2015/03/31 职场文书
教师正风肃纪心得体会
2016/01/15 职场文书
当你焦虑迷茫时,请读读这6句话
2019/07/24 职场文书
小学四年级作文之人物作文
2019/11/06 职场文书
Axios取消重复请求的方法实例详解
2021/06/15 Javascript
Nginx配置之实现多台服务器负载均衡
2021/08/02 Servers
企业开发CSS命名BEM代码规范实践
2022/02/12 HTML / CSS
redis数据一致性的实现示例
2022/03/18 Redis
python实现学生信息管理系统(面向对象)
2022/06/05 Python