Skip to content

Commit

Permalink
Update DataGetter
Browse files Browse the repository at this point in the history
Fix Bug
Update for Issue #6
  • Loading branch information
flier268 committed Mar 1, 2018
1 parent 565fd56 commit fcf9085
Show file tree
Hide file tree
Showing 18 changed files with 2,010 additions and 1,357 deletions.
2 changes: 2 additions & 0 deletions DataGetter/DataGetter.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,9 @@
<DependentUpon>Form1.cs</DependentUpon>
<SubType>Form</SubType>
</Compile>
<Compile Include="ImageUtilities.cs" />
<Compile Include="JsonClass.cs" />
<Compile Include="poedbJson.cs" />
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<EmbeddedResource Include="Form1.resx">
Expand Down
291 changes: 151 additions & 140 deletions DataGetter/Form1.cs

Large diffs are not rendered by default.

208 changes: 208 additions & 0 deletions DataGetter/ImageUtilities.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,208 @@
using System;
using System.Collections.Generic;
using System.Drawing; // note: add reference to System.Drawing assembly
using System.IO;
using System.Linq;
using System.Net.Http;
using System.Net.Http.Headers;

namespace Utilities
{
// largely credited to https://stackoverflow.com/a/112711/3838199 for the image-specific code
public static class ImageUtilities
{
private const string ErrorMessage = "Could not read image data";
private const int ChunkSize = 1024;
private static readonly Dictionary<byte[], Func<BinaryReader, Size>> ImageFormatDecoders = new Dictionary<byte[], Func<BinaryReader, Size>>()
{
{ new byte[]{ 0x42, 0x4D }, DecodeBitmap},
{ new byte[]{ 0x47, 0x49, 0x46, 0x38, 0x37, 0x61 }, DecodeGif },
{ new byte[]{ 0x47, 0x49, 0x46, 0x38, 0x39, 0x61 }, DecodeGif },
{ new byte[]{ 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A }, DecodePng },
{ new byte[]{ 0xff, 0xd8 }, DecodeJfif },
};

/// <summary>
/// Retrieve the dimensions of an online image, downloading as little as possible
/// </summary>
public static Size GetWebDimensions(Uri uri)
{
var moreBytes = true;
var currentStart = 0;
byte[] allBytes = { };

while (moreBytes)
{
try
{
var newBytes = GetSomeBytes(uri, currentStart, currentStart + ChunkSize - 1);
if (newBytes.Length < ChunkSize) moreBytes = false;
allBytes = Combine(allBytes, newBytes);
return GetDimensions(new BinaryReader(new MemoryStream(allBytes)));
}
catch
{
currentStart += ChunkSize;
}
}

return new Size(0, 0);
}

private static byte[] GetSomeBytes(Uri uri, int startRange, int endRange)
{
using (var client = new HttpClient())
{
var request = new HttpRequestMessage { RequestUri = uri };
request.Headers.Range = new RangeHeaderValue(startRange, endRange);
try
{
var response = client.SendAsync(request).Result;
return response.Content.ReadAsByteArrayAsync().Result;
}
catch { }
}
return new byte[] { };
}

/// <summary>
/// Gets the dimensions of an image.
/// </summary>
/// <returns>The dimensions of the specified image.</returns>
/// <exception cref="ArgumentException">The image was of an unrecognized format.</exception>
public static Size GetDimensions(BinaryReader binaryReader)
{
int maxMagicBytesLength = ImageFormatDecoders.Keys.OrderByDescending(x => x.Length).First().Length;

byte[] magicBytes = new byte[maxMagicBytesLength];

for (int i = 0; i < maxMagicBytesLength; i += 1)
{
magicBytes[i] = binaryReader.ReadByte();

foreach (var kvPair in ImageFormatDecoders)
{
if (magicBytes.StartsWith(kvPair.Key))
{
return kvPair.Value(binaryReader);
}
}
}

throw new ArgumentException(ErrorMessage, nameof(binaryReader));
}
public static Size GetDimensions(string path)
{
try
{
using (BinaryReader binaryReader = new BinaryReader(File.OpenRead(path)))
{
try
{
return GetDimensions(binaryReader);
}
catch (ArgumentException e)
{
string newMessage = string.Format("{0} file: '{1}' ", e.Message, path);

throw new ArgumentException(newMessage, "path", e);
}
}
}
catch (ArgumentException)
{
//do it the old fashioned way

using (Bitmap b = new Bitmap(path))
{
return b.Size;
}
}
}
// from https://stackoverflow.com/a/415839/3838199
private static byte[] Combine(byte[] first, byte[] second)
{
byte[] ret = new byte[first.Length + second.Length];
Buffer.BlockCopy(first, 0, ret, 0, first.Length);
Buffer.BlockCopy(second, 0, ret, first.Length, second.Length);
return ret;
}

private static bool StartsWith(this byte[] thisBytes, byte[] thatBytes)
{
for (int i = 0; i < thatBytes.Length; i += 1)
{
if (thisBytes[i] != thatBytes[i])
{
return false;
}
}
return true;
}

private static short ReadLittleEndianInt16(this BinaryReader binaryReader)
{
byte[] bytes = new byte[sizeof(short)];
for (int i = 0; i < sizeof(short); i += 1)
{
bytes[sizeof(short) - 1 - i] = binaryReader.ReadByte();
}
return BitConverter.ToInt16(bytes, 0);
}

private static int ReadLittleEndianInt32(this BinaryReader binaryReader)
{
byte[] bytes = new byte[sizeof(int)];
for (int i = 0; i < sizeof(int); i += 1)
{
bytes[sizeof(int) - 1 - i] = binaryReader.ReadByte();
}
return BitConverter.ToInt32(bytes, 0);
}

private static Size DecodeBitmap(BinaryReader binaryReader)
{
binaryReader.ReadBytes(16);
int width = binaryReader.ReadInt32();
int height = binaryReader.ReadInt32();
return new Size(width, height);
}

private static Size DecodeGif(BinaryReader binaryReader)
{
int width = binaryReader.ReadInt16();
int height = binaryReader.ReadInt16();
return new Size(width, height);
}

private static Size DecodePng(BinaryReader binaryReader)
{
binaryReader.ReadBytes(8);
int width = binaryReader.ReadLittleEndianInt32();
int height = binaryReader.ReadLittleEndianInt32();
return new Size(width, height);
}

private static Size DecodeJfif(BinaryReader binaryReader)
{
while (binaryReader.ReadByte() == 0xff)
{
byte marker = binaryReader.ReadByte();
short chunkLength = binaryReader.ReadLittleEndianInt16();

if (marker == 0xc0 || marker == 0xc1 || marker == 0xc2)
{
binaryReader.ReadByte();

int height = binaryReader.ReadLittleEndianInt16();
int width = binaryReader.ReadLittleEndianInt16();
return new Size(width, height);
}

binaryReader.ReadBytes(chunkLength - 2);
}

throw new ArgumentException(ErrorMessage);
}
}
}
4 changes: 3 additions & 1 deletion DataGetter/JsonClass.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
namespace DataGetter
using System.Collections.Generic;

namespace DataGetter
{
class JsonClass
{
Expand Down
50 changes: 50 additions & 0 deletions DataGetter/PoedbJson.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
using System.Collections.Generic;
using System.Globalization;

namespace DataGetter
{
public partial class poedbJson
{
[JsonProperty("caption")]
public string Caption { get; set; }

[JsonProperty("data")]
public List<List<string>> Data { get; set; }

[JsonProperty("columns")]
public List<Column> Columns { get; set; }
}

public partial class Column
{
[JsonProperty("title")]
public string Title { get; set; }
}

public partial class poedbJson
{
public static poedbJson FromJson(string json) => JsonConvert.DeserializeObject<poedbJson>(json, DataGetter.Converter.Settings);
}

public static class Serialize
{
public static string ToJson(this poedbJson self) => JsonConvert.SerializeObject(self, DataGetter.Converter.Settings);
}

internal class Converter
{
public static readonly JsonSerializerSettings Settings = new JsonSerializerSettings
{
MetadataPropertyHandling = MetadataPropertyHandling.Ignore,
DateParseHandling = DateParseHandling.None,
Converters = {
new IsoDateTimeConverter()
{
DateTimeStyles = DateTimeStyles.AssumeUniversal,
},
},
};
}
}
4 changes: 2 additions & 2 deletions DataGetter/Properties/AssemblyInfo.cs
Original file line number Diff line number Diff line change
Expand Up @@ -32,5 +32,5 @@
// 您可以指定所有的值,或將組建編號或修訂編號設為預設值
// 指定為預設值:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.1")]
[assembly: AssemblyFileVersion("1.0.0.1")]
[assembly: AssemblyVersion("1.0.0.2")]
[assembly: AssemblyFileVersion("1.0.0.2")]
26 changes: 25 additions & 1 deletion Poe整理倉庫v2.sln
Original file line number Diff line number Diff line change
@@ -1,13 +1,16 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15
VisualStudioVersion = 15.0.26730.3
VisualStudioVersion = 15.0.26730.16
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Poe整理倉庫v2", "Poe整理倉庫v2\Poe整理倉庫v2.csproj", "{635C1C97-2212-4C1E-9396-F26D4F4FD0EC}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DataGetter", "DataGetter\DataGetter.csproj", "{157BB369-72A1-4E5A-95FF-E571B1BDA7A4}"
EndProject
Global
GlobalSection(Performance) = preSolution
HasPerformanceSessions = true
EndGlobalSection
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
Expand All @@ -28,4 +31,25 @@ Global
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {189A485B-7F5A-40A6-9696-B0627D55FBD2}
EndGlobalSection
GlobalSection(Performance) = preSolution
HasPerformanceSessions = true
EndGlobalSection
GlobalSection(Performance) = preSolution
HasPerformanceSessions = true
EndGlobalSection
GlobalSection(Performance) = preSolution
HasPerformanceSessions = true
EndGlobalSection
GlobalSection(Performance) = preSolution
HasPerformanceSessions = true
EndGlobalSection
GlobalSection(Performance) = preSolution
HasPerformanceSessions = true
EndGlobalSection
GlobalSection(Performance) = preSolution
HasPerformanceSessions = true
EndGlobalSection
GlobalSection(Performance) = preSolution
HasPerformanceSessions = true
EndGlobalSection
EndGlobal
17 changes: 9 additions & 8 deletions Poe整理倉庫v2/Async.cs
Original file line number Diff line number Diff line change
Expand Up @@ -120,7 +120,7 @@ public async void GetWarehouse(int length = 12)

JsonClass.RootObject t;
if (m.Groups[1].ToString() == "傳奇" || m.Groups[1].ToString() == "Unique")
{
{
t = ItemList_Unique.Where(a => a.c.EndsWith(PrivateFunction.GetStringAfterSomething(temp.Name, "」")) || a.e.EndsWith(PrivateFunction.GetStringAfterSomething(temp.Name, "」"))).FirstOrDefault();
}
else
Expand All @@ -138,13 +138,14 @@ public async void GetWarehouse(int length = 12)
{
Form2 f = new Form2(clip, temp.Name);
f.ShowDialog();
if(File.Exists(Path.Combine(Application.StartupPath, "ItemList_Adden.txt")))
using (StreamReader rr = new StreamReader(Path.Combine(Application.StartupPath, "ItemList_Adden.txt"), Encoding.UTF8))
{
ItemList_Adden = JsonConvert.DeserializeObject<List<JsonClass.RootObject>>(rr.ReadToEnd());
if (ItemList_Adden == null)
ItemList_Adden = new List<RootObject>();
}
if (File.Exists(Path.Combine(Application.StartupPath, "ItemList_Adden.txt")))
using (StreamReader rr = new StreamReader(Path.Combine(Application.StartupPath, "ItemList_Adden.txt"), Encoding.UTF8))
{
ItemList_Adden = JsonConvert.DeserializeObject<List<JsonClass.RootObject>>(rr.ReadToEnd());
if (ItemList_Adden == null)
ItemList_Adden = new List<RootObject>();
rr.Close();
}
t = ItemList_Adden.Where(a => temp.Name.Equals(a.c) || temp.Name.Equals(a.e)).FirstOrDefault();
}
temp.w = t.w;
Expand Down
Loading

0 comments on commit fcf9085

Please sign in to comment.