Skip to content

Commit 61b9407

Browse files
committed
Tweak metadata handling; improve SauceNao parsing
1 parent e61c41d commit 61b9407

File tree

4 files changed

+94
-31
lines changed

4 files changed

+94
-31
lines changed

SmartImage 3/Mode/Shell/ShellMode.Handlers.cs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,7 @@ private async void Filter_Clicked()
188188
{
189189

190190
var res = m_results
191-
.Where(r => r.Status == SearchResultStatus.Success || r.Status == SearchResultStatus.None)
191+
.Where(r => r.Status is SearchResultStatus.Success or SearchResultStatus.None)
192192
.SelectMany(r => r.Results);
193193

194194
filterOrder = Math.Clamp(++filterOrder, 0, filterMax);
@@ -197,7 +197,7 @@ private async void Filter_Clicked()
197197
for (int j = 0; j < filterOrder - (funcs.Length - 1); j++) {
198198
res = res.Where(funcs[j]);
199199
}
200-
200+
201201
if (filterOrder == filterMax) {
202202
Btn_Filter.Enabled = false;
203203

@@ -230,7 +230,6 @@ await Parallel.ForEachAsync(res3, async (item, token) =>
230230
}
231231

232232
Btn_Filter.Enabled = true;
233-
234233
}
235234

236235
private void Queue_Checked(bool b)

SmartImage 3/Mode/Shell/ShellMode.cs

Lines changed: 41 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -347,6 +347,16 @@ public bool UseClipboard
347347

348348
public ShellMode(string[] args)
349349
{
350+
if (Compat.IsWin) {
351+
try {
352+
Console.SetWindowSize(150, 35);
353+
}
354+
catch (Exception e) {
355+
Debug.WriteLine($"{e.Message}");
356+
}
357+
358+
}
359+
350360
Args = args;
351361
m_token = new();
352362
m_tokenu = new();
@@ -602,13 +612,34 @@ private void AddResultToTable(SearchResult result)
602612
Dt_Results.Rows.Add($"{result.Engine.Name} (Raw)", string.Empty,
603613
result.RawUrl, 0, null, null, $"{result.Status}",
604614
null, null, null, null, null, null);
615+
605616
// Message[result.RawUrl] = "?";
606617
// var rawSri = new SearchResultItem(result) { Url = result.RawUrl, Similarity = null };
607618

608619
for (int i = 0; i < result.Results.Count; i++) {
609620
SearchResultItem sri = result.Results[i];
621+
622+
object? meta = sri.Metadata switch
623+
{
624+
/*string[] rg => rg.QuickJoin(),
625+
Array rg => rg.QuickJoin(),
626+
ICollection c => c.QuickJoin(),*/
627+
string s => s,
628+
ExpandoObject eo => eo.QuickJoin(),
629+
_ => null,
630+
631+
};
632+
610633
add(sri, i);
611634

635+
if (sri.Metadata is string[] rg) {
636+
var extra = sri.FromMetadata().ToArray();
637+
638+
for (int j = 0; j < extra.Length; j++) {
639+
SearchResultItem searchResultItem = extra[j];
640+
add(searchResultItem, i, j + 1);
641+
}
642+
}
612643
}
613644

614645
// Interlocked.Increment(ref ResultCount);
@@ -620,20 +651,10 @@ private void AddResultToTable(SearchResult result)
620651

621652
}
622653

623-
void add(SearchResultItem sri, int i)
654+
void add(SearchResultItem sri, int i, int j = 0)
624655
{
625-
object? meta = sri.Metadata switch
626-
{
627-
string[] rg => rg.QuickJoin(),
628-
Array rg => rg.QuickJoin(),
629-
ICollection c => c.QuickJoin(),
630-
string s => s,
631-
ExpandoObject eo => eo.QuickJoin(),
632-
_ => null,
633656

634-
};
635-
636-
// object? meta = sri.Metadata;
657+
object? meta = sri.Metadata;
637658

638659
if (sri.Similarity is { } and 0) {
639660
sri.Similarity = null;
@@ -644,7 +665,13 @@ void add(SearchResultItem sri, int i)
644665

645666
IndexColors[st] = cs;
646667

647-
Dt_Results.Rows.Add($"{sri.Root.Engine.Name} #{i + 1}", "",
668+
string s = $"{sri.Root.Engine.Name} #{i + 1}";
669+
670+
if (j != 0) {
671+
s += $".{j}";
672+
}
673+
674+
Dt_Results.Rows.Add(s, "",
648675
sri.Url, sri.Score, sri.Similarity, sri.Artist, sri.Description, sri.Source,
649676
sri.Title, sri.Site, sri.Width, sri.Height, meta);
650677
}
@@ -861,7 +888,7 @@ private async Task<bool> TrySetQueryAsync(ustring text)
861888
Btn_Run.Enabled = false;
862889
Pbr_Status.Fraction = 0;
863890
// Btn_Delete.Enabled = true;
864-
891+
865892
Btn_Browse.Enabled = QueueMode;
866893

867894
Tf_Input.ReadOnly = true;

SmartImage.Lib 3/Engines/Impl/Search/SauceNaoEngine.cs

Lines changed: 39 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,10 @@ namespace SmartImage.Lib.Engines.Impl.Search;
3030

3131
public sealed class SauceNaoEngine : BaseSearchEngine, IClientSearchEngine
3232
{
33-
private const string BASE_URL = "https://saucenao.com/";
33+
private static readonly string[] Syn_Artists = new[] { "Creator(s):", "Creator:", "Member:", "Artist:", "Author:" };
34+
private static readonly string[] Syn_Characters = new[] { "Characters:" };
35+
private static readonly string[] Syn_Material = new[] { "Material:", "Source:" };
36+
private const string BASE_URL = "https://saucenao.com/";
3437

3538
private const string BASE_ENDPOINT = BASE_URL + "search.php";
3639

@@ -226,18 +229,14 @@ static SauceNaoDataResult Parse(INode result)
226229
// INode resultcontentcolumn1 = resultcontent.ChildNodes[1];
227230
string rcci = resultcontentcolumn_rg.FuncJoin(e => e.TextContent, ",");
228231

229-
var synonyms = new[] { "Creator(s):", "Creator:", "Member:", "Artist:", "Author:" };
230-
var material = new[] { "Material:", "Source:" };
231-
var characters = new[] { "Characters:" };
232-
233232
// string material1 = rcci.SubstringAfter(material);
234-
string material1 = rcci.SubstringAfter(material.First());
233+
string material1 = rcci.SubstringAfter(Syn_Material.First());
235234

236235
// string creator1 = rcci;
237236
string creator1 = rcci;
238237
string characters1 = null;
239238

240-
foreach (var s in synonyms) {
239+
foreach (var s in Syn_Artists) {
241240
if (rti.StartsWith(s)) {
242241
rti = rti.SubstringAfter(s).Trim(' ');
243242
}
@@ -253,7 +252,7 @@ static SauceNaoDataResult Parse(INode result)
253252
or IElement { NodeName: "SPAN" }))
254253
.ToArray();
255254

256-
for (int i = 0; i < nodes.Length - 1; i += 2) {
255+
/*for (int i = 0; i < nodes.Length - 1; i += 2) {
257256
var n = nodes[i];
258257
var n2 = nodes[i + 1];
259258
@@ -271,7 +270,7 @@ static SauceNaoDataResult Parse(INode result)
271270
if (characters.Any(nStr.StartsWith)) {
272271
characters1 = n2Str;
273272
}
274-
}
273+
}*/
275274

276275
/*if (resultcontentcolumn.ChildNodes.Length >= 2) {
277276
string creatorTitle = null;
@@ -306,12 +305,37 @@ static SauceNaoDataResult Parse(INode result)
306305
{
307306
Urls = links.Distinct().ToArray(),
308307
Similarity = similarity,
309-
Creator = creator1,
310-
Title = rti,
311-
Material = material1
308+
// Creator = creator1,
309+
Title = rti,
310+
Material = material1
312311

313312
};
314313

314+
for (int i = 0; i < nodes.Length; i++) {
315+
var node = nodes[i];
316+
var s = node.TextContent;
317+
318+
if (s.StartsWith("Source:")) {
319+
dataResult.Source = nodes[++i].TextContent;
320+
continue;
321+
}
322+
323+
if (s.StartsWith("Material:")) {
324+
dataResult.Material = nodes[++i].TextContent;
325+
continue;
326+
}
327+
328+
if (Syn_Characters.Any(s.StartsWith)) {
329+
dataResult.Character = nodes[++i].TextContent;
330+
continue;
331+
}
332+
333+
if (Syn_Artists.Any(s.StartsWith)) {
334+
dataResult.Creator = nodes[++i].TextContent;
335+
continue;
336+
}
337+
}
338+
315339
/*foreach (INode rccn in resultcontent.ChildNodes) {
316340
foreach (string s in material) {
317341
if (rccn.TextContent.StartsWith(s)) {
@@ -320,7 +344,7 @@ static SauceNaoDataResult Parse(INode result)
320344
}
321345
}
322346
}*/
323-
foreach (IElement element1 in resultcontent.QuerySelectorAll("strong")) {
347+
/*foreach (IElement element1 in resultcontent.QuerySelectorAll("strong")) {
324348
for (int i = 0; i < element1.Children.Length - 1; i += 2) {
325349
IElement ec1 = element1.Children[i];
326350
@@ -352,7 +376,7 @@ static SauceNaoDataResult Parse(INode result)
352376
353377
}
354378
}
355-
}
379+
}*/
356380

357381
return dataResult;
358382

@@ -532,6 +556,7 @@ private sealed class SauceNaoDataResult
532556
public string Material { get; internal set; }
533557

534558
public string Creator { get; internal set; }
559+
public string Source { get; internal set; }
535560
}
536561
}
537562

SmartImage.Lib 3/Results/SearchResultItem.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,18 @@ public void UpdateScore()
146146
m_isScored = true;
147147
}
148148

149+
public IEnumerable<SearchResultItem> FromMetadata()
150+
{
151+
if (Metadata is string[] rg) {
152+
for (int i = 0; i < rg.Length; i++) {
153+
yield return new SearchResultItem(this)
154+
{
155+
Url = rg[i]
156+
};
157+
}
158+
}
159+
}
160+
149161
[MustUseReturnValue]
150162
public async Task<bool> GetUniAsync()
151163
{

0 commit comments

Comments
 (0)