From a03a156a6a96f5f162ede253cf2ad2c1f75ef4a7 Mon Sep 17 00:00:00 2001 From: exsersewo Date: Sat, 28 Mar 2020 09:35:55 +0000 Subject: [PATCH] VerBump, Booru Updates, Restructuring --- Booru.Net.Tests/Booru.Net.Tests.csproj | 2 + Booru.Net.Tests/Program.cs | 56 ++++++- Booru.Net/Booru.Net.csproj | 30 +++- Booru.Net/Client.cs | 142 ------------------ Booru.Net/Clients/DanbooruClient.cs | 45 ++++++ Booru.Net/Clients/E621Client.cs | 45 ++++++ Booru.Net/Clients/GelbooruClient.cs | 45 ++++++ Booru.Net/Clients/KonaChanClient.cs | 45 ++++++ Booru.Net/Clients/RealbooruClient.cs | 45 ++++++ Booru.Net/Clients/Rule34Client.cs | 45 ++++++ Booru.Net/Clients/SafeBooruClient.cs | 45 ++++++ Booru.Net/Clients/YandereClient.cs | 45 ++++++ Booru.Net/Converters/TagGroupConverter.cs | 53 +++++++ Booru.Net/Interfaces/IIndexBooruClient.cs | 13 ++ Booru.Net/Interfaces/IPHPBooruClient.cs | 13 ++ Booru.Net/Interfaces/IPostBooruClient.cs | 13 ++ Booru.Net/Interfaces/IPostsBooruClient.cs | 13 ++ .../Interfaces/IPostsWrappedBooruClient.cs | 13 ++ Booru.Net/Models/Boards/E621Image.cs | 22 ++- Booru.Net/Models/Boards/E621Score.cs | 16 ++ Booru.Net/Models/Boards/GelbooruImage.cs | 3 + Booru.Net/Models/Boards/SafebooruImage.cs | 3 + Booru.Net/Models/Boards/WrappedPosts.cs | 9 ++ Booru.Net/Models/{Boards => }/BooruImage.cs | 3 - .../PublishProfiles/FolderProfile.pubxml | 13 ++ Booru.Net/Props.cs | 12 ++ Booru.Net/WebRequest.cs | 52 ------- 27 files changed, 633 insertions(+), 208 deletions(-) delete mode 100644 Booru.Net/Client.cs create mode 100644 Booru.Net/Clients/DanbooruClient.cs create mode 100644 Booru.Net/Clients/E621Client.cs create mode 100644 Booru.Net/Clients/GelbooruClient.cs create mode 100644 Booru.Net/Clients/KonaChanClient.cs create mode 100644 Booru.Net/Clients/RealbooruClient.cs create mode 100644 Booru.Net/Clients/Rule34Client.cs create mode 100644 Booru.Net/Clients/SafeBooruClient.cs create mode 100644 Booru.Net/Clients/YandereClient.cs create mode 100644 Booru.Net/Converters/TagGroupConverter.cs create mode 100644 Booru.Net/Interfaces/IIndexBooruClient.cs create mode 100644 Booru.Net/Interfaces/IPHPBooruClient.cs create mode 100644 Booru.Net/Interfaces/IPostBooruClient.cs create mode 100644 Booru.Net/Interfaces/IPostsBooruClient.cs create mode 100644 Booru.Net/Interfaces/IPostsWrappedBooruClient.cs create mode 100644 Booru.Net/Models/Boards/E621Score.cs create mode 100644 Booru.Net/Models/Boards/WrappedPosts.cs rename Booru.Net/Models/{Boards => }/BooruImage.cs (91%) create mode 100644 Booru.Net/Properties/PublishProfiles/FolderProfile.pubxml create mode 100644 Booru.Net/Props.cs delete mode 100644 Booru.Net/WebRequest.cs 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; - } - } - } -}