download method

  1. @override
Future<PartialDLResponse> download({
  1. required Uri url,
  2. required Map<String, String> headers,
  3. 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],
  );
}