酷狗音樂的緩存文件(.kgtemp)實際上已是完整的 MP3 數據,只是文件名經過 MD5 重命名。同時緩存目錄下還有對應的歌詞文件(.krc),文件名包含歌曲名與 MD5。本文提供工具類,自動匹配並將緩存文件轉為「歌曲名.mp3」。
歌曲名-MD5.krc,提取歌曲名與 MD5。歌曲名.mp3。package com.zhou.run;
import java.io.File;
import java.util.HashMap;
import java.util.Map;
public class KugouTempFileToMp3AndModifyNameToTrueName {
public static final String KGTEMP = ".kgtemp";
public static final String KRC = "krc";
/** 單文件測試用 */
public void change(String tempPath, String krcPath) {
File temp = new File(tempPath);
File krc = new File(krcPath);
if (!temp.exists() || !temp.getName().endsWith(KGTEMP) || !krc.exists()) return;
String tempMd5 = temp.getName().substring(0, temp.getName().lastIndexOf(KGTEMP));
String krcName = krc.getName();
String krcMd5 = krcName.substring(krcName.lastIndexOf("-") + 1, krcName.lastIndexOf(KRC) - 1);
String mp3Name = krcName.substring(0, krcName.lastIndexOf("-"));
if (krcMd5.equals(tempMd5)) {
String dir = temp.getParent();
File mp3File = new File(dir + File.separator + mp3Name + ".mp3");
temp.renameTo(mp3File);
}
}
/** 批量處理目錄(推薦使用) */
public void changeByDir(String tempDir, String krcDir) {
Map<String, File> tempMap = fileMd5Map(tempDir);
Map<String, String> mp3NameMap = krcNameMd5Map(krcDir);
for (String md5 : tempMap.keySet()) {
File tempFile = tempMap.get(md5);
String mp3Name = mp3NameMap.get(md5);
if (tempFile.exists() && mp3Name != null) {
File mp3File = new File(tempFile.getParent() + File.separator + mp3Name + ".mp3");
if (tempFile.renameTo(mp3File)) {
System.out.println(tempFile.getName() + " -> " + mp3File.getName() + " SUCCESS");
}
}
}
}
private Map<String, File> fileMd5Map(String path) {
Map<String, File> map = new HashMap<>();
File dir = new File(path);
if (dir.isDirectory()) {
for (File f : dir.listFiles()) {
if (f.isFile() && f.getName().endsWith(KGTEMP)) {
String md5 = f.getName().substring(0, f.getName().lastIndexOf(KGTEMP));
map.put(md5, f);
}
}
}
return map;
}
private Map<String, String> krcNameMd5Map(String path) {
Map<String, String> map = new HashMap<>();
File dir = new File(path);
if (dir.isDirectory()) {
for (File f : dir.listFiles()) {
if (f.isFile() && f.getName().endsWith(KRC) && f.getName().contains("-")) {
String name = f.getName();
String md5 = name.substring(name.lastIndexOf("-") + 1, name.lastIndexOf(KRC) - 1);
String mp3Name = name.substring(0, name.lastIndexOf("-"));
map.put(md5, mp3Name);
}
}
}
return map;
}
public static void main(String[] args) {
KugouTempFileToMp3AndModifyNameToTrueName tool = new KugouTempFileToMp3AndModifyNameToTrueName();
tool.changeByDir("D:/KuGou/mp3", "D:/KuGou/Lyric");
}
}
main 方法中的緩存目錄與歌詞目錄路徑。File.separator 以兼容跨平台。