-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfairplay.js
104 lines (86 loc) · 3.19 KB
/
fairplay.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
// ERROR EVENTS
function onLicenseRequestFailed(event) {
let errorStr = '';
if (event.target && event.target.error) {
errorStr = 'Event error code: ' + event.target.error.code + ' - Event error message: ' + event.target.error.message
}
console.error('License', 'KO', errorStr);
throw new Error(errorStr);
}
function onKeyAdded(event) {
console.error('key added successfully')
}
function onKeyError(event) {
let errorStr = '';
if (event.target && event.target.error) {
errorStr = 'Event error code: ' + event.target.error.code + ' - Event error message: ' + event.target.error.message
}
console.error('Key', 'KO', errorStr);
throw new Error(errorStr);
}
function onPlaybackError(event) {
const errorStr = '';
if (event.target && event.target.error) {
errorStr = 'Event error code: ' + event.target.error.code + ' - Event error message: ' + event.target.error.message
}
console.error('Playback', 'KO', errorStr);
throw new Error(errorStr);
}
function laodFariplayStream({
licenseUrl,
certificateUrl,
playbackUrl,
videoElement
}) {
let certificateData = null;
// SUCCESS EVENTS
function onPlaybackNeedKey(event) {
const video = event.target;
if (video) {
if (!video.webkitKeys) {
video.webkitSetMediaKeys(new WebKitMediaKeys("com.apple.fps.1_0"));
}
else {
throw new Error('not supported')
}
}
else {
throw new Error('video not found')
}
const initData = event.initData;
const initDataAsString = arrayToString(initData);
const contentId = initDataAsString.split("skd://")[1].split("?")[0];
const skdValueAsBytes = stringToArray(contentId);
const initDataForFairPlay = concatInitDataIdAndCertificate(initData, skdValueAsBytes, certificateData);
const keySession = video.webkitKeys.createSession("video/mp4", initDataForFairPlay);
keySession.addEventListener('webkitkeymessage', ({ target, message }) => {
fetchLicense({
message,
licenseUrl: (licenseUrl + contentId), // appending asset id with license url
callback: (error, licenseData) => {
if (error) {
console.error('error while getting license', error)
return
}
// updating license data
target.update(new Uint8Array(licenseData));
}
})
}, false);
keySession.addEventListener('webkitkeyadded', onKeyAdded, false);
keySession.addEventListener('webkitkeyerror', onKeyError, false);
}
function startPlayback(videoElement) {
videoElement.addEventListener('webkitneedkey', onPlaybackNeedKey, false);
videoElement.addEventListener('error', onPlaybackError, false);
videoElement.src = playbackUrl;
videoElement.play();
}
fetchCertificate({
certificateUrl,
callback: (error, responseData) => {
certificateData = responseData;
startPlayback(videoElement);
}
})
}