UNPKG

videojs-contrib-eme

Version:

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

103 lines (79 loc) 3.47 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 _globalWindow = require('global/window'); var _globalWindow2 = _interopRequireDefault(_globalWindow); var _playready = require('./playready'); var PLAYREADY_KEY_SYSTEM = 'com.microsoft.playready'; exports.PLAYREADY_KEY_SYSTEM = PLAYREADY_KEY_SYSTEM; var addKeyToSession = function addKeyToSession(options, session, event) { var playreadyOptions = options.keySystems[PLAYREADY_KEY_SYSTEM]; if (typeof playreadyOptions.getKey === 'function') { playreadyOptions.getKey(options, event.destinationURL, event.message.buffer, function (err, key) { if (err) { _videoJs2['default'].log.error('Unable to get key: ' + err); return; } session.update(key); }); return; } if (typeof playreadyOptions === 'string') { playreadyOptions = { url: playreadyOptions }; } var url = playreadyOptions.url || event.destinationURL; (0, _playready.requestPlayreadyLicense)(url, event.message.buffer, function (err, response) { if (err) { _videoJs2['default'].log.error('Unable to request key from url: ' + url); return; } session.update(new Uint8Array(response.body)); }); }; exports.addKeyToSession = addKeyToSession; var createSession = function createSession(video, initData, options) { var session = video.msKeys.createSession('video/mp4', initData); if (!session) { _videoJs2['default'].log.error('Could not create key session.'); return; } // Note that mskeymessage may not always be called for PlayReady: // // "If initData contains a PlayReady object that contains an OnDemand header, only a // keyAdded event is returned (as opposed to a keyMessage event as described in the // Encrypted Media Extension draft). Similarly, if initData contains a PlayReady object // that contains a key identifier in the hashed data storage (HDS), only a keyAdded // event is returned." // eslint-disable-next-line max-len // @see [PlayReady License Acquisition]{@link https://msdn.microsoft.com/en-us/library/dn468979.aspx} session.addEventListener('mskeymessage', function (event) { addKeyToSession(options, session, event); }); session.addEventListener('mskeyerror', function (event) { _videoJs2['default'].log.error('Unexpected key error from key session with ' + ('code: ' + session.error.code + ' and systemCode: ' + session.error.systemCode)); }); }; exports.createSession = createSession; exports['default'] = function (_ref) { var video = _ref.video; var initData = _ref.initData; var options = _ref.options; // Although by the standard examples the presence of video.msKeys is checked first to // verify that we aren't trying to create a new session when one already exists, here // sessions are managed earlier (on the player.eme object), meaning that at this point // any existing keys should be cleaned up. if (video.msKeys) { delete video.msKeys; } try { video.msSetMediaKeys(new _globalWindow2['default'].MSMediaKeys(PLAYREADY_KEY_SYSTEM)); } catch (e) { _videoJs2['default'].log.error('Unable to create media keys for PlayReady key system. Error: ' + e.message); return; } createSession(video, initData, options); };