Merge pull request #955 from erri120/cache-favicons

Cache Favicons
This commit is contained in:
Timothy Baldridge 2020-07-10 08:31:04 -07:00 committed by GitHub
commit 3d8e9ace92
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 57 additions and 15 deletions

View File

@ -102,6 +102,7 @@ namespace Wabbajack.Common
public const string ModListExtensionString = ".wabbajack";
public static Extension ModListExtension = new Extension(ModListExtensionString);
public static AbsolutePath LocalAppDataPath => new AbsolutePath(Path.Combine(KnownFolders.LocalAppData.Path, "Wabbajack"));
public static AbsolutePath FaviconCacheFolderPath => LocalAppDataPath.Combine("favicons");
public static string MetricsKeyHeader => "x-metrics-key";
public static string WabbajackCacheLocation = "http://build.wabbajack.org/nexus_api_cache/";

View File

@ -15,6 +15,7 @@ using System.Windows.Threading;
using Microsoft.WindowsAPICodePack.Shell.PropertySystem;
using ReactiveUI;
using ReactiveUI.Fody.Helpers;
using Wabbajack.Common;
using Wabbajack.Lib;
using Wabbajack.Lib.Downloaders;
@ -84,22 +85,62 @@ namespace Wabbajack
{
if (Login.IconUri == null) return;
using var img = await new Wabbajack.Lib.Http.Client().GetAsync(Login.IconUri, errorsAsExceptions:false);
if (!img.IsSuccessStatusCode) return;
if(!Consts.FaviconCacheFolderPath.Exists)
Consts.FaviconCacheFolderPath.CreateDirectory();
var icoData = new MemoryStream(await img.Content.ReadAsByteArrayAsync());
var data = new Icon(icoData);
var ms = new MemoryStream();
data.ToBitmap().Save(ms, ImageFormat.Png);
ms.Position = 0;
var source = new BitmapImage();
source.BeginInit();
source.StreamSource = ms;
source.EndInit();
source.Freeze();
Favicon = source;
var faviconIcon = Consts.FaviconCacheFolderPath.Combine($"{Login.SiteName}.ico");
if (faviconIcon.Exists)
{
var fsi = new FileInfo(faviconIcon.ToString());
var creationDate = fsi.CreationTimeUtc;
var now = DateTime.UtcNow;
//delete favicons older than 10 days
if ((now - creationDate).TotalDays > 10)
await faviconIcon.DeleteAsync();
}
if (faviconIcon.Exists)
{
await using var fs = await faviconIcon.OpenRead();
var ms = new MemoryStream((int)fs.Length);
await fs.CopyToAsync(ms);
ms.Position = 0;
var source = new BitmapImage();
source.BeginInit();
source.StreamSource = ms;
source.EndInit();
source.Freeze();
Favicon = source;
}
else
{
using var img = await new Lib.Http.Client().GetAsync(Login.IconUri, errorsAsExceptions: false);
if (!img.IsSuccessStatusCode) return;
var icoData = new MemoryStream(await img.Content.ReadAsByteArrayAsync());
var data = new Icon(icoData);
var ms = new MemoryStream();
data.ToBitmap().Save(ms, ImageFormat.Png);
ms.Position = 0;
await using (var fs = await faviconIcon.Create())
{
await ms.CopyToAsync(fs);
ms.Position = 0;
}
var source = new BitmapImage();
source.BeginInit();
source.StreamSource = ms;
source.EndInit();
source.Freeze();
Favicon = source;
}
});
}
}