feat: add basic joox support

This commit is contained in:
Jixun
2021-12-19 23:03:46 +00:00
parent 0e06549e04
commit 699333ca06
13 changed files with 207 additions and 16 deletions

View File

@@ -5,6 +5,7 @@ import { Decrypt as KgmDecrypt } from '@/decrypt/kgm';
import { Decrypt as KwmDecrypt } from '@/decrypt/kwm';
import { Decrypt as RawDecrypt } from '@/decrypt/raw';
import { Decrypt as TmDecrypt } from '@/decrypt/tm';
import { Decrypt as JooxDecrypt } from '@/decrypt/joox';
import { DecryptResult, FileInfo } from '@/decrypt/entity';
import { SplitFilename } from '@/decrypt/utils';
@@ -60,6 +61,9 @@ export async function CommonDecrypt(file: FileInfo): Promise<DecryptResult> {
case 'kgma':
rt_data = await KgmDecrypt(file.raw, raw.name, raw.ext);
break;
case 'ofl_en':
rt_data = await JooxDecrypt(file.raw, raw.name, raw.ext);
break;
default:
throw '不支持此文件格式';
}

34
src/decrypt/joox.ts Normal file
View File

@@ -0,0 +1,34 @@
import { DecryptResult } from './entity';
import { AudioMimeType, GetArrayBuffer, SniffAudioExt } from './utils';
import jooxFactory from '@unlock-music-gh/joox-crypto';
import storage from '@/utils/storage';
import { MergeUint8Array } from '@/utils/MergeUint8Array';
export async function Decrypt(file: Blob, raw_filename: string, raw_ext: string): Promise<DecryptResult> {
const uuid = await storage.loadJooxUUID('');
if (!uuid || uuid.length !== 32) {
throw new Error('请在“解密设定”填写应用 Joox 应用的 UUID。');
}
const fileBuffer = new Uint8Array(await GetArrayBuffer(file));
const decryptor = jooxFactory(fileBuffer, uuid);
if (!decryptor) {
throw new Error('不支持的 joox 加密格式');
}
const musicDecoded = MergeUint8Array(decryptor.decryptFile(fileBuffer));
const ext = SniffAudioExt(musicDecoded);
const mime = AudioMimeType[ext];
const musicBlob = new Blob([musicDecoded], { type: mime });
return {
title: raw_filename.replace(/\.[^\.]+$/, ''),
artist: '未知',
album: '未知',
file: URL.createObjectURL(musicBlob),
blob: musicBlob,
mime: mime,
ext: ext,
};
}

View File

@@ -1,4 +1,5 @@
import QMCCryptoModule from '@jixun/qmc2-crypto/QMC2-wasm-bundle';
import { MergeUint8Array } from '@/utils/MergeUint8Array';
// 检测文件末端使用的缓冲区大小
const DETECTION_SIZE = 40;
@@ -6,22 +7,6 @@ const DETECTION_SIZE = 40;
// 每次处理 2M 的数据
const DECRYPTION_BUF_SIZE = 2 * 1024 * 1024;
function MergeUint8Array(array: Uint8Array[]): Uint8Array {
let length = 0;
array.forEach((item) => {
length += item.length;
});
let mergedArray = new Uint8Array(length);
let offset = 0;
array.forEach((item) => {
mergedArray.set(item, offset);
offset += item.length;
});
return mergedArray;
}
/**
* 解密一个 QMC2 加密的文件。
*