将酷狗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 相关文章推荐
mysql4.1以上版本连接时出现Client does not support authentication protocol问题解决办法
Mar 15 PHP
php递归列出所有文件和目录的代码
Sep 10 PHP
php Smarty初体验二 获取配置信息
Aug 08 PHP
PHP生成验证码时“图像因其本身有错无法显示”的解决方法
Aug 07 PHP
PHP连接操作access数据库实例
Mar 30 PHP
CodeIgniter自定义控制器MY_Controller用法分析
Jan 20 PHP
php获取开始与结束日期之间所有日期的方法
Nov 29 PHP
深入讲解PHP的对象注入(Object Injection)
Mar 01 PHP
PHP实现生成模糊图片的方法示例
Dec 21 PHP
PHP手机短信验证码实现流程详解
May 17 PHP
PHP cookie与session会话基本用法实例分析
Nov 18 PHP
PHP使用gearman进行异步的邮件或短信发送操作详解
Feb 27 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
解决dede生成静态页和动态页转换的一些问题,及火车采集入库生成动态的办法
2007/03/29 PHP
CodeIgniter模板引擎使用实例
2014/07/15 PHP
php通过array_merge()函数合并两个数组的方法
2015/03/18 PHP
Yii视图CGridView列表用法实例分析
2016/07/12 PHP
PHP实现二维数组去重功能示例
2017/01/12 PHP
php5.x禁用eval的操作方法
2018/10/19 PHP
javaScript call 函数的用法说明
2010/04/09 Javascript
一些相见恨晚的 JavaScript 技巧
2010/04/25 Javascript
js 关于=+与+=日期函数使用说明(赋值运算符)
2011/11/15 Javascript
Javascript中的for in循环和hasOwnProperty结合使用
2013/06/05 Javascript
vue.js vue-router如何实现无效路由(404)的友好提示
2017/12/20 Javascript
echarts鼠标覆盖高亮显示节点及关系名称详解
2018/03/17 Javascript
vue如何在自定义组件中使用v-model
2018/05/14 Javascript
Promise扫盲贴
2019/06/24 Javascript
python在Windows8下获取本机ip地址的方法
2015/03/14 Python
深入解析Python中的变量和赋值运算符
2015/10/12 Python
Python中的浮点数原理与运算分析
2017/10/12 Python
基于Django的ModelForm组件(详解)
2017/12/07 Python
python 中文件输入输出及os模块对文件系统的操作方法
2018/08/27 Python
Python 获取中文字拼音首个字母的方法
2018/11/28 Python
浅谈PYTHON 关于文件的操作
2019/03/19 Python
Python除法之传统除法、Floor除法及真除法实例详解
2019/05/23 Python
python opencv调用笔记本摄像头
2019/08/28 Python
tensorflow-gpu安装的常见问题及解决方案
2020/01/20 Python
Python爬虫如何破解JS加密的Cookie
2020/11/19 Python
python excel和yaml文件的读取封装
2021/01/12 Python
css3学习之2D转换功能详解
2016/12/23 HTML / CSS
世界知名接发和假发品牌:Poze Hair
2017/03/08 全球购物
The Body Shop美体小铺西班牙官网:天然化妆品
2019/06/21 全球购物
入党转预备思想汇报
2014/01/07 职场文书
给面试官的感谢信
2014/02/01 职场文书
教师对学生的评语
2014/04/28 职场文书
文秘应届生求职信
2014/07/05 职场文书
2014年公路养护工作总结
2014/12/04 职场文书
工程部主管岗位职责
2015/02/12 职场文书
低门槛开发iOS、Android、小程序应用的前端框架详解
2021/10/16 Javascript