酷狗音樂採用專有 KRC 格式 歌詞(加密壓縮),本文從 Flash 播放器逆向分析出解密算法,提供完整 PHP 解析與 LRC 轉換代碼。
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) { return; }
krcBytes.position = 0;
this.myLyric.dataStr = krcBytes.readUTFBytes(krcBytes.length);
}
$enKey = [64, 71, 97, 119, 94, 50, 116, 71, 81, 54, 49, 45, 206, 210, 110, 105];
$krc_content = substr($krc_content, 4); // 跳過前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
function krc2lrc($krc_content, $glue = "\n") {
$enKey = [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);
// 提取元數據 [ar:...][ti:...][offset:...]
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, '
');
<開始,結束,顏色> 等 KRC 專有標記