将酷狗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.ini中文版(1)
Oct 09 PHP
PHP实现图片简单上传
Oct 09 PHP
sqlyog 中文乱码问题的设置方法
Oct 19 PHP
生成ubuntu自动切换壁纸xml文件的php代码
Jul 17 PHP
分享十款最出色的PHP安全开发库中文详细介绍
Mar 22 PHP
Linux下编译redis和phpredis的方法
Apr 07 PHP
微信支付开发发货通知实例
Jul 12 PHP
php 实现Hash表功能实例详解
Nov 29 PHP
详解PHP中的 input属性(隐藏 只读 限制)
Aug 14 PHP
php查看一个变量的占用内存的实例代码
Mar 29 PHP
php使用自带dom扩展进行元素匹配的原理解析
May 29 PHP
php优化查询foreach代码实例讲解
Mar 24 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通过array_push()函数添加多个变量到数组末尾的方法
2015/03/18 PHP
php处理复杂xml数据示例
2016/07/11 PHP
Yii全局函数用法示例
2017/01/22 PHP
Yii2 中实现单点登录的方法
2018/03/09 PHP
jquery+json 通用三级联动下拉列表
2010/04/19 Javascript
日期处理的js库(迷你版)--自建js库总结
2011/11/21 Javascript
javascript full screen 全屏显示页面元素的方法
2013/09/27 Javascript
jquery 页面滚动到底部自动加载插件集合
2014/01/31 Javascript
JavaScript获取当前url根目录(路径)
2016/06/17 Javascript
浅谈js继承的实现及公有、私有、静态方法的书写
2016/10/28 Javascript
JavaScript利用正则表达式替换字符串中的内容
2016/12/12 Javascript
vue省市区三联动下拉选择组件的实现
2017/04/28 Javascript
JavaScript 数组的进化与性能分析
2017/09/18 Javascript
解决使用Vue.js显示数据的时,页面闪现原始代码的问题
2018/02/11 Javascript
详解基于vue的服务端渲染框架NUXT
2018/06/20 Javascript
vue-router中的hash和history两种模式的区别
2018/07/17 Javascript
JSON生成Form表单的方法示例
2018/11/21 Javascript
vue实现分页加载效果
2019/12/24 Javascript
微信小程序实现导航栏和内容上下联动功能代码
2020/06/29 Javascript
[04:11]DOTA2亚洲邀请赛小组赛第一日 TOP10精彩集锦
2015/01/30 DOTA
python修改字典内key对应值的方法
2015/07/11 Python
Python实现批量检测HTTP服务的状态
2016/10/27 Python
python画一个玫瑰和一个爱心
2020/08/18 Python
让代码变得更易维护的7个Python库
2018/10/09 Python
Python3.6使用tesseract-ocr的正确方法
2018/10/17 Python
Django 响应数据response的返回源码详解
2019/08/06 Python
python下载库的步骤方法
2019/10/12 Python
萨克斯第五大道英国:Saks Fifth Avenue英国
2019/04/01 全球购物
建筑施工员岗位职责
2013/11/26 职场文书
总经理工作职责范文
2014/03/14 职场文书
运动会闭幕词
2015/01/28 职场文书
长城导游词
2015/01/30 职场文书
幼儿园亲子活动通知
2015/04/24 职场文书
认识实习感想
2015/08/10 职场文书
GitHub上77.9K的Axios项目有哪些值得借鉴的地方详析
2021/06/15 Javascript
《群青的幻想曲》京力秋树角色PV公开
2022/04/08 日漫