将酷狗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 相关文章推荐
解决中英文字符串长度问题函数
Jan 16 PHP
php中cookie的作用域
Mar 27 PHP
《PHP编程最快明白》第七讲:php图片验证码与缩略图
Nov 01 PHP
编写Smarty插件在模板中直接加载数据的详细介绍
Jun 26 PHP
php后门URL的防范
Nov 12 PHP
使用PHP生成二维码的两种方法(带logo图像)
Mar 14 PHP
PHP简单判断字符串是否包含另一个字符串的方法
Mar 25 PHP
PHP与jquery实时显示网站在线人数实例详解
Dec 02 PHP
php实现产品加入购物车功能(1)
Jul 23 PHP
PHP实现的服务器一致性hash分布算法示例
Aug 09 PHP
Laravel框架查询构造器 CURD操作示例
Sep 04 PHP
PHP数据源架构模式之表入口模式实例分析
Jan 23 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
Symfony2在Nginx下的配置方法图文教程
2016/02/04 PHP
JS对URL字符串进行编码/解码分析
2008/10/25 Javascript
jquery BS,dialog控件自适应大小
2009/07/06 Javascript
cloudgamer出品ImageZoom 图片放大效果
2010/04/01 Javascript
利用webqq协议使用python登录qq发消息源码参考
2013/04/08 Javascript
jQuery之字体大小的设置方法
2014/02/27 Javascript
用C/C++来实现 Node.js 的模块(一)
2014/09/24 Javascript
Javascript自执行匿名函数(function() { })()的原理浅析
2016/05/15 Javascript
完美实现八种js焦点轮播图(上篇)
2016/07/18 Javascript
Angularjs 实现分页功能及示例代码
2016/09/14 Javascript
JavaScript 字符串常用操作小结(非常实用)
2016/11/30 Javascript
jquery插件锦集【推荐】
2016/12/16 Javascript
带你了解session和cookie作用原理区别和用法
2017/08/14 Javascript
canvas基础绘制-绚丽倒计时的实例
2017/09/17 Javascript
webpack中CommonsChunkPlugin详细教程(小结)
2017/11/09 Javascript
Angular实现的简单定时器功能示例
2017/12/28 Javascript
jQuery实现判断上传图片类型和大小的方法示例
2018/04/11 jQuery
微信小程序仿美团城市选择
2018/06/06 Javascript
JavaScript插入排序算法原理与实现方法示例
2018/08/06 Javascript
vue改变循环遍历后的数据实例
2019/11/07 Javascript
antd-mobile ListView长列表的数据更新遇到的坑
2020/04/08 Javascript
编写一个javascript元循环求值器的方法
2020/04/14 Javascript
详解webpack的文件监听实现(热更新)
2020/09/11 Javascript
VUE项目实现主题切换的多种方法
2020/11/26 Vue.js
[51:32]Optic vs Serenity 2018国际邀请赛淘汰赛BO3 第一场 8.22
2018/08/23 DOTA
在CentOS上配置Nginx+Gunicorn+Python+Flask环境的教程
2016/06/07 Python
用CSS3实现无限循环的无缝滚动的示例代码
2017/11/01 HTML / CSS
瑞贝卡·泰勒官方网站:Rebecca Taylor
2016/09/24 全球购物
企业职业病防治方案
2014/05/29 职场文书
在职党员进社区活动总结
2014/07/05 职场文书
基层党建工作汇报材料
2014/08/15 职场文书
本科毕业论文指导教师评语
2014/12/30 职场文书
幼儿教师继续教育培训心得体会
2016/01/19 职场文书
MySQL Innodb关键特性之插入缓冲(insert buffer)
2021/04/08 MySQL
微软Win11什么功能最惊艳? Windows11新功能特性汇总
2021/11/21 数码科技
我们认为中短波广播场强仪的最佳组合
2022/04/05 无线电