Skip to content

Commit b21b6de

Browse files
authored
Allow base and query URI differences in segment mismatch error check (#7465)
1 parent 5ea8f78 commit b21b6de

File tree

2 files changed

+54
-1
lines changed

2 files changed

+54
-1
lines changed

src/utils/level-helper.ts

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -429,7 +429,9 @@ export function mapFragmentIntersection(
429429
}
430430
if ((oldFrag as any) && (newFrag as any)) {
431431
intersectionFn(oldFrag, newFrag, i, newFrags);
432-
if (oldFrag.url && oldFrag.url !== newFrag.url) {
432+
const uriBefore = oldFrag.relurl;
433+
const uriAfter = newFrag.relurl;
434+
if (uriBefore && notEqualAfterStrippingQueries(uriBefore, uriAfter)) {
433435
newDetails.playlistParsingError = getSequenceError(
434436
`media sequence mismatch ${newFrag.sn}:`,
435437
oldDetails,
@@ -600,3 +602,17 @@ export function reassignFragmentLevelIndexes(levels: Level[]) {
600602
});
601603
});
602604
}
605+
606+
function notEqualAfterStrippingQueries(
607+
uriBefore: string,
608+
uriAfter: string | undefined,
609+
): boolean {
610+
if (uriBefore !== uriAfter && uriAfter) {
611+
return stripQuery(uriBefore) !== stripQuery(uriAfter);
612+
}
613+
return false;
614+
}
615+
616+
function stripQuery(uri: string): string {
617+
return uri.replace(/\?[^?]*$/, '');
618+
}

tests/unit/controller/level-helper.ts

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1677,6 +1677,43 @@ video_5432.m4s`;
16771677
});
16781678
});
16791679

1680+
it('does not error between updates when only the query part of the URI changes', function () {
1681+
const playlist1 = `#EXTM3U
1682+
#EXT-X-VERSION:6
1683+
#EXT-X-TARGETDURATION:3
1684+
#EXT-X-MEDIA-SEQUENCE:5428
1685+
#EXT-X-DISCONTINUITY-SEQUENCE:31
1686+
#EXT-X-MAP:URI="video_init.mp4"
1687+
#EXTINF:2.000,
1688+
video_5428.m4s?t=1
1689+
#EXTINF:2.000,
1690+
video_5429.m4s?t=1
1691+
#EXTINF:2.000,
1692+
video_5430.m4s?t=1
1693+
#EXTINF:2.000,
1694+
video_5431.m4s?t=1`;
1695+
// Media sequence increased by one but two segments removed.
1696+
const playlist2 = `#EXTM3U
1697+
#EXT-X-VERSION:6
1698+
#EXT-X-TARGETDURATION:3
1699+
#EXT-X-MEDIA-SEQUENCE:5429
1700+
#EXT-X-DISCONTINUITY-SEQUENCE:31
1701+
#EXT-X-MAP:URI="video_init.mp4"
1702+
#EXTINF:2.000,
1703+
video_5429.m4s?t=2
1704+
#EXTINF:2.000,
1705+
video_5430.m4s?t=2
1706+
#EXTINF:2.000,
1707+
video_5431.m4s?t=2
1708+
#EXTINF:2.000,
1709+
video_5432.m4s?t=2`;
1710+
const details1 = parseLevelPlaylist(playlist1);
1711+
const details2 = parseLevelPlaylist(playlist2);
1712+
details2.fragments[0].base.url += '?base=changed';
1713+
mergeDetails(details1, details2, logger);
1714+
expect(details2.playlistParsingError).to.be.null;
1715+
});
1716+
16801717
it('maps dateranges based on latest EXT-X-PROGRAM-DATE-TIME', function () {
16811718
const playlist1 = `#EXTM3U
16821719
#EXT-X-VERSION:6

0 commit comments

Comments
 (0)