將酷狗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ù)實(shí)現(xiàn)漢字分割替換功能示例
這篇文章主要介紹了php使用自定義函數(shù)實(shí)現(xiàn)漢字分割替換功能,結(jié)合實(shí)例形式分析了php針對(duì)漢字的遍歷、轉(zhuǎn)換與分割操作相關(guān)技巧,需要的朋友可以參考下2017-01-01如何通過(guò)Apache在本地配置多個(gè)虛擬主機(jī)
這篇文章主要介紹了如何通過(guò)Apache在本地配置多個(gè)虛擬主機(jī),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07Discuz 5.0 中讀取純真IP數(shù)據(jù)庫(kù)函數(shù)分析
Discuz 5.0 中讀取純真IP數(shù)據(jù)庫(kù)函數(shù)分析...2007-03-03php簡(jiǎn)單實(shí)現(xiàn)文件或圖片強(qiáng)制下載的方法
這篇文章主要介紹了php簡(jiǎn)單實(shí)現(xiàn)文件或圖片強(qiáng)制下載的方法,通過(guò)自定義函數(shù)實(shí)現(xiàn)文件或圖片的簡(jiǎn)單讀取、輸出相關(guān)操作技巧,需要的朋友可以參考下2016-12-12PHP合并數(shù)組函數(shù)array_merge用法分析
這篇文章主要介紹了PHP合并數(shù)組函數(shù)array_merge用法,結(jié)合實(shí)例形式分析了php數(shù)組合并函數(shù)array_merge的具體功能、使用方法與相關(guān)注意事項(xiàng),需要的朋友可以參考下2017-02-02完美利用Yii2微信后臺(tái)開(kāi)發(fā)的系列總結(jié)
Yii2是一個(gè)高性能,基于組件的 PHP 框架,這篇文章詳細(xì)的給大家介紹了利用Yii2開(kāi)發(fā)微信后臺(tái)。我們一起來(lái)看看。2016-07-07php+Ajax無(wú)刷新驗(yàn)證用戶名操作實(shí)例詳解
這篇文章主要介紹了php+Ajax無(wú)刷新驗(yàn)證用戶名操作,簡(jiǎn)單介紹了ajax的原理并結(jié)合實(shí)例形式分析了php結(jié)合ajax無(wú)刷新驗(yàn)證用戶名相關(guān)操作技巧,需要的朋友可以參考下2019-03-03