Implementazione dei callback DRM

Le seguenti nuove API ti consentono di definire callback DRM.

Puoi definire una funzione di chiamata di ritorno (ad esempio, parseContentIdCallback) per analizzare l’ID del contenuto e impostarlo su drmManager utilizzando l’ 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);

È possibile definire una funzione di chiamata di ritorno (ad esempio, onCertificateResponseCallback) per elaborare una risposta a un certificato di testo e impostare la funzione su drmManager utilizzando l'API setCertificateResponseCallback. È possibile impostare setCertificateResponseCallback per ignorare il comportamento predefinito. Ad esempio, se disponi di un certificateResponseType diverso da ArrayBuffer, puoi utilizzare questo callback per convertire la risposta del certificato nel 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);

Puoi definire le funzioni di callback per analizzare il messaggio di licenza e la risposta della licenza e trasmetterle in una chiamata a drmManager.acquireLicense. onLicenseResponseCallback è un nuovo parametro nell’ 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);

Nei dati di protezione, il nuovo campo certificateResponseType viene utilizzato per impostare il tipo di risposta del certificato. Ecco 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"
         }
     }
}

L’utilizzo del campo certificateResponseType è facoltativo. Se non viene utilizzato, si presume che il valore sia ArrayBuffer.

In questa pagina