将酷狗krc歌词解析并转换为lrc歌词php源码

 更新时间:2014年06月20日 10:15:03   投稿:shichen2014  
这篇文章主要介绍了krc歌词解析并转换为lrc歌词的php实现方法,需要的朋友可以参考下

最近在进行一次对酷狗音乐歌词采集时发现酷狗音乐的歌词直接浏览都是“乱码”,自己平时所见的歌词都是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/>');

相关文章

  • 比较strtr, str_replace和preg_replace三个函数的效率

    比较strtr, str_replace和preg_replace三个函数的效率

    本篇文章是对strtr, str_replace和preg_replace三个函数的效率问题进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • PHP 组件化编程技巧

    PHP 组件化编程技巧

    PHP是一个很流行的Web编程语言,灵活,高效让它更具魅力。
    2009-06-06
  • php实现压缩合并js的方法【附demo源码下载】

    php实现压缩合并js的方法【附demo源码下载】

    这篇文章主要介绍了php实现压缩合并js的方法,涉及php压缩文件类JSMin的相关调用与使用技巧,并附带了完整的demo源码供读者下载参考,需要的朋友可以参考下
    2016-09-09
  • php实现插入排序

    php实现插入排序

    本文给大家分享的是使用php实现插入排序的方法,十分的简单实用,有需要的小伙伴可以参考下。
    2015-03-03
  • php实现的微信红包算法分析(非官方)

    php实现的微信红包算法分析(非官方)

    这篇文章主要介绍了php实现的微信红包算法,以实例形式分析了拼手气红包的相关随机算法技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-09-09
  • PHP设计模式之建造者模式定义与用法简单示例

    PHP设计模式之建造者模式定义与用法简单示例

    这篇文章主要介绍了PHP设计模式之建造者模式定义与用法,简单描述了建造者模式的概念、原理并结合实例形式分析了建造者模式的具体定义与使用方法,需要的朋友可以参考下
    2018-08-08
  • PHP的Yii框架中YiiBase入口类的扩展写法示例

    PHP的Yii框架中YiiBase入口类的扩展写法示例

    这篇文章主要介绍了PHP的Yii框架中YiiBase入口类的扩展写法示例,同时详细讲解了import和autoload这两个YiiBase中的重要方法,需要的朋友可以参考下
    2016-03-03
  • PHP+MySQL实现模糊查询员工信息功能示例

    PHP+MySQL实现模糊查询员工信息功能示例

    这篇文章主要介绍了PHP+MySQL实现模糊查询员工信息功能,结合实例形式分析了php连接mysql数据库及使用like语句进行模糊查询与显示相关操作技巧,需要的朋友可以参考下
    2018-06-06
  • centos下file_put_contents()无法写入文件的原因及解决方法

    centos下file_put_contents()无法写入文件的原因及解决方法

    下面小编就为大家带来一篇centos下file_put_contents()无法写入文件的原因及解决方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-04-04
  • 浅谈Laravel中如何对大文件进行加密

    浅谈Laravel中如何对大文件进行加密

    在Laravel项目中,用户可以上传任何大小的文件,出于安全目的,需要对这些文件进行静态加密。Laravel提供encryption, 但它们主要用于加密值。 使用encrypt助手方法对像图像文件进行加密可以很好地工作,文件内容需要加载到内存中,对于大文件来说是个问题。
    2021-05-05

最新评论