2021-12-21 22:34:18 +00:00
|
|
|
import { AudioMimeType, GetArrayBuffer, SniffAudioExt } from '@/decrypt/utils';
|
2020-02-11 06:33:45 +00:00
|
|
|
|
2021-12-18 13:55:31 +00:00
|
|
|
import { DecryptResult } from '@/decrypt/entity';
|
2022-11-20 14:30:56 +00:00
|
|
|
import { DecryptQmcWasm } from '@/decrypt/qmc_wasm';
|
2021-12-21 22:34:18 +00:00
|
|
|
import { extractQQMusicMeta } from '@/utils/qm_meta';
|
2020-04-05 11:18:56 +00:00
|
|
|
|
2021-05-23 22:50:20 +00:00
|
|
|
interface Handler {
|
2021-12-18 13:55:31 +00:00
|
|
|
ext: string;
|
|
|
|
version: number;
|
2021-05-23 22:50:20 +00:00
|
|
|
}
|
|
|
|
|
2021-06-03 04:47:06 +00:00
|
|
|
export const HandlerMap: { [key: string]: Handler } = {
|
2021-12-18 13:55:31 +00:00
|
|
|
mgg: { ext: 'ogg', version: 2 },
|
2022-01-21 03:38:58 +00:00
|
|
|
mgg0: { ext: 'ogg', version: 2 },
|
|
|
|
mggl: { ext: 'ogg', version: 2 },
|
2021-12-18 13:55:31 +00:00
|
|
|
mgg1: { ext: 'ogg', version: 2 },
|
|
|
|
mflac: { ext: 'flac', version: 2 },
|
|
|
|
mflac0: { ext: 'flac', version: 2 },
|
2023-01-19 12:33:23 +00:00
|
|
|
mmp4: { ext: 'mp4', version: 2 },
|
2021-12-15 23:07:51 +00:00
|
|
|
|
|
|
|
// qmcflac / qmcogg:
|
|
|
|
// 有可能是 v2 加密但混用同一个后缀名。
|
2021-12-18 13:55:31 +00:00
|
|
|
qmcflac: { ext: 'flac', version: 2 },
|
|
|
|
qmcogg: { ext: 'ogg', version: 2 },
|
|
|
|
|
2022-11-20 14:30:56 +00:00
|
|
|
qmc0: { ext: 'mp3', version: 2 },
|
|
|
|
qmc2: { ext: 'ogg', version: 2 },
|
|
|
|
qmc3: { ext: 'mp3', version: 2 },
|
2023-01-19 11:41:01 +00:00
|
|
|
qmc4: { ext: 'ogg', version: 2 },
|
|
|
|
qmc6: { ext: 'ogg', version: 2 },
|
|
|
|
qmc8: { ext: 'ogg', version: 2 },
|
2021-12-18 13:55:31 +00:00
|
|
|
bkcmp3: { ext: 'mp3', version: 1 },
|
2023-01-19 11:41:01 +00:00
|
|
|
bkcm4a: { ext: 'm4a', version: 1 },
|
2021-12-18 13:55:31 +00:00
|
|
|
bkcflac: { ext: 'flac', version: 1 },
|
2023-01-19 11:41:01 +00:00
|
|
|
bkcwav: { ext: 'wav', version: 1 },
|
|
|
|
bkcape: { ext: 'ape', version: 1 },
|
|
|
|
bkcogg: { ext: 'ogg', version: 1 },
|
|
|
|
bkcwma: { ext: 'wma', version: 1 },
|
2021-12-18 13:55:31 +00:00
|
|
|
tkm: { ext: 'm4a', version: 1 },
|
|
|
|
'666c6163': { ext: 'flac', version: 1 },
|
|
|
|
'6d7033': { ext: 'mp3', version: 1 },
|
|
|
|
'6f6767': { ext: 'ogg', version: 1 },
|
|
|
|
'6d3461': { ext: 'm4a', version: 1 },
|
|
|
|
'776176': { ext: 'wav', version: 1 },
|
2021-12-15 19:59:06 +00:00
|
|
|
};
|
2021-12-15 13:53:50 +00:00
|
|
|
|
2021-06-03 04:47:06 +00:00
|
|
|
export async function Decrypt(file: Blob, raw_filename: string, raw_ext: string): Promise<DecryptResult> {
|
2021-12-15 23:07:51 +00:00
|
|
|
if (!(raw_ext in HandlerMap)) throw `Qmc cannot handle type: ${raw_ext}`;
|
|
|
|
const handler = HandlerMap[raw_ext];
|
2021-12-18 13:55:31 +00:00
|
|
|
let { version } = handler;
|
2021-12-15 23:07:51 +00:00
|
|
|
|
|
|
|
const fileBuffer = await GetArrayBuffer(file);
|
2023-01-19 12:33:23 +00:00
|
|
|
let musicDecoded = new Uint8Array();
|
2021-12-25 12:07:14 +00:00
|
|
|
let musicID: number | string | undefined;
|
|
|
|
|
|
|
|
if (version === 2 && globalThis.WebAssembly) {
|
2022-11-20 14:30:56 +00:00
|
|
|
const v2Decrypted = await DecryptQmcWasm(fileBuffer, raw_ext);
|
2021-12-25 12:07:14 +00:00
|
|
|
// 若 v2 检测失败,降级到 v1 再尝试一次
|
|
|
|
if (v2Decrypted.success) {
|
|
|
|
musicDecoded = v2Decrypted.data;
|
|
|
|
musicID = v2Decrypted.songId;
|
2022-11-20 14:30:56 +00:00
|
|
|
console.log('qmc wasm decoder suceeded');
|
2021-12-25 12:07:14 +00:00
|
|
|
} else {
|
2023-01-19 12:33:23 +00:00
|
|
|
throw new Error(v2Decrypted.error || '(unknown error)');
|
2021-12-25 12:07:14 +00:00
|
|
|
}
|
|
|
|
}
|
2021-12-15 23:07:51 +00:00
|
|
|
|
|
|
|
const ext = SniffAudioExt(musicDecoded, handler.ext);
|
|
|
|
const mime = AudioMimeType[ext];
|
|
|
|
|
2021-12-21 22:34:18 +00:00
|
|
|
const { album, artist, imgUrl, blob, title } = await extractQQMusicMeta(
|
|
|
|
new Blob([musicDecoded], { type: mime }),
|
|
|
|
raw_filename,
|
|
|
|
ext,
|
2021-12-25 06:41:05 +00:00
|
|
|
musicID,
|
2021-12-21 22:34:18 +00:00
|
|
|
);
|
2021-12-15 23:07:51 +00:00
|
|
|
|
|
|
|
return {
|
2021-12-21 22:34:18 +00:00
|
|
|
title: title,
|
|
|
|
artist: artist,
|
2021-12-15 23:07:51 +00:00
|
|
|
ext: ext,
|
2021-12-21 22:34:18 +00:00
|
|
|
album: album,
|
2021-12-15 23:07:51 +00:00
|
|
|
picture: imgUrl,
|
2021-12-21 22:34:18 +00:00
|
|
|
file: URL.createObjectURL(blob),
|
|
|
|
blob: blob,
|
2021-12-18 13:55:31 +00:00
|
|
|
mime: mime,
|
|
|
|
};
|
2019-07-05 07:05:11 +00:00
|
|
|
}
|