Skip to content

Commit 2f28473

Browse files
committed
Work on Linux
1 parent 22d7914 commit 2f28473

File tree

4 files changed

+216
-58
lines changed

4 files changed

+216
-58
lines changed

SmartImage.Lib 3/SearchQuery.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ public static async Task<SearchQuery> TryCreateAsync(string value)
4646

4747
var sq = new SearchQuery(uf)
4848
{ };
49-
49+
5050
return sq;
5151
}
5252

Lines changed: 202 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,202 @@
1+
// Read S SmartImage.Linux SearchCommand.cs
2+
// 2023-07-05 @ 2:07 AM
3+
4+
using System.Collections.Concurrent;
5+
using System.ComponentModel;
6+
using System.Diagnostics;
7+
using SmartImage.Lib;
8+
using SmartImage.Lib.Engines;
9+
using SmartImage.Lib.Results;
10+
using SmartImage.Lib.Utilities;
11+
using Spectre.Console;
12+
using Spectre.Console.Cli;
13+
using Spectre.Console.Rendering;
14+
15+
namespace SmartImage.Linux.Cli;
16+
17+
internal sealed class SearchCommand : AsyncCommand<SearchCommand.Settings>
18+
{
19+
private SearchClient m_client;
20+
private SearchQuery? m_query;
21+
private SearchConfig m_config;
22+
private readonly CancellationTokenSource m_cts = new();
23+
private readonly ConcurrentBag<SearchResult> m_results = new();
24+
25+
public sealed class Settings : CommandSettings
26+
{
27+
[Description("Query")]
28+
[CommandArgument(0, "[query]")]
29+
public string? Query { get; init; }
30+
31+
[CommandOption("-e|--engines")]
32+
[DefaultValue(SearchConfig.SE_DEFAULT)]
33+
public SearchEngineOptions Engines { get; init; }
34+
35+
[CommandOption("--autosearch")]
36+
[DefaultValue(SearchConfig.AUTOSEARCH_DEFAULT)]
37+
public bool AutoSearch { get; init; }
38+
}
39+
40+
private async Task RunSearchAsync()
41+
{
42+
43+
void OnComplete(object sender, SearchResult[] searchResults)
44+
{
45+
// pt1.Increment(COMPLETE);
46+
}
47+
48+
m_client.OnComplete += OnComplete;
49+
50+
var mt = new Table()
51+
{
52+
Border = TableBorder.Heavy,
53+
Title = new($"Results"),
54+
ShowFooters = true,
55+
ShowHeaders = true,
56+
};
57+
58+
mt.AddColumns(new TableColumn("#"),
59+
new TableColumn("Name"),
60+
new TableColumn("Similarity"),
61+
new TableColumn("Artist"),
62+
new TableColumn("Description"),
63+
new TableColumn("Character")
64+
);
65+
66+
// pt1.MaxValue = m_client.Engines.Length;
67+
68+
void OnResult(object sender, SearchResult sr)
69+
{
70+
m_results.Add(sr);
71+
// ptMap[sr.Engine].Item1.Increment(COMPLETE);
72+
// pt1.Increment(1.0);
73+
int i = 0;
74+
75+
// var t = ptMap[sr.Engine].Item2;
76+
77+
foreach (SearchResultItem sri in sr.Results)
78+
{
79+
mt.Rows.Add(new IRenderable[]
80+
{
81+
new Text($"{i + 1}"),
82+
Markup.FromInterpolated($"[link={sri.Url}]{sr.Engine.Name} #{i + 1}[/]"),
83+
Markup.FromInterpolated($"{sri.Similarity}"),
84+
Markup.FromInterpolated($"{sri.Artist}"),
85+
Markup.FromInterpolated($"{sri.Description}"),
86+
Markup.FromInterpolated($"{sri.Character}"),
87+
});
88+
89+
i++;
90+
}
91+
92+
// AnsiConsole.Write(t);
93+
}
94+
95+
m_client.OnResult += OnResult;
96+
97+
var run = m_client.RunSearchAsync(m_query, token: m_cts.Token);
98+
99+
var sw = Stopwatch.StartNew();
100+
101+
var live = AConsole.Live(mt)
102+
.AutoClear(false)
103+
.Overflow(VerticalOverflow.Ellipsis)
104+
.StartAsync(async (ctx) =>
105+
{
106+
while (!run.IsCompleted)
107+
{
108+
ctx.Refresh();
109+
mt.Caption = new TableTitle($"{sw.Elapsed.TotalSeconds:F3}");
110+
// await Task.Delay(1000);
111+
}
112+
113+
});
114+
115+
await run;
116+
117+
await live;
118+
119+
}
120+
121+
private const int COMPLETE = 100;
122+
123+
public async Task<object?> RunAsync(object? c)
124+
{
125+
var cstr = (string?)c;
126+
Debug.WriteLine($"Input: {cstr}");
127+
128+
await AConsole.Progress().AutoRefresh(true).StartAsync(async ctx =>
129+
{
130+
var p = ctx.AddTask("Creating query");
131+
p.IsIndeterminate = true;
132+
m_query = await SearchQuery.TryCreateAsync(cstr);
133+
p.Increment(COMPLETE);
134+
ctx.Refresh();
135+
});
136+
137+
AConsole.WriteLine($"Input: {m_query}");
138+
139+
await AConsole.Progress().AutoRefresh(true).StartAsync(async ctx =>
140+
{
141+
var p = ctx.AddTask("Uploading");
142+
p.IsIndeterminate = true;
143+
var url = await m_query.UploadAsync();
144+
145+
if (url == null)
146+
{
147+
throw new SmartImageException(); //todo
148+
}
149+
150+
p.Increment(COMPLETE);
151+
ctx.Refresh();
152+
});
153+
154+
AConsole.MarkupLine($"[green]{m_query.Upload}[/]");
155+
156+
AConsole.WriteLine($"{m_config}");
157+
158+
Console.CancelKeyPress += (sender, args) =>
159+
{
160+
AConsole.MarkupLine($"[red]Cancellation requested[/]");
161+
m_cts.Cancel();
162+
args.Cancel = false;
163+
164+
Environment.Exit(-1);
165+
};
166+
167+
// await Prg_1.StartAsync(RunSearchAsync);
168+
169+
await RunSearchAsync();
170+
171+
return null;
172+
173+
}
174+
175+
public override async Task<int> ExecuteAsync(CommandContext context, Settings settings)
176+
{
177+
m_config = new SearchConfig()
178+
{
179+
SearchEngines = settings.Engines,
180+
AutoSearch = settings.AutoSearch
181+
};
182+
183+
m_client = new SearchClient(m_config);
184+
185+
var r = await RunAsync(settings.Query);
186+
AC.WriteLine($"{m_query}");
187+
188+
foreach (var sr in m_results)
189+
{
190+
AC.WriteLine($"{sr}");
191+
Console.ReadKey();
192+
193+
foreach (SearchResultItem sri in sr.AllResults)
194+
{
195+
AC.WriteLine($"{sri}");
196+
197+
}
198+
}
199+
200+
return 0;
201+
}
202+
}

SmartImage.Linux/Program.cs

Lines changed: 10 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -1,75 +1,32 @@
11
global using R2 = SmartImage.Linux.Resources;
22
global using R1 = SmartImage.Lib.Resources;
33
global using AC = Spectre.Console.AnsiConsole;
4-
using System.ComponentModel;
4+
global using AConsole = Spectre.Console.AnsiConsole;
5+
using System.Runtime.InteropServices;
56
using JetBrains.Annotations;
6-
using SmartImage.Lib;
7-
using SmartImage.Lib.Engines;
8-
using SmartImage.Lib.Results;
7+
using Kantan.Text;
98
using Spectre.Console;
109
using Spectre.Console.Cli;
10+
using SmartImage.Linux.Cli;
1111

1212
namespace SmartImage.Linux;
1313

1414
public static class Program
1515
{
1616
public static async Task<int> Main(string[] args)
1717
{
18+
//dotnet run --project SmartImage.Linux/ "$HOME/1654086015521.png"
1819

20+
AC.WriteLine(args.QuickJoin());
1921
AC.Write(new FigletText(R1.Name)
2022
.LeftJustified()
2123
.Color(Color.Red));
22-
23-
if (args.Any()) {
24-
var e = args.GetEnumerator();
25-
26-
}
24+
#if DEBUG
25+
26+
#endif
27+
AC.WriteLine($"{OperatingSystem.IsLinux()}|{OperatingSystem.IsWindows()}|{OperatingSystem.IsMacOS()}");
2728

2829
var app = new CommandApp<SearchCommand>();
2930
return await app.RunAsync(args);
3031
}
31-
32-
internal sealed class SearchCommand : AsyncCommand<SearchCommand.Settings>
33-
{
34-
public sealed class Settings : CommandSettings
35-
{
36-
[Description("Query")]
37-
[CommandArgument(0, "[query]")]
38-
public string? Query { get; init; }
39-
40-
[CommandOption("-e|--engines")]
41-
[DefaultValue(SearchConfig.SE_DEFAULT)]
42-
public SearchEngineOptions Engines { get; init; }
43-
44-
[CommandOption("--autosearch")]
45-
[DefaultValue(SearchConfig.AUTOSEARCH_DEFAULT)]
46-
public bool AutoSearch { get; init; }
47-
}
48-
49-
public override async Task<int> ExecuteAsync([NotNull] CommandContext context, [NotNull] Settings settings)
50-
{
51-
var cfg = new SearchConfig()
52-
{
53-
SearchEngines = settings.Engines,
54-
AutoSearch = settings.AutoSearch
55-
};
56-
57-
var sc = new SearchClient(cfg);
58-
var sq = await SearchQuery.TryCreateAsync(settings.Query);
59-
await sq.UploadAsync();
60-
AC.WriteLine($"{sq}");
61-
var r = await sc.RunSearchAsync(sq);
62-
63-
foreach (var sr in r) {
64-
AC.WriteLine($"{sr}");
65-
66-
foreach (SearchResultItem sri in sr.AllResults) {
67-
AC.WriteLine($"{sri}");
68-
69-
}
70-
}
71-
72-
return 0;
73-
}
74-
}
7532
}

SmartImage.Linux/Properties/launchSettings.json

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,10 @@
55
},
66
"WSL": {
77
"commandName": "WSL",
8+
"environmentVariables": {},
9+
"commandLineArgs": "\"{OutDir}/SmartImage.Linux.dll\" /home/neorenegade/1654086015521.png",
810
"distributionName": ""
9-
},
10-
"Test 1": {
11-
"commandName": "Project",
12-
"commandLineArgs": "\"C:\\Users\\Deci\\Pictures\\Epic anime\\1654086015521.png\""
11+
1312
}
1413
}
1514
}

0 commit comments

Comments
 (0)