update to show progress for download
This commit is contained in:
parent
224bfaa456
commit
c55e5c8f1f
@ -55,7 +55,7 @@ namespace SPT_AKI_Installer.Aki.Core
|
|||||||
if (patcherZipPath == null && DownloadHelper.patchNeedCheck)
|
if (patcherZipPath == null && DownloadHelper.patchNeedCheck)
|
||||||
{
|
{
|
||||||
LogHelper.Info("No Patcher zip file present in directory, downloading...");
|
LogHelper.Info("No Patcher zip file present in directory, downloading...");
|
||||||
var task = DownloadHelper.DownloadFileAsync(targetPath, DownloadHelper.patcherLink, "/PATCHERZIP.zip");
|
var task = DownloadHelper.DownloadFile(targetPath, DownloadHelper.patcherLink, "/PATCHERZIP.zip");
|
||||||
while(task.Status != System.Threading.Tasks.TaskStatus.RanToCompletion)
|
while(task.Status != System.Threading.Tasks.TaskStatus.RanToCompletion)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
@ -65,7 +65,7 @@ namespace SPT_AKI_Installer.Aki.Core
|
|||||||
if (akiZipPath == null)
|
if (akiZipPath == null)
|
||||||
{
|
{
|
||||||
LogHelper.Info("No AKI zip file present in directory, downloading...");
|
LogHelper.Info("No AKI zip file present in directory, downloading...");
|
||||||
var task = DownloadHelper.DownloadFileAsync(targetPath, DownloadHelper.akiLink, "/AKIZIP.zip");
|
var task = DownloadHelper.DownloadFile(targetPath, DownloadHelper.akiLink, "/AKIZIP.zip");
|
||||||
while (task.Status != System.Threading.Tasks.TaskStatus.RanToCompletion)
|
while (task.Status != System.Threading.Tasks.TaskStatus.RanToCompletion)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
@ -3,10 +3,12 @@ using System;
|
|||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Net.Http;
|
using System.Net.Http;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
using System.Threading;
|
||||||
using Gitea.Api;
|
using Gitea.Api;
|
||||||
using Gitea.Client;
|
using Gitea.Client;
|
||||||
using Gitea.Model;
|
using Gitea.Model;
|
||||||
using System.Collections.Generic;
|
using Spectre.Console;
|
||||||
|
using HttpClientProgress;
|
||||||
|
|
||||||
namespace SPT_AKI_Installer.Aki.Helper
|
namespace SPT_AKI_Installer.Aki.Helper
|
||||||
{
|
{
|
||||||
@ -16,14 +18,6 @@ namespace SPT_AKI_Installer.Aki.Helper
|
|||||||
public static string akiLink;
|
public static string akiLink;
|
||||||
public static string patcherLink;
|
public static string patcherLink;
|
||||||
|
|
||||||
public static async Task DownloadFileAsync(string targetFilePath, string targetLink, string newFileName)
|
|
||||||
{
|
|
||||||
using (var httpClient = new HttpClient())
|
|
||||||
{
|
|
||||||
await httpClient.DownloadFile(targetLink, Path.Join(targetFilePath, newFileName));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static async Task ReleaseCheck()
|
public static async Task ReleaseCheck()
|
||||||
{
|
{
|
||||||
Configuration.Default.BasePath = "https://dev.sp-tarkov.com/api/v1";
|
Configuration.Default.BasePath = "https://dev.sp-tarkov.com/api/v1";
|
||||||
@ -79,14 +73,32 @@ namespace SPT_AKI_Installer.Aki.Helper
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static async Task DownloadFile(this HttpClient client, string address, string fileName)
|
public static async Task DownloadFile(string targetFilePath, string targetLink, string newFileName)
|
||||||
{
|
{
|
||||||
using (var response = await client.GetAsync(address))
|
await AnsiConsole.Progress().Columns(
|
||||||
using (var stream = await response.Content.ReadAsStreamAsync())
|
new PercentageColumn(),
|
||||||
using (var file = File.OpenWrite(fileName))
|
new TaskDescriptionColumn(),
|
||||||
|
new ProgressBarColumn(),
|
||||||
|
new ElapsedTimeColumn(),
|
||||||
|
new SpinnerColumn()
|
||||||
|
).StartAsync(async (ProgressContext context) =>
|
||||||
{
|
{
|
||||||
stream.CopyTo(file);
|
var task = context.AddTask("Downloading File");
|
||||||
}
|
|
||||||
|
var client = new HttpClient();
|
||||||
|
var docUrl = targetLink;
|
||||||
|
var filePath = Path.Join(targetFilePath, newFileName);
|
||||||
|
|
||||||
|
// Setup your progress reporter
|
||||||
|
var progress = new Progress<float>((float progress) =>
|
||||||
|
{
|
||||||
|
task.Value = progress;
|
||||||
|
});
|
||||||
|
|
||||||
|
// Use the provided extension method
|
||||||
|
using (var file = new FileStream(filePath, FileMode.Create, FileAccess.Write, FileShare.None))
|
||||||
|
await client.DownloadDataAsync(docUrl, file, progress);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
57
Aki.Helper/HttpClientProgressExtensions.cs
Normal file
57
Aki.Helper/HttpClientProgressExtensions.cs
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
using System;
|
||||||
|
using System.IO;
|
||||||
|
using System.Net.Http;
|
||||||
|
using System.Threading;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace HttpClientProgress
|
||||||
|
{
|
||||||
|
public static class HttpClientProgressExtensions
|
||||||
|
{
|
||||||
|
public static async Task DownloadDataAsync(this HttpClient client, string requestUrl, Stream destination, IProgress<float> progress = null, CancellationToken cancellationToken = default(CancellationToken))
|
||||||
|
{
|
||||||
|
using (var response = await client.GetAsync(requestUrl, HttpCompletionOption.ResponseHeadersRead))
|
||||||
|
{
|
||||||
|
var contentLength = response.Content.Headers.ContentLength;
|
||||||
|
using (var download = await response.Content.ReadAsStreamAsync())
|
||||||
|
{
|
||||||
|
// no progress... no contentLength... very sad
|
||||||
|
if (progress is null || !contentLength.HasValue)
|
||||||
|
{
|
||||||
|
await download.CopyToAsync(destination);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// Such progress and contentLength much reporting Wow!
|
||||||
|
var progressWrapper = new Progress<long>(totalBytes => progress.Report(GetProgressPercentage(totalBytes, contentLength.Value)));
|
||||||
|
await download.CopyToAsync(destination, 81920, progressWrapper, cancellationToken);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
float GetProgressPercentage(float totalBytes, float currentBytes) => (totalBytes / currentBytes) * 100f;
|
||||||
|
}
|
||||||
|
|
||||||
|
static async Task CopyToAsync(this Stream source, Stream destination, int bufferSize, IProgress<long> progress = null, CancellationToken cancellationToken = default(CancellationToken))
|
||||||
|
{
|
||||||
|
if (bufferSize < 0)
|
||||||
|
throw new ArgumentOutOfRangeException(nameof(bufferSize));
|
||||||
|
if (source is null)
|
||||||
|
throw new ArgumentNullException(nameof(source));
|
||||||
|
if (!source.CanRead)
|
||||||
|
throw new InvalidOperationException($"'{nameof(source)}' is not readable.");
|
||||||
|
if (destination == null)
|
||||||
|
throw new ArgumentNullException(nameof(destination));
|
||||||
|
if (!destination.CanWrite)
|
||||||
|
throw new InvalidOperationException($"'{nameof(destination)}' is not writable.");
|
||||||
|
|
||||||
|
var buffer = new byte[bufferSize];
|
||||||
|
long totalBytesRead = 0;
|
||||||
|
int bytesRead;
|
||||||
|
while ((bytesRead = await source.ReadAsync(buffer, 0, buffer.Length, cancellationToken).ConfigureAwait(false)) != 0)
|
||||||
|
{
|
||||||
|
await destination.WriteAsync(buffer, 0, bytesRead, cancellationToken).ConfigureAwait(false);
|
||||||
|
totalBytesRead += bytesRead;
|
||||||
|
progress?.Report(totalBytesRead);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user