unified-video-framework 1.4.383 → 1.4.384
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.
- package/package.json +1 -1
- package/packages/core/dist/interfaces.d.ts +20 -1
- package/packages/core/dist/interfaces.d.ts.map +1 -1
- package/packages/core/src/interfaces.ts +41 -2
- package/packages/web/dist/WebPlayer.d.ts.map +1 -1
- package/packages/web/dist/WebPlayer.js +23 -1
- package/packages/web/dist/WebPlayer.js.map +1 -1
- package/packages/web/dist/drm/DRMHelper.d.ts +28 -0
- package/packages/web/dist/drm/DRMHelper.d.ts.map +1 -0
- package/packages/web/dist/drm/DRMHelper.js +117 -0
- package/packages/web/dist/drm/DRMHelper.js.map +1 -0
- package/packages/web/dist/react/WebPlayerView.d.ts +19 -1
- package/packages/web/dist/react/WebPlayerView.d.ts.map +1 -1
- package/packages/web/dist/react/WebPlayerView.js.map +1 -1
- package/packages/web/dist/security/CanvasVideoRenderer.d.ts +26 -0
- package/packages/web/dist/security/CanvasVideoRenderer.d.ts.map +1 -0
- package/packages/web/dist/security/CanvasVideoRenderer.js +143 -0
- package/packages/web/dist/security/CanvasVideoRenderer.js.map +1 -0
- package/packages/web/dist/security/ScreenProtectionController.d.ts +9 -1
- package/packages/web/dist/security/ScreenProtectionController.d.ts.map +1 -1
- package/packages/web/dist/security/ScreenProtectionController.js +86 -1
- package/packages/web/dist/security/ScreenProtectionController.js.map +1 -1
- package/packages/web/src/WebPlayer.ts +34 -1
- package/packages/web/src/drm/DRMHelper.ts +203 -0
- package/packages/web/src/react/WebPlayerView.tsx +23 -4
- package/packages/web/src/security/CanvasVideoRenderer.ts +246 -0
- package/packages/web/src/security/ScreenProtectionController.ts +118 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CanvasVideoRenderer.js","sourceRoot":"","sources":["../../src/security/CanvasVideoRenderer.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,14 +1,17 @@
|
|
|
1
|
-
import { ScreenCaptureEvent } from '@unified-video/core';
|
|
1
|
+
import { ScreenCaptureEvent, EnhancedScreenProtectionConfig } from '@unified-video/core';
|
|
2
2
|
export interface ScreenProtectionOptions {
|
|
3
3
|
videoElement: HTMLVideoElement;
|
|
4
4
|
containerElement: HTMLElement;
|
|
5
|
+
config: EnhancedScreenProtectionConfig;
|
|
5
6
|
watermarkConfig?: any;
|
|
6
7
|
onDetection?: (event: ScreenCaptureEvent) => void;
|
|
7
8
|
onDevToolsDetected?: () => void;
|
|
9
|
+
onPause?: () => void;
|
|
8
10
|
}
|
|
9
11
|
export declare class ScreenProtectionController {
|
|
10
12
|
private opts;
|
|
11
13
|
private overlayElement;
|
|
14
|
+
private canvasRenderer;
|
|
12
15
|
private detectionIntervals;
|
|
13
16
|
private eventListeners;
|
|
14
17
|
private isActive;
|
|
@@ -18,6 +21,7 @@ export declare class ScreenProtectionController {
|
|
|
18
21
|
activate(): void;
|
|
19
22
|
deactivate(): void;
|
|
20
23
|
destroy(): void;
|
|
24
|
+
private initializeCanvasRendering;
|
|
21
25
|
private applyVideoProtection;
|
|
22
26
|
private createInterferenceOverlay;
|
|
23
27
|
private animateOverlay;
|
|
@@ -27,5 +31,9 @@ export declare class ScreenProtectionController {
|
|
|
27
31
|
private detectVisibilityChange;
|
|
28
32
|
private detectScreenCaptureAPI;
|
|
29
33
|
private handleDetection;
|
|
34
|
+
private sendTrackingEvent;
|
|
35
|
+
private executeWarnAction;
|
|
36
|
+
private executePauseAction;
|
|
37
|
+
private executeDegradeAction;
|
|
30
38
|
}
|
|
31
39
|
//# sourceMappingURL=ScreenProtectionController.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ScreenProtectionController.d.ts","sourceRoot":"","sources":["../../src/security/ScreenProtectionController.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"ScreenProtectionController.d.ts","sourceRoot":"","sources":["../../src/security/ScreenProtectionController.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,8BAA8B,EAAE,MAAM,qBAAqB,CAAC;AAGzF,MAAM,WAAW,uBAAuB;IACtC,YAAY,EAAE,gBAAgB,CAAC;IAC/B,gBAAgB,EAAE,WAAW,CAAC;IAC9B,MAAM,EAAE,8BAA8B,CAAC;IACvC,eAAe,CAAC,EAAE,GAAG,CAAC;IACtB,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,kBAAkB,KAAK,IAAI,CAAC;IAClD,kBAAkB,CAAC,EAAE,MAAM,IAAI,CAAC;IAChC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACtB;AAED,qBAAa,0BAA0B;IACrC,OAAO,CAAC,IAAI,CAA0B;IACtC,OAAO,CAAC,cAAc,CAA4B;IAClD,OAAO,CAAC,cAAc,CAAoC;IAC1D,OAAO,CAAC,kBAAkB,CAAwB;IAClD,OAAO,CAAC,cAAc,CAA2D;IACjF,OAAO,CAAC,QAAQ,CAAkB;IAClC,OAAO,CAAC,YAAY,CAAkB;IACtC,OAAO,CAAC,uBAAuB,CAAa;gBAEhC,IAAI,EAAE,uBAAuB;IAIlC,QAAQ,IAAI,IAAI;IAsBhB,UAAU,IAAI,IAAI;IAoClB,OAAO,IAAI,IAAI;IAItB,OAAO,CAAC,yBAAyB;IA4BjC,OAAO,CAAC,oBAAoB;IAwC5B,OAAO,CAAC,yBAAyB;IAuCjC,OAAO,CAAC,cAAc;IActB,OAAO,CAAC,cAAc;IAgBtB,OAAO,CAAC,cAAc;IAkCtB,OAAO,CAAC,eAAe;IAavB,OAAO,CAAC,sBAAsB;IAe9B,OAAO,CAAC,sBAAsB;IAsB9B,OAAO,CAAC,eAAe;YA6BT,iBAAiB;IAmB/B,OAAO,CAAC,iBAAiB;IASzB,OAAO,CAAC,kBAAkB;IAU1B,OAAO,CAAC,oBAAoB;CAa7B"}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
|
+
import { CanvasVideoRenderer } from "./CanvasVideoRenderer.js";
|
|
1
2
|
export class ScreenProtectionController {
|
|
2
3
|
constructor(opts) {
|
|
3
4
|
this.overlayElement = null;
|
|
5
|
+
this.canvasRenderer = null;
|
|
4
6
|
this.detectionIntervals = [];
|
|
5
7
|
this.eventListeners = [];
|
|
6
8
|
this.isActive = false;
|
|
@@ -13,7 +15,10 @@ export class ScreenProtectionController {
|
|
|
13
15
|
return;
|
|
14
16
|
console.log('[ScreenProtectionController] Activating screen protection...');
|
|
15
17
|
this.applyVideoProtection();
|
|
16
|
-
this.
|
|
18
|
+
this.initializeCanvasRendering();
|
|
19
|
+
if (!this.canvasRenderer) {
|
|
20
|
+
this.createInterferenceOverlay();
|
|
21
|
+
}
|
|
17
22
|
this.setupDetection();
|
|
18
23
|
this.isActive = true;
|
|
19
24
|
}
|
|
@@ -21,6 +26,10 @@ export class ScreenProtectionController {
|
|
|
21
26
|
if (!this.isActive)
|
|
22
27
|
return;
|
|
23
28
|
console.log('[ScreenProtectionController] Deactivating screen protection...');
|
|
29
|
+
if (this.canvasRenderer) {
|
|
30
|
+
this.canvasRenderer.deactivate();
|
|
31
|
+
this.canvasRenderer = null;
|
|
32
|
+
}
|
|
24
33
|
if (this.overlayElement && this.overlayElement.parentElement) {
|
|
25
34
|
this.overlayElement.parentElement.removeChild(this.overlayElement);
|
|
26
35
|
this.overlayElement = null;
|
|
@@ -40,6 +49,25 @@ export class ScreenProtectionController {
|
|
|
40
49
|
destroy() {
|
|
41
50
|
this.deactivate();
|
|
42
51
|
}
|
|
52
|
+
initializeCanvasRendering() {
|
|
53
|
+
if (!this.opts.config.canvasRendering?.enabled) {
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
console.log('[ScreenProtectionController] Initializing canvas-based video rendering...');
|
|
57
|
+
console.warn('[ScreenProtectionController] WARNING: Canvas rendering does NOT prevent screenshots.');
|
|
58
|
+
console.warn('[ScreenProtectionController] This only adds obfuscation. Use DRM for true protection.');
|
|
59
|
+
const watermarkText = this.opts.config.forensicWatermark?.userId
|
|
60
|
+
? `PROTECTED - ${this.opts.config.forensicWatermark.userId}`
|
|
61
|
+
: 'PROTECTED CONTENT';
|
|
62
|
+
this.canvasRenderer = new CanvasVideoRenderer({
|
|
63
|
+
sourceVideo: this.opts.videoElement,
|
|
64
|
+
containerElement: this.opts.containerElement,
|
|
65
|
+
watermarkText: watermarkText,
|
|
66
|
+
enableNoise: this.opts.config.canvasRendering.enableNoise ?? true,
|
|
67
|
+
enableDynamicTransforms: this.opts.config.canvasRendering.enableDynamicTransforms ?? true
|
|
68
|
+
});
|
|
69
|
+
this.canvasRenderer.activate();
|
|
70
|
+
}
|
|
43
71
|
applyVideoProtection() {
|
|
44
72
|
const { videoElement, containerElement } = this.opts;
|
|
45
73
|
try {
|
|
@@ -188,6 +216,63 @@ export class ScreenProtectionController {
|
|
|
188
216
|
if (this.opts.onDetection) {
|
|
189
217
|
this.opts.onDetection(event);
|
|
190
218
|
}
|
|
219
|
+
if (this.opts.config.trackingEndpoint) {
|
|
220
|
+
this.sendTrackingEvent(event);
|
|
221
|
+
}
|
|
222
|
+
const action = this.opts.config.onDetection || 'warn';
|
|
223
|
+
switch (action) {
|
|
224
|
+
case 'warn':
|
|
225
|
+
this.executeWarnAction();
|
|
226
|
+
break;
|
|
227
|
+
case 'pause':
|
|
228
|
+
this.executePauseAction();
|
|
229
|
+
break;
|
|
230
|
+
case 'degrade':
|
|
231
|
+
this.executeDegradeAction();
|
|
232
|
+
break;
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
async sendTrackingEvent(event) {
|
|
236
|
+
try {
|
|
237
|
+
await fetch(this.opts.config.trackingEndpoint, {
|
|
238
|
+
method: 'POST',
|
|
239
|
+
headers: {
|
|
240
|
+
'Content-Type': 'application/json'
|
|
241
|
+
},
|
|
242
|
+
body: JSON.stringify({
|
|
243
|
+
event,
|
|
244
|
+
userAgent: navigator.userAgent,
|
|
245
|
+
timestamp: new Date().toISOString(),
|
|
246
|
+
forensicData: this.opts.config.forensicWatermark
|
|
247
|
+
})
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
catch (error) {
|
|
251
|
+
console.error('[ScreenProtection] Failed to send tracking event:', error);
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
executeWarnAction() {
|
|
255
|
+
const message = this.opts.config.warningMessage ||
|
|
256
|
+
'Screen recording or screenshot detected. This content is protected.';
|
|
257
|
+
console.warn(`[ScreenProtection] ${message}`);
|
|
258
|
+
}
|
|
259
|
+
executePauseAction() {
|
|
260
|
+
console.warn('[ScreenProtection] Pausing playback due to suspicious activity');
|
|
261
|
+
if (this.opts.onPause) {
|
|
262
|
+
this.opts.onPause();
|
|
263
|
+
}
|
|
264
|
+
else {
|
|
265
|
+
this.opts.videoElement.pause();
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
executeDegradeAction() {
|
|
269
|
+
console.warn('[ScreenProtection] Degrading video quality due to suspicious activity');
|
|
270
|
+
this.opts.videoElement.style.filter = 'blur(10px) brightness(0.5)';
|
|
271
|
+
setTimeout(() => {
|
|
272
|
+
if (this.opts.videoElement.style.filter) {
|
|
273
|
+
this.opts.videoElement.style.filter = '';
|
|
274
|
+
}
|
|
275
|
+
}, 5000);
|
|
191
276
|
}
|
|
192
277
|
}
|
|
193
278
|
//# sourceMappingURL=ScreenProtectionController.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ScreenProtectionController.js","sourceRoot":"","sources":["../../src/security/ScreenProtectionController.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ScreenProtectionController.js","sourceRoot":"","sources":["../../src/security/ScreenProtectionController.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAY5D,MAAM,OAAO,0BAA0B;IAUrC,YAAY,IAA6B;QARjC,mBAAc,GAAuB,IAAI,CAAC;QAC1C,mBAAc,GAA+B,IAAI,CAAC;QAClD,uBAAkB,GAAqB,EAAE,CAAC;QAC1C,mBAAc,GAAwD,EAAE,CAAC;QACzE,aAAQ,GAAY,KAAK,CAAC;QAC1B,iBAAY,GAAY,KAAK,CAAC;QAC9B,4BAAuB,GAAQ,IAAI,CAAC;QAG1C,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;IAEM,QAAQ;QACb,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO;QAE1B,OAAO,CAAC,GAAG,CAAC,8DAA8D,CAAC,CAAC;QAG5E,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAG5B,IAAI,CAAC,yBAAyB,EAAE,CAAC;QAGjC,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;YACxB,IAAI,CAAC,yBAAyB,EAAE,CAAC;SAClC;QAGD,IAAI,CAAC,cAAc,EAAE,CAAC;QAEtB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;IACvB,CAAC;IAEM,UAAU;QACf,IAAI,CAAC,IAAI,CAAC,QAAQ;YAAE,OAAO;QAE3B,OAAO,CAAC,GAAG,CAAC,gEAAgE,CAAC,CAAC;QAG9E,IAAI,IAAI,CAAC,cAAc,EAAE;YACvB,IAAI,CAAC,cAAc,CAAC,UAAU,EAAE,CAAC;YACjC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;SAC5B;QAGD,IAAI,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,cAAc,CAAC,aAAa,EAAE;YAC5D,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,WAAW,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YACnE,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;SAC5B;QAGD,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC;QACrE,IAAI,CAAC,kBAAkB,GAAG,EAAE,CAAC;QAG7B,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE;YACzD,MAAM,CAAC,mBAAmB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC;QAGzB,IAAI,IAAI,CAAC,uBAAuB,IAAI,SAAS,CAAC,YAAY,EAAE;YAC1D,SAAS,CAAC,YAAY,CAAC,eAAe,GAAG,IAAI,CAAC,uBAAuB,CAAC;YACtE,IAAI,CAAC,uBAAuB,GAAG,IAAI,CAAC;SACrC;QAED,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;IACxB,CAAC;IAEM,OAAO;QACZ,IAAI,CAAC,UAAU,EAAE,CAAC;IACpB,CAAC;IAEO,yBAAyB;QAE/B,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,OAAO,EAAE;YAC9C,OAAO;SACR;QAED,OAAO,CAAC,GAAG,CAAC,2EAA2E,CAAC,CAAC;QACzF,OAAO,CAAC,IAAI,CAAC,sFAAsF,CAAC,CAAC;QACrG,OAAO,CAAC,IAAI,CAAC,uFAAuF,CAAC,CAAC;QAGtG,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,iBAAiB,EAAE,MAAM;YAC9D,CAAC,CAAC,eAAe,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,MAAM,EAAE;YAC5D,CAAC,CAAC,mBAAmB,CAAC;QAGxB,IAAI,CAAC,cAAc,GAAG,IAAI,mBAAmB,CAAC;YAC5C,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,YAAY;YACnC,gBAAgB,EAAE,IAAI,CAAC,IAAI,CAAC,gBAAgB;YAC5C,aAAa,EAAE,aAAa;YAC5B,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,WAAW,IAAI,IAAI;YACjE,uBAAuB,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,uBAAuB,IAAI,IAAI;SAC1F,CAAC,CAAC;QAGH,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,CAAC;IACjC,CAAC;IAEO,oBAAoB;QAC1B,MAAM,EAAE,YAAY,EAAE,gBAAgB,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC;QAErD,IAAI;YAEF,YAAY,CAAC,uBAAuB,GAAG,IAAI,CAAC;YAC3C,YAAoB,CAAC,oBAAoB,GAAG,KAAK,CAAC;SACpD;QAAC,OAAO,CAAC,EAAE;YACV,OAAO,CAAC,IAAI,CAAC,2CAA2C,EAAE,CAAC,CAAC,CAAC;SAC9D;QAED,IAAI;YAEF,IAAI,cAAc,IAAI,YAAY,EAAE;gBACjC,YAAoB,CAAC,YAAY,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;aACtD;SACF;QAAC,OAAO,CAAC,EAAE;YACV,OAAO,CAAC,IAAI,CAAC,gDAAgD,EAAE,CAAC,CAAC,CAAC;SACnE;QAGD,gBAAgB,CAAC,KAAK,CAAC,UAAU,GAAG,MAAM,CAAC;QAC3C,gBAAgB,CAAC,KAAK,CAAC,gBAAgB,GAAG,MAAM,CAAC;QAChD,gBAAgB,CAAC,KAAa,CAAC,kBAAkB,GAAG,MAAM,CAAC;QAG5D,MAAM,kBAAkB,GAAG,CAAC,CAAQ,EAAW,EAAE;YAC/C,IAAI,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAc,CAAC,EAAE;gBAC/C,CAAC,CAAC,cAAc,EAAE,CAAC;gBACnB,CAAC,CAAC,eAAe,EAAE,CAAC;gBACpB,OAAO,KAAK,CAAC;aACd;YACD,OAAO,IAAI,CAAC;QACd,CAAC,CAAC;QACF,QAAQ,CAAC,gBAAgB,CAAC,aAAa,EAAE,kBAAkB,CAAC,CAAC;QAC7D,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,kBAAkB,EAAE,CAAC,CAAC;QAElG,OAAO,CAAC,GAAG,CAAC,6CAA6C,CAAC,CAAC;IAC7D,CAAC;IAEO,yBAAyB;QAC/B,MAAM,EAAE,gBAAgB,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC;QAGvC,IAAI,CAAC,cAAc,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QACpD,IAAI,CAAC,cAAc,CAAC,SAAS,GAAG,+BAA+B,CAAC;QAChE,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;QAGxD,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE;YACvC,QAAQ,EAAE,UAAU;YACpB,GAAG,EAAE,GAAG;YACR,IAAI,EAAE,GAAG;YACT,KAAK,EAAE,MAAM;YACb,MAAM,EAAE,MAAM;YACd,aAAa,EAAE,MAAM;YACrB,MAAM,EAAE,GAAG;YACX,YAAY,EAAE,QAAQ;YACtB,OAAO,EAAE,MAAM;YACf,UAAU,EAAE,aAAa;YAEzB,eAAe,EAAE,iVAAiV;YAClW,UAAU,EAAE,0BAA0B;SACvC,CAAC,CAAC;QAGH,MAAM,eAAe,GAAG,gBAAgB,CAAC,aAAa,CAAC,sBAAsB,CAAC,CAAC;QAC/E,IAAI,eAAe,EAAE;YACnB,gBAAgB,CAAC,YAAY,CAAC,IAAI,CAAC,cAAc,EAAE,eAAe,CAAC,CAAC;SACrE;aAAM;YACL,gBAAgB,CAAC,WAAW,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;SACnD;QAGD,IAAI,CAAC,cAAc,EAAE,CAAC;QAEtB,OAAO,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC;IACjE,CAAC;IAEO,cAAc;QACpB,IAAI,CAAC,IAAI,CAAC,cAAc,IAAI,CAAC,IAAI,CAAC,QAAQ;YAAE,OAAO;QAGnD,MAAM,WAAW,GAAG,IAAI,CAAC;QACzB,MAAM,SAAS,GAAG,WAAW,GAAG,GAAG,CAAC;QACpC,MAAM,UAAU,GAAG,WAAW,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,SAAS,GAAG,SAAS,GAAG,CAAC,CAAC,CAAC;QAE7E,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,OAAO,GAAG,UAAU,CAAC,QAAQ,EAAE,CAAC;QAG1D,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC;IACvE,CAAC;IAEO,cAAc;QAEpB,IAAI,CAAC,cAAc,EAAE,CAAC;QAGtB,IAAI,CAAC,eAAe,EAAE,CAAC;QAGvB,IAAI,CAAC,sBAAsB,EAAE,CAAC;QAG9B,IAAI,CAAC,sBAAsB,EAAE,CAAC;QAE9B,OAAO,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAC;IAChE,CAAC;IAEO,cAAc;QACpB,MAAM,SAAS,GAAG,GAAG,CAAC;QACtB,IAAI,aAAa,GAAG,KAAK,CAAC;QAE1B,MAAM,aAAa,GAAG,GAAG,EAAE;YACzB,IAAI,CAAC,IAAI,CAAC,QAAQ;gBAAE,OAAO;YAE3B,MAAM,SAAS,GAAG,MAAM,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;YACxD,MAAM,UAAU,GAAG,MAAM,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;YAE3D,MAAM,MAAM,GAAG,SAAS,GAAG,SAAS,IAAI,UAAU,GAAG,SAAS,CAAC;YAE/D,IAAI,MAAM,IAAI,CAAC,aAAa,EAAE;gBAC5B,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;gBACzB,IAAI,CAAC,eAAe,CAAC;oBACnB,IAAI,EAAE,UAAU;oBAChB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;oBACrB,OAAO,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE;iBACnC,CAAC,CAAC;gBAEH,IAAI,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE;oBAChC,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC;iBAChC;aACF;iBAAM,IAAI,CAAC,MAAM,IAAI,aAAa,EAAE;gBACnC,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;aAC3B;YAED,aAAa,GAAG,MAAM,CAAC;QACzB,CAAC,CAAC;QAEF,MAAM,QAAQ,GAAG,WAAW,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC;QACjD,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACzC,CAAC;IAEO,eAAe;QACrB,MAAM,WAAW,GAAG,GAAG,EAAE;YACvB,IAAI,CAAC,eAAe,CAAC;gBACnB,IAAI,EAAE,YAAY;gBAClB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;gBACrB,OAAO,EAAE,EAAE,cAAc,EAAE,QAAQ,CAAC,MAAM,EAAE;aAC7C,CAAC,CAAC;QACL,CAAC,CAAC;QAEF,MAAM,CAAC,gBAAgB,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;QAC7C,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC;IACpF,CAAC;IAEO,sBAAsB;QAC5B,MAAM,iBAAiB,GAAG,GAAG,EAAE;YAC7B,IAAI,QAAQ,CAAC,MAAM,EAAE;gBACnB,IAAI,CAAC,eAAe,CAAC;oBACnB,IAAI,EAAE,mBAAmB;oBACzB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;oBACrB,OAAO,EAAE,EAAE,eAAe,EAAE,QAAQ,CAAC,eAAe,EAAE;iBACvD,CAAC,CAAC;aACJ;QACH,CAAC,CAAC;QAEF,QAAQ,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,iBAAiB,CAAC,CAAC;QACjE,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,kBAAkB,EAAE,OAAO,EAAE,iBAAiB,EAAE,CAAC,CAAC;IACxG,CAAC;IAEO,sBAAsB;QAE5B,IAAI,SAAS,CAAC,YAAY,IAAI,SAAS,CAAC,YAAY,CAAC,eAAe,EAAE;YACpE,IAAI,CAAC,uBAAuB,GAAG,SAAS,CAAC,YAAY,CAAC,eAAe,CAAC,IAAI,CACxE,SAAS,CAAC,YAAY,CACvB,CAAC;YAEF,MAAM,IAAI,GAAG,IAAI,CAAC;YAClB,SAAS,CAAC,YAAY,CAAC,eAAe,GAAG,KAAK,WAAW,GAAG,IAAW;gBAErE,IAAI,CAAC,eAAe,CAAC;oBACnB,IAAI,EAAE,oBAAoB;oBAC1B,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;oBACrB,OAAO,EAAE,EAAE,GAAG,EAAE,iBAAiB,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE;iBACvD,CAAC,CAAC;gBAGH,OAAO,IAAI,CAAC,uBAAuB,CAAC,GAAG,IAAI,CAAC,CAAC;YAC/C,CAAC,CAAC;SACH;IACH,CAAC;IAEO,eAAe,CAAC,KAAyB;QAC/C,OAAO,CAAC,IAAI,CAAC,qCAAqC,EAAE,KAAK,CAAC,CAAC;QAG3D,IAAI,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;YACzB,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;SAC9B;QAGD,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE;YACrC,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;SAC/B;QAGD,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC;QAEtD,QAAQ,MAAM,EAAE;YACd,KAAK,MAAM;gBACT,IAAI,CAAC,iBAAiB,EAAE,CAAC;gBACzB,MAAM;YACR,KAAK,OAAO;gBACV,IAAI,CAAC,kBAAkB,EAAE,CAAC;gBAC1B,MAAM;YACR,KAAK,SAAS;gBACZ,IAAI,CAAC,oBAAoB,EAAE,CAAC;gBAC5B,MAAM;SACT;IACH,CAAC;IAEO,KAAK,CAAC,iBAAiB,CAAC,KAAyB;QACvD,IAAI;YACF,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,gBAAiB,EAAE;gBAC9C,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE;oBACP,cAAc,EAAE,kBAAkB;iBACnC;gBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;oBACnB,KAAK;oBACL,SAAS,EAAE,SAAS,CAAC,SAAS;oBAC9B,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;oBACnC,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,iBAAiB;iBACjD,CAAC;aACH,CAAC,CAAC;SACJ;QAAC,OAAO,KAAK,EAAE;YACd,OAAO,CAAC,KAAK,CAAC,mDAAmD,EAAE,KAAK,CAAC,CAAC;SAC3E;IACH,CAAC;IAEO,iBAAiB;QACvB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc;YAC7C,qEAAqE,CAAC;QAExE,OAAO,CAAC,IAAI,CAAC,sBAAsB,OAAO,EAAE,CAAC,CAAC;IAGhD,CAAC;IAEO,kBAAkB;QACxB,OAAO,CAAC,IAAI,CAAC,gEAAgE,CAAC,CAAC;QAE/E,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;YACrB,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;SACrB;aAAM;YACL,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;SAChC;IACH,CAAC;IAEO,oBAAoB;QAC1B,OAAO,CAAC,IAAI,CAAC,uEAAuE,CAAC,CAAC;QAGtF,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,MAAM,GAAG,4BAA4B,CAAC;QAGnE,UAAU,CAAC,GAAG,EAAE;YACd,IAAI,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,MAAM,EAAE;gBACvC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,MAAM,GAAG,EAAE,CAAC;aAC1C;QACH,CAAC,EAAE,IAAI,CAAC,CAAC;IACX,CAAC;CACF"}
|
|
@@ -8153,6 +8153,14 @@ export class WebPlayer extends BasePlayer {
|
|
|
8153
8153
|
private initializeScreenProtection(): void {
|
|
8154
8154
|
if (!this.video || !this.container) return;
|
|
8155
8155
|
|
|
8156
|
+
// Normalize config: convert boolean to EnhancedScreenProtectionConfig
|
|
8157
|
+
const screenProtConfig = (this.config as any).screenProtection;
|
|
8158
|
+
const enhancedConfig = typeof screenProtConfig === 'boolean'
|
|
8159
|
+
? { enabled: true } // Simple mode: just { enabled: true }
|
|
8160
|
+
: screenProtConfig; // Advanced mode: full config object
|
|
8161
|
+
|
|
8162
|
+
if (!enhancedConfig || !enhancedConfig.enabled) return;
|
|
8163
|
+
|
|
8156
8164
|
console.warn(
|
|
8157
8165
|
'[Unified Video Framework] Screen Protection Enabled\n' +
|
|
8158
8166
|
'Note: Browsers cannot completely block screen recording. ' +
|
|
@@ -8161,10 +8169,14 @@ export class WebPlayer extends BasePlayer {
|
|
|
8161
8169
|
);
|
|
8162
8170
|
|
|
8163
8171
|
// Enhance watermark for protection
|
|
8172
|
+
const watermarkText = enhancedConfig.forensicWatermark?.userId
|
|
8173
|
+
? `PROTECTED - ${enhancedConfig.forensicWatermark.userId}`
|
|
8174
|
+
: 'PROTECTED CONTENT';
|
|
8175
|
+
|
|
8164
8176
|
if (!(this.config as any).watermark) {
|
|
8165
8177
|
(this.config as any).watermark = {
|
|
8166
8178
|
enabled: true,
|
|
8167
|
-
text:
|
|
8179
|
+
text: watermarkText,
|
|
8168
8180
|
randomPosition: true,
|
|
8169
8181
|
updateInterval: 1000 // Rapid updates
|
|
8170
8182
|
};
|
|
@@ -8175,6 +8187,10 @@ export class WebPlayer extends BasePlayer {
|
|
|
8175
8187
|
(this.config as any).watermark.updateInterval || 5000,
|
|
8176
8188
|
1000
|
|
8177
8189
|
);
|
|
8190
|
+
// Add forensic watermark user ID if provided
|
|
8191
|
+
if (enhancedConfig.forensicWatermark?.userId) {
|
|
8192
|
+
(this.config as any).watermark.text = watermarkText;
|
|
8193
|
+
}
|
|
8178
8194
|
}
|
|
8179
8195
|
this.setupWatermark(); // Re-setup with new config
|
|
8180
8196
|
|
|
@@ -8182,10 +8198,17 @@ export class WebPlayer extends BasePlayer {
|
|
|
8182
8198
|
this.screenProtectionController = new ScreenProtectionController({
|
|
8183
8199
|
videoElement: this.video,
|
|
8184
8200
|
containerElement: this.container,
|
|
8201
|
+
config: enhancedConfig,
|
|
8185
8202
|
watermarkConfig: (this.config as any).watermark,
|
|
8186
8203
|
onDetection: (event: ScreenCaptureEvent) => {
|
|
8187
8204
|
console.warn('[Screen Protection] Detection:', event);
|
|
8188
8205
|
this.emit('onScreenCaptureDetected', event);
|
|
8206
|
+
|
|
8207
|
+
// Call config callback if provided
|
|
8208
|
+
if (enhancedConfig.onScreenCaptureDetected) {
|
|
8209
|
+
enhancedConfig.onScreenCaptureDetected(event);
|
|
8210
|
+
}
|
|
8211
|
+
// Also check legacy callback
|
|
8189
8212
|
if ((this.config as any).onScreenCaptureDetected) {
|
|
8190
8213
|
(this.config as any).onScreenCaptureDetected(event);
|
|
8191
8214
|
}
|
|
@@ -8193,9 +8216,19 @@ export class WebPlayer extends BasePlayer {
|
|
|
8193
8216
|
onDevToolsDetected: () => {
|
|
8194
8217
|
console.warn('[Screen Protection] DevTools detected');
|
|
8195
8218
|
this.emit('onDevToolsDetected');
|
|
8219
|
+
|
|
8220
|
+
// Call config callback if provided
|
|
8221
|
+
if (enhancedConfig.onDevToolsDetected) {
|
|
8222
|
+
enhancedConfig.onDevToolsDetected();
|
|
8223
|
+
}
|
|
8224
|
+
// Also check legacy callback
|
|
8196
8225
|
if ((this.config as any).onDevToolsDetected) {
|
|
8197
8226
|
(this.config as any).onDevToolsDetected();
|
|
8198
8227
|
}
|
|
8228
|
+
},
|
|
8229
|
+
onPause: () => {
|
|
8230
|
+
// Pause video when requested by protection controller
|
|
8231
|
+
this.pause();
|
|
8199
8232
|
}
|
|
8200
8233
|
});
|
|
8201
8234
|
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DRM Helper Utility
|
|
3
|
+
*
|
|
4
|
+
* Simplifies DRM configuration for users who need maximum security (true black screen protection).
|
|
5
|
+
* This is Option B - for advanced users who can encrypt their videos and set up license servers.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { DRMConfig, DRMType } from '../../../core/dist';
|
|
9
|
+
|
|
10
|
+
export interface DRMHelperOptions {
|
|
11
|
+
licenseServerUrl: string;
|
|
12
|
+
certificateUrl?: string; // Required for FairPlay (Safari)
|
|
13
|
+
headers?: Record<string, string>;
|
|
14
|
+
preferredDRM?: 'widevine' | 'playready' | 'fairplay' | 'auto';
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export class DRMHelper {
|
|
18
|
+
/**
|
|
19
|
+
* Detect the best DRM system for the current browser
|
|
20
|
+
*/
|
|
21
|
+
static detectBestDRM(): DRMType {
|
|
22
|
+
const ua = navigator.userAgent.toLowerCase();
|
|
23
|
+
|
|
24
|
+
// Safari - use FairPlay
|
|
25
|
+
if (ua.indexOf('safari') !== -1 && ua.indexOf('chrome') === -1) {
|
|
26
|
+
return DRMType.FAIRPLAY;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
// Edge - prefer PlayReady, fallback to Widevine
|
|
30
|
+
if (ua.indexOf('edg') !== -1) {
|
|
31
|
+
return DRMType.PLAYREADY;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// Chrome, Firefox, Opera - use Widevine
|
|
35
|
+
return DRMType.WIDEVINE;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Create a simple DRM configuration
|
|
40
|
+
*
|
|
41
|
+
* @example
|
|
42
|
+
* const drmConfig = DRMHelper.createConfig({
|
|
43
|
+
* licenseServerUrl: 'https://your-license-server.com/license',
|
|
44
|
+
* certificateUrl: 'https://your-license-server.com/cert', // FairPlay only
|
|
45
|
+
* headers: {
|
|
46
|
+
* 'Authorization': 'Bearer your-token'
|
|
47
|
+
* }
|
|
48
|
+
* });
|
|
49
|
+
*/
|
|
50
|
+
static createConfig(options: DRMHelperOptions): DRMConfig {
|
|
51
|
+
const preferredDRMMap: Record<string, DRMType> = {
|
|
52
|
+
'widevine': DRMType.WIDEVINE,
|
|
53
|
+
'playready': DRMType.PLAYREADY,
|
|
54
|
+
'fairplay': DRMType.FAIRPLAY
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
const drmType = options.preferredDRM === 'auto' || !options.preferredDRM
|
|
58
|
+
? this.detectBestDRM()
|
|
59
|
+
: preferredDRMMap[options.preferredDRM];
|
|
60
|
+
|
|
61
|
+
return {
|
|
62
|
+
type: drmType,
|
|
63
|
+
licenseUrl: options.licenseServerUrl,
|
|
64
|
+
certificateUrl: options.certificateUrl,
|
|
65
|
+
headers: options.headers || {},
|
|
66
|
+
// Widevine security level (L1 = hardware-backed, most secure)
|
|
67
|
+
...(drmType === DRMType.WIDEVINE && { securityLevel: 'L1' as any })
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Check if browser supports DRM
|
|
73
|
+
*/
|
|
74
|
+
static async checkDRMSupport(): Promise<{
|
|
75
|
+
widevine: boolean;
|
|
76
|
+
playready: boolean;
|
|
77
|
+
fairplay: boolean;
|
|
78
|
+
recommended: DRMType;
|
|
79
|
+
}> {
|
|
80
|
+
const keySystemMap = {
|
|
81
|
+
widevine: 'com.widevine.alpha',
|
|
82
|
+
playready: 'com.microsoft.playready',
|
|
83
|
+
fairplay: 'com.apple.fps'
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
const support = {
|
|
87
|
+
widevine: false,
|
|
88
|
+
playready: false,
|
|
89
|
+
fairplay: false,
|
|
90
|
+
recommended: 'widevine' as DRMType
|
|
91
|
+
};
|
|
92
|
+
|
|
93
|
+
if (!navigator.requestMediaKeySystemAccess) {
|
|
94
|
+
return support;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// Check Widevine
|
|
98
|
+
try {
|
|
99
|
+
await navigator.requestMediaKeySystemAccess(keySystemMap.widevine, [{
|
|
100
|
+
initDataTypes: ['cenc'],
|
|
101
|
+
videoCapabilities: [{ contentType: 'video/mp4; codecs="avc1.42E01E"' }]
|
|
102
|
+
}]);
|
|
103
|
+
support.widevine = true;
|
|
104
|
+
} catch (e) {}
|
|
105
|
+
|
|
106
|
+
// Check PlayReady
|
|
107
|
+
try {
|
|
108
|
+
await navigator.requestMediaKeySystemAccess(keySystemMap.playready, [{
|
|
109
|
+
initDataTypes: ['cenc'],
|
|
110
|
+
videoCapabilities: [{ contentType: 'video/mp4; codecs="avc1.42E01E"' }]
|
|
111
|
+
}]);
|
|
112
|
+
support.playready = true;
|
|
113
|
+
} catch (e) {}
|
|
114
|
+
|
|
115
|
+
// Check FairPlay
|
|
116
|
+
try {
|
|
117
|
+
await navigator.requestMediaKeySystemAccess(keySystemMap.fairplay, [{
|
|
118
|
+
initDataTypes: ['skd'],
|
|
119
|
+
videoCapabilities: [{ contentType: 'video/mp4; codecs="avc1.42E01E"' }]
|
|
120
|
+
}]);
|
|
121
|
+
support.fairplay = true;
|
|
122
|
+
} catch (e) {}
|
|
123
|
+
|
|
124
|
+
// Set recommended based on what's supported
|
|
125
|
+
support.recommended = this.detectBestDRM();
|
|
126
|
+
|
|
127
|
+
return support;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* Validate DRM configuration
|
|
132
|
+
*/
|
|
133
|
+
static validateConfig(config: DRMConfig): { valid: boolean; errors: string[] } {
|
|
134
|
+
const errors: string[] = [];
|
|
135
|
+
|
|
136
|
+
if (!config.type) {
|
|
137
|
+
errors.push('DRM type is required');
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
if (!config.licenseUrl) {
|
|
141
|
+
errors.push('License server URL is required');
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
if (config.type === 'fairplay' && !config.certificateUrl) {
|
|
145
|
+
errors.push('Certificate URL is required for FairPlay DRM');
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
try {
|
|
149
|
+
new URL(config.licenseUrl || '');
|
|
150
|
+
} catch (e) {
|
|
151
|
+
errors.push('License URL must be a valid URL');
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
return {
|
|
155
|
+
valid: errors.length === 0,
|
|
156
|
+
errors
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* Quick start examples for common DRM providers
|
|
163
|
+
*/
|
|
164
|
+
export const DRMProviderExamples = {
|
|
165
|
+
/**
|
|
166
|
+
* BuyDRM KeyOS
|
|
167
|
+
* https://www.buydrm.com/
|
|
168
|
+
*/
|
|
169
|
+
BuyDRM: (customerId: string, videoId: string): DRMHelperOptions => ({
|
|
170
|
+
licenseServerUrl: `https://wv.service.expressplay.com/hms/wv/rights/?ExpressPlayToken=${customerId}`,
|
|
171
|
+
preferredDRM: 'auto'
|
|
172
|
+
}),
|
|
173
|
+
|
|
174
|
+
/**
|
|
175
|
+
* Irdeto
|
|
176
|
+
* https://irdeto.com/
|
|
177
|
+
*/
|
|
178
|
+
Irdeto: (licenseUrl: string): DRMHelperOptions => ({
|
|
179
|
+
licenseServerUrl: licenseUrl,
|
|
180
|
+
preferredDRM: 'auto'
|
|
181
|
+
}),
|
|
182
|
+
|
|
183
|
+
/**
|
|
184
|
+
* Verimatrix
|
|
185
|
+
* https://www.verimatrix.com/
|
|
186
|
+
*/
|
|
187
|
+
Verimatrix: (licenseUrl: string, token: string): DRMHelperOptions => ({
|
|
188
|
+
licenseServerUrl: licenseUrl,
|
|
189
|
+
headers: {
|
|
190
|
+
'Authorization': `Bearer ${token}`
|
|
191
|
+
},
|
|
192
|
+
preferredDRM: 'auto'
|
|
193
|
+
}),
|
|
194
|
+
|
|
195
|
+
/**
|
|
196
|
+
* Custom DRM server
|
|
197
|
+
*/
|
|
198
|
+
Custom: (licenseUrl: string, certificateUrl?: string): DRMHelperOptions => ({
|
|
199
|
+
licenseServerUrl: licenseUrl,
|
|
200
|
+
certificateUrl: certificateUrl,
|
|
201
|
+
preferredDRM: 'auto'
|
|
202
|
+
})
|
|
203
|
+
};
|
|
@@ -433,10 +433,29 @@ export type WebPlayerViewProps = {
|
|
|
433
433
|
// Flash News Ticker
|
|
434
434
|
flashNewsTicker?: FlashNewsTickerConfig; // Flash news ticker configuration
|
|
435
435
|
|
|
436
|
-
// Screen Protection
|
|
437
|
-
screenProtection?: boolean
|
|
438
|
-
|
|
439
|
-
|
|
436
|
+
// Screen Protection (Simple: boolean | Advanced: config object)
|
|
437
|
+
screenProtection?: boolean | {
|
|
438
|
+
enabled: boolean;
|
|
439
|
+
forensicWatermark?: {
|
|
440
|
+
userId?: string;
|
|
441
|
+
sessionId?: string;
|
|
442
|
+
invisible?: boolean;
|
|
443
|
+
};
|
|
444
|
+
canvasRendering?: {
|
|
445
|
+
enabled: boolean;
|
|
446
|
+
enableNoise?: boolean;
|
|
447
|
+
enableDynamicTransforms?: boolean;
|
|
448
|
+
};
|
|
449
|
+
aggressiveMode?: boolean;
|
|
450
|
+
onDetection?: 'warn' | 'pause' | 'degrade';
|
|
451
|
+
warningMessage?: string;
|
|
452
|
+
trackingEndpoint?: string;
|
|
453
|
+
onScreenCaptureDetected?: (event: any) => void;
|
|
454
|
+
onDevToolsDetected?: () => void;
|
|
455
|
+
};
|
|
456
|
+
// Legacy callbacks (deprecated)
|
|
457
|
+
onScreenCaptureDetected?: (event: any) => void;
|
|
458
|
+
onDevToolsDetected?: () => void;
|
|
440
459
|
};
|
|
441
460
|
|
|
442
461
|
export const WebPlayerView: React.FC<WebPlayerViewProps> = (props) => {
|