unified-video-framework
Version:
Cross-platform video player framework supporting iOS, Android, Web, Smart TVs (Samsung/LG), Roku, and more
68 lines (61 loc) • 2.27 kB
text/typescript
import { BaseDRM } from './BaseDRM';
import { KEY_SYSTEMS, DRMInitResult, DRMErrorCode } from '../types/DRMTypes';
import { DRMErrorHandler } from '../utils/DRMErrorHandler';
export class WidevineDRM extends BaseDRM {
getKeySystem(): string { return KEY_SYSTEMS.WIDEVINE; }
async initialize(): Promise<DRMInitResult> {
try {
const config: MediaKeySystemConfiguration[] = [{
initDataTypes: ['cenc'],
videoCapabilities: [{
contentType: 'video/mp4; codecs="avc1.42E01E"',
robustness: this.config.videoRobustness || 'SW_SECURE_CRYPTO',
}],
audioCapabilities: [{
contentType: 'audio/mp4; codecs="mp4a.40.2"',
robustness: this.config.audioRobustness || 'SW_SECURE_CRYPTO',
}],
persistentState: this.config.persistentState || 'optional',
distinctiveIdentifier: this.config.distinctiveIdentifier || 'optional',
}];
await navigator.requestMediaKeySystemAccess(KEY_SYSTEMS.WIDEVINE, config);
this.log('Widevine access granted');
return { success: true, drmType: 'widevine', keySystem: KEY_SYSTEMS.WIDEVINE };
} catch (error: any) {
return {
success: false,
error: DRMErrorHandler.createError(DRMErrorCode.INITIALIZATION_FAILED, `Widevine init failed: ${error.message}`, error),
};
}
}
getHLSConfig(): Record<string, any> {
return {
emeEnabled: true,
widevineLicenseUrl: this.config.licenseUrl,
drmSystems: {
'com.widevine.alpha': {
licenseUrl: this.config.licenseUrl,
},
},
licenseXhrSetup: this.config.headers
? (xhr: XMLHttpRequest) => {
for (const [k, v] of Object.entries(this.config.headers!)) {
xhr.setRequestHeader(k, v);
}
}
: undefined,
};
}
getDashProtectionData(): Record<string, any> {
return {
[KEY_SYSTEMS.WIDEVINE]: {
serverURL: this.config.licenseUrl,
httpRequestHeaders: this.config.headers || {},
withCredentials: this.config.withCredentials || false,
},
};
}
async destroy(): Promise<void> {
this.log('Widevine DRM destroyed');
}
}