将酷狗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代码
Mar 24 PHP
php数组声明、遍历、数组全局变量使用小结
Jun 05 PHP
php.ini save_handler 修改不生效的解决办法
Jul 22 PHP
yiic命令时提示“php.exe”不是内部或外部命令的解决方法
Dec 18 PHP
如何使用纯PHP实现定时器任务(Timer)
Jul 31 PHP
php微信公众平台开发(一) 配置接口
Dec 06 PHP
php单元测试phpunit入门实例教程
Nov 17 PHP
PHPUnit测试私有属性和方法功能示例
Jun 12 PHP
php常用字符串查找函数strstr()与strpos()实例分析
Jun 21 PHP
Laravel框架创建路由的方法详解
Sep 04 PHP
YII2框架中ActiveDataProvider与GridView的配合使用操作示例
Mar 18 PHP
PHP实现倒计时功能
Nov 16 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中Socket创建与监听实现方法
2015/01/05 PHP
php实现递归与无限分类的方法
2015/02/16 PHP
PHP结合jQuery插件ajaxFileUpload实现异步上传文件实例
2020/08/17 PHP
PHP实现十进制数字与二十六进制字母串相互转换操作示例
2018/08/10 PHP
php使用array_chunk函数将一个数组分割成多个数组
2018/12/05 PHP
在IE模态窗口中自由查看HTML源码的方法
2007/03/08 Javascript
dreamweaver 安装Jquery智能提示
2011/04/02 Javascript
jquery(hide方法)隐藏指定元素实例
2013/11/11 Javascript
JavaScript数组方法总结分析
2016/05/06 Javascript
JS实现关闭当前页而不弹出提示框的方法
2016/06/22 Javascript
js实现文字选中分享功能
2017/01/25 Javascript
Avalonjs双向数据绑定与监听的实例代码
2017/06/23 Javascript
Node.js pipe实现源码解析
2017/08/12 Javascript
react-navigation 如何判断用户是否登录跳转到登录页的方法
2017/12/01 Javascript
基于openlayers4实现点的扩散效果
2020/08/17 Javascript
vue 使某个组件不被 keep-alive 缓存的方法
2018/09/21 Javascript
vue实现微信分享功能
2018/11/28 Javascript
详解Nuxt.js中使用Element-UI填坑
2019/09/06 Javascript
jQuery实现点击滚动到指定元素上的方法分析
2020/03/19 jQuery
vue绑定数字类型 value为数字的实例
2020/08/31 Javascript
Python 批量合并多个txt文件的实例讲解
2018/05/08 Python
解决Pycharm中import时无法识别自己写的程序方法
2018/05/18 Python
Python中 map()函数的用法详解
2018/07/10 Python
对Python3+gdal 读取tiff格式数据的实例讲解
2018/12/04 Python
python 绘制拟合曲线并加指定点标识的实现
2019/07/10 Python
Python Pandas 箱线图的实现
2019/07/23 Python
详解Python3 中的字符串格式化语法
2020/01/15 Python
AmazeUI的下载配置与Helloworld的实现
2020/08/19 HTML / CSS
Interrail法国:乘火车探索欧洲,最受欢迎的欧洲铁路通票
2019/08/27 全球购物
PHP高级工程师面试问题推荐
2013/01/18 面试题
劲霸男装广告词改编版
2014/03/21 职场文书
作风建设剖析材料
2014/10/06 职场文书
通知范文怎么写
2015/04/16 职场文书
《领导干部从政道德启示录》学习心得体会
2016/01/20 职场文书
学校就业保障协议书
2019/06/24 职场文书
PHP获取学生成绩的方法
2021/11/17 PHP