diff --git a/lib/hls/hls_parser.js b/lib/hls/hls_parser.js index c1658442e5..85e9b2114a 100644 --- a/lib/hls/hls_parser.js +++ b/lib/hls/hls_parser.js @@ -3684,7 +3684,11 @@ shaka.hls.HlsParser = class { const endDate = shaka.util.TXml.parseDate(endDateValue); if (!isNaN(endDate)) { goog.asserts.assert(endDate != null, 'End date should not be null!'); - endTime = Math.max(0, endDate - initialProgramDateTime); + endTime = endDate - initialProgramDateTime; + if (endTime < 0) { + // Date range in the past + continue; + } } } if (endTime == null) { @@ -3694,6 +3698,11 @@ shaka.hls.HlsParser = class { if (!isNaN(duration)) { endTime = startTime + duration; } + const realEndTime = startDate - initialProgramDateTime + duration; + if (realEndTime < 0) { + // Date range in the past + continue; + } } } const type = tag.getAttributeValue('CLASS') || 'com.apple.quicktime.HLS'; diff --git a/test/hls/hls_parser_unit.js b/test/hls/hls_parser_unit.js index c7f42d001b..b5927fe1a2 100644 --- a/test/hls/hls_parser_unit.js +++ b/test/hls/hls_parser_unit.js @@ -5638,6 +5638,28 @@ describe('HlsParser', () => { expect(onMetadataSpy).not.toHaveBeenCalled(); }); + it('ignores if date ranges are in the past', async () => { + const mediaPlaylist = [ + '#EXTM3U\n', + '#EXT-X-TARGETDURATION:5\n', + '#EXT-X-PROGRAM-DATE-TIME:2000-01-01T00:00:00.00Z\n', + '#EXTINF:5,\n', + 'video1.ts\n', + '#EXT-X-DATERANGE:ID="0",START-DATE="1999-01-01T00:00:00.00Z",', + 'DURATION=1,X-SHAKA="FOREVER"\n', + '#EXT-X-DATERANGE:ID="1",START-DATE="2000-01-01T00:00:05.00Z",', + 'END-DATE="1999-01-01T00:00:06.00Z",X-SHAKA="FOREVER"\n', + ].join(''); + + fakeNetEngine + .setResponseText('test:/master', mediaPlaylist) + .setResponseValue('test:/video1.ts', tsSegmentData); + + await parser.start('test:/master', playerInterface); + + expect(onMetadataSpy).not.toHaveBeenCalled(); + }); + it('supports interstitial', async () => { const mediaPlaylist = [ '#EXTM3U\n',