1
0
forked from um/web

Fix Qmc Mask Query

This commit is contained in:
MengYX 2020-04-26 14:32:32 +08:00
parent f9543965b6
commit dd965688a9
No known key found for this signature in database
GPG Key ID: E63F9C7303E8F604
2 changed files with 10 additions and 6 deletions

View File

@ -15,6 +15,7 @@
"fix-compatibility": "node ./src/fix-compatibility.js" "fix-compatibility": "node ./src/fix-compatibility.js"
}, },
"dependencies": { "dependencies": {
"base64-js": "^1.3.1",
"browser-id3-writer": "^4.4.0", "browser-id3-writer": "^4.4.0",
"core-js": "^3.6.4", "core-js": "^3.6.4",
"crypto-js": "^4.0.0", "crypto-js": "^4.0.0",

View File

@ -1,7 +1,8 @@
import {AudioMimeType, DetectAudioExt, GetArrayBuffer, GetFileInfo, GetMetaCoverURL, RequestJsonp} from "./util"; import {AudioMimeType, DetectAudioExt, GetArrayBuffer, GetFileInfo, GetMetaCoverURL, RequestJsonp} from "./util";
import {QmcMaskCreate58, QmcMaskDetectMflac, QmcMaskDetectMgg, QmcMaskGetDefault} from "./qmcMask"; 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"); 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)); const fileData = new Uint8Array(await GetArrayBuffer(file));
let audioData, seed, keyData; let audioData, seed, keyData;
if (handler.detect) { 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); 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) seed = await queryKeyInfo(keyData, raw_filename, raw_ext);
if (seed === undefined) return {status: false, message: raw_ext + "格式仅提供实验性支持"}; if (seed === undefined) return {status: false, message: raw_ext + "格式仅提供实验性支持"};
} else { } else {
@ -76,7 +79,7 @@ function reportKeyUsage(keyData, maskData, artist, title, album, filename, forma
method: "POST", method: "POST",
headers: {"Content-Type": "application/json"}, headers: {"Content-Type": "application/json"},
body: JSON.stringify({ 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 Artist: artist, Title: title, Album: album, Filename: filename, Format: format
}), }),
}).then().catch() }).then().catch()
@ -87,10 +90,10 @@ async function queryKeyInfo(keyData, filename, format) {
const resp = await fetch("https://stats.ixarea.com/collect/qmcmask/query", { const resp = await fetch("https://stats.ixarea.com/collect/qmcmask/query", {
method: "POST", method: "POST",
headers: {"Content-Type": "application/json"}, 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(); let data = await resp.json();
return QmcMaskCreate58(data.Matrix58, data.Super58A, data.Super58B); return QmcMaskCreate58(Base64Decode(data.Matrix44));
} catch (e) { } catch (e) {
console.log(e); console.log(e);
} }