将酷狗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的安全策略
Oct 09 PHP
用PHP与XML联手进行网站编程代码实例
Jul 10 PHP
windows的文件系统机制引发的PHP路径爆破问题分析
Jul 28 PHP
php图片处理函数获取类型及扩展名实例
Nov 19 PHP
两个php日期控制类实例
Dec 09 PHP
php操作xml入门之cdata区段
Jan 23 PHP
php通过smtp邮件验证登陆的方法
May 11 PHP
Yii视图CGridView实现操作按钮定义地址示例
Jul 14 PHP
PHP实践教程之过滤、验证、转义与密码详解
Jul 24 PHP
Laravel 中创建 Zip 压缩文件并提供下载的实现方法
Apr 02 PHP
Laravel使用Queue队列的技巧汇总
Sep 02 PHP
php新建文件的方法实例
Sep 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
漂亮但不安全的CTB
2006/10/09 PHP
PHP开发的一些注意点总结
2010/10/12 PHP
php使用curl存储cookie的示例
2014/03/31 PHP
PHP中应该避免使用同名变量(拆分临时变量)
2015/04/03 PHP
php序列化函数serialize() 和 unserialize() 与原生函数对比
2015/05/08 PHP
php 的多进程操作实践案例分析
2020/02/28 PHP
Javascript 继承机制实例
2009/08/12 Javascript
自制基于jQuery的智能提示插件一枚
2011/02/18 Javascript
jquery attr 设定src中含有&amp;(宏)符号问题的解决方法
2011/07/26 Javascript
node.js中的fs.readFile方法使用说明
2014/12/15 Javascript
jQuery自定义添加&quot;$&quot;与解决&quot;$&quot;冲突的方法
2015/01/19 Javascript
jquery插件jquery.nicescroll实现图片无滚动条左右拖拽的方法
2015/08/10 Javascript
Node.js 条形码识别程序构建思路详解
2016/02/14 Javascript
Javascript实现跑马灯效果的简单实例
2016/05/31 Javascript
JS伪继承prototype实现方法示例
2018/06/20 Javascript
解决JavaScript layui 下拉框不显示的问题
2018/08/14 Javascript
vue vantUI tab切换时 list组件不触发load事件的问题及解决方法
2020/02/14 Javascript
v-slot和slot、slot-scope之间相互替换实例
2020/09/04 Javascript
JavaScript实现音乐导航效果
2020/11/19 Javascript
Python selenium 父子、兄弟、相邻节点定位方式详解
2016/09/15 Python
python urllib urlopen()对象方法/代理的补充说明
2017/06/29 Python
轻量级的Web框架Flask 中模块化应用的实现
2017/09/11 Python
Python实现1-9数组形成的结果为100的所有运算式的示例
2017/11/03 Python
Python实现发送与接收邮件的方法详解
2018/03/28 Python
python使用代理ip访问网站的实例
2018/05/07 Python
Python中的 is 和 == 以及字符串驻留机制详解
2019/06/28 Python
Python List列表对象内置方法实例详解
2019/10/22 Python
python将图片转base64,实现前端显示
2020/01/09 Python
Python插入Elasticsearch操作方法解析
2020/01/19 Python
Pycharm 使用 Pipenv 新建的虚拟环境(图文详解)
2020/04/16 Python
canvas简易绘图的实现(海绵宝宝篇)
2018/07/04 HTML / CSS
StubHub希腊:购买体育赛事、音乐会和剧院门票
2019/08/03 全球购物
领导证婚人证婚词
2014/01/13 职场文书
个人委托书如何写
2014/09/25 职场文书
《1942》观后感
2015/06/08 职场文书
springboot读取nacos配置文件
2022/05/20 Java/Android