From ae25bd87f5e9a53989ddf3971fe6702b403bf3b7 Mon Sep 17 00:00:00 2001 From: yajin2021 Date: Fri, 18 Jul 2025 14:54:03 +0800 Subject: [PATCH] fix: support Widevine and Playready Hardware DRM. --- api-extractor/report/hls.js.api.md | 14 ++++++++++++++ src/controller/eme-controller.ts | 18 ++++++++---------- src/events.ts | 7 +++++++ src/hls.ts | 1 + src/types/events.ts | 5 +++++ 5 files changed, 35 insertions(+), 10 deletions(-) diff --git a/api-extractor/report/hls.js.api.md b/api-extractor/report/hls.js.api.md index 2d780afb20b..e046c50400e 100644 --- a/api-extractor/report/hls.js.api.md +++ b/api-extractor/report/hls.js.api.md @@ -1503,6 +1503,8 @@ export enum Events { // (undocumented) KEY_LOADING = "hlsKeyLoading", // (undocumented) + KEY_STATUSES_CHANGED = "hlsKeyStatusesChanged", + // (undocumented) LEVEL_LOADED = "hlsLevelLoaded", // (undocumented) LEVEL_LOADING = "hlsLevelLoading", @@ -2401,6 +2403,8 @@ export interface HlsListeners { // (undocumented) [Events.KEY_LOADING]: (event: Events.KEY_LOADING, data: KeyLoadingData) => void; // (undocumented) + [Events.KEY_STATUSES_CHANGED]: (event: Events.KEY_STATUSES_CHANGED, data: KeyStatusesChangedData) => void; + // (undocumented) [Events.LEVEL_LOADED]: (event: Events.LEVEL_LOADED, data: LevelLoadedData) => void; // (undocumented) [Events.LEVEL_LOADING]: (event: Events.LEVEL_LOADING, data: LevelLoadingData) => void; @@ -3036,6 +3040,16 @@ export interface KeyLoadingData { frag: Fragment; } +// Warning: (ae-missing-release-tag) "KeyStatusesChangedData" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export interface KeyStatusesChangedData { + // (undocumented) + keyStatuses: MediaKeyStatusMap; + // (undocumented) + keySystem: string; +} + // Warning: (ae-missing-release-tag) "KeySystemFormats" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) diff --git a/src/controller/eme-controller.ts b/src/controller/eme-controller.ts index 5ce41a32e2e..b4ad16794c9 100644 --- a/src/controller/eme-controller.ts +++ b/src/controller/eme-controller.ts @@ -680,6 +680,11 @@ class EMEController extends Logger implements ComponentAPI { this.warn(`${context.keySystem} expired for key ${keyId}`); this.renewKeySession(context); } + + this.hls.trigger(Events.KEY_STATUSES_CHANGED, { + keySystem: context.decryptdata.keyFormat, + keyStatuses: keySession.keyStatuses, + }); }); addEventListener(context.mediaKeysSession, 'message', onmessage); @@ -708,16 +713,9 @@ class EMEController extends Logger implements ComponentAPI { ), ); } else if (keyStatus === 'internal-error') { - reject( - new EMEKeyError( - { - type: ErrorTypes.KEY_SYSTEM_ERROR, - details: ErrorDetails.KEY_SYSTEM_STATUS_INTERNAL_ERROR, - fatal: true, - }, - `key status changed to "${keyStatus}"`, - ), - ); + // resolve for Hardware DRM + this.warn('keyStatus: internal-error'); + resolve(); } else if (keyStatus === 'expired') { reject(new Error('key expired while generating request')); } else { diff --git a/src/events.ts b/src/events.ts index 4a13a65adb9..722749ad054 100644 --- a/src/events.ts +++ b/src/events.ts @@ -40,6 +40,7 @@ import type { InterstitialsUpdatedData, KeyLoadedData, KeyLoadingData, + KeyStatusesChangedData, LevelLoadedData, LevelLoadingData, LevelPTSUpdatedData, @@ -220,6 +221,8 @@ export enum Events { PLAYOUT_LIMIT_REACHED = 'hlsPlayoutLimitReached', // Event DateRange cue "enter" event dispatched EVENT_CUE_ENTER = 'hlsEventCueEnter', + // HD DRM + KEY_STATUSES_CHANGED = 'hlsKeyStatusesChanged', } /** @@ -496,6 +499,10 @@ export interface HlsListeners { data: {}, ) => void; [Events.EVENT_CUE_ENTER]: (event: Events.EVENT_CUE_ENTER, data: {}) => void; + [Events.KEY_STATUSES_CHANGED]: ( + event: Events.KEY_STATUSES_CHANGED, + data: KeyStatusesChangedData, + ) => void; } export interface HlsEventEmitter { on( diff --git a/src/hls.ts b/src/hls.ts index 663cb277885..59f1ecd34de 100644 --- a/src/hls.ts +++ b/src/hls.ts @@ -1417,6 +1417,7 @@ export type { BufferFlushingData, CuesParsedData, ErrorData, + KeyStatusesChangedData, FPSDropData, FPSDropLevelCappingData, FragBufferedData, diff --git a/src/types/events.ts b/src/types/events.ts index 2d88349ec5c..7a28b21084b 100644 --- a/src/types/events.ts +++ b/src/types/events.ts @@ -252,6 +252,11 @@ export interface LevelPTSUpdatedData { end: number; } +export interface KeyStatusesChangedData { + keySystem: string; + keyStatuses: MediaKeyStatusMap; +} + export interface AudioTrackSwitchingData extends MediaPlaylist {} export interface AudioTrackSwitchedData extends MediaPlaylist {}