Compare commits

...

3 Commits

Author SHA1 Message Date
486f1fe898 refactor: re-order decryption factory 2024-09-14 20:54:35 +01:00
8b628fd6ce refactor: slice NCM parsing 2024-09-14 20:54:10 +01:00
bb9529b877 fix: performance logging code 2024-09-14 20:53:44 +01:00
4 changed files with 24 additions and 13 deletions

2
.env
View File

@ -1,4 +1,4 @@
# Example environment file for vite to use. # Example environment file for vite to use.
# For more information, see: https://vitejs.dev/guide/env-and-mode.html # For more information, see: https://vitejs.dev/guide/env-and-mode.html
ENABLE_PERF_LOG=0 VITE_ENABLE_PERF_LOG=0

View File

@ -12,12 +12,7 @@ import { TransparentCrypto } from './transparent/transparent';
import { QingTingFM$Device } from './qtfm/qtfm_device'; import { QingTingFM$Device } from './qtfm/qtfm_device';
export const allCryptoFactories: CryptoFactory[] = [ export const allCryptoFactories: CryptoFactory[] = [
// Xiami (*.xm) /// File with fixed headers goes first.
XiamiCrypto.make,
// QMCv2 (*.mflac)
QMC2CryptoWithKey.make,
QMC2Crypto.make,
// NCM (*.ncm) // NCM (*.ncm)
NCMCrypto.make, NCMCrypto.make,
@ -28,6 +23,17 @@ export const allCryptoFactories: CryptoFactory[] = [
// KWMv1 (*.kwm) // KWMv1 (*.kwm)
KWMCrypto.make, KWMCrypto.make,
// Xiami (*.xm)
XiamiCrypto.make,
/// File with a fixed footer goes second
// QMCv2 (*.mflac)
QMC2CryptoWithKey.make,
QMC2Crypto.make,
/// File without an obvious header or footer goes last.
// Migu3D/Keyless (*.wav; *.m4a) // Migu3D/Keyless (*.wav; *.m4a)
MiguCrypto.make, MiguCrypto.make,

View File

@ -8,8 +8,13 @@ export class NCMCrypto implements CryptoBase {
ncm = new NCMFile(); ncm = new NCMFile();
async checkBySignature(buffer: ArrayBuffer) { async checkBySignature(buffer: ArrayBuffer) {
const data = new Uint8Array(buffer);
let len = 1024;
try { try {
this.ncm.open(new Uint8Array(buffer)); while (len !== 0) {
console.debug('NCM/open: read %d bytes', len);
len = this.ncm.open(data.subarray(0, len));
}
} catch (error) { } catch (error) {
return false; return false;
} }

View File

@ -1,25 +1,25 @@
import { wrapFunctionCall } from './fnWrapper'; import { wrapFunctionCall } from './fnWrapper';
export function timedLogger<R = unknown>(label: string, fn: () => R): R { export function timedLogger<R = unknown>(label: string, fn: () => R): R {
if (import.meta.env.ENABLE_PERF_LOG !== '1') { if (import.meta.env.VITE_ENABLE_PERF_LOG !== '1') {
return fn(); return fn();
} else { } else {
return wrapFunctionCall( return wrapFunctionCall(
() => console.time(label), () => console.time(label),
() => console.timeEnd(label), () => console.timeEnd(label),
fn fn,
); );
} }
} }
export function withGroupedLogs<R = unknown>(label: string, fn: () => R): R { export function withGroupedLogs<R = unknown>(label: string, fn: () => R): R {
if (import.meta.env.ENABLE_PERF_LOG !== '1') { if (import.meta.env.VITE_ENABLE_PERF_LOG !== '1') {
return fn(); return fn();
} else { } else {
return wrapFunctionCall( return wrapFunctionCall(
() => console.group(label), () => console.group(label),
() => (console.groupEnd as (label: string) => void)(label), () => (console.groupEnd as (label: string) => void)(label),
() => timedLogger(`${label}/total`, fn) () => timedLogger(`${label}/total`, fn),
); );
} }
} }
@ -37,7 +37,7 @@ const dummyLogger = {
}; };
export function getLogger() { export function getLogger() {
if (import.meta.env.ENABLE_PERF_LOG === '1') { if (import.meta.env.VITE_ENABLE_PERF_LOG === '1') {
return window.console; return window.console;
} else { } else {
return dummyLogger; return dummyLogger;