Playing protected content with DRMtoday
Overview
If you are not sure what DRM is, you want have an overview and get started, please have a look at our DRM Setup Guide.
Nearly every license provider, such as Irdeto or EZDRM, requires a few special information being sent to the DRM license server, or responds with a proprietary format. Instead of integrating a few license providers into the core of our player, we decided to provide necessary configuration options via the player configuration.
Widevine
const source = {
dash: 'DASH_MANIFEST_URL',
drm: {
widevine: {
LA_URL: 'WIDEVINE_LICENSE_SERVER_URL',
headers: { 'x-dt-custom-data': 'BASE64_ENCODED_CUSTOMDATA' },
prepareLicense: licenseObj => {
const license = {license: licenseObj.license};
try {
const drmTodayObj = JSON.parse(String.fromCharCode.apply(null, licenseObj.license));
if (drmTodayObj && drmTodayObj.status && drmTodayObj.license) {
if (drmTodayObj.status === 'OK') {
const str = window.atob(drmTodayObj.license);
const bufView = new Uint8Array(new ArrayBuffer(str.length));
for (let i = 0; i < str.length; i++) {
bufView[i] = str.charCodeAt(i);
}
license.license = bufView;
} else {
throw 'DRMtoday license not okay';
}
} else {
throw 'no valid DRMtoday license';
}
} catch (e) {
throw 'no valid DRMtoday license';
}
return license;
}
}
}
}
Please replace the following placeholders in the code:
- DASH_MANIFEST_URL: The URL to the DASH manifest (MPD) file.
- WIDEVINE_LICENSE_SERVER_URL: The URL to DRMtoday's Widevine license server.
- BASE64_ENCODED_CUSTOMDATA: The base64 encoded custom data that DRMtoday expects in license requests.
PlayReady
const source = {
dash: 'DASH_MANIFEST_URL',
drm: {
playready: {
LA_URL: 'PLAYREADY_LICENSE_SERVER_URL',
headers: {
'x-dt-custom-data': 'BASE64_ENCODED_CUSTOMDATA'
},
}
}
}
Please replace the following placeholders in the code:
- DASH_MANIFEST_URL: The URL to the DASH manifest (MPD) file.
- PLAYREADY_LICENSE_SERVER_URL: The URL to DRMtoday's Playready license server.
- BASE64_ENCODED_CUSTOMDATA: The base64 encoded custom data that DRMtoday expects in license requests.
FairPlay
const source = {
hls: 'HLS_MANIFEST_URL',
drm: {
fairplay: {
LA_URL: 'FAIRPLAY_LICENSE_SERVER_URL',
certificateURL: 'FAIRPLAY_CERTIFICATE_SERVER_URL',
headers: { 'x-dt-custom-data': 'BASE64_ENCODED_CUSTOMDATA' },
prepareMessage : event => `spc=${encodeURIComponent(event.messageBase64Encoded)}`,
prepareContentId: contentId => {
const pattern='skd://drmtoday';
const idx = contentId.indexOf(pattern);
let parameters = '';
if (idx > -1) {
parameters = contentId.substring(idx + pattern.length);
parameters = parameters.replace(/assetid/gi, 'assetId');
parameters = parameters.replace(/variantid/gi, 'variantId');
}
return parameters
},
useUint16InitData: true,
}
}
}
Please replace the following placeholders in the code:
- HLS_MANIFEST_URL: The URL to the HLS Multivariant Playlist (M3U8) file.
- FAIRPLAY_LICENSE_SERVER_URL: The URL to DRMtoday's Fairplay license server.
- FAIRPLAY_CERTIFICATE_SERVER_URL: The URL to retrieve the Fairplay certificate.
- BASE64_ENCODED_CUSTOMDATA: The base64 encoded custom data that DRMtoday expects in license requests.
Complete example for Widevine, PlayReady, Access and FairPlay
const source = {
dash: 'DASH_MANIFEST_URL',
hls: 'HLS_MANIFEST_URL',
drm: {
widevine: {
LA_URL: 'WIDEVINE_LICENSE_SERVER_URL',
headers: { 'x-dt-custom-data': 'BASE64_ENCODED_CUSTOMDATA' },
prepareLicense: licenseObj => {
const license = {license: licenseObj.license};
try {
const drmTodayObj = JSON.parse(String.fromCharCode.apply(null, licenseObj.license));
if (drmTodayObj && drmTodayObj.status && drmTodayObj.license) {
if (drmTodayObj.status === 'OK') {
const str = window.atob(drmTodayObj.license);
const bufView = new Uint8Array(new ArrayBuffer(str.length));
for (let i = 0; i < str.length; i++) {
bufView[i] = str.charCodeAt(i);
}
license.license = bufView;
} else {
throw 'DRMtoday license not okay';
}
} else {
throw 'no valid DRMtoday license';
}
} catch (e) {
throw 'no valid DRMtoday license';
}
return license;
}
},
playready: {
LA_URL: 'PLAYREADY_LICENSE_SERVER_URL',
headers: {
'x-dt-custom-data': 'BASE64_ENCODED_CUSTOMDATA'
},
},
fairplay: {
LA_URL: 'FAIRPLAY_LICENSE_SERVER_URL',
certificateURL: 'FAIRPLAY_CERTIFICATE_SERVER_URL',
headers: { 'x-dt-custom-data': 'BASE64_ENCODED_CUSTOMDATA' },
prepareMessage : event => `spc=${encodeURIComponent(event.messageBase64Encoded)}`,
prepareContentId: contentId => {
const pattern='skd://drmtoday';
const idx = contentId.indexOf(pattern);
let parameters = '';
if (idx > -1) {
parameters = contentId.substring(idx + pattern.length);
parameters = parameters.replace(/assetid/gi, 'assetId');
parameters = parameters.replace(/variantid/gi, 'variantId');
}
return parameters
},
useUint16InitData: true,
}
}
}
Please replace the following placeholders in the code:
- DASH_MANIFEST_URL: The URL to the DASH manifest (MPD) file.
- HLS_MANIFEST_URL: The URL to the HLS Multivariant Playlist (M3U8) file.
- WIDEVINE_LICENSE_SERVER_URL: The URL to DRMtoday's Widevine license server.
- PLAYREADY_LICENSE_SERVER_URL: The URL to DRMtoday's Playready license server.
- FAIRPLAY_LICENSE_SERVER_URL: The URL to DRMtoday's Fairplay license server.
- FAIRPLAY_CERTIFICATE_SERVER_URL: The URL to retrieve the Fairplay certificate.
- BASE64_ENCODED_CUSTOMDATA: The base64 encoded custom data that DRMtoday expects in license requests.
Updated 2 months ago