Skip to content

Commit f1a4d91

Browse files
committed
Improve code design, handle trace.moe deserialization edge case
1 parent 5624e64 commit f1a4d91

25 files changed

+418
-284
lines changed

SmartImage.Lib/Engines/Search/Base/ClientSearchEngine.cs

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,21 +9,18 @@ public abstract class ClientSearchEngine : ProcessedSearchEngine
99
{
1010
protected ClientSearchEngine(string baseUrl, string endpointUrl) : base(baseUrl)
1111
{
12-
1312
EndpointUrl = endpointUrl;
1413
}
1514

1615
public abstract override SearchEngineOptions EngineOption { get; }
1716

18-
1917
public abstract override EngineSearchType SearchType { get; }
2018

2119
protected string EndpointUrl { get; }
2220

23-
24-
protected override object GetProcessingObject(SearchResult r)
21+
protected override object GetProcessingObject(SearchResult sr)
2522
{
26-
return r.Origin.Query;
23+
return sr.Origin.Query;
2724
}
2825

2926
}

SmartImage.Lib/Engines/Search/Base/ProcessedSearchEngine.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@
77

88
namespace SmartImage.Lib.Engines.Search.Base;
99

10+
/// <summary>
11+
/// Represents a search engine whose results require further processing.
12+
/// </summary>
1013
public abstract class ProcessedSearchEngine : BaseSearchEngine
1114
{
1215
protected ProcessedSearchEngine(string baseUrl) : base(baseUrl) { }
@@ -54,7 +57,7 @@ public sealed override SearchResult GetResult(ImageQuery query, CancellationToke
5457
return sr;
5558
}
5659

57-
protected abstract object GetProcessingObject(SearchResult r);
60+
protected abstract object GetProcessingObject(SearchResult sr);
5861

5962
/// <summary>
6063
/// Processes engine results

SmartImage.Lib/Engines/Search/Base/WebClientSearchEngine.cs

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,28 +4,25 @@
44
namespace SmartImage.Lib.Engines.Search.Base;
55

66
/// <summary>
7-
/// Represents a search engine whose results are from HTML.
7+
/// Represents a search engine whose results are parsed from HTML.
88
/// </summary>
99
public abstract class WebClientSearchEngine : ProcessedSearchEngine
1010
{
1111
protected WebClientSearchEngine(string baseUrl) : base(baseUrl) { }
1212

1313
public abstract override SearchEngineOptions EngineOption { get; }
14-
14+
1515
public abstract override EngineSearchType SearchType { get; }
1616

17-
protected override object GetProcessingObject(SearchResult r)
18-
{
19-
return ParseContent(r.Origin);
20-
}
17+
protected override object GetProcessingObject(SearchResult sr) => ParseContent(sr.Origin);
2118

2219
protected virtual object ParseContent(SearchResultOrigin s)
2320
{
24-
var parser = new HtmlParser();
25-
var async = s.Response.Content.ReadAsStringAsync();
26-
async.Wait();
27-
var content = async.Result;
28-
var document = parser.ParseDocument((string) content);
21+
var parser = new HtmlParser();
22+
var readStringTask = s.Response.Content.ReadAsStringAsync();
23+
readStringTask.Wait();
24+
var content = readStringTask.Result;
25+
var document = parser.ParseDocument(content);
2926

3027
return document;
3128
}

SmartImage.Lib/Engines/Search/Base/WebDriverSearchEngine.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@
77

88
namespace SmartImage.Lib.Engines.Search.Base;
99

10+
/// <summary>
11+
/// Represents a search engine whose results are parsed through a web driver.
12+
/// </summary>
1013
public abstract class WebDriverSearchEngine : ProcessedSearchEngine
1114
{
1215
protected WebDriverSearchEngine(string baseUrl) : base(baseUrl) { }

SmartImage.Lib/Engines/Search/TinEyeEngine.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,9 @@ public sealed class TinEyeEngine : WebDriverSearchEngine
2626
{
2727
public TinEyeEngine() : base("https://www.tineye.com/search?url=") { }
2828

29-
protected override object GetProcessingObject(SearchResult r)
29+
protected override object GetProcessingObject(SearchResult sr)
3030
{
31-
return r.Origin.Query;
31+
return sr.Origin.Query;
3232
}
3333

3434
public override SearchEngineOptions EngineOption => SearchEngineOptions.TinEye;

SmartImage.Lib/Engines/Search/TraceMoeEngine.cs

Lines changed: 41 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
using Flurl.Http;
66
using JetBrains.Annotations;
77
using Newtonsoft.Json;
8+
using Newtonsoft.Json.Linq;
9+
using RestSharp.Serialization.Json;
810
using SmartImage.Lib.Clients;
911
using SmartImage.Lib.Engines.Search.Base;
1012
using SmartImage.Lib.Searching;
@@ -28,7 +30,7 @@ public TraceMoeEngine() : base("https://trace.moe/?url=", "https://api.trace.moe
2830
/// Used to retrieve more information about results
2931
/// </summary>
3032
private readonly AnilistClient m_anilistClient = new();
31-
33+
3234

3335
public override string Name => "trace.moe";
3436

@@ -56,7 +58,38 @@ protected override SearchResult Process(object obj, SearchResult r)
5658
var task = request.GetStringAsync();
5759

5860
task.Wait(Timeout);
59-
tm = JsonConvert.DeserializeObject<TraceMoeRootObject>(task.Result);
61+
var result = task.Result;
62+
63+
/*JObject jo;
64+
65+
jo = JObject.Parse(result);
66+
var token = jo["result"];
67+
68+
Debug.WriteLine(result);
69+
var rg = JsonConvert.DeserializeObject<List<TraceMoeDoc>>(token.ToString());
70+
71+
tm = new();
72+
tm.result = rg.ToList();
73+
tm.error = jo["error"].ToString();
74+
tm.frameCount = long.Parse(jo["frameCount"].ToString());*/
75+
76+
77+
// tm = JsonConvert.DeserializeObject<TraceMoeRootObject>(result);
78+
79+
var settings = new JsonSerializerSettings
80+
{
81+
Error = (sender, args) =>
82+
{
83+
if (object.Equals(args.ErrorContext.Member, nameof(TraceMoeDoc.episode)) &&
84+
args.ErrorContext.OriginalObject.GetType() == typeof(TraceMoeDoc))
85+
{
86+
args.ErrorContext.Handled = true;
87+
}
88+
}
89+
};
90+
tm = JsonConvert.DeserializeObject<TraceMoeRootObject>(result, settings);
91+
92+
6093
}
6194
catch (Exception e) {
6295
Debug.WriteLine($"{e.Message}");
@@ -166,6 +199,7 @@ private class TraceMoeDoc
166199

167200

168201
/// <remarks>Episode field may contain multiple possible results delimited by <c>|</c></remarks>
202+
[JsonIgnore]
169203
public string episode { get; set; }
170204

171205
public double similarity { get; set; }
@@ -178,9 +212,11 @@ private class TraceMoeDoc
178212
[UsedImplicitly(ImplicitUseTargetFlags.WithMembers)]
179213
private class TraceMoeRootObject
180214
{
181-
public long frameCount { get; set; }
182-
public string error { get; set; }
183-
public List<TraceMoeDoc> result { get; set; }
215+
public long frameCount { get; set; }
216+
217+
public string error { get; set; }
218+
219+
public List<TraceMoeDoc> result { get; set; }
184220
}
185221

186222
#endregion

SmartImage.Lib/SearchClient.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
global using static Kantan.Diagnostics.LogCategories;
2+
global using MN = System.Diagnostics.CodeAnalysis.MaybeNullAttribute;
23
using System;
34
using System.Collections.Generic;
45
using System.Diagnostics;

SmartImage.Lib/Searching/IResult.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ protected static ConsoleOptionFunction GetDownloadFunction(Func<Uri> f)
3737
CPI.Instance.Start(cts);
3838

3939

40-
var file = ImageHelper.Download(direct, path);
40+
var file = ImageMedia.Download(direct, path);
4141

4242
// Program.ResultDialog.Refresh();
4343

SmartImage.Lib/Searching/ImageQuery.cs

Lines changed: 9 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -32,12 +32,12 @@ public sealed class ImageQuery : IDisposable, IConsoleOption
3232
/// <summary>
3333
/// Whether <see cref="Value"/> is a file
3434
/// </summary>
35-
public bool IsFile { get; }
35+
public bool IsFile => Info.IsFile;
3636

3737
/// <summary>
3838
/// Whether <see cref="Value"/> is an image link
3939
/// </summary>
40-
public bool IsUri { get; }
40+
public bool IsUri => Info.IsUri;
4141

4242
/// <summary>
4343
/// Uploaded direct image
@@ -53,6 +53,8 @@ public sealed class ImageQuery : IDisposable, IConsoleOption
5353

5454
public TimeSpan UploadTime { get; }
5555

56+
public MediaResourceInfo Info { get; }
57+
5658
public ImageQuery([NotNull] string value, [CanBeNull] BaseUploadEngine engine = null)
5759
{
5860
var now = Stopwatch.GetTimestamp();
@@ -63,10 +65,10 @@ public ImageQuery([NotNull] string value, [CanBeNull] BaseUploadEngine engine =
6365

6466
value = value.CleanString();
6567

66-
(IsUri, IsFile) = IsUriOrFile(value);
68+
Info = ImageMedia.GetMediaInfo(value);
6769

68-
if (!IsUri && !IsFile) {
69-
throw new ArgumentException("Input was neither file nor direct image link", nameof(value));
70+
if (!((bool) Info)) {
71+
throw new ArgumentException($"Input error: {Info.Message?.ReasonPhrase}");
7072
}
7173

7274
Value = value;
@@ -84,7 +86,7 @@ public ImageQuery([NotNull] string value, [CanBeNull] BaseUploadEngine engine =
8486
}
8587

8688

87-
var client = new HttpClient();//todo
89+
var client = new HttpClient(); //todo
8890
Stream = IsFile ? File.OpenRead(value) : client.GetStream(value);
8991

9092

@@ -97,14 +99,6 @@ public ImageQuery([NotNull] string value, [CanBeNull] BaseUploadEngine engine =
9799

98100
public static implicit operator ImageQuery(string value) => new(value);
99101

100-
public static (bool IsUri, bool IsFile) IsUriOrFile(string x)
101-
{
102-
//todo
103-
var isUriOrFile = (ImageHelper.IsBinaryImage(x, out var di,-1), File.Exists(x));
104-
// di?.Dispose();
105-
return isUriOrFile;
106-
}
107-
108102
public ImageResult GetImageResult()
109103
{
110104

@@ -117,7 +111,7 @@ public ImageResult GetImageResult()
117111

118112
var result = new ImageResult(null)
119113
{
120-
114+
121115
// Image = Image.FromStream(Stream),
122116
Url = UploadUri
123117
};

SmartImage.Lib/Searching/ImageResult.cs

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ public DisplayResolutionType DisplayResolution
145145

146146

147147
if (HasImageDimensions) {
148-
return ImageHelper.GetDisplayResolution(Width.Value, Height.Value);
148+
return ImageManipulation.GetDisplayResolution(Width.Value, Height.Value);
149149
}
150150

151151
throw new SmartImageException("Resolution unavailable");
@@ -236,18 +236,20 @@ public bool ScanForBinaryImages(int ms)
236236

237237
var url = Url.ToString();
238238

239-
if (ImageHelper.IsBinaryImage(url, out var br, ms)) {
240-
DirectImages.Add(br);
239+
var info = ImageMedia.GetMediaInfo(url);
240+
241+
if ((bool) info) {
242+
DirectImages.Add(info.Resource);
241243
return true;
242244
}
243245
else {
244-
br.Dispose();
246+
info.Dispose();
245247
}
246248

247249
/*if (DirectImage is { Url: { } } || ImageHelper.IsBinaryImage(url, out var di1, ms)) {
248250
return true;
249251
}*/
250-
252+
251253
/*if (OtherUrl.Any()) {
252254
var plr = Parallel.For(0, OtherUrl.Count, (i, s) =>
253255
{
@@ -265,7 +267,7 @@ public bool ScanForBinaryImages(int ms)
265267

266268
try {
267269

268-
var directImages = ImageHelper.ScanForBinaryImages(url, ms)
270+
var directImages = ImageMedia.Scan(url, ms)
269271
.Where(x => x is { Url: { } })
270272
.ToList();
271273

0 commit comments

Comments
 (0)