private async Task DownloadFilesAsync(DownloadItem downloadInfo, EventHandler<DownloadCompletedEventArgs> callback) {
// Decrypt all URLs at the same time without waiting.
List<Task> DecryptTasks = new List<Task>();
foreach (var item in downloadInfo.Files) {
DecryptTasks.Add(Task.Run(() => DownloadUrlResolver.DecryptDownloadUrl(item.Source)));
}
await Task.WhenAll(DecryptTasks.ToArray()).ConfigureAwait(false);
if (!downloadInfo.IsCanceled) {
// Download all files.
List<Task> DownloadTasks = new List<Task>();
foreach (var item in downloadInfo.Files) {
DownloadTasks.Add(DownloadVideoAsync(downloadInfo, item, callback));
}
await Task.WhenAll(DownloadTasks.ToArray()).ConfigureAwait(false);
} else
RaiseCallback(downloadInfo);
}