unified-video-framework 1.4.412 → 1.4.414

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (147) hide show
  1. package/package.json +6 -1
  2. package/packages/core/dist/interfaces/IVideoPlayer.d.ts +0 -22
  3. package/packages/core/dist/interfaces/IVideoPlayer.d.ts.map +1 -1
  4. package/packages/core/src/BasePlayer.d.ts +61 -0
  5. package/packages/core/src/BasePlayer.d.ts.map +1 -0
  6. package/packages/core/src/BasePlayer.js +175 -0
  7. package/packages/core/src/BasePlayer.js.map +1 -0
  8. package/packages/core/src/VideoPlayerFactory.d.ts +8 -0
  9. package/packages/core/src/VideoPlayerFactory.d.ts.map +1 -0
  10. package/packages/core/src/VideoPlayerFactory.js +95 -0
  11. package/packages/core/src/VideoPlayerFactory.js.map +1 -0
  12. package/packages/core/src/analytics/adapters/PlayerAnalyticsAdapter.d.ts +18 -0
  13. package/packages/core/src/analytics/adapters/PlayerAnalyticsAdapter.d.ts.map +1 -0
  14. package/packages/core/src/analytics/adapters/PlayerAnalyticsAdapter.js +117 -0
  15. package/packages/core/src/analytics/adapters/PlayerAnalyticsAdapter.js.map +1 -0
  16. package/packages/core/src/analytics/core/AnalyticsProvider.d.ts +18 -0
  17. package/packages/core/src/analytics/core/AnalyticsProvider.d.ts.map +1 -0
  18. package/packages/core/src/analytics/core/AnalyticsProvider.js +99 -0
  19. package/packages/core/src/analytics/core/AnalyticsProvider.js.map +1 -0
  20. package/packages/core/src/analytics/core/DynamicAnalyticsManager.d.ts +20 -0
  21. package/packages/core/src/analytics/core/DynamicAnalyticsManager.d.ts.map +1 -0
  22. package/packages/core/src/analytics/core/DynamicAnalyticsManager.js +161 -0
  23. package/packages/core/src/analytics/core/DynamicAnalyticsManager.js.map +1 -0
  24. package/packages/core/src/analytics/core/EventBatcher.d.ts +32 -0
  25. package/packages/core/src/analytics/core/EventBatcher.d.ts.map +1 -0
  26. package/packages/core/src/analytics/core/EventBatcher.js +98 -0
  27. package/packages/core/src/analytics/core/EventBatcher.js.map +1 -0
  28. package/packages/core/src/analytics/core/PlayerAnalytics.d.ts +19 -0
  29. package/packages/core/src/analytics/core/PlayerAnalytics.d.ts.map +1 -0
  30. package/packages/core/src/analytics/core/PlayerAnalytics.js +80 -0
  31. package/packages/core/src/analytics/core/PlayerAnalytics.js.map +1 -0
  32. package/packages/core/src/analytics/index.d.ts +13 -0
  33. package/packages/core/src/analytics/index.d.ts.map +1 -0
  34. package/packages/core/src/analytics/index.js +13 -0
  35. package/packages/core/src/analytics/index.js.map +1 -0
  36. package/packages/core/src/analytics/types/AnalyticsTypes.d.ts +239 -0
  37. package/packages/core/src/analytics/types/AnalyticsTypes.d.ts.map +1 -0
  38. package/packages/core/src/analytics/types/AnalyticsTypes.js +8 -0
  39. package/packages/core/src/analytics/types/AnalyticsTypes.js.map +1 -0
  40. package/packages/core/src/analytics/utils/DeviceDetection.d.ts +27 -0
  41. package/packages/core/src/analytics/utils/DeviceDetection.d.ts.map +1 -0
  42. package/packages/core/src/analytics/utils/DeviceDetection.js +184 -0
  43. package/packages/core/src/analytics/utils/DeviceDetection.js.map +1 -0
  44. package/packages/core/src/chapter-manager.d.ts +39 -0
  45. package/packages/core/src/chapter-manager.d.ts.map +1 -0
  46. package/packages/core/src/chapter-manager.js +173 -0
  47. package/packages/core/src/chapter-manager.js.map +1 -0
  48. package/packages/core/src/index.d.ts +10 -0
  49. package/packages/core/src/index.d.ts.map +1 -0
  50. package/packages/core/src/index.js +8 -0
  51. package/packages/core/src/index.js.map +1 -0
  52. package/packages/core/src/interfaces/IVideoPlayer.d.ts +229 -0
  53. package/packages/core/src/interfaces/IVideoPlayer.d.ts.map +1 -0
  54. package/packages/core/src/interfaces/IVideoPlayer.js +2 -0
  55. package/packages/core/src/interfaces/IVideoPlayer.js.map +1 -0
  56. package/packages/core/src/interfaces/IVideoPlayer.ts +0 -27
  57. package/packages/core/src/interfaces.d.ts +455 -0
  58. package/packages/core/src/interfaces.d.ts.map +1 -0
  59. package/packages/core/src/interfaces.js +32 -0
  60. package/packages/core/src/interfaces.js.map +1 -0
  61. package/packages/core/src/utils/EventEmitter.d.ts +14 -0
  62. package/packages/core/src/utils/EventEmitter.d.ts.map +1 -0
  63. package/packages/core/src/utils/EventEmitter.js +55 -0
  64. package/packages/core/src/utils/EventEmitter.js.map +1 -0
  65. package/packages/web/dist/WebPlayer.d.ts +0 -4
  66. package/packages/web/dist/WebPlayer.d.ts.map +1 -1
  67. package/packages/web/dist/WebPlayer.js +62 -73
  68. package/packages/web/dist/WebPlayer.js.map +1 -1
  69. package/packages/web/dist/drm/DRMManager.d.ts +16 -9
  70. package/packages/web/dist/drm/DRMManager.d.ts.map +1 -1
  71. package/packages/web/dist/drm/DRMManager.js +109 -42
  72. package/packages/web/dist/drm/DRMManager.js.map +1 -1
  73. package/packages/web/dist/drm/index.d.ts +15 -0
  74. package/packages/web/dist/drm/index.d.ts.map +1 -0
  75. package/packages/web/dist/drm/index.js +13 -0
  76. package/packages/web/dist/drm/index.js.map +1 -0
  77. package/packages/web/dist/drm/providers/BunnyNetProvider.d.ts +19 -0
  78. package/packages/web/dist/drm/providers/BunnyNetProvider.d.ts.map +1 -0
  79. package/packages/web/dist/drm/providers/BunnyNetProvider.js +112 -0
  80. package/packages/web/dist/drm/providers/BunnyNetProvider.js.map +1 -0
  81. package/packages/web/dist/drm/providers/GenericProvider.d.ts +30 -0
  82. package/packages/web/dist/drm/providers/GenericProvider.d.ts.map +1 -0
  83. package/packages/web/dist/drm/providers/GenericProvider.js +104 -0
  84. package/packages/web/dist/drm/providers/GenericProvider.js.map +1 -0
  85. package/packages/web/dist/drm/systems/BaseDRM.d.ts +18 -0
  86. package/packages/web/dist/drm/systems/BaseDRM.d.ts.map +1 -0
  87. package/packages/web/dist/drm/systems/BaseDRM.js +29 -0
  88. package/packages/web/dist/drm/systems/BaseDRM.js.map +1 -0
  89. package/packages/web/dist/drm/systems/FairPlayDRM.d.ts +32 -0
  90. package/packages/web/dist/drm/systems/FairPlayDRM.d.ts.map +1 -0
  91. package/packages/web/dist/drm/systems/FairPlayDRM.js +198 -0
  92. package/packages/web/dist/drm/systems/FairPlayDRM.js.map +1 -0
  93. package/packages/web/dist/drm/systems/PlayReadyDRM.d.ts +9 -0
  94. package/packages/web/dist/drm/systems/PlayReadyDRM.d.ts.map +1 -0
  95. package/packages/web/dist/drm/systems/PlayReadyDRM.js +92 -0
  96. package/packages/web/dist/drm/systems/PlayReadyDRM.js.map +1 -0
  97. package/packages/web/dist/drm/systems/WidevineDRM.d.ts +9 -0
  98. package/packages/web/dist/drm/systems/WidevineDRM.d.ts.map +1 -0
  99. package/packages/web/dist/drm/systems/WidevineDRM.js +73 -0
  100. package/packages/web/dist/drm/systems/WidevineDRM.js.map +1 -0
  101. package/packages/web/dist/drm/types/BunnyNetTypes.d.ts +20 -0
  102. package/packages/web/dist/drm/types/BunnyNetTypes.d.ts.map +1 -0
  103. package/packages/web/dist/drm/types/BunnyNetTypes.js +8 -0
  104. package/packages/web/dist/drm/types/BunnyNetTypes.js.map +1 -0
  105. package/packages/web/dist/drm/types/DRMTypes.d.ts +56 -49
  106. package/packages/web/dist/drm/types/DRMTypes.d.ts.map +1 -1
  107. package/packages/web/dist/drm/types/DRMTypes.js +19 -13
  108. package/packages/web/dist/drm/types/DRMTypes.js.map +1 -1
  109. package/packages/web/dist/drm/utils/BrowserDetector.d.ts +20 -0
  110. package/packages/web/dist/drm/utils/BrowserDetector.d.ts.map +1 -0
  111. package/packages/web/dist/drm/utils/BrowserDetector.js +168 -0
  112. package/packages/web/dist/drm/utils/BrowserDetector.js.map +1 -0
  113. package/packages/web/dist/drm/utils/CertificateManager.d.ts +15 -0
  114. package/packages/web/dist/drm/utils/CertificateManager.d.ts.map +1 -0
  115. package/packages/web/dist/drm/utils/CertificateManager.js +46 -0
  116. package/packages/web/dist/drm/utils/CertificateManager.js.map +1 -0
  117. package/packages/web/dist/drm/utils/DRMErrorHandler.d.ts +7 -0
  118. package/packages/web/dist/drm/utils/DRMErrorHandler.d.ts.map +1 -0
  119. package/packages/web/dist/drm/utils/DRMErrorHandler.js +49 -0
  120. package/packages/web/dist/drm/utils/DRMErrorHandler.js.map +1 -0
  121. package/packages/web/dist/drm/utils/LicenseRequestHandler.d.ts +15 -0
  122. package/packages/web/dist/drm/utils/LicenseRequestHandler.d.ts.map +1 -0
  123. package/packages/web/dist/drm/utils/LicenseRequestHandler.js +110 -0
  124. package/packages/web/dist/drm/utils/LicenseRequestHandler.js.map +1 -0
  125. package/packages/web/dist/react/WebPlayerView.d.ts +1 -18
  126. package/packages/web/dist/react/WebPlayerView.d.ts.map +1 -1
  127. package/packages/web/dist/react/WebPlayerView.js +0 -5
  128. package/packages/web/dist/react/WebPlayerView.js.map +1 -1
  129. package/packages/web/src/WebPlayer.ts +79 -106
  130. package/packages/web/src/drm/DRMManager.ts +214 -99
  131. package/packages/web/src/drm/index.ts +37 -0
  132. package/packages/web/src/drm/providers/BunnyNetProvider.ts +171 -0
  133. package/packages/web/src/drm/providers/GenericProvider.ts +151 -0
  134. package/packages/web/src/drm/systems/BaseDRM.ts +68 -0
  135. package/packages/web/src/drm/systems/FairPlayDRM.ts +306 -0
  136. package/packages/web/src/drm/systems/PlayReadyDRM.ts +132 -0
  137. package/packages/web/src/drm/systems/WidevineDRM.ts +106 -0
  138. package/packages/web/src/drm/types/BunnyNetTypes.ts +35 -0
  139. package/packages/web/src/drm/types/DRMTypes.ts +92 -97
  140. package/packages/web/src/drm/utils/BrowserDetector.ts +233 -0
  141. package/packages/web/src/drm/utils/CertificateManager.ts +86 -0
  142. package/packages/web/src/drm/utils/DRMErrorHandler.ts +84 -0
  143. package/packages/web/src/drm/utils/LicenseRequestHandler.ts +180 -0
  144. package/packages/web/src/react/WebPlayerView.tsx +1 -28
  145. package/packages/web/src/drm/BunnyCDNDRMProvider.ts +0 -104
  146. package/packages/web/src/drm/FairPlayDRMHandler.ts +0 -322
  147. package/packages/web/src/drm/WidevineDRMHandler.ts +0 -246
@@ -1,99 +1,214 @@
1
- /**
2
- * DRM Manager
3
- * Main orchestrator for web DRM - detects browser and initializes appropriate handler
4
- */
5
-
6
- import { IDRMHandler, WebDRMConfig, DRMError } from './types/DRMTypes';
7
- import { WidevineDRMHandler } from './WidevineDRMHandler';
8
- import { FairPlayDRMHandler } from './FairPlayDRMHandler';
9
-
10
- export class DRMManager {
11
- private handler: IDRMHandler | null = null;
12
- private config: WebDRMConfig;
13
-
14
- constructor(config: WebDRMConfig) {
15
- this.config = config;
16
- }
17
-
18
- /**
19
- * Detect browser and return appropriate DRM handler
20
- */
21
- private detectDRMHandler(): IDRMHandler {
22
- const userAgent = navigator.userAgent.toLowerCase();
23
- const isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent);
24
-
25
- if (isSafari) {
26
- console.log('[DRM] Detected Safari - using FairPlay DRM');
27
- return new FairPlayDRMHandler(this.config);
28
- } else {
29
- console.log('[DRM] Detected non-Safari browser - using Widevine DRM');
30
- return new WidevineDRMHandler(this.config);
31
- }
32
- }
33
-
34
- /**
35
- * Initialize DRM system
36
- */
37
- async initialize(): Promise<void> {
38
- console.log('[DRM] Initializing DRM Manager...');
39
-
40
- try {
41
- // Detect and create appropriate handler
42
- this.handler = this.detectDRMHandler();
43
-
44
- // Check if DRM is supported
45
- if (!this.handler.isSupported()) {
46
- throw new DRMError(
47
- 'DRM is not supported in this browser',
48
- 'DRM_NOT_SUPPORTED'
49
- );
50
- }
51
-
52
- // Initialize the handler
53
- await this.handler.initialize();
54
- console.log('[DRM] DRM Manager initialized successfully');
55
-
56
- } catch (error) {
57
- console.error('[DRM] Failed to initialize DRM Manager:', error);
58
- throw error;
59
- }
60
- }
61
-
62
- /**
63
- * Setup DRM for video element and manifest
64
- */
65
- async setupDRM(videoElement: HTMLVideoElement, manifestUrl: string): Promise<void> {
66
- if (!this.handler) {
67
- throw new DRMError('DRM Manager not initialized', 'DRM_NOT_INITIALIZED');
68
- }
69
-
70
- console.log('[DRM] Setting up DRM for video element');
71
- await this.handler.setupDRM(videoElement, manifestUrl);
72
- }
73
-
74
- /**
75
- * Check if DRM is currently active
76
- */
77
- isActive(): boolean {
78
- return this.handler !== null;
79
- }
80
-
81
- /**
82
- * Get current DRM handler type
83
- */
84
- getHandlerType(): 'widevine' | 'fairplay' | null {
85
- if (!this.handler) return null;
86
- return this.handler instanceof FairPlayDRMHandler ? 'fairplay' : 'widevine';
87
- }
88
-
89
- /**
90
- * Cleanup DRM resources
91
- */
92
- destroy(): void {
93
- if (this.handler) {
94
- console.log('[DRM] Destroying DRM Manager');
95
- this.handler.destroy();
96
- this.handler = null;
97
- }
98
- }
99
- }
1
+ /**
2
+ * DRM Manager
3
+ * Main orchestrator for all DRM systems
4
+ * Provides a unified interface for HLS.js, dash.js, and native playback
5
+ */
6
+
7
+ import type { DRMType, DRMConfig } from '@unified-video/core';
8
+ import { DRMType as DRMTypeEnum } from '@unified-video/core';
9
+ import { ExtendedDRMConfig, DRMInitResult, DRMError, DRMErrorCode, DRMCapabilities } from './types/DRMTypes';
10
+ import { BrowserDetector } from './utils/BrowserDetector';
11
+ import { BunnyNetProvider } from './providers/BunnyNetProvider';
12
+ import { WidevineDRM } from './systems/WidevineDRM';
13
+ import { FairPlayDRM } from './systems/FairPlayDRM';
14
+ import { PlayReadyDRM } from './systems/PlayReadyDRM';
15
+ import { BaseDRM } from './systems/BaseDRM';
16
+ import { DRMErrorHandler } from './utils/DRMErrorHandler';
17
+
18
+ export class DRMManager {
19
+ private videoElement: HTMLVideoElement;
20
+ private config: ExtendedDRMConfig;
21
+ private drmSystem: BaseDRM | null = null;
22
+ private browserDetector: BrowserDetector;
23
+ private debug: boolean = false;
24
+
25
+ constructor(videoElement: HTMLVideoElement, config: DRMConfig, debug: boolean = false) {
26
+ this.videoElement = videoElement;
27
+ this.config = this.normalizeConfig(config);
28
+ this.debug = debug || this.config.debug || false;
29
+ this.browserDetector = BrowserDetector.getInstance();
30
+ }
31
+
32
+ /**
33
+ * Initialize DRM system based on browser capabilities
34
+ */
35
+ async initialize(): Promise<DRMInitResult> {
36
+ try {
37
+ this.log('Initializing DRM system...');
38
+
39
+ // Detect browser capabilities
40
+ const capabilities = await this.browserDetector.detectCapabilities();
41
+ this.log('Browser DRM capabilities:', capabilities);
42
+
43
+ // Determine which DRM system to use
44
+ const drmType = this.selectDRMType(capabilities);
45
+ if (!drmType) {
46
+ const browserName = this.browserDetector.getBrowserName();
47
+ throw DRMErrorHandler.createError(
48
+ DRMErrorCode.UNSUPPORTED_BROWSER,
49
+ `No supported DRM system found in ${browserName}. Please use Chrome, Safari, Firefox, or Edge.`,
50
+ true,
51
+ { browser: browserName, capabilities }
52
+ );
53
+ }
54
+
55
+ this.log(`Selected DRM type: ${drmType}`);
56
+
57
+ // Create appropriate DRM system
58
+ this.drmSystem = this.createDRMSystem(drmType);
59
+
60
+ // Initialize the DRM system
61
+ await this.drmSystem.initialize();
62
+
63
+ return {
64
+ success: true,
65
+ drmType,
66
+ keySystem: this.drmSystem.getKeySystem(),
67
+ };
68
+ } catch (error: any) {
69
+ this.log('DRM initialization failed:', error);
70
+
71
+ const drmError = error.code && error.code.startsWith('DRM_')
72
+ ? error
73
+ : DRMErrorHandler.createError(
74
+ DRMErrorCode.CONFIGURATION_ERROR,
75
+ error.message || 'DRM initialization failed',
76
+ true,
77
+ error
78
+ );
79
+
80
+ return {
81
+ success: false,
82
+ drmType: this.config.type,
83
+ keySystem: '',
84
+ error: drmError,
85
+ };
86
+ }
87
+ }
88
+
89
+ /**
90
+ * Get HLS.js configuration for DRM
91
+ */
92
+ getHLSConfig(): any {
93
+ if (!this.drmSystem) {
94
+ throw new Error('DRM system not initialized. Call initialize() first.');
95
+ }
96
+
97
+ return this.drmSystem.getHLSConfig();
98
+ }
99
+
100
+ /**
101
+ * Get dash.js protection data for DRM
102
+ */
103
+ getDashProtectionData(): any {
104
+ if (!this.drmSystem) {
105
+ throw new Error('DRM system not initialized. Call initialize() first.');
106
+ }
107
+
108
+ return this.drmSystem.getDashProtectionData();
109
+ }
110
+
111
+ /**
112
+ * Cleanup DRM resources
113
+ */
114
+ async destroy(): Promise<void> {
115
+ if (this.drmSystem) {
116
+ this.log('Destroying DRM system');
117
+ await this.drmSystem.destroy();
118
+ this.drmSystem = null;
119
+ }
120
+ }
121
+
122
+ /**
123
+ * Select appropriate DRM type based on config and capabilities
124
+ */
125
+ private selectDRMType(capabilities: DRMCapabilities): DRMType | null {
126
+ // If config specifies a type and it's supported, use it
127
+ if (this.config.type) {
128
+ const typeSupported = this.isDRMTypeSupported(this.config.type, capabilities);
129
+ if (typeSupported) {
130
+ return this.config.type;
131
+ }
132
+
133
+ this.log(`Requested DRM type ${this.config.type} not supported, falling back to browser default`);
134
+ }
135
+
136
+ // Otherwise, use browser's preferred DRM system
137
+ return capabilities.supportedType;
138
+ }
139
+
140
+ /**
141
+ * Check if specific DRM type is supported
142
+ */
143
+ private isDRMTypeSupported(drmType: DRMType, capabilities: DRMCapabilities): boolean {
144
+ switch (drmType) {
145
+ case DRMTypeEnum.WIDEVINE:
146
+ return capabilities.widevine;
147
+ case DRMTypeEnum.FAIRPLAY:
148
+ return capabilities.fairplay;
149
+ case DRMTypeEnum.PLAYREADY:
150
+ return capabilities.playready;
151
+ default:
152
+ return false;
153
+ }
154
+ }
155
+
156
+ /**
157
+ * Create DRM system instance
158
+ */
159
+ private createDRMSystem(drmType: DRMType): BaseDRM {
160
+ switch (drmType) {
161
+ case DRMTypeEnum.FAIRPLAY:
162
+ return new FairPlayDRM(this.videoElement, this.config, this.debug);
163
+
164
+ case DRMTypeEnum.WIDEVINE:
165
+ return new WidevineDRM(this.videoElement, this.config, this.debug);
166
+
167
+ case DRMTypeEnum.PLAYREADY:
168
+ return new PlayReadyDRM(this.videoElement, this.config, this.debug);
169
+
170
+ default:
171
+ throw DRMErrorHandler.createError(
172
+ DRMErrorCode.CONFIGURATION_ERROR,
173
+ `Unsupported DRM type: ${drmType}`,
174
+ true
175
+ );
176
+ }
177
+ }
178
+
179
+ /**
180
+ * Normalize and enrich DRM config
181
+ */
182
+ private normalizeConfig(config: DRMConfig): ExtendedDRMConfig {
183
+ const extended = { ...config } as ExtendedDRMConfig;
184
+
185
+ // Auto-detect Bunny.net and enhance config
186
+ if (BunnyNetProvider.isBunnyNetConfig(config)) {
187
+ extended.provider = 'bunny';
188
+
189
+ // Extract IDs if available
190
+ const ids = BunnyNetProvider.extractIdsFromUrl(config.licenseUrl);
191
+ if (ids.libraryId) extended.libraryId = ids.libraryId;
192
+ if (ids.videoId) extended.videoId = ids.videoId;
193
+
194
+ this.log('Detected Bunny.net DRM configuration');
195
+ }
196
+
197
+ // Set defaults
198
+ extended.retryConfig = extended.retryConfig || {
199
+ maxRetries: 3,
200
+ retryDelay: 1000,
201
+ };
202
+
203
+ return extended;
204
+ }
205
+
206
+ /**
207
+ * Debug logging
208
+ */
209
+ private log(...args: any[]): void {
210
+ if (this.debug) {
211
+ console.log('[DRMManager]', ...args);
212
+ }
213
+ }
214
+ }
@@ -0,0 +1,37 @@
1
+ /**
2
+ * DRM System - Public API
3
+ * Exports for the DRM system
4
+ */
5
+
6
+ // Main DRM Manager
7
+ export { DRMManager } from './DRMManager';
8
+
9
+ // Providers
10
+ export { BunnyNetProvider } from './providers/BunnyNetProvider';
11
+ export { GenericProvider } from './providers/GenericProvider';
12
+
13
+ // Types
14
+ export type {
15
+ ExtendedDRMConfig,
16
+ DRMCapabilities,
17
+ LicenseRequest,
18
+ LicenseResponse,
19
+ DRMInitResult,
20
+ DRMError,
21
+ } from './types/DRMTypes';
22
+
23
+ export { DRMErrorCode, KEY_SYSTEMS } from './types/DRMTypes';
24
+
25
+ export type { BunnyNetConfig, BunnyNetEndpoints } from './types/BunnyNetTypes';
26
+ export { BUNNY_NET_BASE_URL, BUNNY_NET_ENDPOINTS } from './types/BunnyNetTypes';
27
+
28
+ // Utilities
29
+ export { BrowserDetector } from './utils/BrowserDetector';
30
+ export { DRMErrorHandler } from './utils/DRMErrorHandler';
31
+ export { CertificateManager } from './utils/CertificateManager';
32
+
33
+ // DRM Systems (for advanced usage)
34
+ export { BaseDRM } from './systems/BaseDRM';
35
+ export { WidevineDRM } from './systems/WidevineDRM';
36
+ export { FairPlayDRM } from './systems/FairPlayDRM';
37
+ export { PlayReadyDRM } from './systems/PlayReadyDRM';
@@ -0,0 +1,171 @@
1
+ /**
2
+ * Bunny.net DRM Provider
3
+ * Helper utilities for Bunny.net MediaCage DRM integration
4
+ */
5
+
6
+ import type { DRMType, DRMConfig } from '@unified-video/core';
7
+ import { DRMType as DRMTypeEnum } from '@unified-video/core';
8
+ import { ExtendedDRMConfig } from '../types/DRMTypes';
9
+ import { BunnyNetConfig, BUNNY_NET_ENDPOINTS } from '../types/BunnyNetTypes';
10
+
11
+ export class BunnyNetProvider {
12
+ /**
13
+ * Generate complete DRM config from Bunny.net credentials
14
+ */
15
+ static createDRMConfig(config: BunnyNetConfig): ExtendedDRMConfig {
16
+ const { libraryId, videoId, drmType = DRMTypeEnum.WIDEVINE } = config;
17
+
18
+ const drmConfig: ExtendedDRMConfig = {
19
+ type: drmType,
20
+ licenseUrl: this.getLicenseUrl(drmType, libraryId, videoId),
21
+ provider: 'bunny',
22
+ libraryId,
23
+ videoId,
24
+ };
25
+
26
+ // Add FairPlay-specific settings
27
+ if (drmType === DRMTypeEnum.FAIRPLAY) {
28
+ drmConfig.certificateUrl = this.getCertificateUrl(libraryId);
29
+ drmConfig.fairplayOptions = {
30
+ certificateUrl: this.getCertificateUrl(libraryId),
31
+ licenseUrl: this.getLicenseUrl(drmType, libraryId, videoId),
32
+ };
33
+ }
34
+
35
+ // Add Widevine-specific settings
36
+ if (drmType === DRMTypeEnum.WIDEVINE) {
37
+ drmConfig.widevineOptions = {
38
+ licenseUrl: this.getLicenseUrl(drmType, libraryId, videoId),
39
+ };
40
+ }
41
+
42
+ // Add PlayReady-specific settings
43
+ if (drmType === DRMTypeEnum.PLAYREADY) {
44
+ drmConfig.playreadyOptions = {
45
+ licenseUrl: this.getLicenseUrl(drmType, libraryId, videoId),
46
+ };
47
+ }
48
+
49
+ return drmConfig;
50
+ }
51
+
52
+ /**
53
+ * Get license URL for specific DRM type
54
+ */
55
+ static getLicenseUrl(drmType: DRMType, libraryId: string, videoId: string): string {
56
+ switch (drmType) {
57
+ case DRMTypeEnum.WIDEVINE:
58
+ return BUNNY_NET_ENDPOINTS.WIDEVINE_LICENSE(libraryId, videoId);
59
+
60
+ case DRMTypeEnum.FAIRPLAY:
61
+ return BUNNY_NET_ENDPOINTS.FAIRPLAY_LICENSE(libraryId, videoId);
62
+
63
+ case DRMTypeEnum.PLAYREADY:
64
+ return BUNNY_NET_ENDPOINTS.PLAYREADY_LICENSE(libraryId, videoId);
65
+
66
+ default:
67
+ throw new Error(`Unsupported DRM type for Bunny.net: ${drmType}`);
68
+ }
69
+ }
70
+
71
+ /**
72
+ * Get certificate URL (FairPlay only)
73
+ */
74
+ static getCertificateUrl(libraryId: string): string {
75
+ return BUNNY_NET_ENDPOINTS.FAIRPLAY_CERTIFICATE(libraryId);
76
+ }
77
+
78
+ /**
79
+ * Validate Bunny.net DRM configuration
80
+ */
81
+ static validateConfig(config: BunnyNetConfig): { valid: boolean; error?: string } {
82
+ if (!config.libraryId || !config.videoId) {
83
+ return {
84
+ valid: false,
85
+ error: 'Bunny.net DRM requires libraryId and videoId',
86
+ };
87
+ }
88
+
89
+ if (!/^\d+$/.test(config.libraryId)) {
90
+ return {
91
+ valid: false,
92
+ error: 'libraryId must be a numeric string',
93
+ };
94
+ }
95
+
96
+ return { valid: true };
97
+ }
98
+
99
+ /**
100
+ * Auto-detect if a DRM config is for Bunny.net
101
+ */
102
+ static isBunnyNetConfig(config: DRMConfig): boolean {
103
+ return !!(
104
+ config.licenseUrl?.includes('bunnycdn.com') ||
105
+ config.certificateUrl?.includes('bunnycdn.com') ||
106
+ config.fairplayOptions?.licenseUrl?.includes('bunnycdn.com') ||
107
+ config.fairplayOptions?.certificateUrl?.includes('bunnycdn.com') ||
108
+ config.widevineOptions?.licenseUrl?.includes('bunnycdn.com') ||
109
+ config.playreadyOptions?.licenseUrl?.includes('bunnycdn.com')
110
+ );
111
+ }
112
+
113
+ /**
114
+ * Extract library and video IDs from Bunny.net URLs
115
+ */
116
+ static extractIdsFromUrl(url: string): { libraryId?: string; videoId?: string } {
117
+ if (!url) return {};
118
+
119
+ const widevineMatch = url.match(/WidevineLicense\/([^/]+)\/([^/?]+)/);
120
+ const fairplayLicenseMatch = url.match(/FairPlay\/([^/]+)\/license.*videoId=([^&]+)/);
121
+ const fairplayCertMatch = url.match(/FairPlay\/([^/]+)\/certificate/);
122
+ const playreadyMatch = url.match(/PlayReadyLicense\/([^/]+)\/([^/?]+)/);
123
+
124
+ if (widevineMatch) {
125
+ return { libraryId: widevineMatch[1], videoId: widevineMatch[2] };
126
+ }
127
+ if (fairplayLicenseMatch) {
128
+ return { libraryId: fairplayLicenseMatch[1], videoId: fairplayLicenseMatch[2] };
129
+ }
130
+ if (fairplayCertMatch) {
131
+ return { libraryId: fairplayCertMatch[1] };
132
+ }
133
+ if (playreadyMatch) {
134
+ return { libraryId: playreadyMatch[1], videoId: playreadyMatch[2] };
135
+ }
136
+
137
+ return {};
138
+ }
139
+
140
+ /**
141
+ * Create multi-DRM config for Bunny.net (auto-detects browser)
142
+ */
143
+ static createMultiDRMConfig(libraryId: string, videoId: string): ExtendedDRMConfig {
144
+ // Primary Widevine config with FairPlay fallback
145
+ const config: ExtendedDRMConfig = {
146
+ type: DRMTypeEnum.WIDEVINE,
147
+ licenseUrl: this.getLicenseUrl(DRMTypeEnum.WIDEVINE, libraryId, videoId),
148
+ provider: 'bunny',
149
+ libraryId,
150
+ videoId,
151
+
152
+ // Widevine options
153
+ widevineOptions: {
154
+ licenseUrl: this.getLicenseUrl(DRMTypeEnum.WIDEVINE, libraryId, videoId),
155
+ },
156
+
157
+ // FairPlay options (for Safari fallback)
158
+ fairplayOptions: {
159
+ certificateUrl: this.getCertificateUrl(libraryId),
160
+ licenseUrl: this.getLicenseUrl(DRMTypeEnum.FAIRPLAY, libraryId, videoId),
161
+ },
162
+
163
+ // PlayReady options (for Edge fallback)
164
+ playreadyOptions: {
165
+ licenseUrl: this.getLicenseUrl(DRMTypeEnum.PLAYREADY, libraryId, videoId),
166
+ },
167
+ };
168
+
169
+ return config;
170
+ }
171
+ }
@@ -0,0 +1,151 @@
1
+ /**
2
+ * Generic DRM Provider
3
+ * Helper utilities for generic DRM configurations
4
+ */
5
+
6
+ import type { DRMType, DRMConfig } from '@unified-video/core';
7
+ import { ExtendedDRMConfig } from '../types/DRMTypes';
8
+
9
+ export class GenericProvider {
10
+ /**
11
+ * Create generic DRM config with sensible defaults
12
+ */
13
+ static createDRMConfig(config: {
14
+ drmType: DRMType;
15
+ licenseUrl: string;
16
+ certificateUrl?: string;
17
+ headers?: Record<string, string>;
18
+ customData?: string;
19
+ }): ExtendedDRMConfig {
20
+ const drmConfig: ExtendedDRMConfig = {
21
+ type: config.drmType,
22
+ licenseUrl: config.licenseUrl,
23
+ certificateUrl: config.certificateUrl,
24
+ headers: config.headers,
25
+ customData: config.customData,
26
+ provider: 'generic',
27
+ };
28
+
29
+ // Add type-specific options
30
+ const DRMTypeEnum = require('../../../core/src/interfaces').DRMType;
31
+ switch (config.drmType) {
32
+ case DRMTypeEnum.FAIRPLAY:
33
+ if (config.certificateUrl) {
34
+ drmConfig.fairplayOptions = {
35
+ certificateUrl: config.certificateUrl,
36
+ licenseUrl: config.licenseUrl,
37
+ };
38
+ }
39
+ break;
40
+
41
+ case DRMTypeEnum.WIDEVINE:
42
+ drmConfig.widevineOptions = {
43
+ licenseUrl: config.licenseUrl,
44
+ };
45
+ break;
46
+
47
+ case DRMTypeEnum.PLAYREADY:
48
+ drmConfig.playreadyOptions = {
49
+ licenseUrl: config.licenseUrl,
50
+ customData: config.customData,
51
+ };
52
+ break;
53
+ }
54
+
55
+ return drmConfig;
56
+ }
57
+
58
+ /**
59
+ * Validate generic DRM configuration
60
+ */
61
+ static validateConfig(config: DRMConfig): { valid: boolean; error?: string } {
62
+ if (!config.type) {
63
+ return {
64
+ valid: false,
65
+ error: 'DRM type is required',
66
+ };
67
+ }
68
+
69
+ if (!config.licenseUrl) {
70
+ return {
71
+ valid: false,
72
+ error: 'License URL is required',
73
+ };
74
+ }
75
+
76
+ // FairPlay requires certificate URL
77
+ const DRMTypeEnum = require('../../../core/src/interfaces').DRMType;
78
+ if (config.type === DRMTypeEnum.FAIRPLAY) {
79
+ const certificateUrl = config.certificateUrl || config.fairplayOptions?.certificateUrl;
80
+ if (!certificateUrl) {
81
+ return {
82
+ valid: false,
83
+ error: 'FairPlay requires certificateUrl',
84
+ };
85
+ }
86
+ }
87
+
88
+ // Validate URL format
89
+ try {
90
+ new URL(config.licenseUrl);
91
+ } catch (e) {
92
+ return {
93
+ valid: false,
94
+ error: 'Invalid license URL format',
95
+ };
96
+ }
97
+
98
+ if (config.certificateUrl) {
99
+ try {
100
+ new URL(config.certificateUrl);
101
+ } catch (e) {
102
+ return {
103
+ valid: false,
104
+ error: 'Invalid certificate URL format',
105
+ };
106
+ }
107
+ }
108
+
109
+ return { valid: true };
110
+ }
111
+
112
+ /**
113
+ * Create multi-DRM config for generic provider
114
+ */
115
+ static createMultiDRMConfig(config: {
116
+ widevine: { licenseUrl: string };
117
+ fairplay: { licenseUrl: string; certificateUrl: string };
118
+ playready?: { licenseUrl: string; customData?: string };
119
+ headers?: Record<string, string>;
120
+ }): ExtendedDRMConfig {
121
+ // Primary Widevine config with FairPlay and PlayReady fallbacks
122
+ const DRMTypeEnum = require('../../../core/src/interfaces').DRMType;
123
+ const drmConfig: ExtendedDRMConfig = {
124
+ type: DRMTypeEnum.WIDEVINE,
125
+ licenseUrl: config.widevine.licenseUrl,
126
+ provider: 'generic',
127
+ headers: config.headers,
128
+
129
+ // Widevine options
130
+ widevineOptions: {
131
+ licenseUrl: config.widevine.licenseUrl,
132
+ },
133
+
134
+ // FairPlay options
135
+ fairplayOptions: {
136
+ certificateUrl: config.fairplay.certificateUrl,
137
+ licenseUrl: config.fairplay.licenseUrl,
138
+ },
139
+
140
+ // PlayReady options (optional)
141
+ playreadyOptions: config.playready
142
+ ? {
143
+ licenseUrl: config.playready.licenseUrl,
144
+ customData: config.playready.customData,
145
+ }
146
+ : undefined,
147
+ };
148
+
149
+ return drmConfig;
150
+ }
151
+ }