|
|
|
@ -1,7 +1,8 @@
|
|
|
|
|
import {AudioMimeType, DetectAudioExt, GetArrayBuffer, GetFileInfo, GetMetaCoverURL, RequestJsonp} from "./util";
|
|
|
|
|
import {QmcMaskCreate58, QmcMaskDetectMflac, QmcMaskDetectMgg, QmcMaskGetDefault} from "./qmcMask";
|
|
|
|
|
|
|
|
|
|
import {decode} from "iconv-lite"
|
|
|
|
|
|
|
|
|
|
import {fromByteArray as Base64Encode, toByteArray as Base64Decode} from 'base64-js'
|
|
|
|
|
|
|
|
|
|
const musicMetadata = require("music-metadata-browser");
|
|
|
|
|
|
|
|
|
@ -25,9 +26,11 @@ export async function Decrypt(file, raw_filename, raw_ext) {
|
|
|
|
|
const fileData = new Uint8Array(await GetArrayBuffer(file));
|
|
|
|
|
let audioData, seed, keyData;
|
|
|
|
|
if (handler.detect) {
|
|
|
|
|
audioData = fileData.slice(0, -0x170);
|
|
|
|
|
const keyLen = new DataView(fileData.slice(fileData.length - 4).buffer).getUint32(0, true)
|
|
|
|
|
const keyPos = fileData.length - 4 - keyLen;
|
|
|
|
|
audioData = fileData.slice(0, keyPos);
|
|
|
|
|
seed = handler.handler(audioData);
|
|
|
|
|
keyData = fileData.slice(-0x170);
|
|
|
|
|
keyData = fileData.slice(keyPos, keyPos + keyLen);
|
|
|
|
|
if (seed === undefined) seed = await queryKeyInfo(keyData, raw_filename, raw_ext);
|
|
|
|
|
if (seed === undefined) return {status: false, message: raw_ext + "格式仅提供实验性支持"};
|
|
|
|
|
} else {
|
|
|
|
@ -76,7 +79,7 @@ function reportKeyUsage(keyData, maskData, artist, title, album, filename, forma
|
|
|
|
|
method: "POST",
|
|
|
|
|
headers: {"Content-Type": "application/json"},
|
|
|
|
|
body: JSON.stringify({
|
|
|
|
|
Mask: Array.from(maskData), Key: Array.from(keyData),
|
|
|
|
|
Mask: Base64Encode(new Uint8Array(maskData)), Key: Base64Encode(keyData),
|
|
|
|
|
Artist: artist, Title: title, Album: album, Filename: filename, Format: format
|
|
|
|
|
}),
|
|
|
|
|
}).then().catch()
|
|
|
|
@ -87,10 +90,10 @@ async function queryKeyInfo(keyData, filename, format) {
|
|
|
|
|
const resp = await fetch("https://stats.ixarea.com/collect/qmcmask/query", {
|
|
|
|
|
method: "POST",
|
|
|
|
|
headers: {"Content-Type": "application/json"},
|
|
|
|
|
body: JSON.stringify({Format: format, Key: Array.from(keyData), Filename: filename}),
|
|
|
|
|
body: JSON.stringify({Format: format, Key: Base64Encode(keyData), Filename: filename, Type: 44}),
|
|
|
|
|
});
|
|
|
|
|
let data = await resp.json();
|
|
|
|
|
return QmcMaskCreate58(data.Matrix58, data.Super58A, data.Super58B);
|
|
|
|
|
return QmcMaskCreate58(Base64Decode(data.Matrix44));
|
|
|
|
|
} catch (e) {
|
|
|
|
|
console.log(e);
|
|
|
|
|
}
|
|
|
|
|