fromM3u8PlaylistUrl static method
Future<Map<String, VideoSource>>
fromM3u8PlaylistUrl( - String m3u8, {
- String initialSubtitle = '',
- Map<String, SenzuPlayerSubtitle>? subtitle,
- List<SenzuPlayerAd>? ads,
- Tween<Duration>? range,
- String formatter(
- String
)?,
- bool descending = true,
- bool autoSubtitle = true,
- String initialSubtitleLang = '',
- SenzuThumbnailSprite? thumbnailSprite,
- 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;
}