Compare commits
7 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| d84c95654a | |||
| e8a1391a38 | |||
| 8492bc994e | |||
| c1e7e93ed7 | |||
| ed236340cd | |||
| f2d21dc411 | |||
| 7266a2162d |
@@ -3,8 +3,8 @@
|
|||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<OutputType>Exe</OutputType>
|
<OutputType>Exe</OutputType>
|
||||||
<TargetFramework>netcoreapp2.1</TargetFramework>
|
<TargetFramework>netcoreapp2.1</TargetFramework>
|
||||||
<AssemblyVersion>2020.3.24.0</AssemblyVersion>
|
<AssemblyVersion>2020.4.28.0</AssemblyVersion>
|
||||||
<FileVersion>2020.3.24.0</FileVersion>
|
<FileVersion>2020.4.28.0</FileVersion>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
|||||||
@@ -21,43 +21,61 @@ namespace Booru.Net.Tests
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
IEnumerable<BooruImage> posts = null;
|
|
||||||
|
|
||||||
Console.WriteLine(client);
|
Console.WriteLine(client);
|
||||||
|
|
||||||
switch(client)
|
List<string> tags = new List<string>{ "corona", "-cum" };
|
||||||
|
|
||||||
|
switch (client)
|
||||||
{
|
{
|
||||||
case 0:
|
case 0:
|
||||||
posts = await new DanbooruClient().GetImagesAsync().ConfigureAwait(false);
|
{
|
||||||
|
var posts = await new DanbooruClient().GetImagesAsync(tags).ConfigureAwait(false);
|
||||||
|
Console.WriteLine(posts.Any(x => x.Tags.Any(z=>tags.Contains(z) != null)));
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
var p = await new E621Client().GetImagesAsync().ConfigureAwait(false);
|
{
|
||||||
Console.WriteLine(p.Posts.All(x => x != null));
|
var posts = await new E621Client().GetImagesAsync(tags).ConfigureAwait(false);
|
||||||
|
Console.WriteLine(posts.All(x => x.Tags.Any(z => z.Value.Any(y => tags.Contains(y)))));
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
posts = await new GelbooruClient().GetImagesAsync().ConfigureAwait(false);
|
{
|
||||||
|
var posts = await new GelbooruClient().GetImagesAsync(tags).ConfigureAwait(false);
|
||||||
|
Console.WriteLine(posts.Any(x => x.Tags.Any(z => tags.Contains(z) != null)));
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
posts = await new KonaChanClient().GetImagesAsync().ConfigureAwait(false);
|
{
|
||||||
|
var posts = await new KonaChanClient().GetImagesAsync(tags).ConfigureAwait(false);
|
||||||
|
Console.WriteLine(posts.Any(x => x.Tags.Any(z => tags.Contains(z) != null)));
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case 4:
|
case 4:
|
||||||
posts = await new RealbooruClient().GetImagesAsync().ConfigureAwait(false);
|
{
|
||||||
|
var posts = await new RealbooruClient().GetImagesAsync(tags).ConfigureAwait(false);
|
||||||
|
Console.WriteLine(posts.Any(x => x.Tags.Any(z => tags.Contains(z) != null)));
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case 5:
|
case 5:
|
||||||
posts = await new Rule34Client().GetImagesAsync().ConfigureAwait(false);
|
{
|
||||||
|
var posts = await new Rule34Client().GetImagesAsync(tags).ConfigureAwait(false);
|
||||||
|
Console.WriteLine(posts.Any(x => x.Tags.Any(z => tags.Contains(z) != null)));
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case 6:
|
case 6:
|
||||||
posts = await new SafebooruClient().GetImagesAsync().ConfigureAwait(false);
|
{
|
||||||
|
var posts = await new SafebooruClient().GetImagesAsync(tags).ConfigureAwait(false);
|
||||||
|
Console.WriteLine(posts.Any(x => x.Tags.Any(z => tags.Contains(z) != null)));
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case 7:
|
case 7:
|
||||||
posts = await new YandereClient().GetImagesAsync().ConfigureAwait(false);
|
{
|
||||||
|
var posts = await new YandereClient().GetImagesAsync(tags).ConfigureAwait(false);
|
||||||
|
Console.WriteLine(posts.Any(x => x.Tags.Any(z => tags.Contains(z) != null)));
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (posts != null)
|
|
||||||
{
|
|
||||||
Console.WriteLine(posts.All(x => x != null));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
catch(Exception ex)
|
catch(Exception ex)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -24,11 +24,11 @@ Yande.re</Description>
|
|||||||
<PackageTags>booru imageboard api wrapper</PackageTags>
|
<PackageTags>booru imageboard api wrapper</PackageTags>
|
||||||
<PackageLicenseUrl></PackageLicenseUrl>
|
<PackageLicenseUrl></PackageLicenseUrl>
|
||||||
<PackageRequireLicenseAcceptance>true</PackageRequireLicenseAcceptance>
|
<PackageRequireLicenseAcceptance>true</PackageRequireLicenseAcceptance>
|
||||||
<Version>2.0.1</Version>
|
<Version>2.0.5</Version>
|
||||||
<PackageLicenseFile>LICENSE</PackageLicenseFile>
|
<PackageLicenseFile>LICENSE</PackageLicenseFile>
|
||||||
<AssemblyVersion>2.0.1.0</AssemblyVersion>
|
<AssemblyVersion>2.0.5.0</AssemblyVersion>
|
||||||
<FileVersion>2.0.1.0</FileVersion>
|
<FileVersion>2.0.5.0</FileVersion>
|
||||||
<PackageReleaseNotes>Fix a few fields not being visible on E621Image#Score</PackageReleaseNotes>
|
<PackageReleaseNotes>Tags now work</PackageReleaseNotes>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
|
||||||
@@ -46,7 +46,6 @@ Yande.re</Description>
|
|||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="Newtonsoft.Json" Version="12.0.3" />
|
<PackageReference Include="Newtonsoft.Json" Version="12.0.3" />
|
||||||
<PackageReference Include="RestEase" Version="1.4.10" />
|
|
||||||
<PackageReference Include="System.Threading.Tasks.Extensions" Version="4.5.4" />
|
<PackageReference Include="System.Threading.Tasks.Extensions" Version="4.5.4" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
using RestEase;
|
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Net.Http;
|
using System.Net.Http;
|
||||||
@@ -7,35 +6,43 @@ using System.Threading.Tasks;
|
|||||||
|
|
||||||
namespace Booru.Net
|
namespace Booru.Net
|
||||||
{
|
{
|
||||||
public class DanbooruClient : IPostsBooruClient<DanbooruImage>, IDisposable
|
public class DanbooruClient : IDisposable
|
||||||
{
|
{
|
||||||
IPostsBooruClient<DanbooruImage> _api;
|
private readonly HttpClient _api;
|
||||||
|
private readonly JsonSerializerSettings settings;
|
||||||
|
|
||||||
public DanbooruClient()
|
public DanbooruClient()
|
||||||
{
|
{
|
||||||
var httpClient = new HttpClient
|
_api = new HttpClient
|
||||||
{
|
{
|
||||||
BaseAddress = new Uri("https://danbooru.donmai.us/")
|
BaseAddress = new Uri("https://danbooru.donmai.us/")
|
||||||
};
|
};
|
||||||
httpClient.DefaultRequestHeaders.Add("User-Agent", $"Booru.Net/v{Props.LibraryVersion} (https://github.com/exsersewo/Booru.Net)");
|
_api.DefaultRequestHeaders.Add("User-Agent", $"Booru.Net/v{Props.LibraryVersion} (https://github.com/exsersewo/Booru.Net)");
|
||||||
|
|
||||||
JsonSerializerSettings settings = new JsonSerializerSettings
|
settings = new JsonSerializerSettings
|
||||||
{
|
{
|
||||||
Formatting = Formatting.Indented,
|
Formatting = Formatting.Indented,
|
||||||
NullValueHandling = NullValueHandling.Ignore
|
NullValueHandling = NullValueHandling.Ignore
|
||||||
};
|
};
|
||||||
|
|
||||||
_api = new RestClient(httpClient)
|
|
||||||
{
|
|
||||||
JsonSerializerSettings = settings
|
|
||||||
}.For<IPostsBooruClient<DanbooruImage>>();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public Task<IReadOnlyList<DanbooruImage>> GetImagesAsync(IEnumerable<string> tags)
|
public Task<IReadOnlyList<DanbooruImage>> GetImagesAsync(IEnumerable<string> tags)
|
||||||
=> _api.GetImagesAsync(tags);
|
=> GetImagesAsync(string.Join("%20", tags));
|
||||||
|
|
||||||
public Task<IReadOnlyList<DanbooruImage>> GetImagesAsync(params string[] tags)
|
public Task<IReadOnlyList<DanbooruImage>> GetImagesAsync(params string[] tags)
|
||||||
=> _api.GetImagesAsync(tags);
|
=> GetImagesAsync(string.Join("%20", tags));
|
||||||
|
|
||||||
|
public async Task<IReadOnlyList<DanbooruImage>> GetImagesAsync(string tags)
|
||||||
|
{
|
||||||
|
var get = await _api.GetAsync($"posts.json?tags={tags}").ConfigureAwait(false);
|
||||||
|
|
||||||
|
if (!get.IsSuccessStatusCode)
|
||||||
|
throw new HttpRequestException($"Response failed with reason: \"({get.StatusCode}) {get.ReasonPhrase}\"");
|
||||||
|
|
||||||
|
var content = await get.Content.ReadAsStringAsync().ConfigureAwait(false);
|
||||||
|
|
||||||
|
return JsonConvert.DeserializeObject<IReadOnlyList<DanbooruImage>>(content, settings);
|
||||||
|
}
|
||||||
|
|
||||||
public void Dispose()
|
public void Dispose()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
using RestEase;
|
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Net.Http;
|
using System.Net.Http;
|
||||||
@@ -7,35 +6,45 @@ using System.Threading.Tasks;
|
|||||||
|
|
||||||
namespace Booru.Net
|
namespace Booru.Net
|
||||||
{
|
{
|
||||||
public class E621Client : IPostsWrappedBooruClient<WrappedPosts<E621Image>>, IDisposable
|
public class E621Client : IDisposable
|
||||||
{
|
{
|
||||||
IPostsWrappedBooruClient<WrappedPosts<E621Image>> _api;
|
private readonly HttpClient _api;
|
||||||
|
private readonly JsonSerializerSettings settings;
|
||||||
|
|
||||||
public E621Client()
|
public E621Client()
|
||||||
{
|
{
|
||||||
var httpClient = new HttpClient
|
_api = new HttpClient
|
||||||
{
|
{
|
||||||
BaseAddress = new Uri("https://e621.net/")
|
BaseAddress = new Uri("https://e621.net/")
|
||||||
};
|
};
|
||||||
httpClient.DefaultRequestHeaders.Add("User-Agent", $"Booru.Net/v{Props.LibraryVersion} (https://github.com/exsersewo/Booru.Net)");
|
_api.DefaultRequestHeaders.Add("User-Agent", $"Booru.Net/v{Props.LibraryVersion} (https://github.com/exsersewo/Booru.Net)");
|
||||||
|
|
||||||
JsonSerializerSettings settings = new JsonSerializerSettings
|
settings = new JsonSerializerSettings
|
||||||
{
|
{
|
||||||
Formatting = Formatting.Indented,
|
Formatting = Formatting.Indented,
|
||||||
NullValueHandling = NullValueHandling.Ignore
|
NullValueHandling = NullValueHandling.Ignore
|
||||||
};
|
};
|
||||||
|
|
||||||
_api = new RestClient(httpClient)
|
|
||||||
{
|
|
||||||
JsonSerializerSettings = settings
|
|
||||||
}.For<IPostsWrappedBooruClient<WrappedPosts<E621Image>>>();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public Task<WrappedPosts<E621Image>> GetImagesAsync(IEnumerable<string> tags)
|
public Task<IReadOnlyList<E621Image>> GetImagesAsync(IEnumerable<string> tags)
|
||||||
=> _api.GetImagesAsync(tags);
|
=> GetImagesAsync(string.Join("%20", tags));
|
||||||
|
|
||||||
public Task<WrappedPosts<E621Image>> GetImagesAsync(params string[] tags)
|
public Task<IReadOnlyList<E621Image>> GetImagesAsync(params string[] tags)
|
||||||
=> _api.GetImagesAsync(tags);
|
=> GetImagesAsync(string.Join("%20", tags));
|
||||||
|
|
||||||
|
public async Task<IReadOnlyList<E621Image>> GetImagesAsync(string tags)
|
||||||
|
{
|
||||||
|
var get = await _api.GetAsync($"posts.json?tags={tags}").ConfigureAwait(false);
|
||||||
|
|
||||||
|
if (!get.IsSuccessStatusCode)
|
||||||
|
throw new HttpRequestException($"Response failed with reason: \"({get.StatusCode}) {get.ReasonPhrase}\"");
|
||||||
|
|
||||||
|
var content = await get.Content.ReadAsStringAsync().ConfigureAwait(false);
|
||||||
|
|
||||||
|
var posts = JsonConvert.DeserializeObject<WrappedPosts<E621Image>>(content, settings);
|
||||||
|
|
||||||
|
return posts.Posts;
|
||||||
|
}
|
||||||
|
|
||||||
public void Dispose()
|
public void Dispose()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
using RestEase;
|
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Net.Http;
|
using System.Net.Http;
|
||||||
@@ -7,35 +6,43 @@ using System.Threading.Tasks;
|
|||||||
|
|
||||||
namespace Booru.Net
|
namespace Booru.Net
|
||||||
{
|
{
|
||||||
public class GelbooruClient : IPHPBooruClient<GelbooruImage>, IDisposable
|
public class GelbooruClient : IDisposable
|
||||||
{
|
{
|
||||||
IPHPBooruClient<GelbooruImage> _api;
|
private readonly HttpClient _api;
|
||||||
|
private readonly JsonSerializerSettings settings;
|
||||||
|
|
||||||
public GelbooruClient()
|
public GelbooruClient()
|
||||||
{
|
{
|
||||||
var httpClient = new HttpClient
|
_api = new HttpClient
|
||||||
{
|
{
|
||||||
BaseAddress = new Uri("https://gelbooru.com/")
|
BaseAddress = new Uri("https://gelbooru.com/")
|
||||||
};
|
};
|
||||||
httpClient.DefaultRequestHeaders.Add("User-Agent", $"Booru.Net/v{Props.LibraryVersion} (https://github.com/exsersewo/Booru.Net)");
|
_api.DefaultRequestHeaders.Add("User-Agent", $"Booru.Net/v{Props.LibraryVersion} (https://github.com/exsersewo/Booru.Net)");
|
||||||
|
|
||||||
JsonSerializerSettings settings = new JsonSerializerSettings
|
settings = new JsonSerializerSettings
|
||||||
{
|
{
|
||||||
Formatting = Formatting.Indented,
|
Formatting = Formatting.Indented,
|
||||||
NullValueHandling = NullValueHandling.Ignore
|
NullValueHandling = NullValueHandling.Ignore
|
||||||
};
|
};
|
||||||
|
|
||||||
_api = new RestClient(httpClient)
|
|
||||||
{
|
|
||||||
JsonSerializerSettings = settings
|
|
||||||
}.For<IPHPBooruClient<GelbooruImage>>();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public Task<IReadOnlyList<GelbooruImage>> GetImagesAsync(IEnumerable<string> tags)
|
public Task<IReadOnlyList<GelbooruImage>> GetImagesAsync(IEnumerable<string> tags)
|
||||||
=> _api.GetImagesAsync(tags);
|
=> GetImagesAsync(string.Join("%20", tags));
|
||||||
|
|
||||||
public Task<IReadOnlyList<GelbooruImage>> GetImagesAsync(params string[] tags)
|
public Task<IReadOnlyList<GelbooruImage>> GetImagesAsync(params string[] tags)
|
||||||
=> _api.GetImagesAsync(tags);
|
=> GetImagesAsync(string.Join("%20", tags));
|
||||||
|
|
||||||
|
public async Task<IReadOnlyList<GelbooruImage>> GetImagesAsync(string tags)
|
||||||
|
{
|
||||||
|
var get = await _api.GetAsync($"index.php?page=dapi&s=post&q=index&json=1&tags={tags}").ConfigureAwait(false);
|
||||||
|
|
||||||
|
if (!get.IsSuccessStatusCode)
|
||||||
|
throw new HttpRequestException($"Response failed with reason: \"({get.StatusCode}) {get.ReasonPhrase}\"");
|
||||||
|
|
||||||
|
var content = await get.Content.ReadAsStringAsync().ConfigureAwait(false);
|
||||||
|
|
||||||
|
return JsonConvert.DeserializeObject<IReadOnlyList<GelbooruImage>>(content, settings);
|
||||||
|
}
|
||||||
|
|
||||||
public void Dispose()
|
public void Dispose()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
using RestEase;
|
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Net.Http;
|
using System.Net.Http;
|
||||||
@@ -7,35 +6,43 @@ using System.Threading.Tasks;
|
|||||||
|
|
||||||
namespace Booru.Net
|
namespace Booru.Net
|
||||||
{
|
{
|
||||||
public class KonaChanClient : IPostBooruClient<KonaChanImage>, IDisposable
|
public class KonaChanClient : IDisposable
|
||||||
{
|
{
|
||||||
IPostBooruClient<KonaChanImage> _api;
|
private readonly HttpClient _api;
|
||||||
|
private readonly JsonSerializerSettings settings;
|
||||||
|
|
||||||
public KonaChanClient()
|
public KonaChanClient()
|
||||||
{
|
{
|
||||||
var httpClient = new HttpClient
|
_api = new HttpClient
|
||||||
{
|
{
|
||||||
BaseAddress = new Uri("https://konachan.com/")
|
BaseAddress = new Uri("https://konachan.com/")
|
||||||
};
|
};
|
||||||
httpClient.DefaultRequestHeaders.Add("User-Agent", $"Booru.Net/v{Props.LibraryVersion} (https://github.com/exsersewo/Booru.Net)");
|
_api.DefaultRequestHeaders.Add("User-Agent", $"Booru.Net/v{Props.LibraryVersion} (https://github.com/exsersewo/Booru.Net)");
|
||||||
|
|
||||||
JsonSerializerSettings settings = new JsonSerializerSettings
|
settings = new JsonSerializerSettings
|
||||||
{
|
{
|
||||||
Formatting = Formatting.Indented,
|
Formatting = Formatting.Indented,
|
||||||
NullValueHandling = NullValueHandling.Ignore
|
NullValueHandling = NullValueHandling.Ignore
|
||||||
};
|
};
|
||||||
|
|
||||||
_api = new RestClient(httpClient)
|
|
||||||
{
|
|
||||||
JsonSerializerSettings = settings
|
|
||||||
}.For<IPostBooruClient<KonaChanImage>>();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public Task<IReadOnlyList<KonaChanImage>> GetImagesAsync(IEnumerable<string> tags)
|
public Task<IReadOnlyList<KonaChanImage>> GetImagesAsync(IEnumerable<string> tags)
|
||||||
=> _api.GetImagesAsync(tags);
|
=> GetImagesAsync(string.Join("%20", tags));
|
||||||
|
|
||||||
public Task<IReadOnlyList<KonaChanImage>> GetImagesAsync(params string[] tags)
|
public Task<IReadOnlyList<KonaChanImage>> GetImagesAsync(params string[] tags)
|
||||||
=> _api.GetImagesAsync(tags);
|
=> GetImagesAsync(string.Join("%20", tags));
|
||||||
|
|
||||||
|
public async Task<IReadOnlyList<KonaChanImage>> GetImagesAsync(string tags)
|
||||||
|
{
|
||||||
|
var get = await _api.GetAsync($"post.json?tags={tags}").ConfigureAwait(false);
|
||||||
|
|
||||||
|
if (!get.IsSuccessStatusCode)
|
||||||
|
throw new HttpRequestException($"Response failed with reason: \"({get.StatusCode}) {get.ReasonPhrase}\"");
|
||||||
|
|
||||||
|
var content = await get.Content.ReadAsStringAsync().ConfigureAwait(false);
|
||||||
|
|
||||||
|
return JsonConvert.DeserializeObject<IReadOnlyList<KonaChanImage>>(content, settings);
|
||||||
|
}
|
||||||
|
|
||||||
public void Dispose()
|
public void Dispose()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
using RestEase;
|
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Net.Http;
|
using System.Net.Http;
|
||||||
@@ -7,35 +6,43 @@ using System.Threading.Tasks;
|
|||||||
|
|
||||||
namespace Booru.Net
|
namespace Booru.Net
|
||||||
{
|
{
|
||||||
public class RealbooruClient : IPHPBooruClient<RealbooruImage>, IDisposable
|
public class RealbooruClient : IDisposable
|
||||||
{
|
{
|
||||||
IPHPBooruClient<RealbooruImage> _api;
|
HttpClient _api;
|
||||||
|
JsonSerializerSettings settings;
|
||||||
|
|
||||||
public RealbooruClient()
|
public RealbooruClient()
|
||||||
{
|
{
|
||||||
var httpClient = new HttpClient
|
_api = new HttpClient
|
||||||
{
|
{
|
||||||
BaseAddress = new Uri("https://realbooru.com/")
|
BaseAddress = new Uri("https://realbooru.com/")
|
||||||
};
|
};
|
||||||
httpClient.DefaultRequestHeaders.Add("User-Agent", $"Booru.Net/v{Props.LibraryVersion} (https://github.com/exsersewo/Booru.Net)");
|
_api.DefaultRequestHeaders.Add("User-Agent", $"Booru.Net/v{Props.LibraryVersion} (https://github.com/exsersewo/Booru.Net)");
|
||||||
|
|
||||||
JsonSerializerSettings settings = new JsonSerializerSettings
|
settings = new JsonSerializerSettings
|
||||||
{
|
{
|
||||||
Formatting = Formatting.Indented,
|
Formatting = Formatting.Indented,
|
||||||
NullValueHandling = NullValueHandling.Ignore
|
NullValueHandling = NullValueHandling.Ignore
|
||||||
};
|
};
|
||||||
|
|
||||||
_api = new RestClient(httpClient)
|
|
||||||
{
|
|
||||||
JsonSerializerSettings = settings
|
|
||||||
}.For<IPHPBooruClient<RealbooruImage>>();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<IReadOnlyList<RealbooruImage>> GetImagesAsync(IEnumerable<string> tags)
|
public Task<IReadOnlyList<RealbooruImage>> GetImagesAsync(IEnumerable<string> tags)
|
||||||
=> await _api.GetImagesAsync(tags).ConfigureAwait(false);
|
=> GetImagesAsync(string.Join("%20", tags));
|
||||||
|
|
||||||
public async Task<IReadOnlyList<RealbooruImage>> GetImagesAsync(params string[] tags)
|
public Task<IReadOnlyList<RealbooruImage>> GetImagesAsync(params string[] tags)
|
||||||
=> await _api.GetImagesAsync(tags).ConfigureAwait(false);
|
=> GetImagesAsync(string.Join("%20", tags));
|
||||||
|
|
||||||
|
public async Task<IReadOnlyList<RealbooruImage>> GetImagesAsync(string tags)
|
||||||
|
{
|
||||||
|
var get = await _api.GetAsync($"index.php?page=dapi&s=post&q=index&json=1&tags={tags}").ConfigureAwait(false);
|
||||||
|
|
||||||
|
if (!get.IsSuccessStatusCode)
|
||||||
|
throw new HttpRequestException($"Response failed with reason: \"({get.StatusCode}) {get.ReasonPhrase}\"");
|
||||||
|
|
||||||
|
var content = await get.Content.ReadAsStringAsync().ConfigureAwait(false);
|
||||||
|
|
||||||
|
return JsonConvert.DeserializeObject<IReadOnlyList<RealbooruImage>>(content, settings);
|
||||||
|
}
|
||||||
|
|
||||||
public void Dispose()
|
public void Dispose()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
using RestEase;
|
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Net.Http;
|
using System.Net.Http;
|
||||||
@@ -7,35 +6,43 @@ using System.Threading.Tasks;
|
|||||||
|
|
||||||
namespace Booru.Net
|
namespace Booru.Net
|
||||||
{
|
{
|
||||||
public class Rule34Client : IPHPBooruClient<Rule34Image>, IDisposable
|
public class Rule34Client : IDisposable
|
||||||
{
|
{
|
||||||
IPHPBooruClient<Rule34Image> _api;
|
private readonly HttpClient _api;
|
||||||
|
private readonly JsonSerializerSettings settings;
|
||||||
|
|
||||||
public Rule34Client()
|
public Rule34Client()
|
||||||
{
|
{
|
||||||
var httpClient = new HttpClient
|
_api = new HttpClient
|
||||||
{
|
{
|
||||||
BaseAddress = new Uri("https://rule34.xxx/")
|
BaseAddress = new Uri("https://rule34.xxx/")
|
||||||
};
|
};
|
||||||
httpClient.DefaultRequestHeaders.Add("User-Agent", $"Booru.Net/v{Props.LibraryVersion} (https://github.com/exsersewo/Booru.Net)");
|
_api.DefaultRequestHeaders.Add("User-Agent", $"Booru.Net/v{Props.LibraryVersion} (https://github.com/exsersewo/Booru.Net)");
|
||||||
|
|
||||||
JsonSerializerSettings settings = new JsonSerializerSettings
|
settings = new JsonSerializerSettings
|
||||||
{
|
{
|
||||||
Formatting = Formatting.Indented,
|
Formatting = Formatting.Indented,
|
||||||
NullValueHandling = NullValueHandling.Ignore
|
NullValueHandling = NullValueHandling.Ignore
|
||||||
};
|
};
|
||||||
|
|
||||||
_api = new RestClient(httpClient)
|
|
||||||
{
|
|
||||||
JsonSerializerSettings = settings
|
|
||||||
}.For<IPHPBooruClient<Rule34Image>>();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public Task<IReadOnlyList<Rule34Image>> GetImagesAsync(IEnumerable<string> tags)
|
public Task<IReadOnlyList<Rule34Image>> GetImagesAsync(IEnumerable<string> tags)
|
||||||
=> _api.GetImagesAsync(tags);
|
=> GetImagesAsync(string.Join("%20", tags));
|
||||||
|
|
||||||
public Task<IReadOnlyList<Rule34Image>> GetImagesAsync(params string[] tags)
|
public Task<IReadOnlyList<Rule34Image>> GetImagesAsync(params string[] tags)
|
||||||
=> _api.GetImagesAsync(tags);
|
=> GetImagesAsync(string.Join("%20", tags));
|
||||||
|
|
||||||
|
public async Task<IReadOnlyList<Rule34Image>> GetImagesAsync(string tags)
|
||||||
|
{
|
||||||
|
var get = await _api.GetAsync($"index.php?page=dapi&s=post&q=index&json=1&tags={tags}").ConfigureAwait(false);
|
||||||
|
|
||||||
|
if (!get.IsSuccessStatusCode)
|
||||||
|
throw new HttpRequestException($"Response failed with reason: \"({get.StatusCode}) {get.ReasonPhrase}\"");
|
||||||
|
|
||||||
|
var content = await get.Content.ReadAsStringAsync().ConfigureAwait(false);
|
||||||
|
|
||||||
|
return JsonConvert.DeserializeObject<IReadOnlyList<Rule34Image>>(content, settings);
|
||||||
|
}
|
||||||
|
|
||||||
public void Dispose()
|
public void Dispose()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
using RestEase;
|
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Net.Http;
|
using System.Net.Http;
|
||||||
@@ -7,35 +6,43 @@ using System.Threading.Tasks;
|
|||||||
|
|
||||||
namespace Booru.Net
|
namespace Booru.Net
|
||||||
{
|
{
|
||||||
public class SafebooruClient : IPHPBooruClient<SafebooruImage>, IDisposable
|
public class SafebooruClient : IDisposable
|
||||||
{
|
{
|
||||||
IPHPBooruClient<SafebooruImage> _api;
|
private readonly HttpClient _api;
|
||||||
|
private readonly JsonSerializerSettings settings;
|
||||||
|
|
||||||
public SafebooruClient()
|
public SafebooruClient()
|
||||||
{
|
{
|
||||||
var httpClient = new HttpClient
|
_api = new HttpClient
|
||||||
{
|
{
|
||||||
BaseAddress = new Uri("https://safebooru.org/")
|
BaseAddress = new Uri("https://safebooru.org/")
|
||||||
};
|
};
|
||||||
httpClient.DefaultRequestHeaders.Add("User-Agent", $"Booru.Net/v{Props.LibraryVersion} (https://github.com/exsersewo/Booru.Net)");
|
_api.DefaultRequestHeaders.Add("User-Agent", $"Booru.Net/v{Props.LibraryVersion} (https://github.com/exsersewo/Booru.Net)");
|
||||||
|
|
||||||
JsonSerializerSettings settings = new JsonSerializerSettings
|
settings = new JsonSerializerSettings
|
||||||
{
|
{
|
||||||
Formatting = Formatting.Indented,
|
Formatting = Formatting.Indented,
|
||||||
NullValueHandling = NullValueHandling.Ignore
|
NullValueHandling = NullValueHandling.Ignore
|
||||||
};
|
};
|
||||||
|
|
||||||
_api = new RestClient(httpClient)
|
|
||||||
{
|
|
||||||
JsonSerializerSettings = settings
|
|
||||||
}.For<IPHPBooruClient<SafebooruImage>>();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public Task<IReadOnlyList<SafebooruImage>> GetImagesAsync(IEnumerable<string> tags)
|
public Task<IReadOnlyList<SafebooruImage>> GetImagesAsync(IEnumerable<string> tags)
|
||||||
=> _api.GetImagesAsync(tags);
|
=> GetImagesAsync(string.Join("%20", tags));
|
||||||
|
|
||||||
public Task<IReadOnlyList<SafebooruImage>> GetImagesAsync(params string[] tags)
|
public Task<IReadOnlyList<SafebooruImage>> GetImagesAsync(params string[] tags)
|
||||||
=> _api.GetImagesAsync(tags);
|
=> GetImagesAsync(string.Join("%20", tags));
|
||||||
|
|
||||||
|
public async Task<IReadOnlyList<SafebooruImage>> GetImagesAsync(string tags)
|
||||||
|
{
|
||||||
|
var get = await _api.GetAsync($"index.php?page=dapi&s=post&q=index&json=1&tags={tags}").ConfigureAwait(false);
|
||||||
|
|
||||||
|
if (!get.IsSuccessStatusCode)
|
||||||
|
throw new HttpRequestException($"Response failed with reason: \"({get.StatusCode}) {get.ReasonPhrase}\"");
|
||||||
|
|
||||||
|
var content = await get.Content.ReadAsStringAsync().ConfigureAwait(false);
|
||||||
|
|
||||||
|
return JsonConvert.DeserializeObject<IReadOnlyList<SafebooruImage>>(content, settings);
|
||||||
|
}
|
||||||
|
|
||||||
public void Dispose()
|
public void Dispose()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
using RestEase;
|
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Net.Http;
|
using System.Net.Http;
|
||||||
@@ -7,35 +6,43 @@ using System.Threading.Tasks;
|
|||||||
|
|
||||||
namespace Booru.Net
|
namespace Booru.Net
|
||||||
{
|
{
|
||||||
public class YandereClient : IPostBooruClient<YandereImage>, IDisposable
|
public class YandereClient : IDisposable
|
||||||
{
|
{
|
||||||
IPostBooruClient<YandereImage> _api;
|
private readonly HttpClient _api;
|
||||||
|
private readonly JsonSerializerSettings settings;
|
||||||
|
|
||||||
public YandereClient()
|
public YandereClient()
|
||||||
{
|
{
|
||||||
var httpClient = new HttpClient
|
_api = new HttpClient
|
||||||
{
|
{
|
||||||
BaseAddress = new Uri("https://yande.re/")
|
BaseAddress = new Uri("https://yande.re/")
|
||||||
};
|
};
|
||||||
httpClient.DefaultRequestHeaders.Add("User-Agent", $"Booru.Net/v{Props.LibraryVersion} (https://github.com/exsersewo/Booru.Net)");
|
_api.DefaultRequestHeaders.Add("User-Agent", $"Booru.Net/v{Props.LibraryVersion} (https://github.com/exsersewo/Booru.Net)");
|
||||||
|
|
||||||
JsonSerializerSettings settings = new JsonSerializerSettings
|
settings = new JsonSerializerSettings
|
||||||
{
|
{
|
||||||
Formatting = Formatting.Indented,
|
Formatting = Formatting.Indented,
|
||||||
NullValueHandling = NullValueHandling.Ignore
|
NullValueHandling = NullValueHandling.Ignore
|
||||||
};
|
};
|
||||||
|
|
||||||
_api = new RestClient(httpClient)
|
|
||||||
{
|
|
||||||
JsonSerializerSettings = settings
|
|
||||||
}.For<IPostBooruClient<YandereImage>>();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public Task<IReadOnlyList<YandereImage>> GetImagesAsync(IEnumerable<string> tags)
|
public Task<IReadOnlyList<YandereImage>> GetImagesAsync(IEnumerable<string> tags)
|
||||||
=> _api.GetImagesAsync(tags);
|
=> GetImagesAsync(string.Join("%20", tags));
|
||||||
|
|
||||||
public Task<IReadOnlyList<YandereImage>> GetImagesAsync(params string[] tags)
|
public Task<IReadOnlyList<YandereImage>> GetImagesAsync(params string[] tags)
|
||||||
=> _api.GetImagesAsync(tags);
|
=> GetImagesAsync(string.Join("%20", tags));
|
||||||
|
|
||||||
|
public async Task<IReadOnlyList<YandereImage>> GetImagesAsync(string tags)
|
||||||
|
{
|
||||||
|
var get = await _api.GetAsync($"post.json?tags={tags}").ConfigureAwait(false);
|
||||||
|
|
||||||
|
if (!get.IsSuccessStatusCode)
|
||||||
|
throw new HttpRequestException($"Response failed with reason: \"({get.StatusCode}) {get.ReasonPhrase}\"");
|
||||||
|
|
||||||
|
var content = await get.Content.ReadAsStringAsync().ConfigureAwait(false);
|
||||||
|
|
||||||
|
return JsonConvert.DeserializeObject<IReadOnlyList<YandereImage>>(content, settings);
|
||||||
|
}
|
||||||
|
|
||||||
public void Dispose()
|
public void Dispose()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
using Newtonsoft.Json.Linq;
|
using Newtonsoft.Json.Linq;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
|
||||||
namespace Booru.Net.Converters
|
namespace Booru.Net.Converters
|
||||||
{
|
{
|
||||||
@@ -16,25 +17,11 @@ namespace Booru.Net.Converters
|
|||||||
{
|
{
|
||||||
var token = JToken.Load(reader);
|
var token = JToken.Load(reader);
|
||||||
|
|
||||||
List<Dictionary<string, List<string>>> container = new List<Dictionary<string, List<string>>>();
|
Dictionary<string, List<string>> container = new Dictionary<string, List<string>>();
|
||||||
|
|
||||||
foreach(var el in token.Children<JObject>())
|
foreach(JProperty el in token.Values<JProperty>())
|
||||||
{
|
{
|
||||||
Dictionary<string, List<string>> att = new Dictionary<string, List<string>>();
|
container.Add(el.Name, el.Value.Values<string>().ToList());
|
||||||
foreach (JProperty prop in el.Properties())
|
|
||||||
{
|
|
||||||
List<string> children = new List<string>();
|
|
||||||
|
|
||||||
foreach(var child in prop.Value.Children())
|
|
||||||
{
|
|
||||||
children.Add(child.Value<string>());
|
|
||||||
}
|
|
||||||
|
|
||||||
att.Add(prop.Name, children);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
container.Add(att);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return container;
|
return container;
|
||||||
|
|||||||
@@ -1,13 +0,0 @@
|
|||||||
using RestEase;
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace Booru.Net
|
|
||||||
{
|
|
||||||
public interface IIndexBooruClient<T> : IDisposable
|
|
||||||
{
|
|
||||||
[Get("index.json")]
|
|
||||||
public Task<IReadOnlyList<T>> GetImagesAsync([Query("tags")] IEnumerable<string> tags);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,13 +0,0 @@
|
|||||||
using RestEase;
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace Booru.Net
|
|
||||||
{
|
|
||||||
public interface IPHPBooruClient<T> : IDisposable
|
|
||||||
{
|
|
||||||
[Get("index.php?page=dapi&s=post&q=index&json=1")]
|
|
||||||
public Task<IReadOnlyList<T>> GetImagesAsync([Query("tags")] IEnumerable<string> tags);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,13 +0,0 @@
|
|||||||
using RestEase;
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace Booru.Net
|
|
||||||
{
|
|
||||||
public interface IPostBooruClient<T> : IDisposable
|
|
||||||
{
|
|
||||||
[Get("post.json")]
|
|
||||||
public Task<IReadOnlyList<T>> GetImagesAsync([Query("tags")] IEnumerable<string> tags);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,13 +0,0 @@
|
|||||||
using RestEase;
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace Booru.Net
|
|
||||||
{
|
|
||||||
public interface IPostsBooruClient<T> : IDisposable
|
|
||||||
{
|
|
||||||
[Get("posts.json")]
|
|
||||||
public Task<IReadOnlyList<T>> GetImagesAsync([Query("tags")] IEnumerable<string> tags);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,13 +0,0 @@
|
|||||||
using RestEase;
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace Booru.Net
|
|
||||||
{
|
|
||||||
public interface IPostsWrappedBooruClient<T> : IDisposable
|
|
||||||
{
|
|
||||||
[Get("posts.json")]
|
|
||||||
public Task<T> GetImagesAsync([Query("tags")] IEnumerable<string> tags);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -5,6 +5,15 @@ namespace Booru.Net
|
|||||||
{
|
{
|
||||||
public class DanbooruImage : BooruImage
|
public class DanbooruImage : BooruImage
|
||||||
{
|
{
|
||||||
|
[JsonProperty("score")]
|
||||||
|
public int? Score { get; set; }
|
||||||
|
|
||||||
|
[JsonProperty("file_url")]
|
||||||
|
private string FileUrl { get; set; }
|
||||||
|
|
||||||
|
public override string ImageUrl
|
||||||
|
=> FileUrl;
|
||||||
|
|
||||||
[JsonProperty("tag_string")]
|
[JsonProperty("tag_string")]
|
||||||
private string TagString { get; set; }
|
private string TagString { get; set; }
|
||||||
|
|
||||||
|
|||||||
@@ -12,11 +12,25 @@ namespace Booru.Net
|
|||||||
[JsonProperty("directory")]
|
[JsonProperty("directory")]
|
||||||
public string Directory { get; set; }
|
public string Directory { get; set; }
|
||||||
|
|
||||||
|
[JsonProperty("file")]
|
||||||
|
public E621ImageSource File { get; set; }
|
||||||
|
|
||||||
|
[JsonProperty("preview")]
|
||||||
|
public E621ImageSource PreviewImage { get; set; }
|
||||||
|
|
||||||
|
[JsonProperty("sample")]
|
||||||
|
public E621ImageSource SampleImage { get; set; }
|
||||||
|
|
||||||
|
[JsonProperty("flags")]
|
||||||
|
public E621ImageFlags Flags { get; set; }
|
||||||
|
|
||||||
[JsonProperty("tags")]
|
[JsonProperty("tags")]
|
||||||
[JsonConverter(typeof(TagGroupConverter))]
|
[JsonConverter(typeof(TagGroupConverter))]
|
||||||
private List<Dictionary<string, List<string>>> PTags { get; set; }
|
private Dictionary<string, List<string>> PTags { get; set; }
|
||||||
|
|
||||||
public IReadOnlyList<Dictionary<string, List<string>>> Tags { get { return PTags.AsReadOnly(); } }
|
public IReadOnlyDictionary<string, List<string>> Tags { get { return PTags; } }
|
||||||
|
|
||||||
|
public override string ImageUrl => File.Url;
|
||||||
|
|
||||||
public override string PostUrl { get { return "https://e621.net/post/show/" + ID; } }
|
public override string PostUrl { get { return "https://e621.net/post/show/" + ID; } }
|
||||||
}
|
}
|
||||||
|
|||||||
25
Booru.Net/Models/Boards/E621ImageFlags.cs
Normal file
25
Booru.Net/Models/Boards/E621ImageFlags.cs
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
using Newtonsoft.Json;
|
||||||
|
|
||||||
|
namespace Booru.Net
|
||||||
|
{
|
||||||
|
public class E621ImageFlags
|
||||||
|
{
|
||||||
|
[JsonProperty("pending")]
|
||||||
|
public bool Pending { get; private set; }
|
||||||
|
|
||||||
|
[JsonProperty("flagged")]
|
||||||
|
public bool Flagged { get; private set; }
|
||||||
|
|
||||||
|
[JsonProperty("note_locked")]
|
||||||
|
public bool NoteLocked { get; private set; }
|
||||||
|
|
||||||
|
[JsonProperty("status_locked")]
|
||||||
|
public bool StatusLocked { get; private set; }
|
||||||
|
|
||||||
|
[JsonProperty("rating_locked")]
|
||||||
|
public bool RatingLocked { get; private set; }
|
||||||
|
|
||||||
|
[JsonProperty("deleted")]
|
||||||
|
public bool Deleted { get; private set; }
|
||||||
|
}
|
||||||
|
}
|
||||||
28
Booru.Net/Models/Boards/E621ImageSource.cs
Normal file
28
Booru.Net/Models/Boards/E621ImageSource.cs
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
using Newtonsoft.Json;
|
||||||
|
|
||||||
|
namespace Booru.Net
|
||||||
|
{
|
||||||
|
public class E621ImageSource
|
||||||
|
{
|
||||||
|
[JsonProperty("width")]
|
||||||
|
public int Width { get; private set; }
|
||||||
|
|
||||||
|
[JsonProperty("height")]
|
||||||
|
public int Height { get; private set; }
|
||||||
|
|
||||||
|
[JsonProperty("ext")]
|
||||||
|
public string Extension { get; private set; }
|
||||||
|
|
||||||
|
[JsonProperty("size")]
|
||||||
|
public ulong Size { get; private set; }
|
||||||
|
|
||||||
|
[JsonProperty("has")]
|
||||||
|
public bool Has { get; private set; }
|
||||||
|
|
||||||
|
[JsonProperty("md5")]
|
||||||
|
public string MD5 { get; private set; }
|
||||||
|
|
||||||
|
[JsonProperty("url")]
|
||||||
|
public string Url { get; private set; }
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -11,6 +11,12 @@ namespace Booru.Net
|
|||||||
[JsonProperty("directory")]
|
[JsonProperty("directory")]
|
||||||
public string Directory { get; set; }
|
public string Directory { get; set; }
|
||||||
|
|
||||||
|
[JsonProperty("file_url")]
|
||||||
|
private string FileUrl { get; set; }
|
||||||
|
|
||||||
|
public override string ImageUrl
|
||||||
|
=> FileUrl;
|
||||||
|
|
||||||
[JsonProperty("tags")]
|
[JsonProperty("tags")]
|
||||||
private string Ptags { get; set; }
|
private string Ptags { get; set; }
|
||||||
|
|
||||||
|
|||||||
@@ -10,9 +10,9 @@ namespace Booru.Net
|
|||||||
[JsonProperty("rating")]
|
[JsonProperty("rating")]
|
||||||
private string Prating { get; set; }
|
private string Prating { get; set; }
|
||||||
|
|
||||||
public virtual string ImageUrl { get; set; }
|
public virtual string ImageUrl { get; private set; }
|
||||||
|
|
||||||
public virtual string PostUrl { get; set; }
|
public virtual string PostUrl { get; private set; }
|
||||||
|
|
||||||
public Rating Rating
|
public Rating Rating
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user