Skip to content

Commit 2b10523

Browse files
committed
improvements
1 parent cf960d9 commit 2b10523

File tree

12 files changed

+186
-200
lines changed

12 files changed

+186
-200
lines changed

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

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,11 @@
33
using System.Linq;
44
using System.Net;
55
using System.Net.Http;
6+
using System.Reflection;
67
using System.Threading;
78
using System.Threading.Tasks;
89
using Flurl.Http;
10+
using Kantan.Collections;
911
using Kantan.Net;
1012
using Kantan.Text;
1113
using Novus.Utilities;
@@ -143,9 +145,24 @@ public static BaseSearchEngine[] GetAllSearchEngines()
143145
var engines = typeof(BaseSearchEngine).GetAllSubclasses()
144146
.Select(Activator.CreateInstance)
145147
.Cast<BaseSearchEngine>()
146-
.ToArray();
147-
148-
return engines;
148+
.ToList();
149+
150+
for (var i = engines.Count - 1; i >= 0; i--) {
151+
BaseSearchEngine engine = engines[i];
152+
153+
var attr = engine.GetType().GetTypeInfo()
154+
.GetCustomAttributes(typeof(ObsoleteAttribute), true)
155+
.Cast<ObsoleteAttribute>()
156+
.FirstOrDefault();
157+
158+
if (attr is { }) {
159+
Debug.WriteLine($"Removing obsolete engine: {engine.Name}", C_INFO);
160+
engines.RemoveAt(i);
161+
}
162+
}
163+
164+
165+
return engines.ToArray();
149166
}
150167
}
151168

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,13 @@ protected WebClientSearchEngine(string baseUrl) : base(baseUrl) { }
1414
public abstract override SearchEngineOptions EngineOption { get; }
1515

1616
public abstract override EngineSearchType SearchType { get; }
17-
17+
1818
protected override object GetProcessingObject(SearchResult sr) => ParseContent(sr.Origin);
19-
19+
2020
protected virtual object ParseContent(SearchResultOrigin origin)
2121
{
22-
var parser = new HtmlParser();
23-
var readStringTask = origin.Response.Content.ReadAsStringAsync();
22+
var parser = new HtmlParser();
23+
var readStringTask = origin.Response.Content.ReadAsStringAsync();
2424
readStringTask.Wait();
2525
var content = readStringTask.Result;
2626
var document = parser.ParseDocument(content);

SmartImage.Lib/Engines/Search/Other/KarmaDecayEngine.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
1+
using System;
12
using SmartImage.Lib.Engines.Search.Base;
23
using SmartImage.Lib.Searching;
34

45
namespace SmartImage.Lib.Engines.Search.Other;
56

7+
[Obsolete]
68
public sealed class KarmaDecayEngine : BaseSearchEngine
79
{
810
public KarmaDecayEngine() : base("http://karmadecay.com/search/?q=") { }
11+
912
public override EngineSearchType SearchType => EngineSearchType.External | EngineSearchType.Metadata;
1013

1114
public override SearchEngineOptions EngineOption => SearchEngineOptions.KarmaDecay;

SmartImage.Lib/Engines/Search/TidderEngine.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System;
22
using System.Collections.Generic;
3+
using System.Diagnostics;
34
using System.Linq;
45
using AngleSharp.Dom;
56
using AngleSharp.Html.Dom;
@@ -13,15 +14,18 @@
1314
#nullable enable
1415
namespace SmartImage.Lib.Engines.Search;
1516

17+
[Obsolete]
1618
public sealed class TidderEngine : WebClientSearchEngine
1719
{
1820
public TidderEngine() : base("http://tidder.xyz/?imagelink=") { }
1921

2022
public override SearchEngineOptions EngineOption => SearchEngineOptions.Tidder;
21-
23+
2224

2325
public override EngineSearchType SearchType => EngineSearchType.External | EngineSearchType.Metadata;
2426

27+
28+
[DebuggerHidden]
2529
protected override SearchResult Process(object obj, SearchResult sr)
2630
{
2731
var doc = (IDocument) obj;

SmartImage.Lib/Engines/Search/TinEyeEngine.cs

Lines changed: 20 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -37,14 +37,7 @@ protected override object GetProcessingObject(SearchResult sr)
3737

3838
protected override async Task<List<ImageResult>> Browse(ImageQuery sd, SearchResult r)
3939
{
40-
using var browserFetcher = new BrowserFetcher();
41-
42-
var ri = await browserFetcher.DownloadAsync();
43-
44-
Debug.WriteLine($"{ri}");
45-
46-
var extra = new PuppeteerExtra();
47-
extra.Use(new StealthPlugin());
40+
PuppeteerExtra extra = await GetBrowser();
4841

4942
await using Browser browser = await extra.LaunchAsync(new LaunchOptions
5043
{
@@ -55,24 +48,20 @@ protected override async Task<List<ImageResult>> Browse(ImageQuery sd, SearchRes
5548
await using Page page = await browser.NewPageAsync();
5649

5750
await page.GoToAsync(BaseUrl + sd.UploadUri);
58-
// await page.ScreenshotAsync(@"C:\Users\Deci\Downloads\a.png");
5951
await page.WaitForNavigationAsync();
6052

6153
var rd = page.Url;
6254
Debug.WriteLine($"{rd}");
6355

64-
/*var rcText = await (await page.WaitForSelectorAsync("#result_count"))
65-
.GetPropertyAsync("textContent");*/
66-
67-
//div[class="match"]
68-
//div[class*='match-row']
6956

7057
var resultElems = await page.QuerySelectorAllAsync("div[class='match']");
7158

7259
var img = new List<ImageResult>();
7360

74-
if ((await (await resultElems[0].QuerySelectorAsync("span")).GetPropertyAsync("textContent"))
75-
.ToValueString().Contains("sponsored", StringComparison.InvariantCultureIgnoreCase)) {
61+
var firstSpan = await (await resultElems[0].QuerySelectorAsync("span"))
62+
.GetPropertyAsync("textContent");
63+
64+
if (firstSpan.ToValueString().Contains("sponsored", StringComparison.InvariantCultureIgnoreCase)) {
7665
resultElems = resultElems.Skip(1).ToArray();
7766
}
7867

@@ -110,7 +99,7 @@ protected override async Task<List<ImageResult>> Browse(ImageQuery sd, SearchRes
11099
}
111100

112101
ir.OtherUrl.AddRange(uri);
113-
102+
114103

115104
var imgElems = await t1.QuerySelectorAllAsync("img");
116105
var imgList = new List<Uri>();
@@ -120,20 +109,9 @@ protected override async Task<List<ImageResult>> Browse(ImageQuery sd, SearchRes
120109

121110
imgList.Add(new Uri(src.ToValueString()));
122111
}
123-
112+
124113
ir.OtherUrl.AddRange(imgList);
125114
ir.Url = ir.OtherUrl.FirstOrDefault();
126-
127-
/*var union = imgList.Union(uri).ToArray();
128-
129-
var plr=Parallel.For(0, union.Length, (i, s) =>
130-
{
131-
if (ImageHelper.IsBinaryImage(union[i].ToString(), out var b,2000)) {
132-
ir.DirectImages.Add(b);
133-
}
134-
135-
});
136-
r.Scanned = true;*/
137115
}
138116

139117
img.Add(ir);
@@ -142,6 +120,19 @@ protected override async Task<List<ImageResult>> Browse(ImageQuery sd, SearchRes
142120
return img;
143121
}
144122

123+
private static async Task<PuppeteerExtra> GetBrowser()
124+
{
125+
using var browserFetcher = new BrowserFetcher();
126+
127+
var ri = await browserFetcher.DownloadAsync();
128+
129+
Debug.WriteLine($"{ri}");
130+
131+
var extra = new PuppeteerExtra();
132+
extra.Use(new StealthPlugin());
133+
return extra;
134+
}
135+
145136

146137
protected override SearchResult Process(object obj, SearchResult sr)
147138
{

SmartImage.Lib/SearchClient.cs

Lines changed: 11 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -114,8 +114,8 @@ public void Reload(bool saveCfg = false)
114114
}
115115

116116
Engines = BaseSearchEngine.GetAllSearchEngines()
117-
.Where(e => Config.SearchEngines.HasFlag(e.EngineOption))
118-
.ToArray();
117+
.Where(e => Config.SearchEngines.HasFlag(e.EngineOption))
118+
.ToArray();
119119

120120
Trace.WriteLine($"{nameof(SearchClient)}: Config:\n{Config}", C_DEBUG);
121121

@@ -146,27 +146,25 @@ public void Reset()
146146
/// <summary>
147147
/// Performs an image search asynchronously.
148148
/// </summary>
149-
public async Task RunSearchAsync(CancellationToken? cts = null)
149+
public async Task RunSearchAsync(CancellationToken cts, CancellationTokenSource cts2)
150150
{
151151
if (IsComplete) {
152152
Reset();
153153
}
154154

155155

156-
cts ??= CancellationToken.None;
157-
158156
Tasks = new List<Task<SearchResult>>(Engines.Select(engine =>
159157
{
160-
var task = engine.GetResultAsync(Config.Query, cts.Value);
158+
var task = engine.GetResultAsync(Config.Query, cts);
161159

162160
return task;
163161
}));
164162

165163

166-
while (!IsComplete && !cts.Value.IsCancellationRequested) {
164+
while (!IsComplete && !cts.IsCancellationRequested) {
167165
var finished = await Task.WhenAny(Tasks);
168166

169-
var task = finished.ContinueWith(GetResultContinueCallback, null, cts.Value,
167+
var task = finished.ContinueWith(GetResultContinueCallback, state: cts2, cts,
170168
0, TaskScheduler.Default);
171169

172170
ContinueTasks.Add(task);
@@ -232,14 +230,13 @@ public async Task RunSearchAsync(CancellationToken? cts = null)
232230
SearchCompleted?.Invoke(null, args);
233231
}
234232

235-
public async Task RunContinueAsync(CancellationToken? c = null)
233+
public async Task RunContinueAsync(CancellationToken c)
236234
{
237235

238236
IsContinueComplete = false;
239237

240-
c ??= CancellationToken.None;
241238

242-
while (!IsContinueComplete && !c.Value.IsCancellationRequested) {
239+
while (!IsContinueComplete && !c.IsCancellationRequested) {
243240
var task = await Task.WhenAny(ContinueTasks);
244241
await task;
245242

@@ -260,7 +257,8 @@ private void GetResultContinueCallback(Task<SearchResult> task, object state)
260257
return;
261258
}
262259

263-
var result = value.GetBinaryImageResults();
260+
var cts = (CancellationTokenSource) state;
261+
var result = value.GetBinaryImageResults(cts);
264262

265263
if (result.Any()) {
266264

@@ -274,7 +272,7 @@ private void GetResultContinueCallback(Task<SearchResult> task, object state)
274272
if (DirectResultsWaitHandle.TrySetResult()) {
275273
Debug.WriteLine("wait handle set");
276274

277-
275+
278276
}
279277

280278
}
@@ -287,32 +285,6 @@ private void GetResultContinueCallback(Task<SearchResult> task, object state)
287285
}
288286
}
289287

290-
/// <summary>
291-
/// Refines search results by searching with the most-detailed result (<see cref="FindDirectResults" />).
292-
/// </summary>
293-
public async Task RefineSearchAsync()
294-
{
295-
if (!IsComplete) {
296-
throw SearchException;
297-
}
298-
299-
var directResult = DirectResults.FirstOrDefault();
300-
301-
if (directResult == null) {
302-
throw new SmartImageException("Could not find direct result");
303-
}
304-
305-
var direct = directResult.DirectImage.Url;
306-
307-
Debug.WriteLine($"{nameof(SearchClient)}: Refining by {direct}", C_DEBUG);
308-
309-
Config.Query = direct;
310-
311-
Reset();
312-
313-
await RunSearchAsync();
314-
}
315-
316288
public static List<ImageResult> ApplyPredicateFilter(List<SearchResult> results, Predicate<SearchResult> predicate)
317289
{
318290
var query = results.Where(r => predicate(r))
@@ -325,22 +297,6 @@ public static List<ImageResult> ApplyPredicateFilter(List<SearchResult> results,
325297
return query;
326298
}
327299

328-
/// <summary>
329-
/// Maximizes search results by using the specified property selector.
330-
/// </summary>
331-
/// <returns><see cref="Results" /> ordered by <paramref name="property" /></returns>
332-
public List<SearchResult> MaximizeResults<T>(Func<SearchResult, T> property)
333-
{
334-
if (!IsComplete) {
335-
throw SearchException;
336-
}
337-
338-
var res = Results.OrderByDescending(property).ToList();
339-
340-
res.RemoveAll(r => !r.IsNonPrimitive);
341-
342-
return res;
343-
}
344300

345301
/// <summary>
346302
/// Fires when <see cref="GetResultContinueCallback"/> returns

0 commit comments

Comments
 (0)