150 lines
4.5 KiB
JavaScript
150 lines
4.5 KiB
JavaScript
/**
|
|
* @file add-text-track-data.js
|
|
*/
|
|
'use strict';
|
|
|
|
Object.defineProperty(exports, '__esModule', {
|
|
value: true
|
|
});
|
|
|
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
|
|
|
|
var _globalWindow = require('global/window');
|
|
|
|
var _globalWindow2 = _interopRequireDefault(_globalWindow);
|
|
|
|
var _videoJs = require('video.js');
|
|
|
|
var _videoJs2 = _interopRequireDefault(_videoJs);
|
|
|
|
/**
|
|
* Define properties on a cue for backwards compatability,
|
|
* but warn the user that the way that they are using it
|
|
* is depricated and will be removed at a later date.
|
|
*
|
|
* @param {Cue} cue the cue to add the properties on
|
|
* @private
|
|
*/
|
|
var deprecateOldCue = function deprecateOldCue(cue) {
|
|
Object.defineProperties(cue.frame, {
|
|
id: {
|
|
get: function get() {
|
|
_videoJs2['default'].log.warn('cue.frame.id is deprecated. Use cue.value.key instead.');
|
|
return cue.value.key;
|
|
}
|
|
},
|
|
value: {
|
|
get: function get() {
|
|
_videoJs2['default'].log.warn('cue.frame.value is deprecated. Use cue.value.data instead.');
|
|
return cue.value.data;
|
|
}
|
|
},
|
|
privateData: {
|
|
get: function get() {
|
|
_videoJs2['default'].log.warn('cue.frame.privateData is deprecated. Use cue.value.data instead.');
|
|
return cue.value.data;
|
|
}
|
|
}
|
|
});
|
|
};
|
|
|
|
var durationOfVideo = function durationOfVideo(duration) {
|
|
var dur = undefined;
|
|
|
|
if (isNaN(duration) || Math.abs(duration) === Infinity) {
|
|
dur = Number.MAX_VALUE;
|
|
} else {
|
|
dur = duration;
|
|
}
|
|
return dur;
|
|
};
|
|
/**
|
|
* Add text track data to a source handler given the captions and
|
|
* metadata from the buffer.
|
|
*
|
|
* @param {Object} sourceHandler the flash or virtual source buffer
|
|
* @param {Array} captionArray an array of caption data
|
|
* @param {Array} metadataArray an array of meta data
|
|
* @private
|
|
*/
|
|
var addTextTrackData = function addTextTrackData(sourceHandler, captionArray, metadataArray) {
|
|
var Cue = _globalWindow2['default'].WebKitDataCue || _globalWindow2['default'].VTTCue;
|
|
|
|
if (captionArray) {
|
|
captionArray.forEach(function (caption) {
|
|
var track = caption.stream;
|
|
|
|
this.inbandTextTracks_[track].addCue(new Cue(caption.startTime + this.timestampOffset, caption.endTime + this.timestampOffset, caption.text));
|
|
}, sourceHandler);
|
|
}
|
|
|
|
if (metadataArray) {
|
|
(function () {
|
|
var videoDuration = durationOfVideo(sourceHandler.mediaSource_.duration);
|
|
|
|
metadataArray.forEach(function (metadata) {
|
|
var time = metadata.cueTime + this.timestampOffset;
|
|
|
|
metadata.frames.forEach(function (frame) {
|
|
var cue = new Cue(time, time, frame.value || frame.url || frame.data || '');
|
|
|
|
cue.frame = frame;
|
|
cue.value = frame;
|
|
deprecateOldCue(cue);
|
|
|
|
this.metadataTrack_.addCue(cue);
|
|
}, this);
|
|
}, sourceHandler);
|
|
|
|
// Updating the metadeta cues so that
|
|
// the endTime of each cue is the startTime of the next cue
|
|
// the endTime of last cue is the duration of the video
|
|
if (sourceHandler.metadataTrack_ && sourceHandler.metadataTrack_.cues && sourceHandler.metadataTrack_.cues.length) {
|
|
(function () {
|
|
var cues = sourceHandler.metadataTrack_.cues;
|
|
var cuesArray = [];
|
|
|
|
// Create a copy of the TextTrackCueList...
|
|
// ...disregarding cues with a falsey value
|
|
for (var i = 0; i < cues.length; i++) {
|
|
if (cues[i]) {
|
|
cuesArray.push(cues[i]);
|
|
}
|
|
}
|
|
|
|
// Group cues by their startTime value
|
|
var cuesGroupedByStartTime = cuesArray.reduce(function (obj, cue) {
|
|
var timeSlot = obj[cue.startTime] || [];
|
|
|
|
timeSlot.push(cue);
|
|
obj[cue.startTime] = timeSlot;
|
|
|
|
return obj;
|
|
}, {});
|
|
|
|
// Sort startTimes by ascending order
|
|
var sortedStartTimes = Object.keys(cuesGroupedByStartTime).sort(function (a, b) {
|
|
return Number(a) - Number(b);
|
|
});
|
|
|
|
// Map each cue group's endTime to the next group's startTime
|
|
sortedStartTimes.forEach(function (startTime, idx) {
|
|
var cueGroup = cuesGroupedByStartTime[startTime];
|
|
var nextTime = Number(sortedStartTimes[idx + 1]) || videoDuration;
|
|
|
|
// Map each cue's endTime the next group's startTime
|
|
cueGroup.forEach(function (cue) {
|
|
cue.endTime = nextTime;
|
|
});
|
|
});
|
|
})();
|
|
}
|
|
})();
|
|
}
|
|
};
|
|
|
|
exports['default'] = {
|
|
addTextTrackData: addTextTrackData,
|
|
durationOfVideo: durationOfVideo
|
|
};
|
|
module.exports = exports['default']; |