UNPKG

videojs-contrib-eme

Version:

Supports Encrypted Media Extensions for playback of encrypted content in Video.js

262 lines (213 loc) 7.84 kB
'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } var _videoJs = require('video.js'); var _videoJs2 = _interopRequireDefault(_videoJs); var _playready = require('./playready'); var getSupportedKeySystem = function getSupportedKeySystem(_ref) { var video = _ref.video; var keySystems = _ref.keySystems; // As this happens after the src is set on the video, we rely only on the set src (we // do not change src based on capabilities of the browser in this plugin). var promise = undefined; Object.keys(keySystems).forEach(function (keySystem) { // TODO use initDataTypes when appropriate var systemOptions = {}; var audioContentType = keySystems[keySystem].audioContentType; var videoContentType = keySystems[keySystem].videoContentType; if (audioContentType) { systemOptions.audioCapabilities = [{ contentType: audioContentType }]; } if (videoContentType) { systemOptions.videoCapabilities = [{ contentType: videoContentType }]; } if (!promise) { promise = navigator.requestMediaKeySystemAccess(keySystem, [systemOptions]); } else { promise = promise['catch'](function (e) { return navigator.requestMediaKeySystemAccess(keySystem, [systemOptions]); }); } }); return promise; }; var makeNewRequest = function makeNewRequest(_ref2) { var mediaKeys = _ref2.mediaKeys; var initDataType = _ref2.initDataType; var initData = _ref2.initData; var options = _ref2.options; var getLicense = _ref2.getLicense; var keySession = mediaKeys.createSession(); keySession.addEventListener('message', function (event) { getLicense(options, event.message).then(function (license) { return keySession.update(license); })['catch'](_videoJs2['default'].log.error.bind(_videoJs2['default'].log.error, 'failed to get and set license')); }, false); keySession.generateRequest(initDataType, initData)['catch'](_videoJs2['default'].log.error.bind(_videoJs2['default'].log.error, 'Unable to create or initialize key session')); }; var addSession = function addSession(_ref3) { var video = _ref3.video; var initDataType = _ref3.initDataType; var initData = _ref3.initData; var options = _ref3.options; var getLicense = _ref3.getLicense; if (video.mediaKeysObject) { makeNewRequest({ mediaKeys: video.mediaKeysObject, initDataType: initDataType, initData: initData, options: options, getLicense: getLicense }); } else { video.pendingSessionData.push({ initDataType: initDataType, initData: initData }); } }; var setMediaKeys = function setMediaKeys(_ref4) { var video = _ref4.video; var certificate = _ref4.certificate; var createdMediaKeys = _ref4.createdMediaKeys; var options = _ref4.options; var getLicense = _ref4.getLicense; video.mediaKeysObject = createdMediaKeys; if (certificate) { createdMediaKeys.setServerCertificate(certificate); } for (var i = 0; i < video.pendingSessionData.length; i++) { var data = video.pendingSessionData[i]; makeNewRequest({ mediaKeys: video.mediaKeysObject, initDataType: data.initDataType, initData: data.initData, options: options, getLicense: getLicense }); } video.pendingSessionData = []; return video.setMediaKeys(createdMediaKeys); }; var defaultPlayreadyGetLicense = function defaultPlayreadyGetLicense(url) { return function (emeOptions, keyMessage, callback) { (0, _playready.requestPlayreadyLicense)(url, keyMessage, function (err, response, responseBody) { if (err) { callback(err); return; } callback(null, responseBody); }); }; }; var defaultGetLicense = function defaultGetLicense(url) { return function (emeOptions, keyMessage, callback) { _videoJs2['default'].xhr({ uri: url, method: 'POST', responseType: 'arraybuffer', body: keyMessage, headers: { 'Content-type': 'application/octet-stream' } }, function (err, response, responseBody) { if (err) { callback(err); return; } callback(null, responseBody); }); }; }; var promisifyGetLicense = function promisifyGetLicense(getLicenseFn) { return function (emeOptions, keyMessage) { return new Promise(function (resolve, reject) { getLicenseFn(emeOptions, keyMessage, function (err, license) { if (err) { reject(err); } resolve(license); }); }); }; }; var standardizeKeySystemOptions = function standardizeKeySystemOptions(keySystem, keySystemOptions) { if (typeof keySystemOptions === 'string') { keySystemOptions = { url: keySystemOptions }; } if (!keySystemOptions.url && !keySystemOptions.getLicense) { throw new Error('Neither URL nor getLicense function provided to get license'); } if (keySystemOptions.url && !keySystemOptions.getLicense) { keySystemOptions.getLicense = keySystem === 'com.microsoft.playready' ? defaultPlayreadyGetLicense(keySystemOptions.url) : defaultGetLicense(keySystemOptions.url); } return keySystemOptions; }; var standard5July2016 = function standard5July2016(_ref5) { var video = _ref5.video; var initDataType = _ref5.initDataType; var initData = _ref5.initData; var options = _ref5.options; if (typeof video.mediaKeysObject === 'undefined') { var _ret = (function () { // Prevent entering this path again. video.mediaKeysObject = null; // Will store all initData until the MediaKeys is ready. video.pendingSessionData = []; var certificate = undefined; var keySystemOptions = undefined; var keySystemPromise = getSupportedKeySystem({ video: video, keySystems: options.keySystems }); if (!keySystemPromise) { _videoJs2['default'].log.error('No supported key system found'); return { v: undefined }; } keySystemPromise.then(function (keySystemAccess) { return new Promise(function (resolve, reject) { // save key system for adding sessions video.keySystem = keySystemAccess.keySystem; keySystemOptions = standardizeKeySystemOptions(keySystemAccess.keySystem, options.keySystems[keySystemAccess.keySystem]); if (!keySystemOptions.getCertificate) { resolve(keySystemAccess); return; } keySystemOptions.getCertificate(options, function (err, cert) { if (err) { reject(err); return; } certificate = cert; resolve(keySystemAccess); }); }); }).then(function (keySystemAccess) { return keySystemAccess.createMediaKeys(); }).then(function (createdMediaKeys) { return setMediaKeys({ video: video, certificate: certificate, createdMediaKeys: createdMediaKeys, options: options, getLicense: promisifyGetLicense(keySystemOptions.getLicense) }); })['catch'](_videoJs2['default'].log.error.bind(_videoJs2['default'].log.error, 'Failed to create and initialize a MediaKeys object')); })(); if (typeof _ret === 'object') return _ret.v; } addSession({ video: video, initDataType: initDataType, initData: initData, options: options, // if key system has not been determined then addSession doesn't need getLicense getLicense: video.keySystem ? promisifyGetLicense(standardizeKeySystemOptions(video.keySystem, options.keySystems[video.keySystem]).getLicense) : null }); }; exports.standard5July2016 = standard5July2016;