parseSegment method

Future<List<HlsSegment>> parseSegment(
  1. Uri uri,
  2. Map<String, Object>? headers
)

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;
}