From 3f0928e1c3a7013bb0c1ecb6e5be362fbecd3e74 Mon Sep 17 00:00:00 2001 From: Mathew Sachin Date: Sun, 26 Nov 2017 12:25:30 +0530 Subject: [PATCH] Cache sprites to temporary folder --- Core/SpriteManager.cs | 52 +++++++++---------- .../ValueConverters/PokemonSpriteConverter.cs | 17 +----- 2 files changed, 25 insertions(+), 44 deletions(-) diff --git a/Core/SpriteManager.cs b/Core/SpriteManager.cs index d210bb0..36d93e4 100644 --- a/Core/SpriteManager.cs +++ b/Core/SpriteManager.cs @@ -6,31 +6,15 @@ namespace Poke { public static class SpriteManager { - public static Stream GetStream(string Link) + static SpriteManager() { - const int bytesToRead = 100; + LocalPrefix = Path.Combine(Path.GetTempPath(), "pkimg"); - var request = WebRequest.Create(Link); - request.Timeout = -1; - - var reader = new BinaryReader(request.GetResponse().GetResponseStream()); - var memoryStream = new MemoryStream(); - - var bytebuffer = new byte[bytesToRead]; - var bytesRead = reader.Read(bytebuffer, 0, bytesToRead); - - while (bytesRead > 0) - { - memoryStream.Write(bytebuffer, 0, bytesRead); - bytesRead = reader.Read(bytebuffer, 0, bytesToRead); - } - - memoryStream.Seek(0, SeekOrigin.Begin); - - return memoryStream; + if (!Directory.Exists(LocalPrefix)) + Directory.CreateDirectory(LocalPrefix); } - - static string MakeSpriteLink(int Number, bool Back, bool Mega, bool Alolan, Gender Gender, bool Shiny) + + static string GetSpriteFileName(int Number, bool Back, bool Mega, bool Alolan, Gender Gender, bool Shiny) { var b = Back ? "b_" : ""; @@ -56,9 +40,12 @@ static string MakeSpriteLink(int Number, bool Back, bool Mega, bool Alolan, Gend var s = Shiny ? "_s" : ""; - return $"https://bulbapedia.bulbagarden.net/wiki/File:Spr_{b}7s_{Number:D3}{m}{a}{gender}{s}.png"; + return $"Spr_{b}7s_{Number:D3}{m}{a}{gender}{s}.png"; } + const string BulbapediaPrefix = "https://bulbapedia.bulbagarden.net/wiki/File:"; + static readonly string LocalPrefix; + public static string GetSpriteLink(Pokemon Pokemon, bool Back = false) { var name = Pokemon.Species.Name; @@ -79,14 +66,23 @@ public static string GetSpriteLink(Pokemon Pokemon, bool Back = false) string GetLink(Gender Gender = Gender.Genderless) { - var link = MakeSpriteLink(Pokemon.Species.Number, Back, mega, alolan, Gender, Pokemon.Shiny); + var fileName = GetSpriteFileName(Pokemon.Species.Number, Back, mega, alolan, Gender, Pokemon.Shiny); + + var localPath = Path.Combine(LocalPrefix, fileName); - var request = WebRequest.Create(link); - request.Timeout = -1; + if (File.Exists(localPath)) + return localPath; + + using (var w = new WebClient()) + { + var content = w.DownloadString(BulbapediaPrefix + fileName); + + var imgLink = "https:" + CQ.Create(content)[".fullImageLink a"].Attr("href"); - var stream = request.GetResponse().GetResponseStream(); + w.DownloadFile(imgLink, localPath); + } - return "https:" + CQ.Create(stream)[".fullImageLink a"].Attr("href"); + return localPath; } // Mega Charizard diff --git a/Poke/ValueConverters/PokemonSpriteConverter.cs b/Poke/ValueConverters/PokemonSpriteConverter.cs index ee4a05e..5586dce 100644 --- a/Poke/ValueConverters/PokemonSpriteConverter.cs +++ b/Poke/ValueConverters/PokemonSpriteConverter.cs @@ -1,31 +1,16 @@ using System; using System.Globalization; using System.Windows.Data; -using System.Windows.Media; -using System.Windows.Media.Imaging; namespace Poke { public class PokemonSpriteConverter : IMultiValueConverter { - static ImageSource GetImageSource(string Link) - { - var image = new BitmapImage(); - - image.BeginInit(); - - image.StreamSource = SpriteManager.GetStream(Link); - - image.EndInit(); - - return image; - } - public object Convert(object[] value, Type targetType, object parameter, CultureInfo culture) { if (value[0] is Pokemon pokemon && parameter is string s) { - return GetImageSource(SpriteManager.GetSpriteLink(pokemon, s == "Back")); + return SpriteManager.GetSpriteLink(pokemon, s == "Back"); } return null;