Le nuove API seguenti consentono di definire i callback DRM.
È possibile definire una funzione di richiamata (ad esempio, parseContentIdCallback
) per analizzare l'ID contenuto e impostarlo su drmManager
utilizzando setParseContentIdCallback
API.
var arrayToString = function (array) {
var uint16array = new Uint16Array(array.buffer);
return String.fromCharCode.apply(null, uint16array);
},
parseContentIdCallback = function (initData) {
var contentId = arrayToString(initData),
tokens = contentId?contentId.split('/'):[];
if(tokens.length) {
return tokens[tokens.length-1];
} else {
return '';
}
};
drmManager.setParseContentIdCallback(parseContentIdCallback);
È possibile definire una funzione di richiamata (ad esempio, onCertificateResponseCallback
) per elaborare una risposta di certificato di testo e impostare la funzione su drmManager
utilizzando setCertificateResponseCallback
API. È possibile impostare setCertificateResponseCallback
per ignorare il comportamento predefinito. Ad esempio, se hai un certificateResponseType
diverso da ArrayBuffer
, puoi utilizzare questo callback per convertire la risposta del certificato in ArrayBuffer
tipo.
var base64DecodeUint8Array = function (input) {
var raw = window.atob(input);
var rawLength = raw.length;
var array = new Uint8Array(new ArrayBuffer(rawLength));
for (var i = 0; i < rawLength; i++)
array[i] = raw.charCodeAt(i);
return array;
},
onCertificateResponseCallback = function (certificateResponse) {
if(certificateResponse) {
var certText = certificateResponse.trim();
certText = certText.replace(/^"(.+(?="$))"$/, '$1');
return base64DecodeUint8Array(certText);
}
};
drmManager.setCertificateResponseCallback(onCertificateResponseCallback);
È possibile definire funzioni di callback per analizzare il messaggio di licenza e la risposta alla licenza e trasmetterli in una chiamata a drmManager.acquireLicense
. onLicenseResponseCallback
è un nuovo parametro in acquireLicense
API.
var base64EncodeUint8Array = function (input) {
var keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
var output = "";
var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
var i = 0;
while (i < input.length) {
chr1 = input[i++];
chr2 = i < input.length ? input[i++] : Number.NaN; // Not sure if the index
chr3 = i < input.length ? input[i++] : Number.NaN; // checks are needed here
enc1 = chr1 >> 2;
enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
enc4 = chr3 & 63;
if (isNaN(chr2)) {
enc3 = enc4 = 64;
} else if (isNaN(chr3)) {
enc4 = 64;
}
output += keyStr.charAt(enc1) + keyStr.charAt(enc2) +
keyStr.charAt(enc3) + keyStr.charAt(enc4);
}
return output;
},
base64DecodeUint8Array = function (input) {
var raw = window.atob(input);
var rawLength = raw.length;
var array = new Uint8Array(new ArrayBuffer(rawLength));
for (var i = 0; i < rawLength; i++)
array[i] = raw.charCodeAt(i);
return array;
},
onLicenseMessageCallback = function (drmLicenseRequest) {
var licenseMessage = drmLicenseRequest.licenseMessage,
base64Message = base64EncodeUint8Array(licenseMessage);
return base64Message;
},
onLicenseResponseCallback = function (serverResponse) {
var keyText = serverResponse.licenseResponse.trim();
keyText = keyText.replace(/^"(.+(?="$))"$/, '$1');
return base64DecodeUint8Array(keyText);
};
drmManager.acquireLicense(drmMetadata, null, acquireLicenseListener, onLicenseMessageCallback, onLicenseResponseCallback);
In Protezione dei dati, il nuovo certificateResponseType viene utilizzato per impostare il tipo di risposta del certificato. Di seguito è riportato un esempio di dati di protezione:
{
"com.apple.fps.1_0": {
"serverURL": "https://fairplay.license.istreamplanet.com/api/license/9d3ed760-3ba9-4042-b4a4-07e0d8069200",
"certificateURL":"https://fairplay-stage.license.istreamplanet.com/api/AppCert/9d3ed760-3ba9-4042-b4a4-07e0d8069200",
"licenseResponseType": "text",
"certificateResponseType": "text",
"httpRequestHeaders": {
"Content-type": "application/x-www-form-urlencoded"
}
}
}
Utilizzo di certificateResponseType
è facoltativo. Se non viene utilizzato, il valore viene considerato essere ArrayBuffer
.