[downloader/hls] Remove duplicate cues using a sliding window of candidates

This commit is contained in:
Felix S 2021-04-23 10:52:21 +02:00
parent 4a2f19abbd
commit 333217f43e
2 changed files with 35 additions and 0 deletions

View File

@ -325,6 +325,31 @@ class HlsFD(FragmentFD):
if isinstance(block, webvtt.CueBlock): if isinstance(block, webvtt.CueBlock):
block.start += adjust block.start += adjust
block.end += adjust block.end += adjust
dedup_window = extra_state.setdefault('webvtt_dedup_window', [])
cue = block.as_json
# skip the cue if an identical one appears
# in the window of potential duplicates
# and prune the window of unviable candidates
i = 0
skip = True
while i < len(dedup_window):
window_cue = dedup_window[i]
if window_cue == cue:
break
if window_cue['end'] >= cue['start']:
i += 1
continue
del dedup_window[i]
else:
skip = False
if skip:
continue
# add the cue to the window
dedup_window.append(cue)
elif isinstance(block, webvtt.Magic): elif isinstance(block, webvtt.Magic):
# XXX: we do not handle MPEGTS overflow # XXX: we do not handle MPEGTS overflow
if frag_index == 1: if frag_index == 1:

View File

@ -322,6 +322,16 @@ class CueBlock(Block):
stream.write(self.text) stream.write(self.text)
stream.write('\n') stream.write('\n')
@property
def as_json(self):
return {
'id': self.id,
'start': self.start,
'end': self.end,
'text': self.text,
'settings': self.settings,
}
def parse_fragment(frag_content): def parse_fragment(frag_content):
""" """