fix(hls): keep ad-filtered segments out of DRM key state

This commit is contained in:
imSp4rky
2026-08-19 14:39:09 -06:00
parent 29d0828c33
commit 4177cb2267
3 changed files with 11 additions and 5 deletions
+3
View File
@@ -346,6 +346,9 @@ A typical `get_tracks` therefore looks like fetching the manifest text with
### Segment-filtering hooks
- **HLS**: set `track.OnSegmentFilter(segment)` to drop unwanted segments (ads/bumpers).
A dropped segment is invisible to the whole download: its `EXT-X-KEY` and its
`EXT-X-DISCONTINUITY` are ignored, so a clear ad break inside encrypted content does
not disturb decryption.
- **DASH**: pass a `period_filter` callable to `to_tracks` to drop whole periods.
Caching-breadth periods some services emit and non-`content` segment types are dropped automatically.
+1 -1
View File
@@ -1391,7 +1391,7 @@ def requests(
output_dir
/ filename.format(
i=i * index_stride + index_offset,
ext=get_extension(url["url"] if isinstance(url, dict) else url) if needs_ext else "",
ext=(get_extension(url["url"] if isinstance(url, dict) else url) or "") if needs_ext else "",
)
]
]
+7 -4
View File
@@ -789,13 +789,16 @@ class HLS:
"""
drm = encryption_data[1]
first_segment_i = next(
int(file.stem) for file in sorted(segment_save_dir.iterdir()) if file.stem.isdigit()
(int(file.stem) for file in sorted(segment_save_dir.iterdir()) if file.stem.isdigit()), None
)
last_segment_i = max(0, i - int(not include_this_segment))
if first_segment_i is None or first_segment_i > last_segment_i:
return None
range_len = (last_segment_i - first_segment_i) + 1
segment_range = f"{str(first_segment_i).zfill(name_len)}-{str(last_segment_i).zfill(name_len)}"
merged_path = segment_save_dir / f"{segment_range}{get_extension(master.segments[last_segment_i].uri)}"
ext = get_extension(wanted_segments[last_segment_i].uri) or ""
merged_path = segment_save_dir / f"{segment_range}{ext}"
decrypted_path = segment_save_dir / f"{merged_path.stem}_decrypted{merged_path.suffix}"
files = [
@@ -864,7 +867,7 @@ class HLS:
if segment not in unwanted_segments:
if isinstance(track, Subtitle):
segment_file_ext = get_extension(segment.uri)
segment_file_ext = get_extension(segment.uri) or ""
segment_file_path = segment_save_dir / f"{str(i).zfill(name_len)}{segment_file_ext}"
segment_data = try_ensure_utf8(segment_file_path.read_bytes())
if track.codec not in (Subtitle.Codec.fVTT, Subtitle.Codec.fTTML):
@@ -909,7 +912,7 @@ class HLS:
map_data = (segment.init_section, init_content)
segment_keys = getattr(segment, "keys", None)
if segment_keys:
if segment_keys and segment not in unwanted_segments:
if cdm:
cdm_segment_keys = HLS.filter_keys_for_cdm(segment_keys, cdm)
key = (