酷狗krc歌詞解析並轉換為lrc歌詞php版

來源:互聯網
上載者:User

最近在進行一次對酷狗音樂歌詞採集時發現酷狗音樂的歌詞直接瀏覽都是“亂碼”,自己平時所見的歌詞都是lrc格式的文本,這種酷狗專用的krc格式的顯然是經過特別處理過的,平時用酷狗聽音樂也沒仔細看他的歌詞有什麼不同,只是與天天靜聽等不同的是可以逐字高亮顯示歌詞。

於是搜尋了下發現有個java版的半成品解密代碼,測試了下竟然還是“亂碼”,巨坑!於是只有採用最原始的辦法,對酷狗的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歌詞了,如下:

 代碼如下 複製代碼

/**
 * krc歌詞解析並轉換為lrc歌詞
 * $Name: krc2lrc  2014-4-18  qaulau<qaulau@hotmail.com>$
 *
 * @param string $krc_content 加密的krc歌詞內容
 * @param string $glue   處理後的lrc歌詞串連字元,預設為分行符號n
 */
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/>');

分享一下,方便日後有類似需要的人查詢!

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.