mirror of
https://github.com/shaka-project/shaka-player.git
synced 2026-06-15 16:06:41 +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
74 lines
2.3 KiB
Markdown
74 lines
2.3 KiB
Markdown
# 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:
|
|
|
|
```js
|
|
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:
|
|
|
|
```js
|
|
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:
|
|
|
|
```js
|
|
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;
|
|
});
|
|
```
|