feat: added support for ncm (#15)
This commit is contained in:
parent
b0fc56519e
commit
117351a6e5
@ -20,7 +20,7 @@
|
||||
"@chakra-ui/react": "^2.6.1",
|
||||
"@emotion/react": "^11.11.0",
|
||||
"@emotion/styled": "^11.11.0",
|
||||
"@jixun/libparakeet": "0.0.0-exp.18",
|
||||
"@jixun/libparakeet": "0.0.0-exp.19",
|
||||
"@reduxjs/toolkit": "^1.9.5",
|
||||
"framer-motion": "^10.12.12",
|
||||
"nanoid": "^4.0.2",
|
||||
|
@ -14,8 +14,8 @@ dependencies:
|
||||
specifier: ^11.11.0
|
||||
version: 11.11.0(@emotion/react@11.11.0)(@types/react@18.2.6)(react@18.2.0)
|
||||
'@jixun/libparakeet':
|
||||
specifier: 0.0.0-exp.18
|
||||
version: 0.0.0-exp.18
|
||||
specifier: 0.0.0-exp.19
|
||||
version: 0.0.0-exp.19
|
||||
'@reduxjs/toolkit':
|
||||
specifier: ^1.9.5
|
||||
version: 1.9.5(react-redux@8.0.5)(react@18.2.0)
|
||||
@ -3060,9 +3060,9 @@ packages:
|
||||
chalk: 4.1.2
|
||||
dev: true
|
||||
|
||||
/@jixun/libparakeet@0.0.0-exp.18:
|
||||
/@jixun/libparakeet@0.0.0-exp.19:
|
||||
resolution:
|
||||
{ integrity: sha512-KLUCxr6x47hDs1tszY8uyR8fgiB+b2UIFSgCg9GEs+AiB+oFTyQlhZXbKmyfDOuWSDiBcdKJvmXq29x3zPDNEQ== }
|
||||
{ integrity: sha512-FePuE49fCIRppzTJzaeISJhtvf1mFyU4MpVlQigmlR2CLAXtEkJz0HhsoumJwzcWv6UQJMUSagtXoTa8pxZ4ww== }
|
||||
dev: false
|
||||
|
||||
/@jridgewell/gen-mapping@0.3.3:
|
||||
|
@ -1,4 +1,5 @@
|
||||
import { CryptoFactory } from './CryptoBase';
|
||||
import { NCMCrypto } from './ncm/ncm_pc';
|
||||
|
||||
import { QMC1Crypto } from './qmc/qmc_v1';
|
||||
import { QMC2Crypto } from './qmc/qmc_v2';
|
||||
@ -12,6 +13,9 @@ export const allCryptoFactories: CryptoFactory[] = [
|
||||
// QMCv2 (*.mflac)
|
||||
QMC2Crypto.make,
|
||||
|
||||
// NCM (*.ncm)
|
||||
NCMCrypto.make,
|
||||
|
||||
// Crypto that does not implement "checkBySignature" or need to decrypt the entire file and then check audio type,
|
||||
// should be moved to the bottom of the list for performance reasons.
|
||||
|
||||
|
2
src/decrypt-worker/crypto/ncm/ncm_pc.key.ts
Normal file
2
src/decrypt-worker/crypto/ncm/ncm_pc.key.ts
Normal file
@ -0,0 +1,2 @@
|
||||
export const NCM_KEY = 'hzHRAmso5kInbaxW';
|
||||
export const NCM_MAGIC_HEADER = new Uint8Array([0x43, 0x54, 0x45, 0x4e, 0x46, 0x44, 0x41, 0x4d]);
|
21
src/decrypt-worker/crypto/ncm/ncm_pc.ts
Normal file
21
src/decrypt-worker/crypto/ncm/ncm_pc.ts
Normal file
@ -0,0 +1,21 @@
|
||||
import { transformBlob } from '~/decrypt-worker/util/transformBlob';
|
||||
import type { CryptoBase } from '../CryptoBase';
|
||||
import { NCM_KEY, NCM_MAGIC_HEADER } from './ncm_pc.key';
|
||||
|
||||
export class NCMCrypto implements CryptoBase {
|
||||
cryptoName = 'NCM/PC';
|
||||
checkByDecryptHeader = false;
|
||||
|
||||
async checkBySignature(buffer: ArrayBuffer) {
|
||||
const view = new DataView(buffer, 0, NCM_MAGIC_HEADER.byteLength);
|
||||
return NCM_MAGIC_HEADER.every((value, i) => value === view.getUint8(i));
|
||||
}
|
||||
|
||||
async decrypt(buffer: ArrayBuffer): Promise<Blob> {
|
||||
return transformBlob(buffer, (p) => p.make.NeteaseNCM(NCM_KEY));
|
||||
}
|
||||
|
||||
public static make() {
|
||||
return new NCMCrypto();
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user