Skip to content

Commit b4856c1

Browse files
committed
Use Widevine KEYID or parse Playready when level keys are present
Update keyUriToKeyIdMap set after KEY_LOADING
1 parent 997b05b commit b4856c1

1 file changed

Lines changed: 17 additions & 9 deletions

File tree

src/loader/level-key.ts

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,10 @@ export class LevelKey implements DecryptData {
178178
}
179179
if (!this.keyId) {
180180
this.keyId = getKeyIdFromPlayReadyKey(levelKeys);
181+
if (!this.keyId) {
182+
const offset = keyBytes.length - 22;
183+
this.keyId = keyBytes.subarray(offset, offset + 16);
184+
}
181185
}
182186
break;
183187
case KeySystemFormats.PLAYREADY: {
@@ -207,18 +211,22 @@ export class LevelKey implements DecryptData {
207211
}
208212
}
209213

210-
// Default behavior: get keyId from other KEY tag or URI lookup
211-
if (this.keyId?.byteLength !== 16) {
212-
let keyId: Uint8Array<ArrayBuffer> | null | undefined;
213-
keyId = getKeyIdFromWidevineKey(levelKeys);
214+
// Default behavior: assign a new keyId for each uri
215+
if (!this.keyId || this.keyId.byteLength !== 16) {
216+
let keyId: Uint8Array<ArrayBuffer> | null | undefined =
217+
keyUriToKeyIdMap[this.uri];
214218
if (!keyId) {
215-
keyId = getKeyIdFromPlayReadyKey(levelKeys);
219+
keyId = getKeyIdFromWidevineKey(levelKeys);
216220
if (!keyId) {
217-
keyId = keyUriToKeyIdMap[this.uri];
221+
keyId = getKeyIdFromPlayReadyKey(levelKeys);
222+
if (!keyId) {
223+
const val =
224+
Object.keys(keyUriToKeyIdMap).length % Number.MAX_SAFE_INTEGER;
225+
keyId = new Uint8Array(16);
226+
const dv = new DataView(keyId.buffer, 12, 4); // Just set the last 4 bytes
227+
dv.setUint32(0, val);
228+
}
218229
}
219-
}
220-
if (keyId) {
221-
this.keyId = keyId;
222230
LevelKey.setKeyIdForUri(this.uri, keyId);
223231
}
224232
}

0 commit comments

Comments
 (0)