Implementazione dei callback DRM

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.

In questa pagina