update download task to handle checking cache and downloading if needed
allows for more verbose output during the patcher download process
This commit is contained in:
parent
f0e1abc9bf
commit
84e67b9ae7
@ -5,12 +5,18 @@ using SPTInstaller.Models;
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using SPTInstaller.Helpers;
|
using SPTInstaller.Helpers;
|
||||||
|
using SPTInstaller.Models.Mirrors;
|
||||||
|
using SPTInstaller.Models.Mirrors.Downloaders;
|
||||||
|
using Microsoft.CodeAnalysis.CSharp.Syntax;
|
||||||
|
using Serilog;
|
||||||
|
|
||||||
namespace SPTInstaller.Installer_Tasks;
|
namespace SPTInstaller.Installer_Tasks;
|
||||||
|
|
||||||
public class DownloadTask : InstallerTaskBase
|
public class DownloadTask : InstallerTaskBase
|
||||||
{
|
{
|
||||||
private InternalData _data;
|
private InternalData _data;
|
||||||
|
private List<IMirrorDownloader> _mirrors = new List<IMirrorDownloader>();
|
||||||
|
private string _expectedPatcherHash = "";
|
||||||
|
|
||||||
public DownloadTask(InternalData data) : base("Download Files")
|
public DownloadTask(InternalData data) : base("Download Files")
|
||||||
{
|
{
|
||||||
@ -19,9 +25,9 @@ public class DownloadTask : InstallerTaskBase
|
|||||||
|
|
||||||
private async Task<IResult> BuildMirrorList()
|
private async Task<IResult> BuildMirrorList()
|
||||||
{
|
{
|
||||||
var progress = new Progress<double>((d) => { SetStatus("Downloading Mirror List", "", (int)Math.Floor(d));});
|
var progress = new Progress<double>((d) => { SetStatus("Downloading Mirror List", "", (int)Math.Floor(d), ProgressStyle.Shown);});
|
||||||
|
|
||||||
var file = await DownloadCacheHelper.GetOrDownloadFileAsync("mirrors.json", _data.PatcherMirrorsLink, progress);
|
var file = await DownloadCacheHelper.DownloadFileAsync("mirrors.json", _data.PatcherMirrorsLink, progress);
|
||||||
|
|
||||||
if (file == null)
|
if (file == null)
|
||||||
{
|
{
|
||||||
@ -30,52 +36,42 @@ public class DownloadTask : InstallerTaskBase
|
|||||||
|
|
||||||
var mirrorsList = JsonConvert.DeserializeObject<List<DownloadMirror>>(File.ReadAllText(file.FullName));
|
var mirrorsList = JsonConvert.DeserializeObject<List<DownloadMirror>>(File.ReadAllText(file.FullName));
|
||||||
|
|
||||||
if (mirrorsList is List<DownloadMirror> mirrors)
|
if (mirrorsList == null)
|
||||||
{
|
return Result.FromError("Failed to deserialize mirrors list");
|
||||||
_data.PatcherReleaseMirrors = mirrors;
|
|
||||||
|
|
||||||
return Result.FromSuccess();
|
|
||||||
|
foreach (var mirror in mirrorsList)
|
||||||
|
{
|
||||||
|
switch (mirror.Link)
|
||||||
|
{
|
||||||
|
case string l when l.StartsWith("https://mega"):
|
||||||
|
_mirrors.Add(new MegaMirrorDownloader(mirror));
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
_mirrors.Add(new HttpMirrorDownloader(mirror));
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return Result.FromError("Failed to deserialize mirrors list");
|
return Result.FromSuccess("Mirrors list ready");
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task<IResult> DownloadPatcherFromMirrors(IProgress<double> progress)
|
private async Task<IResult> DownloadPatcherFromMirrors(IProgress<double> progress)
|
||||||
{
|
{
|
||||||
foreach (var mirror in _data.PatcherReleaseMirrors)
|
SetStatus("Downloading Patcher", "Checking cache ...", progressStyle: ProgressStyle.Indeterminate);
|
||||||
|
|
||||||
|
if (DownloadCacheHelper.CheckCache("patcher.zip", _expectedPatcherHash, out var cacheFile))
|
||||||
{
|
{
|
||||||
SetStatus($"Downloading Patcher", mirror.Link);
|
_data.PatcherZipInfo = cacheFile;
|
||||||
|
Log.Information("Using cached file {fileName} - Hash: {hash}", _data.PatcherZipInfo.Name, _expectedPatcherHash);
|
||||||
// mega is a little weird since they use encryption, but thankfully there is a great library for their api :)
|
|
||||||
if (mirror.Link.StartsWith("https://mega"))
|
|
||||||
{
|
|
||||||
var megaClient = new MegaApiClient();
|
|
||||||
await megaClient.LoginAnonymousAsync();
|
|
||||||
|
|
||||||
// if mega fails to connect, try the next mirror
|
|
||||||
if (!megaClient.IsLoggedIn) continue;
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
using var megaDownloadStream = await megaClient.DownloadAsync(new Uri(mirror.Link), progress);
|
|
||||||
|
|
||||||
_data.PatcherZipInfo = await DownloadCacheHelper.GetOrDownloadFileAsync("patcher.zip", megaDownloadStream, mirror.Hash);
|
|
||||||
|
|
||||||
if(_data.PatcherZipInfo == null)
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
return Result.FromSuccess();
|
return Result.FromSuccess();
|
||||||
}
|
}
|
||||||
catch
|
|
||||||
{
|
|
||||||
//most likely a 509 (Bandwidth limit exceeded) due to mega's user quotas.
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
_data.PatcherZipInfo = await DownloadCacheHelper.GetOrDownloadFileAsync("patcher.zip", mirror.Link, progress, mirror.Hash);
|
foreach (var mirror in _mirrors)
|
||||||
|
{
|
||||||
|
SetStatus("Downloading Patcher", mirror.MirrorInfo.Link, progressStyle: ProgressStyle.Indeterminate);
|
||||||
|
|
||||||
|
_data.PatcherZipInfo = await mirror.Download(progress);
|
||||||
|
|
||||||
if (_data.PatcherZipInfo != null)
|
if (_data.PatcherZipInfo != null)
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user