• 技术文章 >后端开发 >php教程

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

    2016-06-01 11:51:46原创532
    酷狗

    最近在进行一次对酷狗音乐歌词采集时发现酷狗音乐的歌词直接浏览都是“乱码”,自己平时所见的歌词都是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("//",'',$matches[3][$k]);
     $lrc_text .= "[{$lrc_time}]{$lrc_cont}{$glue}";
     }
     }
     return $lrc_text;
    }
    

    简单示例如下:

    $content = file_get_contents('1.krc');
    echo krc2lrc($content,'
    ');
    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:krc lrc php源码
    上一篇:ThinkPHP模板中判断volist循环的最后一条记录的验证方法_PHP 下一篇:PHP实现的汉字拼音转换和公历农历转换类及使用示例_PHP
    VIP课程(WEB全栈开发)

    相关文章推荐

    • 【腾讯云】年中优惠,「专享618元」优惠券!• 循环有关问题求大神解答 小弟我的QQ是2509577255• 使用curl 提交表单(多维数组+文件)数据到服务器的有关问题 • 为什么小弟我配置的PHP5不支持MySQL • 网站领航的代码,有没有开源的推荐下 • ()检测用户名是否在数据库失败!
    1/1

    PHP中文网