134 lines
3.7 KiB
JavaScript
134 lines
3.7 KiB
JavaScript
'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 defaultOptions = {
|
|
errorInterval: 30,
|
|
getSource: function getSource(next) {
|
|
var tech = this.tech({ IWillNotUseThisInPlugins: true });
|
|
var sourceObj = tech.currentSource_;
|
|
|
|
return next(sourceObj);
|
|
}
|
|
};
|
|
|
|
/**
|
|
* Main entry point for the plugin
|
|
*
|
|
* @param {Player} player a reference to a videojs Player instance
|
|
* @param {Object} [options] an object with plugin options
|
|
* @private
|
|
*/
|
|
var initPlugin = function initPlugin(player, options) {
|
|
var lastCalled = 0;
|
|
var seekTo = 0;
|
|
var localOptions = _videoJs2['default'].mergeOptions(defaultOptions, options);
|
|
|
|
player.ready(function () {
|
|
player.trigger({ type: 'usage', name: 'hls-error-reload-initialized' });
|
|
});
|
|
|
|
/**
|
|
* Player modifications to perform that must wait until `loadedmetadata`
|
|
* has been triggered
|
|
*
|
|
* @private
|
|
*/
|
|
var loadedMetadataHandler = function loadedMetadataHandler() {
|
|
if (seekTo) {
|
|
player.currentTime(seekTo);
|
|
}
|
|
};
|
|
|
|
/**
|
|
* Set the source on the player element, play, and seek if necessary
|
|
*
|
|
* @param {Object} sourceObj An object specifying the source url and mime-type to play
|
|
* @private
|
|
*/
|
|
var setSource = function setSource(sourceObj) {
|
|
if (sourceObj === null || sourceObj === undefined) {
|
|
return;
|
|
}
|
|
seekTo = player.duration() !== Infinity && player.currentTime() || 0;
|
|
|
|
player.one('loadedmetadata', loadedMetadataHandler);
|
|
|
|
player.src(sourceObj);
|
|
player.trigger({ type: 'usage', name: 'hls-error-reload' });
|
|
player.play();
|
|
};
|
|
|
|
/**
|
|
* Attempt to get a source from either the built-in getSource function
|
|
* or a custom function provided via the options
|
|
*
|
|
* @private
|
|
*/
|
|
var errorHandler = function errorHandler() {
|
|
// Do not attempt to reload the source if a source-reload occurred before
|
|
// 'errorInterval' time has elapsed since the last source-reload
|
|
if (Date.now() - lastCalled < localOptions.errorInterval * 1000) {
|
|
player.trigger({ type: 'usage', name: 'hls-error-reload-canceled' });
|
|
return;
|
|
}
|
|
|
|
if (!localOptions.getSource || typeof localOptions.getSource !== 'function') {
|
|
_videoJs2['default'].log.error('ERROR: reloadSourceOnError - The option getSource must be a function!');
|
|
return;
|
|
}
|
|
lastCalled = Date.now();
|
|
|
|
return localOptions.getSource.call(player, setSource);
|
|
};
|
|
|
|
/**
|
|
* Unbind any event handlers that were bound by the plugin
|
|
*
|
|
* @private
|
|
*/
|
|
var cleanupEvents = function cleanupEvents() {
|
|
player.off('loadedmetadata', loadedMetadataHandler);
|
|
player.off('error', errorHandler);
|
|
player.off('dispose', cleanupEvents);
|
|
};
|
|
|
|
/**
|
|
* Cleanup before re-initializing the plugin
|
|
*
|
|
* @param {Object} [newOptions] an object with plugin options
|
|
* @private
|
|
*/
|
|
var reinitPlugin = function reinitPlugin(newOptions) {
|
|
cleanupEvents();
|
|
initPlugin(player, newOptions);
|
|
};
|
|
|
|
player.on('error', errorHandler);
|
|
player.on('dispose', cleanupEvents);
|
|
|
|
// Overwrite the plugin function so that we can correctly cleanup before
|
|
// initializing the plugin
|
|
player.reloadSourceOnError = reinitPlugin;
|
|
};
|
|
|
|
/**
|
|
* Reload the source when an error is detected as long as there
|
|
* wasn't an error previously within the last 30 seconds
|
|
*
|
|
* @param {Object} [options] an object with plugin options
|
|
*/
|
|
var reloadSourceOnError = function reloadSourceOnError(options) {
|
|
initPlugin(this, options);
|
|
};
|
|
|
|
exports['default'] = reloadSourceOnError;
|
|
module.exports = exports['default']; |