parseFromEntryUrl method
Implementation
Future<HlsParsedResult> parseFromEntryUrl(String entryUrl) async {
final entryUri = Uri.parse(entryUrl);
final entryText = (await dio.get<String>(entryUrl, options: Options(responseType: ResponseType.plain))).data ?? '';
final parser = HlsPlaylistParser.create();
final entryPlaylist = await parser.parseString(entryUri, entryText);
String mediaUrl = entryUrl;
if (entryPlaylist is HlsMasterPlaylist) {
if (entryPlaylist.variants.isEmpty) throw StateError('Master playlist has no variants.');
entryPlaylist.variants.sort((a, b) => (b.format.bitrate ?? 0).compareTo(a.format.bitrate ?? 0));
mediaUrl = entryPlaylist.variants.first.url as String;
}
final mediaUri = Uri.parse(mediaUrl);
final mediaText = (await dio.get<String>(mediaUrl, options: Options(responseType: ResponseType.plain))).data ?? '';
final mediaPlaylist = await parser.parseString(mediaUri, mediaText);
if (mediaPlaylist is! HlsMediaPlaylist) throw StateError('Parsed playlist is not a media playlist.');
KeyInfo? key;
String? keyUri;
String? ivHex;
for (final seg in mediaPlaylist.segments) {
if (seg.fullSegmentEncryptionKeyUri != null) {
keyUri = seg.fullSegmentEncryptionKeyUri!;
ivHex = seg.encryptionIV;
break;
}
}
if (keyUri != null) {
key = KeyInfo()
..method = 'AES-128'
..uri = _absUrl(keyUri, mediaUri)
..localName = 'key.bin'
..ivHex = ivHex;
}
final segments = <Segment>[];
for (int i = 0; i < mediaPlaylist.segments.length; i++) {
final s = mediaPlaylist.segments[i];
final abs = _absUrl(s.url!, mediaUri);
segments.add(Segment(index: i, duration: s.durationUs ?? 0, remoteUri: abs, localName: 'seg_${(i + 1).toString().padLeft(5, '0')}.ts'));
}
int seqBase = 0;
try {
final dynamic dyn = mediaPlaylist;
seqBase = dyn.mediaSequence ?? 0;
} catch (_) {}
return HlsParsedResult(segments: segments, key: key, mediaContent: mediaText, mediaBase: mediaUri, mediaSequenceBase: seqBase);
}