download method
Future<PartialDLResponse>
download({
- required Uri url,
- required Map<
String, String> headers, - required HttpClient client,
override
Downloads a file.
Implementation
@override
Future<PartialDLResponse> download({
required final Uri url,
required final Map<String, String> headers,
required final HttpClient client,
}) async {
final PartialDLResponse masterRes = await super.download(
url: url,
headers: headers,
client: client,
);
final List<List<int>> masterData = await resolveStream(masterRes.data);
final List<M3U8Item> masterM3U8 = parseM3U8(
url: url.toString(),
headers: headers,
data: utf8.decode(
masterData.fold<List<int>>(
<int>[],
(final List<int> pv, final List<int> x) => pv..addAll(x),
),
),
);
final StreamController<DLProgress> progress = DLProgress.create();
final Completer<void> dataStreamCompleter = Completer<void>();
return PartialDLResponse(
request: masterRes.request,
response: masterRes.response,
data: _getDataStream(
client: client,
masterM3U8: masterM3U8,
progress: progress,
).transform(
StreamTransformer<List<int>, List<int>>.fromHandlers(
handleDone: (final EventSink<List<int>> sink) async {
sink.close();
dataStreamCompleter.complete();
},
handleError: (
final Object error,
final StackTrace stacktrace,
final EventSink<List<int>> sink,
) {
sink.addError(error, stacktrace);
dataStreamCompleter.completeError(error, stacktrace);
},
),
),
progress: progress.stream,
onDoneFutures: <Future<void>>[progress.done, dataStreamCompleter.future],
);
}