将酷狗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可能遇到的问题“无法载入mysql扩展” 的解决方法
Apr 16 PHP
php生成随机密码的几种方法
Jan 17 PHP
php查询whois信息的方法
Jun 08 PHP
php文件读取方法实例分析
Jun 20 PHP
PHP+shell实现多线程的方法
Jul 01 PHP
PHP如何将log信息写入服务器中的log文件
Jul 29 PHP
php实现简单的上传进度条
Nov 17 PHP
CI框架数据库查询之join用法分析
May 18 PHP
PHP与以太坊交互详解
Aug 24 PHP
PHP Laravel中的Trait使用方法
Jan 20 PHP
Thinkphp 在api开发中异常返回依然是html的解决方式
Oct 16 PHP
php下的原生ajax请求用法实例分析
Feb 28 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
一个连接两个不同MYSQL数据库的PHP程序
2006/10/09 PHP
用PHP和ACCESS写聊天室(九)
2006/10/09 PHP
PHP MemCached 高级缓存应用代码
2010/08/05 PHP
Laravel 5框架学习之日期,Mutator 和 Scope
2015/04/08 PHP
php实现批量上传数据到数据库(.csv格式)的案例
2017/06/18 PHP
用jquery实现等比例缩放图片效果插件
2010/07/24 Javascript
使用jQuery快速解决input中placeholder值在ie中无法支持的问题
2014/01/02 Javascript
jQuery源码解读之removeAttr()方法分析
2015/02/20 Javascript
js实现显示当前状态的导航效果代码
2015/08/28 Javascript
前端性能优化及技巧
2016/05/06 Javascript
JQuery遍历元素的后代和同胞实现方法
2016/09/18 Javascript
微信小程序 wxapp内容组件 text详细介绍
2016/10/31 Javascript
Bootstarp基本模版学习教程
2017/02/01 Javascript
JS及JQuery对Html内容编码,Html转义
2017/02/17 Javascript
JavaScript实现经纬度转换成地址功能
2017/03/28 Javascript
老生常谈javascript中逻辑运算符&amp;&amp;和||的返回值问题
2017/04/13 Javascript
Layui选项卡制作历史浏览记录的方法
2019/09/28 Javascript
vue样式穿透 ::v-deep的具体使用
2020/06/04 Javascript
Paypal支付不完全指北
2020/06/04 Javascript
前端性能优化建议
2020/09/17 Javascript
[02:39]DOTA2英雄基础教程 极限穿梭编织者
2013/12/05 DOTA
[00:26]TI7不朽珍藏III——冥界亚龙不朽展示
2017/07/15 DOTA
python服务器端收发请求的实现代码
2014/09/29 Python
Python单例模式的两种实现方法
2017/08/14 Python
便捷提取python导入包的属性方法
2018/10/15 Python
10招!看骨灰级Pythoner玩转Python的方法
2019/04/15 Python
Python动态参数/命名空间/函数嵌套/global和nonlocal
2019/05/29 Python
Python爬虫图片懒加载技术 selenium和PhantomJS解析
2019/09/18 Python
wxPython实现整点报时
2019/11/18 Python
关于Tensorflow 模型持久化详解
2020/02/12 Python
解决python和pycharm安装gmpy2 出现ERROR的问题
2020/08/28 Python
新颖的化妆品活动方案
2014/08/21 职场文书
红色旅游心得体会
2014/09/03 职场文书
幼儿园大班教育随笔
2015/08/14 职场文书
Django中的JWT身份验证的实现
2021/05/07 Python
CSS基础详解
2021/10/16 HTML / CSS