Skip to content

Commit

Permalink
Work on #64, #63, #62 ...
Browse files Browse the repository at this point in the history
  • Loading branch information
Decimation committed Jan 1, 2025
1 parent 628681c commit 5f0f1be
Show file tree
Hide file tree
Showing 5 changed files with 140 additions and 159 deletions.
220 changes: 74 additions & 146 deletions SmartImage.Lib/SearchClient.cs
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,8 @@ namespace SmartImage.Lib;
public sealed class SearchClient : IDisposable
{

public SearchQuery Query { get; set; }

public SearchConfig Config { get; init; }

public bool IsComplete { get; private set; }
Expand All @@ -54,16 +56,31 @@ public sealed class SearchClient : IDisposable

private static readonly ILogger s_logger = AppSupport.Factory.CreateLogger(nameof(SearchClient));

public SearchClient(SearchConfig cfg)
private static readonly Lock m_lock = new Lock();

public SearchClient(SearchConfig cfg, SearchQuery query)
{
Query = query;
Config = cfg;
ConfigApplied = false;
IsRunning = false;

Config.PropertyChanged += (sender, args) =>
{
if (args.PropertyName == nameof(SearchConfig.SearchEngines)) {
lock (m_lock) {
Engines = BaseSearchEngine.GetSelectedEngines(Config.SearchEngines).ToArray();

}
}
};

// GetSelectedEngines();

}

public SearchClient(SearchConfig cfg) : this(cfg, SearchQuery.Null) { }

static SearchClient() { }

[ModuleInitializer]
Expand Down Expand Up @@ -106,141 +123,43 @@ public void OpenChannel()
// ...
}

ResultChannel = Channel.CreateUnbounded<SearchResult>(new UnboundedChannelOptions()
ResultChannel = Channel.CreateBounded<SearchResult>(new BoundedChannelOptions(Engines.Length)
{
SingleWriter = true,

});
}

#if OLD
/// <summary>
/// Runs a search of <paramref name="query"/>.
/// </summary>
/// <param name="query">Search query</param>
/// <param name="scheduler"></param>
/// <param name="token">Cancellation token passed to <see cref="WebSearchEngine{T}.GetResultAsync(SmartImage.Lib.SearchQuery,System.Threading.CancellationToken)"/></param>
public async Task<SearchResult[]> RunSearchAsync1(SearchQuery query,
TaskScheduler scheduler = default,
CancellationToken token = default)
{
scheduler ??= TaskScheduler.Default;

// Requires.NotNull(ResultChannel);
if (ResultChannel == null || (IsComplete && !IsRunning)) {
OpenChannel();
}

if (!query.IsUploaded) {
throw new ArgumentException($"Query was not uploaded", nameof(query));
}

IsRunning = true;

if (!ConfigApplied) {
await LoadEnginesAsync(token); // todo

}
else {
Debug.WriteLine("Not reloading engines");
}

Debug.WriteLine($"Config: {Config} | {Engines.QuickJoin()}");

var tasks = GetSearchTasks(query, scheduler, token);

// var results = new SearchResult[tasks.Count];
int i = 0;

/*while (tasks.Count > 0) {
if (token.IsCancellationRequested) {
Debugger.Break();
s_logger.LogWarning("Cancellation requested");
CompleteSearchAsync();
return results;
}
Task<SearchResult> task = await Task.WhenAny(tasks);
tasks.Remove(task);
if (task.IsFaulted) {
Trace.WriteLine($"{task} faulted!",LogCategories.C_ERROR);
}
SearchResult result = await task;
results[i] = result;
i++;
}*/


await foreach (var task in Task.WhenEach(tasks).WithCancellation(token)) {
if (token.IsCancellationRequested) {

Debugger.Break();
s_logger.LogWarning("Cancellation requested");
CompleteSearchAsync();
}

var result = await task;
ProcessResult(result);
}

CompleteSearchAsync();
OnSearchComplete?.Invoke(this, results);

if (Config.PriorityEngines == SearchEngineOptions.Auto) {

try {

SearchResultItem item = GetBest(results);

if (item != null) {
OpenResult(item.Url);
}
}
catch (Exception e) {
Debug.WriteLine($"{e.Message}");

Debugger.Break();
}

}

IsRunning = false;

return results;
}
#endif

public async IAsyncEnumerable<SearchResult> RunSearchAsync(SearchQuery query,
TaskScheduler scheduler = default,
public async IAsyncEnumerable<SearchResult> RunSearchAsync(TaskScheduler scheduler = default,
[EC] CancellationToken token = default)
{
await RunSearchAsync2(query, ResultChannel.Writer, token);
await RunSearchAsync2(token);

await foreach (var result in ResultChannel.Reader.ReadAllAsync(token)) {
yield return result;
while (await ResultChannel.Reader.WaitToReadAsync(token)) {
while (ResultChannel.Reader.TryRead(out var result)) {
yield return result;
}
}
}

public ValueTask<bool> RunSearchAsync2(CancellationToken token = default)
=> RunSearchAsync2(ResultChannel.Writer, token);

/// <summary>
/// Runs a search of <paramref name="query"/>.
/// </summary>
public async ValueTask<bool> RunSearchAsync2(SearchQuery query,
ChannelWriter<SearchResult> cw,
public async ValueTask<bool> RunSearchAsync2(ChannelWriter<SearchResult> cw,
CancellationToken token = default)
{
if (!query.IsUploaded) {
throw new SmartImageException($"{query} was not uploaded");
if (!Query.IsUploaded) {
throw new SmartImageException($"{Query} was not uploaded");
}

var tasks = Engines.Select(e =>
{
var task = e.GetResultAsync(query, token);
return task;
});
IEnumerable<Task<SearchResult>> tasks;

lock (m_lock) {
tasks = Engines.Select(e =>
{
var task = e.GetResultAsync(Query, token);
return task;
});
}

await foreach (var task in Task.WhenEach(tasks).WithCancellation(token)) {

Expand Down Expand Up @@ -369,40 +288,16 @@ public async ValueTask LoadEnginesAsync(CancellationToken token = default)

Trace.WriteLine("Loading engines");

Engines = BaseSearchEngine.GetSelectedEngines(Config.SearchEngines).ToArray();

if (Config.ReadCookies) {

try {
await ((DefaultCookiesProvider) DefaultCookiesProvider.Instance).OpenAsync();
}
catch (Exception e) {
Trace.WriteLine($"{e}");
Config.ReadCookies = false;
DefaultCookiesProvider.Instance.Dispose();
}
await InitCookiesProvider();
}

if (Config.FlareSolverr && !FlareSolverrClient.Value.IsInitialized) {


var ok = FlareSolverrClient.Value.Configure(Config.FlareSolverrApiUrl);

if (!ok) {
Debugger.Break();
}
else {
// Ensure FlareSolverr

try {
var idx = await FlareSolverrClient.Value.Clearance.Solverr.GetIndexAsync();
}
catch (Exception e) {
Trace.WriteLine($"{nameof(FlareSolverrClient)}: {e.Message}");
Config.FlareSolverr = false;
FlareSolverrClient.Value.Dispose();
}
}
await InitFlareSolverr();
}

foreach (BaseSearchEngine bse in Engines) {
Expand All @@ -424,6 +319,39 @@ public async ValueTask LoadEnginesAsync(CancellationToken token = default)
ConfigApplied = true;
}

private async Task InitFlareSolverr()
{
var ok = FlareSolverrClient.Value.Configure(Config.FlareSolverrApiUrl);

if (!ok) {
Debugger.Break();
}
else {
// Ensure FlareSolverr

try {
var idx = await FlareSolverrClient.Value.Clearance.Solverr.GetIndexAsync();
}
catch (Exception e) {
Trace.WriteLine($"{nameof(FlareSolverrClient)}: {e.Message}");
Config.FlareSolverr = false;
FlareSolverrClient.Value.Dispose();
}
}
}

private async Task InitCookiesProvider()
{
try {
await ((DefaultCookiesProvider) DefaultCookiesProvider.Instance).OpenAsync();
}
catch (Exception e) {
Trace.WriteLine($"{e}");
Config.ReadCookies = false;
DefaultCookiesProvider.Instance.Dispose();
}
}

public void Dispose()
{
Debug.WriteLine($"Disposing {nameof(SearchClient)}");
Expand Down
13 changes: 7 additions & 6 deletions SmartImage.Lib/SearchServer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -74,17 +74,18 @@ private async Task<object> HandleRequestAsync(HttpListenerRequest request, HttpL
Debug.WriteLine($"{sz}");

var sq = await SearchQuery.TryCreateAsync(sz);

Client.Query = sq;
if (sq == SearchQuery.Null) {
return R1.Err_Query;
}

var url = await sq.UploadAsync();

var results1 = Client.RunSearchAsync(sq);

// todo
var results1 = Client.RunSearchAsync();
var results = new List<SearchResult>();
await foreach (var v in results1) {

results.Add(v);
}

var best = SearchClient.GetBest(results);
Expand Down Expand Up @@ -129,9 +130,9 @@ public class SearchResults
public SearchResultItem Best { get; internal set; }

[JsonPropertyOrder(1)]
public SearchResult[] Results { get; }
public IList<SearchResult> Results { get; }

public SearchResults(SearchResult[] results, SearchResultItem best)
public SearchResults(IList<SearchResult> results, SearchResultItem best)
{
Best = best;
Results = results;
Expand Down
1 change: 1 addition & 0 deletions SmartImage.Lib/Utilities/SearchUtil.cs
Original file line number Diff line number Diff line change
Expand Up @@ -26,4 +26,5 @@ public static bool IsError(this SearchResultStatus s)

public static bool HasFlagFast(this SearchResultFlags value, SearchResultFlags status)
=> (value & status) != 0;

}
41 changes: 39 additions & 2 deletions SmartImage.Rdx/Commands/SearchCommand.cs
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,11 @@ public sealed class SearchCommand : AsyncCommand<SearchCommandSettings>, IDispos

public SearchClient Client { get; }

public SearchQuery Query { get; private set; }
public SearchQuery Query
{
get => Client.Query;
set => Client.Query = value;
}

public SearchConfig Config { get; }

Expand All @@ -76,7 +80,7 @@ public SearchCommand()
Config = new SearchConfig();

// Config = (SearchConfig) cfg;
Client = new SearchClient(Config);
Client = new SearchClient(Config, Query);

// Client.OnSearchComplete += OnSearchComplete;

Expand Down Expand Up @@ -298,6 +302,7 @@ await AnsiConsole.Live(m_table).StartAsync(async (f) =>
// TODO: Rewrite RunSearch counterparts


#if OLD
private async Task RunSearchLiveAsync(LiveDisplayContext c)
{

Expand Down Expand Up @@ -334,6 +339,38 @@ private async Task RunSearchLiveAsync(LiveDisplayContext c)
await search;

}
#endif
private async Task RunSearchLiveAsync(LiveDisplayContext c)
{

#if UNITTEST
return;
#endif
await foreach (var result in Client.RunSearchAsync(token: m_cts.Token)) {
m_results.TryAdd(result, BaseOSIntegration.EC_ERROR);

// m_results.Add(result);


/*var txt = new Text(result.Engine.Name, GetEngineColor(result.Engine.EngineOption));
var txt2 = new Text($"{result.Results.Count}");
m_mainTable.AddRow(txt, txt2);*/


var rows = CreateResultRows(result);

m_results[result] = m_table.Rows.Count;

foreach (IRenderable[] row in rows) {
m_table.AddRow(row);
}

c.Refresh();

}

}


private async ValueTask ShowImageScanResultsAsync(SearchResultItem item)
Expand Down
Loading

0 comments on commit 5f0f1be

Please sign in to comment.