diff --git a/Booru.Net.Tests/Booru.Net.Tests.csproj b/Booru.Net.Tests/Booru.Net.Tests.csproj
index 51ab5c4..24d1af4 100644
--- a/Booru.Net.Tests/Booru.Net.Tests.csproj
+++ b/Booru.Net.Tests/Booru.Net.Tests.csproj
@@ -3,6 +3,8 @@
Exe
netcoreapp2.1
+ 2020.3.24.0
+ 2020.3.24.0
diff --git a/Booru.Net.Tests/Program.cs b/Booru.Net.Tests/Program.cs
index 8c6eb5e..2de2edf 100644
--- a/Booru.Net.Tests/Program.cs
+++ b/Booru.Net.Tests/Program.cs
@@ -1,5 +1,7 @@
using System.Threading.Tasks;
using System;
+using System.Collections.Generic;
+using System.Linq;
namespace Booru.Net.Tests
{
@@ -7,14 +9,60 @@ namespace Booru.Net.Tests
{
static void Main(string[] args) => StartAsync().GetAwaiter().GetResult();
-
static async Task StartAsync()
{
- var BooruClient = new BooruClient();
-
- var posts = await BooruClient.GetSafebooruImagesAsync();
+ for (int x = 0; x < 8; x++)
+ await DoClientTest(x).ConfigureAwait(false);
Console.ReadLine();
}
+
+ static async Task DoClientTest(int client)
+ {
+ try
+ {
+ IEnumerable posts = null;
+
+ Console.WriteLine(client);
+
+ switch(client)
+ {
+ case 0:
+ posts = await new DanbooruClient().GetImagesAsync().ConfigureAwait(false);
+ break;
+ case 1:
+ var p = await new E621Client().GetImagesAsync().ConfigureAwait(false);
+ Console.WriteLine(p.Posts.All(x => x != null));
+ break;
+ case 2:
+ posts = await new GelbooruClient().GetImagesAsync().ConfigureAwait(false);
+ break;
+ case 3:
+ posts = await new KonaChanClient().GetImagesAsync().ConfigureAwait(false);
+ break;
+ case 4:
+ posts = await new RealbooruClient().GetImagesAsync().ConfigureAwait(false);
+ break;
+ case 5:
+ posts = await new Rule34Client().GetImagesAsync().ConfigureAwait(false);
+ break;
+ case 6:
+ posts = await new SafebooruClient().GetImagesAsync().ConfigureAwait(false);
+ break;
+ case 7:
+ posts = await new YandereClient().GetImagesAsync().ConfigureAwait(false);
+ break;
+ }
+
+ if (posts != null)
+ {
+ Console.WriteLine(posts.All(x => x != null));
+ }
+ }
+ catch(Exception ex)
+ {
+ Console.Write(ex);
+ }
+ }
}
}
diff --git a/Booru.Net/Booru.Net.csproj b/Booru.Net/Booru.Net.csproj
index 9880e9b..254880f 100644
--- a/Booru.Net/Booru.Net.csproj
+++ b/Booru.Net/Booru.Net.csproj
@@ -3,6 +3,7 @@
netstandard2.0
true
+ Latest
exsersewo
An asynchronous Booru based ImageBoard wrapper.
@@ -16,19 +17,40 @@ Gelbooru,
Konachan,
E621 and
Yande.re
- https://github.com/systemexit/Booru.Net
+ https://github.com/exsersewo/Booru.Net
exsersewo
- https://github.com/systemexit/Booru.Net
+ https://github.com/exsersewo/Booru.Net
Library
booru imageboard api wrapper
true
- 1.0.0.4
+ 2.0.0.0
LICENSE
+ 2.0.0.0
+ 2.0.0.0
+ ⚠ This version is not compatible with 1.0.0.X code ⚠
+
+Wrapper Restructuring & Seperate out each client from the container client
+Fix bugs presented from some booru's updating
+
+
+
+ True
+ False
+ True
+ True
+ False
+ None.None.None.None
+ False
+ SettingsVersion
+ None
+ None.None.None.None
-
+
+
+
diff --git a/Booru.Net/Client.cs b/Booru.Net/Client.cs
deleted file mode 100644
index 60f9d39..0000000
--- a/Booru.Net/Client.cs
+++ /dev/null
@@ -1,142 +0,0 @@
-using System;
-using System.Linq;
-using System.Collections.Generic;
-using System.Threading.Tasks;
-using Newtonsoft.Json;
-
-namespace Booru.Net
-{
- public class BooruClient
- {
- public async Task> GetSafebooruImagesAsync(IEnumerable tags)
- {
- IList newtags = tags.ToList();
- var tagstring = String.Join("%20", newtags);
-
- var data = await WebRequest.ReturnStringAsync(new Uri("https://safebooru.org/index.php?page=dapi&s=post&q=index&json=1&tags=" + tagstring));
-
- if (data != null)
- {
- var posts = JsonConvert.DeserializeObject>(data);
- return posts;
- }
-
- return null;
- }
- public async Task> GetRule34ImagesAsync(IEnumerable tags)
- {
- IList newtags = tags.ToList();
- var tagstring = String.Join("%20", newtags);
-
- var data = await WebRequest.ReturnStringAsync(new Uri("https://rule34.xxx/index.php?page=dapi&s=post&q=index&json=1&tags=" + tagstring));
- if (data != null)
- {
- var posts = JsonConvert.DeserializeObject>(data);
- return posts;
- }
-
- return null;
- }
- public async Task> GetRealBooruImagesAsync(IEnumerable tags)
- {
- IList newtags = tags.ToList();
- var tagstring = String.Join("%20", newtags);
-
- var data = await WebRequest.ReturnStringAsync(new Uri("https://realbooru.com/index.php?page=dapi&s=post&q=index&json=1&tags=" + tagstring));
- if (data != null)
- {
- var posts = JsonConvert.DeserializeObject>(data);
- return posts;
- }
-
- return null;
- }
- public async Task> GetDanbooruImagesAsync(IEnumerable tags)
- {
- IList newtags = tags.ToList();
- var tagstring = String.Join("%20", newtags);
-
- var data = await WebRequest.ReturnStringAsync(new Uri("https://danbooru.donmai.us/posts.json?tags=" + tagstring));
- if (data != null)
- {
- var posts = JsonConvert.DeserializeObject>(data);
- return posts;
- }
-
- return null;
- }
- public async Task> GetGelbooruImagesAsync(IEnumerable tags)
- {
- IList newtags = tags.ToList();
- var tagstring = String.Join("%20", newtags);
-
- var data = await WebRequest.ReturnStringAsync(new Uri("https://gelbooru.com/index.php?page=dapi&s=post&q=index&json=1&tags=" + tagstring));
-
- if (data != null)
- {
- var posts = JsonConvert.DeserializeObject>(data);
- return posts;
- }
- else return null;
- }
- public async Task> GetKonaChanImagesAsync(IEnumerable tags)
- {
- IList newtags = tags.ToList();
- var tagstring = String.Join("%20", newtags);
-
- var data = await WebRequest.ReturnStringAsync(new Uri("https://konachan.com/post.json?tags=" + tagstring));
-
- if (data != null)
- {
- var posts = JsonConvert.DeserializeObject>(data);
- return posts;
- }
- else return null;
- }
- public async Task> GetE621ImagesAsync(IEnumerable tags)
- {
- IList newtags = tags.ToList();
- var tagstring = String.Join("%20", newtags);
-
- var data = await WebRequest.ReturnStringAsync(new Uri("https://e621.net/post/index.json?tags=" + tagstring));
-
- if (data != null)
- {
- var posts = JsonConvert.DeserializeObject>(data);
- return posts;
- }
- else return null;
- }
- public async Task> GetYandereImagesAsync(IEnumerable tags)
- {
- IList newtags = tags.ToList();
- var tagstring = String.Join("%20", newtags);
-
- var data = await WebRequest.ReturnStringAsync(new Uri("https://yande.re/post.json?tags=" + tagstring));
-
- if (data != null)
- {
- var posts = JsonConvert.DeserializeObject>(data);
- return posts;
- }
- else return null;
- }
-
- public async Task> GetSafebooruImagesAsync(params string[] tags)
- => await GetSafebooruImagesAsync(tags.AsEnumerable());
- public async Task> GetRule34ImagesAsync(params string[] tags)
- => await GetRule34ImagesAsync(tags.AsEnumerable());
- public async Task> GetRealBooruImagesAsync(params string[] tags)
- => await GetRealBooruImagesAsync(tags.AsEnumerable());
- public async Task> GetDanbooruImagesAsync(params string[] tags)
- => await GetDanbooruImagesAsync(tags.AsEnumerable());
- public async Task> GetGelbooruImagesAsync(params string[] tags)
- => await GetGelbooruImagesAsync(tags.AsEnumerable());
- public async Task> GetKonaChanImagesAsync(params string[] tags)
- => await GetKonaChanImagesAsync(tags.AsEnumerable());
- public async Task> GetE621ImagesAsync(params string[] tags)
- => await GetE621ImagesAsync(tags.AsEnumerable());
- public async Task> GetYandereImagesAsync(params string[] tags)
- => await GetYandereImagesAsync(tags.AsEnumerable());
- }
-}
diff --git a/Booru.Net/Clients/DanbooruClient.cs b/Booru.Net/Clients/DanbooruClient.cs
new file mode 100644
index 0000000..3f9757a
--- /dev/null
+++ b/Booru.Net/Clients/DanbooruClient.cs
@@ -0,0 +1,45 @@
+using Newtonsoft.Json;
+using RestEase;
+using System;
+using System.Collections.Generic;
+using System.Net.Http;
+using System.Threading.Tasks;
+
+namespace Booru.Net
+{
+ public class DanbooruClient : IPostsBooruClient, IDisposable
+ {
+ IPostsBooruClient _api;
+
+ public DanbooruClient()
+ {
+ var httpClient = new HttpClient
+ {
+ BaseAddress = new Uri("https://danbooru.donmai.us/")
+ };
+ httpClient.DefaultRequestHeaders.Add("User-Agent", $"Booru.Net/v{Props.LibraryVersion} (https://github.com/exsersewo/Booru.Net)");
+
+ JsonSerializerSettings settings = new JsonSerializerSettings
+ {
+ Formatting = Formatting.Indented,
+ NullValueHandling = NullValueHandling.Ignore
+ };
+
+ _api = new RestClient(httpClient)
+ {
+ JsonSerializerSettings = settings
+ }.For>();
+ }
+
+ public Task> GetImagesAsync(IEnumerable tags)
+ => _api.GetImagesAsync(tags);
+
+ public Task> GetImagesAsync(params string[] tags)
+ => _api.GetImagesAsync(tags);
+
+ public void Dispose()
+ {
+ _api.Dispose();
+ }
+ }
+}
diff --git a/Booru.Net/Clients/E621Client.cs b/Booru.Net/Clients/E621Client.cs
new file mode 100644
index 0000000..eea0ee6
--- /dev/null
+++ b/Booru.Net/Clients/E621Client.cs
@@ -0,0 +1,45 @@
+using Newtonsoft.Json;
+using RestEase;
+using System;
+using System.Collections.Generic;
+using System.Net.Http;
+using System.Threading.Tasks;
+
+namespace Booru.Net
+{
+ public class E621Client : IPostsWrappedBooruClient>, IDisposable
+ {
+ IPostsWrappedBooruClient> _api;
+
+ public E621Client()
+ {
+ var httpClient = new HttpClient
+ {
+ BaseAddress = new Uri("https://e621.net/")
+ };
+ httpClient.DefaultRequestHeaders.Add("User-Agent", $"Booru.Net/v{Props.LibraryVersion} (https://github.com/exsersewo/Booru.Net)");
+
+ JsonSerializerSettings settings = new JsonSerializerSettings
+ {
+ Formatting = Formatting.Indented,
+ NullValueHandling = NullValueHandling.Ignore
+ };
+
+ _api = new RestClient(httpClient)
+ {
+ JsonSerializerSettings = settings
+ }.For>>();
+ }
+
+ public Task> GetImagesAsync(IEnumerable tags)
+ => _api.GetImagesAsync(tags);
+
+ public Task> GetImagesAsync(params string[] tags)
+ => _api.GetImagesAsync(tags);
+
+ public void Dispose()
+ {
+
+ }
+ }
+}
diff --git a/Booru.Net/Clients/GelbooruClient.cs b/Booru.Net/Clients/GelbooruClient.cs
new file mode 100644
index 0000000..af0c2ec
--- /dev/null
+++ b/Booru.Net/Clients/GelbooruClient.cs
@@ -0,0 +1,45 @@
+using Newtonsoft.Json;
+using RestEase;
+using System;
+using System.Collections.Generic;
+using System.Net.Http;
+using System.Threading.Tasks;
+
+namespace Booru.Net
+{
+ public class GelbooruClient : IPHPBooruClient, IDisposable
+ {
+ IPHPBooruClient _api;
+
+ public GelbooruClient()
+ {
+ var httpClient = new HttpClient
+ {
+ BaseAddress = new Uri("https://gelbooru.com/")
+ };
+ httpClient.DefaultRequestHeaders.Add("User-Agent", $"Booru.Net/v{Props.LibraryVersion} (https://github.com/exsersewo/Booru.Net)");
+
+ JsonSerializerSettings settings = new JsonSerializerSettings
+ {
+ Formatting = Formatting.Indented,
+ NullValueHandling = NullValueHandling.Ignore
+ };
+
+ _api = new RestClient(httpClient)
+ {
+ JsonSerializerSettings = settings
+ }.For>();
+ }
+
+ public Task> GetImagesAsync(IEnumerable tags)
+ => _api.GetImagesAsync(tags);
+
+ public Task> GetImagesAsync(params string[] tags)
+ => _api.GetImagesAsync(tags);
+
+ public void Dispose()
+ {
+
+ }
+ }
+}
diff --git a/Booru.Net/Clients/KonaChanClient.cs b/Booru.Net/Clients/KonaChanClient.cs
new file mode 100644
index 0000000..ec96bdf
--- /dev/null
+++ b/Booru.Net/Clients/KonaChanClient.cs
@@ -0,0 +1,45 @@
+using Newtonsoft.Json;
+using RestEase;
+using System;
+using System.Collections.Generic;
+using System.Net.Http;
+using System.Threading.Tasks;
+
+namespace Booru.Net
+{
+ public class KonaChanClient : IPostBooruClient, IDisposable
+ {
+ IPostBooruClient _api;
+
+ public KonaChanClient()
+ {
+ var httpClient = new HttpClient
+ {
+ BaseAddress = new Uri("https://konachan.com/")
+ };
+ httpClient.DefaultRequestHeaders.Add("User-Agent", $"Booru.Net/v{Props.LibraryVersion} (https://github.com/exsersewo/Booru.Net)");
+
+ JsonSerializerSettings settings = new JsonSerializerSettings
+ {
+ Formatting = Formatting.Indented,
+ NullValueHandling = NullValueHandling.Ignore
+ };
+
+ _api = new RestClient(httpClient)
+ {
+ JsonSerializerSettings = settings
+ }.For>();
+ }
+
+ public Task> GetImagesAsync(IEnumerable tags)
+ => _api.GetImagesAsync(tags);
+
+ public Task> GetImagesAsync(params string[] tags)
+ => _api.GetImagesAsync(tags);
+
+ public void Dispose()
+ {
+
+ }
+ }
+}
diff --git a/Booru.Net/Clients/RealbooruClient.cs b/Booru.Net/Clients/RealbooruClient.cs
new file mode 100644
index 0000000..c82ca45
--- /dev/null
+++ b/Booru.Net/Clients/RealbooruClient.cs
@@ -0,0 +1,45 @@
+using Newtonsoft.Json;
+using RestEase;
+using System;
+using System.Collections.Generic;
+using System.Net.Http;
+using System.Threading.Tasks;
+
+namespace Booru.Net
+{
+ public class RealbooruClient : IPHPBooruClient, IDisposable
+ {
+ IPHPBooruClient _api;
+
+ public RealbooruClient()
+ {
+ var httpClient = new HttpClient
+ {
+ BaseAddress = new Uri("https://realbooru.com/")
+ };
+ httpClient.DefaultRequestHeaders.Add("User-Agent", $"Booru.Net/v{Props.LibraryVersion} (https://github.com/exsersewo/Booru.Net)");
+
+ JsonSerializerSettings settings = new JsonSerializerSettings
+ {
+ Formatting = Formatting.Indented,
+ NullValueHandling = NullValueHandling.Ignore
+ };
+
+ _api = new RestClient(httpClient)
+ {
+ JsonSerializerSettings = settings
+ }.For>();
+ }
+
+ public async Task> GetImagesAsync(IEnumerable tags)
+ => await _api.GetImagesAsync(tags).ConfigureAwait(false);
+
+ public async Task> GetImagesAsync(params string[] tags)
+ => await _api.GetImagesAsync(tags).ConfigureAwait(false);
+
+ public void Dispose()
+ {
+
+ }
+ }
+}
diff --git a/Booru.Net/Clients/Rule34Client.cs b/Booru.Net/Clients/Rule34Client.cs
new file mode 100644
index 0000000..b2c0415
--- /dev/null
+++ b/Booru.Net/Clients/Rule34Client.cs
@@ -0,0 +1,45 @@
+using Newtonsoft.Json;
+using RestEase;
+using System;
+using System.Collections.Generic;
+using System.Net.Http;
+using System.Threading.Tasks;
+
+namespace Booru.Net
+{
+ public class Rule34Client : IPHPBooruClient, IDisposable
+ {
+ IPHPBooruClient _api;
+
+ public Rule34Client()
+ {
+ var httpClient = new HttpClient
+ {
+ BaseAddress = new Uri("https://rule34.xxx/")
+ };
+ httpClient.DefaultRequestHeaders.Add("User-Agent", $"Booru.Net/v{Props.LibraryVersion} (https://github.com/exsersewo/Booru.Net)");
+
+ JsonSerializerSettings settings = new JsonSerializerSettings
+ {
+ Formatting = Formatting.Indented,
+ NullValueHandling = NullValueHandling.Ignore
+ };
+
+ _api = new RestClient(httpClient)
+ {
+ JsonSerializerSettings = settings
+ }.For>();
+ }
+
+ public Task> GetImagesAsync(IEnumerable tags)
+ => _api.GetImagesAsync(tags);
+
+ public Task> GetImagesAsync(params string[] tags)
+ => _api.GetImagesAsync(tags);
+
+ public void Dispose()
+ {
+
+ }
+ }
+}
diff --git a/Booru.Net/Clients/SafeBooruClient.cs b/Booru.Net/Clients/SafeBooruClient.cs
new file mode 100644
index 0000000..ccbd7a3
--- /dev/null
+++ b/Booru.Net/Clients/SafeBooruClient.cs
@@ -0,0 +1,45 @@
+using Newtonsoft.Json;
+using RestEase;
+using System;
+using System.Collections.Generic;
+using System.Net.Http;
+using System.Threading.Tasks;
+
+namespace Booru.Net
+{
+ public class SafebooruClient : IPHPBooruClient, IDisposable
+ {
+ IPHPBooruClient _api;
+
+ public SafebooruClient()
+ {
+ var httpClient = new HttpClient
+ {
+ BaseAddress = new Uri("https://safebooru.org/")
+ };
+ httpClient.DefaultRequestHeaders.Add("User-Agent", $"Booru.Net/v{Props.LibraryVersion} (https://github.com/exsersewo/Booru.Net)");
+
+ JsonSerializerSettings settings = new JsonSerializerSettings
+ {
+ Formatting = Formatting.Indented,
+ NullValueHandling = NullValueHandling.Ignore
+ };
+
+ _api = new RestClient(httpClient)
+ {
+ JsonSerializerSettings = settings
+ }.For>();
+ }
+
+ public Task> GetImagesAsync(IEnumerable tags)
+ => _api.GetImagesAsync(tags);
+
+ public Task> GetImagesAsync(params string[] tags)
+ => _api.GetImagesAsync(tags);
+
+ public void Dispose()
+ {
+
+ }
+ }
+}
diff --git a/Booru.Net/Clients/YandereClient.cs b/Booru.Net/Clients/YandereClient.cs
new file mode 100644
index 0000000..e5d99bb
--- /dev/null
+++ b/Booru.Net/Clients/YandereClient.cs
@@ -0,0 +1,45 @@
+using Newtonsoft.Json;
+using RestEase;
+using System;
+using System.Collections.Generic;
+using System.Net.Http;
+using System.Threading.Tasks;
+
+namespace Booru.Net
+{
+ public class YandereClient : IPostBooruClient, IDisposable
+ {
+ IPostBooruClient _api;
+
+ public YandereClient()
+ {
+ var httpClient = new HttpClient
+ {
+ BaseAddress = new Uri("https://yande.re/")
+ };
+ httpClient.DefaultRequestHeaders.Add("User-Agent", $"Booru.Net/v{Props.LibraryVersion} (https://github.com/exsersewo/Booru.Net)");
+
+ JsonSerializerSettings settings = new JsonSerializerSettings
+ {
+ Formatting = Formatting.Indented,
+ NullValueHandling = NullValueHandling.Ignore
+ };
+
+ _api = new RestClient(httpClient)
+ {
+ JsonSerializerSettings = settings
+ }.For>();
+ }
+
+ public Task> GetImagesAsync(IEnumerable tags)
+ => _api.GetImagesAsync(tags);
+
+ public Task> GetImagesAsync(params string[] tags)
+ => _api.GetImagesAsync(tags);
+
+ public void Dispose()
+ {
+
+ }
+ }
+}
diff --git a/Booru.Net/Converters/TagGroupConverter.cs b/Booru.Net/Converters/TagGroupConverter.cs
new file mode 100644
index 0000000..8f285c8
--- /dev/null
+++ b/Booru.Net/Converters/TagGroupConverter.cs
@@ -0,0 +1,53 @@
+using Newtonsoft.Json;
+using Newtonsoft.Json.Linq;
+using System;
+using System.Collections.Generic;
+
+namespace Booru.Net.Converters
+{
+ public class TagGroupConverter : JsonConverter
+ {
+ public override bool CanConvert(Type objectType)
+ {
+ return objectType == typeof(List>>);
+ }
+
+ public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
+ {
+ var token = JToken.Load(reader);
+
+ List>> container = new List>>();
+
+ foreach(var el in token.Children())
+ {
+ Dictionary> att = new Dictionary>();
+ foreach (JProperty prop in el.Properties())
+ {
+ List children = new List();
+
+ foreach(var child in prop.Value.Children())
+ {
+ children.Add(child.Value());
+ }
+
+ att.Add(prop.Name, children);
+ break;
+ }
+
+ container.Add(att);
+ }
+
+ return container;
+ }
+
+ public override bool CanWrite
+ {
+ get { return false; }
+ }
+
+ public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
+ {
+ throw new NotImplementedException();
+ }
+ }
+}
diff --git a/Booru.Net/Interfaces/IIndexBooruClient.cs b/Booru.Net/Interfaces/IIndexBooruClient.cs
new file mode 100644
index 0000000..9e51ece
--- /dev/null
+++ b/Booru.Net/Interfaces/IIndexBooruClient.cs
@@ -0,0 +1,13 @@
+using RestEase;
+using System;
+using System.Collections.Generic;
+using System.Threading.Tasks;
+
+namespace Booru.Net
+{
+ public interface IIndexBooruClient : IDisposable
+ {
+ [Get("index.json")]
+ public Task> GetImagesAsync([Query("tags")] IEnumerable tags);
+ }
+}
diff --git a/Booru.Net/Interfaces/IPHPBooruClient.cs b/Booru.Net/Interfaces/IPHPBooruClient.cs
new file mode 100644
index 0000000..5e956ca
--- /dev/null
+++ b/Booru.Net/Interfaces/IPHPBooruClient.cs
@@ -0,0 +1,13 @@
+using RestEase;
+using System;
+using System.Collections.Generic;
+using System.Threading.Tasks;
+
+namespace Booru.Net
+{
+ public interface IPHPBooruClient : IDisposable
+ {
+ [Get("index.php?page=dapi&s=post&q=index&json=1")]
+ public Task> GetImagesAsync([Query("tags")] IEnumerable tags);
+ }
+}
diff --git a/Booru.Net/Interfaces/IPostBooruClient.cs b/Booru.Net/Interfaces/IPostBooruClient.cs
new file mode 100644
index 0000000..20dbd9b
--- /dev/null
+++ b/Booru.Net/Interfaces/IPostBooruClient.cs
@@ -0,0 +1,13 @@
+using RestEase;
+using System;
+using System.Collections.Generic;
+using System.Threading.Tasks;
+
+namespace Booru.Net
+{
+ public interface IPostBooruClient : IDisposable
+ {
+ [Get("post.json")]
+ public Task> GetImagesAsync([Query("tags")] IEnumerable tags);
+ }
+}
diff --git a/Booru.Net/Interfaces/IPostsBooruClient.cs b/Booru.Net/Interfaces/IPostsBooruClient.cs
new file mode 100644
index 0000000..1ec2252
--- /dev/null
+++ b/Booru.Net/Interfaces/IPostsBooruClient.cs
@@ -0,0 +1,13 @@
+using RestEase;
+using System;
+using System.Collections.Generic;
+using System.Threading.Tasks;
+
+namespace Booru.Net
+{
+ public interface IPostsBooruClient : IDisposable
+ {
+ [Get("posts.json")]
+ public Task> GetImagesAsync([Query("tags")] IEnumerable tags);
+ }
+}
diff --git a/Booru.Net/Interfaces/IPostsWrappedBooruClient.cs b/Booru.Net/Interfaces/IPostsWrappedBooruClient.cs
new file mode 100644
index 0000000..a0ef5ad
--- /dev/null
+++ b/Booru.Net/Interfaces/IPostsWrappedBooruClient.cs
@@ -0,0 +1,13 @@
+using RestEase;
+using System;
+using System.Collections.Generic;
+using System.Threading.Tasks;
+
+namespace Booru.Net
+{
+ public interface IPostsWrappedBooruClient : IDisposable
+ {
+ [Get("posts.json")]
+ public Task GetImagesAsync([Query("tags")] IEnumerable tags);
+ }
+}
diff --git a/Booru.Net/Models/Boards/E621Image.cs b/Booru.Net/Models/Boards/E621Image.cs
index 1fda44a..200e10c 100644
--- a/Booru.Net/Models/Boards/E621Image.cs
+++ b/Booru.Net/Models/Boards/E621Image.cs
@@ -1,7 +1,23 @@
-namespace Booru.Net
+using Booru.Net.Converters;
+using Newtonsoft.Json;
+using System.Collections.Generic;
+
+namespace Booru.Net
{
- public class E621Image : GelbooruImage
+ public class E621Image : BooruImage
{
- public override string PostUrl { get { return "https://e621.net/post/show/" + ID; } }
+ [JsonProperty("score")]
+ public E621Score Score { get; set; }
+
+ [JsonProperty("directory")]
+ public string Directory { get; set; }
+
+ [JsonProperty("tags")]
+ [JsonConverter(typeof(TagGroupConverter))]
+ private List>> PTags { get; set; }
+
+ public IReadOnlyList>> Tags { get { return PTags.AsReadOnly(); } }
+
+ public override string PostUrl { get { return "https://e621.net/post/show/" + ID; } }
}
}
diff --git a/Booru.Net/Models/Boards/E621Score.cs b/Booru.Net/Models/Boards/E621Score.cs
new file mode 100644
index 0000000..b6fa97c
--- /dev/null
+++ b/Booru.Net/Models/Boards/E621Score.cs
@@ -0,0 +1,16 @@
+using Newtonsoft.Json;
+
+namespace Booru.Net
+{
+ public class E621Score
+ {
+ [JsonProperty("up")]
+ public int Up { get; set; }
+
+ [JsonProperty("down")]
+ private int Down { get; set; }
+
+ [JsonProperty("total")]
+ private int Total { get; set; }
+ }
+}
diff --git a/Booru.Net/Models/Boards/GelbooruImage.cs b/Booru.Net/Models/Boards/GelbooruImage.cs
index 2b83442..07b3973 100644
--- a/Booru.Net/Models/Boards/GelbooruImage.cs
+++ b/Booru.Net/Models/Boards/GelbooruImage.cs
@@ -5,6 +5,9 @@ namespace Booru.Net
{
public class GelbooruImage : BooruImage
{
+ [JsonProperty("score")]
+ public int? Score { get; set; }
+
[JsonProperty("directory")]
public string Directory { get; set; }
diff --git a/Booru.Net/Models/Boards/SafebooruImage.cs b/Booru.Net/Models/Boards/SafebooruImage.cs
index 90640c8..2210650 100644
--- a/Booru.Net/Models/Boards/SafebooruImage.cs
+++ b/Booru.Net/Models/Boards/SafebooruImage.cs
@@ -41,6 +41,9 @@ namespace Booru.Net
[JsonProperty("width")]
public int Width { get; set; }
+ [JsonProperty("score")]
+ public int? Score { get; set; }
+
public IReadOnlyList Tags
=> Ptags.Split(' ');
diff --git a/Booru.Net/Models/Boards/WrappedPosts.cs b/Booru.Net/Models/Boards/WrappedPosts.cs
new file mode 100644
index 0000000..92e7622
--- /dev/null
+++ b/Booru.Net/Models/Boards/WrappedPosts.cs
@@ -0,0 +1,9 @@
+using System.Collections.Generic;
+
+namespace Booru.Net
+{
+ public class WrappedPosts
+ {
+ public IReadOnlyList Posts;
+ }
+}
diff --git a/Booru.Net/Models/Boards/BooruImage.cs b/Booru.Net/Models/BooruImage.cs
similarity index 91%
rename from Booru.Net/Models/Boards/BooruImage.cs
rename to Booru.Net/Models/BooruImage.cs
index 43f7113..1ebb516 100644
--- a/Booru.Net/Models/Boards/BooruImage.cs
+++ b/Booru.Net/Models/BooruImage.cs
@@ -7,9 +7,6 @@ namespace Booru.Net
[JsonProperty("id")]
public int ID { get; set; }
- [JsonProperty("score")]
- public int Score { get; set; }
-
[JsonProperty("rating")]
private string Prating { get; set; }
diff --git a/Booru.Net/Properties/PublishProfiles/FolderProfile.pubxml b/Booru.Net/Properties/PublishProfiles/FolderProfile.pubxml
new file mode 100644
index 0000000..1bf4dcf
--- /dev/null
+++ b/Booru.Net/Properties/PublishProfiles/FolderProfile.pubxml
@@ -0,0 +1,13 @@
+
+
+
+
+ FileSystem
+ Release
+ Any CPU
+ netstandard2.0
+ bin\Release\netstandard2.0\publish\
+
+
\ No newline at end of file
diff --git a/Booru.Net/Props.cs b/Booru.Net/Props.cs
new file mode 100644
index 0000000..8372168
--- /dev/null
+++ b/Booru.Net/Props.cs
@@ -0,0 +1,12 @@
+using System.Reflection;
+
+namespace Booru.Net
+{
+ static class Props
+ {
+ public static string LibraryVersion { get; } =
+ typeof(SafebooruClient).GetTypeInfo().Assembly.GetCustomAttribute()?.InformationalVersion ??
+ typeof(SafebooruClient).GetTypeInfo().Assembly.GetName().Version.ToString(3) ??
+ "Unknown";
+ }
+}
diff --git a/Booru.Net/WebRequest.cs b/Booru.Net/WebRequest.cs
deleted file mode 100644
index 0a1b0e7..0000000
--- a/Booru.Net/WebRequest.cs
+++ /dev/null
@@ -1,52 +0,0 @@
-using System;
-using System.Net;
-using System.Threading.Tasks;
-using System.IO;
-using System.Reflection;
-
-namespace Booru.Net
-{
- class WebRequest
- {
- public static HttpWebRequest CreateWebRequest(Uri uri)
- {
- var ver = Assembly.GetExecutingAssembly().GetName().Version;
-
- var cli = (HttpWebRequest)System.Net.WebRequest.Create(uri);
- cli.UserAgent = "Mozilla/5.0 Booru.Net/{VERSION} +https://github.com/exsersewo/Booru.Net".Replace("{VERSION}", $"{ver.Major}.{ver.MajorRevision}.{ver.Minor}.{ver.MinorRevision}");
- cli.AllowAutoRedirect = true;
- cli.KeepAlive = false;
- cli.Timeout = 20000;
- cli.ProtocolVersion = HttpVersion.Version11;
-
- return cli;
- }
- public static async Task ReturnStringAsync(Uri url)
- {
- try
- {
- var client = CreateWebRequest(url);
-
- var resp = (HttpWebResponse)(await client.GetResponseAsync());
- if (resp.StatusCode == HttpStatusCode.OK)
- {
- var reader = new StreamReader(resp.GetResponseStream());
- var responce = await reader.ReadToEndAsync();
- resp.Dispose();
- client.Abort();
- return responce;
- }
- else
- {
- resp.Dispose();
- client.Abort();
- return null;
- }
- }
- catch
- {
- return null;
- }
- }
- }
-}