diff --git a/src/dash-playlist-loader.js b/src/dash-playlist-loader.js index de312e7b5..cf37b53db 100644 --- a/src/dash-playlist-loader.js +++ b/src/dash-playlist-loader.js @@ -25,6 +25,21 @@ import logger from './util/logger'; const { EventTarget, mergeOptions } = videojs; const dashPlaylistUnchanged = function(a, b) { + // derive media sequence for timeshift manifests without startNumber attribute + if ( + b.mediaSequence === 1 && + b.mediaSequence <= a.mediaSequence && + a.segments && + b.segments && + a.segments.length && + b.segments.length + ) { + const seqDelta = a.segments.findIndex((s) => s.uri === b.segments[0].uri); + + b.mediaSequence = + a.mediaSequence + (seqDelta === -1 ? a.segments.length : seqDelta); + } + if (!isPlaylistUnchanged(a, b)) { return false; } diff --git a/src/media-groups.js b/src/media-groups.js index c2da756a9..523a8bcdb 100644 --- a/src/media-groups.js +++ b/src/media-groups.js @@ -73,6 +73,7 @@ export const startLoaders = (playlistLoader, mediaType) => { */ export const onGroupChanged = (type, settings) => () => { const { + sourceType, segmentLoaders: { [type]: segmentLoader, main: mainSegmentLoader @@ -92,7 +93,10 @@ export const onGroupChanged = (type, settings) => () => { mediaType.lastGroup_ = activeGroup; mediaType.lastTrack_ = activeTrack; - stopLoaders(segmentLoader, mediaType); + if (sourceType !== 'dash') { + // only one playlist for dash. do not stop. + stopLoaders(segmentLoader, mediaType); + } if (!activeGroup || activeGroup.isMasterPlaylist) { // there is no group active or active group is a main playlist and won't change