Optimize the gallery image loaders

This commit is contained in:
Timothy Baldridge 2021-02-26 17:08:05 -07:00
parent 4298c2a432
commit 96601ee958
4 changed files with 37 additions and 22 deletions

View File

@ -56,19 +56,8 @@ namespace Wabbajack.Lib.ModListRegistry
[JsonName("Links")]
public class LinksObject
{
[JsonProperty("image")] public string ImageUri { get; set; } = string.Empty;
[JsonIgnore]
public string ImageUrlFast
{
get
{
if (ImageUri.StartsWith("https://raw.githubusercontent.com/wabbajack-tools/mod-lists/"))
return ImageUri.Replace("https://raw.githubusercontent.com/wabbajack-tools/mod-lists/",
"https://mod-lists.wabbajack.org/");
return ImageUri;
}
}
[JsonProperty("image")]
public string ImageUri { get; set; } = string.Empty;
[JsonProperty("readme")]
public string Readme { get; set; } = string.Empty;

View File

@ -11,6 +11,7 @@ using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Windows.Media.Imaging;
using SharpDX.Text;
using Wabbajack.Common;
namespace Wabbajack
@ -85,14 +86,19 @@ namespace Wabbajack
{
try
{
var (found, mstream) = await FindCachedImage(url);
if (found) return mstream;
var ret = new MemoryStream();
using (var client = new HttpClient())
using (var stream = await client.GetStreamAsync(url))
await using (var stream = await client.GetStreamAsync(url))
{
stream.CopyTo(ret);
await stream.CopyToAsync(ret);
}
ret.Seek(0, SeekOrigin.Begin);
await WriteCachedImage(url, ret.ToArray());
return ret;
}
catch (Exception ex)
@ -101,7 +107,6 @@ namespace Wabbajack
return default;
}
})
.ObserveOnGuiThread()
.Select(memStream =>
{
if (memStream == null) return default;
@ -118,7 +123,26 @@ namespace Wabbajack
{
memStream.Dispose();
}
});
})
.ObserveOnGuiThread();
}
private static async Task WriteCachedImage(string url, byte[] data)
{
var folder = Consts.LocalAppDataPath.Combine("ModListImages");
if (!folder.Exists) folder.CreateDirectory();
var path = folder.Combine(Encoding.UTF8.GetBytes(url).xxHash().ToHex());
await path.WriteAllBytesAsync(data);
}
private static async Task<(bool Found, MemoryStream data)> FindCachedImage(string uri)
{
var folder = Consts.LocalAppDataPath.Combine("ModListImages");
if (!folder.Exists) folder.CreateDirectory();
var path = folder.Combine(Encoding.UTF8.GetBytes(uri).xxHash().ToHex());
return path.Exists ? (true, new MemoryStream(await path.ReadAllBytesAsync())) : (false, default);
}
/// <summary>

View File

@ -161,7 +161,7 @@ namespace Wabbajack
})
.ToGuiProperty(this, nameof(Exists));
var imageObs = Observable.Return(Metadata.Links.ImageUrlFast)
var imageObs = Observable.Return(Metadata.Links.ImageUri)
.DownloadBitmapImage((ex) => Utils.Log($"Error downloading modlist image {Metadata.Title}"));
_Image = imageObs

View File

@ -37,13 +37,15 @@ namespace Wabbajack
.BindToStrict(this, x => x.DownloadProgressBar.Value)
.DisposeWith(dispose);
this.WhenAny(x => x.ViewModel.Metadata)
.Where(x => !x.ImageContainsTitle)
.Select(x => x.Title)
.CombineLatest(this.WhenAny(x => x.ViewModel.IsBroken))
.Where(x => !x.First.ImageContainsTitle || x.Second)
.Select(x => x.First.Title)
.BindToStrict(this, x => x.DescriptionTextShadow.Text)
.DisposeWith(dispose);
this.WhenAny(x => x.ViewModel.Metadata)
.Where(x => !x.ImageContainsTitle)
.Select(x => x.Title)
.CombineLatest(this.WhenAny(x => x.ViewModel.IsBroken))
.Where(x => !x.First.ImageContainsTitle || x.Second)
.Select(x => x.First.Title)
.BindToStrict(this, x => x.ModListTitleShadow.Text)
.DisposeWith(dispose);