@li0ard/widevine
Simple Widevine CDM implementation
docs
# from NPM
npm i @li0ard/widevine
# from JSR
bunx jsr add @li0ard/widevine
import { CDM, PSSH, Device, DeviceType, KeyType } from "@li0ard/widevine";
const device = Device.decode(
DeviceType.ANDROID,
Buffer.from("....", "base64"),
Buffer.from("....", "base64")
);
const cdm = new CDM(device);
const sessionId = cdm.open();
const pssh = PSSH.decode(Buffer.from("....", "base64"));
const challenge = cdm.get_license_challenge(sessionId, pssh);
const license = await (await fetch(`https://cwip-shaka-proxy.appspot.com/no_auth`, {
method: "POST",
body: challenge
})).arrayBuffer();
for(const key of cdm.parse_license(sessionId, new Uint8Array(license)))
console.log(`- [${KeyType[key.type]}] ${bytesToHex(key.kid)}:${bytesToHex(key.key)}`);
cdm.close(sessionId);