Digital Rights Management (DRM)
This tutorial shows how to configure DRM when using AMP properly.
-
Supported Providers.
-
Adding a Key.
-
Using Multiple Keys.
-
Using Multiple Sources.
-
Custom Request Headers.
-
Using Custom Fairplay Handlers
1. Supported Providers
AMP supports DRM content from the following providers:
-
Widevine
-
PlayReady
-
FairPlay
2. Adding a Key
To enable DRM content, the player is required to provide both the source and a key for the start, as shown in the following example:
var config = {
media : {
src: "https://willzhanmswest.streaming.mediaservices.windows.net/609f4f57-1e5b-4898-90b1-81c574b2e8e3/VfE.ism/manifest(format=mpd-time-csf)",
type: "application/dash+xml",
keys: {
"com.widevine.alpha": {
"serverURL": "https://willzhanmswest.keydelivery.mediaservices.windows.net/Widevine/?kid=4c241420-4ec4-42cb-9551-e9eb988d2911"
}
}
}
}
3. Using Multiple Keys
In some cases, it is required to provide multiple keys to support browsers that lack compatibility with some DRM providers. To do so, numerous key objects should be provided:
var config = {
media : {
src: "https://willzhanmswest.streaming.mediaservices.windows.net/609f4f57-1e5b-4898-90b1-81c574b2e8e3/VfE.ism/manifest(format=mpd-time-csf)",
type: "application/dash+xml",
keys: {
"com.widevine.alpha": {
"serverURL": "https://willzhanmswest.keydelivery.mediaservices.windows.net/Widevine/?kid=4c241420-4ec4-42cb-9551-e9eb988d2911"
},
"com.microsoft.playready": {
"serverURL": "https://willzhanmswest.keydelivery.mediaservices.windows.net/PlayReady/"
}
}
}
}
4. Using Multiple Sources
For more information on how to use multiple sources, read Load Media. When dealing with various sources, the keys for all sources should be provided in the keys object.
var config = {
media : {
source:[{
// FIRST SOURCE
src : "https://willzhanmswest.streaming.mediaservices.windows.net/609f4f57-1e5b-4898-90b1-81c574b2e8e3/VfE.ism/manifest(format=mpd-time-csf)",
type : "application/dash+xml",
}, {
// SECOND SOURCE
src : "https://willzhanmswest.streaming.mediaservices.windows.net/609f4f57-1e5b-4898-90b1-81c574b2e8e3/VfE.ism/manifest(format=m3u8-aapl)",
type : "application/x-mpegURL",
}],
keys: {
// KEY FOR FIRST SOURCE
"com.widevine.alpha": {
"serverURL": "https://willzhanmswest.keydelivery.mediaservices.windows.net/Widevine/?kid=4c241420-4ec4-42cb-9551-e9eb988d2911"
},
// ALTERNATIVE KEY FOR FIRST SOURCE
"com.microsoft.playready": {
"serverURL": "https://willzhanmswest.keydelivery.mediaservices.windows.net/PlayReady/"
},
// KEY FOR SECOND SOURCE
"com.apple.fps.1_0": {
"serverURL": "https://willzhanmswest.keydelivery.mediaservices.windows.net/FairPlay/?kid=58ba906b-c94d-4d26-9403-905b6d6760d1",
"cert": "FPSAC.cer"
}
}
}
}
5. Custom Request Headers
Some license requests require custom headers or credentials. These headers can be provided by passing a httpRequestHeaders
object as part of each key object.
var config = {
media : {
src : "https://willzhanmswest.streaming.mediaservices.windows.net/609f4f57-1e5b-4898-90b1-81c574b2e8e3/VfE.ism/manifest(format=mpd-time-csf)",
type : "application/dash+xml",
keys: {
"com.widevine.alpha": {
"serverURL": "https://willzhanmswest.keydelivery.mediaservices.windows.net/Widevine/?kid=4c241420-4ec4-42cb-9551-e9eb988d2911",
"withCredentials": true
},
"com.microsoft.playready": {
"serverURL": "https://willzhanmswest.keydelivery.mediaservices.windows.net/PlayReady/",
"httpRequestHeaders": {
"http-header-CustomData": "eyJ1c2VySWQiOiIxMjM0NSIsInNlc3Npb25JZCI6ImV3b2dJQ0p3Y205bWFXeGxJaUE2SUhzS0lDQWdJQ0p3ZFhKamFHRnpaU0lnT2lCN0lIMEtJQ0I5TEFvZ0lDSnZkWFJ3ZFhSUWNtOTBaV04wYVc5dUlpQTZJSHNLSUNBZ0lDSmthV2RwZEdGc0lpQTZJR1poYkhObExBb2dJQ0FnSW1GdVlXeHZaM1ZsSWlBNklHWmhiSE5sTEFvZ0lDQWdJbVZ1Wm05eVkyVWlJRG9nWm1Gc2MyVUtJQ0I5TEFvZ0lDSnpkRzl5WlV4cFkyVnVjMlVpSURvZ1ptRnNjMlVLZlFvSyIsIm1lcmNoYW50IjoiY2FibGVsYWJzIn0K"
}
}
}
}
}
6. Using Custom Fairplay Handlers
Some advanced use cases for FairPlay require special handling of the license request. Custom FairPlay handlers can be provided by passing the fps
object as part of the config object.
For example, to use an octet-stream instead of the default form encoded message payload, the config might look like the next example:
var config = {
media: {
src : "https://willzhanmswest.streaming.mediaservices.windows.net/609f4f57-1e5b-4898-90b1-81c574b2e8e3/VfE.ism/manifest(format=m3u8-aapl)",
keys: {
"com.apple.fps.1_0": {
"serverURL":"https://willzhanmswest.keydelivery.mediaservices.windows.net/FairPlay/?kid=58ba906b-c94d-4d26-9403-905b6d6760d1",
"cert": "FPSAC.cer"
}
}
},
fps: {
requestLicense: function(message, contentId, serverUrl, keys) {
var request = {
url: serverUrl,
method: "POST",
responseType: "arraybuffer",
headers: {
"Content-Type": "application/octet-stream",
"utoken-drm": "fp"
},
data: new Uint8Array(message)
};
return akamai.amp.Utils.request(request).then(function (xhr) {
return new Uint8Array(xhr.response);
})
.catch(function (error) {
throw "The license request failed.";
});
}
}
};
The complete list of FairPlay overridable functions are:
var config = {
fps: {
extractServerUrl: function (initData, keys) {
return // String. The server url
},
extractContentId: function (initData, keyData) {
return // String. The content id
},
requestCertificate: function (keys) {
return // Promise.<Uint8Array>
},
concatInitDataIdAndCertificate: function (initData, id, cert) {
return // Uint8Array
},
requestLicense: function (message, contentId, serverUrl) {
return // Promise.<Uint8Array>
}
}
}