實現DRM回呼

下列新API可讓您定義DRM回呼。

您可以定義回呼函式(例如parseContentIdCallback)來剖析內容ID,並使用setParseContentIdCallback API將其設為drmManager

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

您可以定義回呼函式(例如onCertificateResponseCallback),以處理文字憑證回應,並使用setCertificateResponseCallback API將函式設為drmManager。 您可以設定setCertificateResponseCallback來覆寫預設行為。 例如,如果您有certificateResponseType,而它不是ArrayBuffer,則可使用此回呼將憑證回應轉換為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);

您可以定義回呼函式來剖析授權訊息和授權回應,並在呼叫drmManager.acquireLicense時傳遞這些訊息。 onLicenseResponseCallbackacquireLicense 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);

在保護資料中,新​certificateResponseType​欄位用於設定證書響應類型。 以下是保護資料的示例:

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

使用certificateResponseType欄位是選擇性的。 如果未使用,則假定值為ArrayBuffer

本頁內容