將酷狗krc歌詞解析并轉(zhuǎn)換為lrc歌詞php源碼
最近在進(jìn)行一次對(duì)酷狗音樂(lè)歌詞采集時(shí)發(fā)現(xiàn)酷狗音樂(lè)的歌詞直接瀏覽都是“亂碼”,自己平時(shí)所見(jiàn)的歌詞都是lrc格式的文本,這種酷狗專用的krc格式的顯然是經(jīng)過(guò)特別處理過(guò)的,平時(shí)用酷狗聽(tīng)音樂(lè)也沒(méi)仔細(xì)看他的歌詞有什么不同,只是與天天靜聽(tīng)等不同的是可以逐字高亮顯示歌詞。
對(duì)酷狗的flash播放器進(jìn)行反編譯,發(fā)現(xiàn)這段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;
}
根據(jù)這段代碼可以很快轉(zhuǎn)換成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歌詞壓縮加密的文本內(nèi)容,得到了解析后的krc明文文本歌詞$krc_text,然后就可以很容易的轉(zhuǎn)換成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;
}
簡(jiǎn)單示例如下:
$content = file_get_contents('1.krc');
echo krc2lrc($content,'<br/>');
- php獲取從百度、谷歌等搜索引擎進(jìn)入網(wǎng)站關(guān)鍵詞的方法
- php實(shí)現(xiàn)搜索一維數(shù)組元素并刪除二維數(shù)組對(duì)應(yīng)元素的方法
- PHP查找與搜索數(shù)組元素方法總結(jié)
- php 批量查詢搜狗sogou代碼分享
- php站內(nèi)搜索關(guān)鍵詞變亮的實(shí)現(xiàn)方法
- php啟用sphinx全文搜索的實(shí)現(xiàn)方法
- 谷歌音樂(lè)搜索欄的提示功能php修正代碼
- PHP實(shí)現(xiàn)網(wǎng)上點(diǎn)歌(二)
- PHP實(shí)現(xiàn)簡(jiǎn)單搜歌的方法
相關(guān)文章
PHP設(shè)計(jì)模式之狀態(tài)模式定義與用法詳解
這篇文章主要介紹了PHP設(shè)計(jì)模式之狀態(tài)模式定義與用法,結(jié)合實(shí)例形式分析了php狀態(tài)模式的概念、原理、定義、使用方法及相關(guān)注意事項(xiàng),需要的朋友可以參考下2018-04-04
DW中鏈接mysql數(shù)據(jù)庫(kù)時(shí),建立字符集中文出現(xiàn)亂碼的解決方法
DW中鏈接mysql數(shù)據(jù)庫(kù)時(shí),建立字符集中文出現(xiàn)亂碼“????”2010-03-03
php在多維數(shù)組中根據(jù)鍵名快速查詢其父鍵以及父鍵值的代碼
有一個(gè)多維數(shù)組,有多少維大家可以自定義。假如我們要在這個(gè)數(shù)組中找一個(gè)鍵為'subIndex'的值,我們可以用for、foreach等方法遍歷查找 反過(guò)來(lái),假如我們?nèi)我饨o出一個(gè)或多個(gè)鍵,要求找出這個(gè)鍵的父級(jí)數(shù)組的鍵和值。這又如何實(shí)現(xiàn)?2011-05-05
PHP代碼加密和擴(kuò)展解密實(shí)戰(zhàn)
這篇文章主要介紹了PHP代碼加密和擴(kuò)展解密實(shí)戰(zhàn),對(duì)加密解密感興趣的同學(xué),可以參考下2021-04-04
總結(jié)PHP刪除字符串最后一個(gè)字符的三種方法
這篇文章為大家講解的是php實(shí)現(xiàn)如何去掉字符串的最后一個(gè)字符的多種方法,感興趣的同學(xué)參考下。下面來(lái)一起看看。2016-08-08
php實(shí)現(xiàn)過(guò)濾UBB代碼的類
這篇文章主要介紹了php實(shí)現(xiàn)過(guò)濾UBB代碼的類,涉及php正則表達(dá)式的操作技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-03-03
php實(shí)現(xiàn)多維數(shù)組中每個(gè)單元值(數(shù)字)翻倍的方法
這篇文章主要介紹了php實(shí)現(xiàn)多維數(shù)組中每個(gè)單元值(數(shù)字)翻倍的方法,涉及php操作數(shù)組的技巧,需要的朋友可以參考下2015-02-02

