Implementación de llamadas de retorno de DRM

Las siguientes nuevas API permiten definir devoluciones de llamada de DRM.

Puede definir una función de llamada de retorno (por ejemplo, parseContentIdCallback) para analizar el ID de contenido y establecerlo en drmManager mediante la API setParseContentIdCallback.

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);

Puede definir una función de llamada de retorno (por ejemplo, onCertificateResponseCallback) para procesar una respuesta de certificado de texto y establecer la función en drmManager mediante la API setCertificateResponseCallback. Puede establecer setCertificateResponseCallback para anular el comportamiento predeterminado. Por ejemplo, si tiene un certificateResponseType que no sea ArrayBuffer, puede utilizar esta rellamada para convertir la respuesta del certificado al tipo ArrayBuffer .

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);

Puede definir funciones de llamada de retorno para analizar el mensaje de licencia y la respuesta de licencia y pasarlos en una llamada a drmManager.acquireLicense. onLicenseResponseCallback es un nuevo parámetro en la 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);

En Protection data, el nuevo campo certificateResponseType se utiliza para establecer el tipo de respuesta del certificado. Este es un ejemplo de protección de datos:

{
     "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"
         }
     }
}

El uso del campo certificateResponseType es opcional. Si no se utiliza, se supone que el valor es ArrayBuffer.

En esta página