mirror of
https://github.com/shaka-project/shaka-player.git
synced 2026-06-14 15:56:38 +03:00
c5b9d6804f
Now there is a generic callback to transform the init data before passing it to the browser. This can be used by apps to use a custom content ID in FairPlay content. This also adds some utilities to help in writing these functions and moves the default behavior to DrmEngine. Closes #1951 Change-Id: I78ce660c126b53a69d5f55b16775ffcdbbe4d748
2.3 KiB
2.3 KiB
FairPlay Support
When using native src= playback, we support using FairPlay on Safari.
Adding FairPlay support involves a bit more work than other key systems.
Server certificate
All FairPlay content requires setting a server certificate. This is set in the Player configuration:
const req = await fetch('https://example.com/cert.der');
const cert = await req.arrayBuffer();
player.configure('drm.advanced.com\\.apple\\.fps\\.1_0.serverCertificate',
new Uint8Array(cert));
Content ID
Some FairPlay content use custom signaling for the content ID. The content ID is used by the browser to generate the license request. If you don't use the default content ID derivation, you need to specify a custom init data transform:
player.configure('drm.initDataTransform', (initData) => {
const contentId = getMyContentId(initData);
const cert = player.drmInfo().serverCertificate;
return shaka.util.FairPlayUtils.initDataTransform(initData, contentId, cert);
});
License wrapping
Some FairPlay servers need to accept the license request in a different format or give the response in a different format. For more info, see the general {@tutorial license-wrapping} tutorial:
player.getNetworkingEngine().registerRequestFilter((type, request) => {
if (type != shaka.net.NetworkingEngine.RequestType.LICENSE) {
return;
}
const originalPayload = new Uint8Array(request.body);
const base64Payload =
shaka.util.Uint8ArrayUtils.toStandardBase64(originalPayload);
const params = 'spc=' + base64Payload;
request.headers['Content-Type'] = 'application/x-www-form-urlencoded';
request.body = shaka.util.StringUtils.toUTF8(encodeURIComponent(params));
});
player.getNetworkingEngine().registerResponseFilter((type, request) => {
if (type != shaka.net.NetworkingEngine.RequestType.LICENSE) {
return;
}
let responseText = shaka.util.StringUtils.fromUTF8(response.data);
// Trim whitespace.
responseText = responseText.trim();
// Look for <ckc> wrapper and remove it.
if (responseText.substr(0, 5) === '<ckc>' &&
responseText.substr(-6) === '</ckc>') {
responseText = responseText.slice(5, -6);
}
// Decode the base64-encoded data into the format the browser expects.
response.data = shaka.util.Uint8ArrayUtils.fromBase64(responseText).buffer;
});