Playing protected content with Conax DRM
Overview
Nearly every license provider requires a few special pieces of information to be 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',
hls: 'HLS_MANIFEST_URL',
drm: {
widevine: {
LA_URL: 'CONAX_LICENSE_SERVER_URL',
headers: {
'Conax-Custom-Data':'{\"Version\":\"1.0.0\",\"CxAuthenticationDataToken\":\"' + TOKEN + '\",\"CxClientInfo\":{\"DeviceType\":\"Browser\",\"DrmClientType\":\"Widevine-HTML5\",\"DrmClientVersion\":\"1.0.0\",\"CxDeviceId\":\"'+ DEVICE_ID +'\"}}'
}
}
}
};
PlayReady
const source = {
dash: 'DASH_MANIFEST_URL',
hls: 'HLS_MANIFEST_URL',
drm: {
playready: {
LA_URL: 'CONAX_LICENSE_SERVER_URL',
headers: {
'Conax-Custom-Data':'{\"Version\":\"1.0.0\",\"CxAuthenticationDataToken\":\"' + TOKEN + '\",\"CxClientInfo\":{\"DeviceType\":\"Browser\",\"DrmClientType\":\"Widevine-HTML5\",\"DrmClientVersion\":\"1.0.0\",\"CxDeviceId\":\"' + DEVICE_ID + '\"}}'
}
}
}
};
FairPlay
const source = {
dash: 'DASH_MANIFEST_URL',
hls: 'HLS_MANIFEST_URL',
drm: {
fairplay: {
LA_URL: 'CONAX_LICENSE_SERVER_URL',
certificateURL: 'CERTIFICATE-URL',
prepareMessage: event => event.message,
prepareContentId: initDataAsString => {
const base64decoded = window.atob(initDataAsString.split(\"skd://\")[1].split(\"?\")[0]);
const json = JSON.parse(base64decoded);
return '{\"contentRef\": \"' + json.ContentRef + '\", \"keyId\": \"' + json.KeyId + '\"}';
},
prepareLicense: license => JSON.parse(license).CkcMessage;
useUint16InitData: true,
headers: {
'Content-type': 'application/octet-stream',
'Conax-Custom-Data': '{\"Version\":\"1.0.0\",\"CxAuthenticationDataToken\":\"' + TOKEN + '\",\"CxClientInfo\":{\"DeviceType\":\"Browser\",\"DrmClientType\":\"FairPlay-HTML5\",\"DrmClientVersion\":\"1.0.0\",\"CxDeviceId\":\"' + DEVICE_ID + '\"}}'
}
}
}
};
Complete example for Widevine, PlayReady and FairPlay
const source = {
dash: 'DASH_MANIFEST_URL',
hls: 'HLS_MANIFEST_URL',
drm: {
widevine: {
LA_URL: 'CONAX_LICENSE_SERVER_URL',
headers: {
'Conax-Custom-Data': '{\"Version\":\"1.0.0\",\"CxAuthenticationDataToken\":\"' + TOKEN + '\",\"CxClientInfo\":{\"DeviceType\":\"Browser\",\"DrmClientType\":\"Widevine-HTML5\",\"DrmClientVersion\":\"1.0.0\",\"CxDeviceId\":\"' + DEVICE_ID + '\"}}'
}
},
playready: {
LA_URL: 'CONAX_LICENSE_SERVER_URL',
headers: {
'Conax-Custom-Data', '{\"Version\":\"1.0.0\",\"CxAuthenticationDataToken\":\"' + TOKEN + '\",\"CxClientInfo\":{\"DeviceType\":\"Browser\",\"DrmClientType\":\"PlayReady-HTML5\",\"DrmClientVersion\":\"1.0.0\",\"CxDeviceId\":\"' + DEVICE_ID + '\"}}'
},
},
fairplay: {
LA_URL: 'CONAX_LICENSE_SERVER_URL',
certificateURL: 'CERTIFICATE-URL',
prepareMessage: event => event.message,
prepareContentId: initDataAsString => {
const base64decoded = window.atob(initDataAsString.split(\"skd://\")[1].split(\"?\")[0]);
const json = JSON.parse(base64decoded);
return '{\"contentRef\": \"' + json.ContentRef + '\", \"keyId\": \"' + json.KeyId + '\"}';
},
prepareLicense: license => JSON.parse(license).CkcMessage;
useUint16InitData: true,
headers: {
'Content-type': 'application/octet-stream',
'Conax-Custom-Data': '{\"Version\":\"1.0.0\",\"CxAuthenticationDataToken\":\"' + TOKEN + '\",\"CxClientInfo\":{\"DeviceType\":\"Browser\",\"DrmClientType\":\"FairPlay-HTML5\",\"DrmClientVersion\":\"1.0.0\",\"CxDeviceId\":\"' + DEVICE_ID + '\"}}'
}
}
}
}
Please replace the following placeholders in the code:
- HLS_MANIFEST_URL: The URL to the HLS manifest (M3U8) file.
- DASH_MANIFEST_URL: The URL to the DASH manifest (mpd) file.
- CONAX_LICENSE_SERVER_URL: The URL to your DRM License Server for the respective DRM Solution.
- CERTIFICATE-URL: The URL to the Fairplay certificate. This needs to be accessible for the player.
- TOKEN: The provided by Conax
- DEVICE_ID: The device ID provided by Conax
Updated 9 months ago