@@ -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