fromM3u8PlaylistUrl static method

Future<Map<String, VideoSource>> fromM3u8PlaylistUrl(
  1. String m3u8, {
  2. String initialSubtitle = '',
  3. Map<String, SenzuPlayerSubtitle>? subtitle,
  4. List<SenzuPlayerAd>? ads,
  5. Tween<Duration>? range,
  6. String formatter(
    1. String
    )?,
  7. bool descending = true,
  8. Map<String, String>? httpHeaders,
  9. bool autoSubtitle = true,
  10. String initialSubtitleLang = '',
  11. SenzuThumbnailSprite? thumbnailSprite,
  12. SenzuDrmConfig? drm,
})

Implementation

static Future<Map<String, VideoSource>> fromM3u8PlaylistUrl(
  String m3u8, {
  String initialSubtitle = '',
  Map<String, SenzuPlayerSubtitle>? subtitle,
  List<SenzuPlayerAd>? ads,
  Tween<Duration>? range,
  String Function(String)? formatter,
  bool descending = true,
  Map<String, String>? httpHeaders,
  bool autoSubtitle = true,
  String initialSubtitleLang = '',
  SenzuThumbnailSprite? thumbnailSprite,
  final SenzuDrmConfig? drm,
}) async {
  final content = await _fetch(m3u8, httpHeaders);
  final sourceUrls = _parseVariants(content, m3u8);

  String resolvedInitial = initialSubtitle;
  Map<String, SenzuPlayerSubtitle>? resolvedSubs = subtitle;

  if (autoSubtitle && subtitle == null) {
    final r = await _parseSubs(
      content,
      m3u8,
      httpHeaders,
      initialSubtitleLang,
    );
    if (r.subtitles.isNotEmpty) {
      resolvedSubs = r.subtitles;
      resolvedInitial = r.initialName;
    }
  }

  VideoSource bb(String url) => VideoSource(
    dataSource: url,
    initialSubtitle: resolvedInitial,
    subtitle: resolvedSubs,
    ads: ads,
    range: range,
    httpHeaders: httpHeaders,
    thumbnailSprite: thumbnailSprite,
    drm: drm,
  );

  final sorted = sourceUrls.entries.toList()
    ..sort((a, b) {
      if (!descending) return 0;
      final ah = int.tryParse(a.key.split('x').last) ?? 0;
      final bh = int.tryParse(b.key.split('x').last) ?? 0;
      return bh.compareTo(ah);
    });

  final result = <String, VideoSource>{};
  if (descending) result['Auto'] = bb(m3u8);
  for (final e in sorted) {
    result[formatter?.call(e.key) ?? e.key] = bb(e.value);
  }
  if (!descending) result['Auto'] = bb(m3u8);
  return result;
}