parseSegment method
Parses M3U8 TS file segment URLs from the playlist at uri.
Returns a list of segment URLs.
Implementation
Future<List<HlsSegment>> parseSegment(
Uri uri,
Map<String, Object>? headers,
) async {
final HlsMediaPlaylist? playList =
await parseMediaPlaylist(uri, headers: headers);
if (playList == null) return <HlsSegment>[];
List<HlsSegment> segments = <HlsSegment>[];
for (final Segment segment in playList.segments) {
String? segmentUrl = segment.url;
if (segmentUrl != null && !segmentUrl.startsWith('http')) {
int relativePath = 0;
// when hlsLine is relative path
while (segmentUrl!.startsWith("../")) {
segmentUrl = segmentUrl.substring(3);
relativePath++;
}
// when hlsLine start with /, and prefix contain hlsLine
String prefix = '${uri.pathPrefix(relativePath)}/';
if (segmentUrl.startsWith("/")) {
List<String> split = segmentUrl.split("/");
List<String> result = [];
for (var item in split) {
if (prefix.contains(item)) continue;
result.add(item);
}
segmentUrl = result.join("/");
}
segmentUrl = prefix + segmentUrl;
}
if (segmentUrl == null) continue;
int? endRange;
if (segment.byterangeOffset != null && segment.byterangeOffset != null) {
endRange = segment.byterangeLength! - segment.byterangeOffset! - 1;
}
segments.add(HlsSegment(
key: segmentUrl.generateMd5,
url: segmentUrl,
startRange: segment.byterangeOffset ?? 0,
endRange: endRange,
));
}
return segments;
}