Skip to content

Commit

Permalink
Merge pull request #6 from MakeshVineeth/v1.3
Browse files Browse the repository at this point in the history
v1.3
  • Loading branch information
MakeshVineeth authored Nov 4, 2021
2 parents 08f48cc + 8127bf8 commit aee4954
Show file tree
Hide file tree
Showing 11 changed files with 442 additions and 90 deletions.
1 change: 1 addition & 0 deletions WikiPreview.Fluent.Plugin/QueryConfiguration.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,5 +6,6 @@ public class QueryConfiguration
public int WikiNameSpace { get; set; }
public int ResultsCount { get; set; }
public int ImageSize { get; set; }
public bool LoadImage { get; set; }
}
}
114 changes: 114 additions & 0 deletions WikiPreview.Fluent.Plugin/ResultGenerator.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,114 @@
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Net.Http;
using System.Net.Http.Json;
using System.Reflection;
using System.Threading.Tasks;
using Blast.API.Search;
using Blast.Core.Results;
using static WikiPreview.Fluent.Plugin.WikiPreviewSearchApp;
using static WikiPreview.Fluent.Plugin.WikiResult;

namespace WikiPreview.Fluent.Plugin
{
/// <summary>
/// A static class that stores the common methods to generate search results.
/// Also stores and initializes WikipediaLogo which will be used as placeholder for Wiki Results with no images.
/// Stores the Image Size (set in FS Plugin Settings) and is used across multiple places.
/// </summary>
public static class ResultGenerator
{
private static readonly BitmapImageResult WikipediaLogo;
private static int _imageSizePrefs;

static ResultGenerator()
{
var assembly = Assembly.GetExecutingAssembly();
WikipediaLogo =
new BitmapImageResult(
assembly.GetManifestResourceStream("WikiPreview.Fluent.Plugin.Wikipedia-logo.png"));
}

public static int GetImageSizePrefs()
{
return _imageSizePrefs;
}

public static void SetImageSizePrefs(int size)
{
_imageSizePrefs = size;
}

public static async ValueTask<WikiPreviewSearchResult> GenerateSearchResult(PageView value,
string searchedText, bool loadImage = true)
{
string displayedName = value?.Title;
string pageId = value?.PageId.ToString();
if (string.IsNullOrWhiteSpace(pageId) || string.IsNullOrWhiteSpace(displayedName)) return null;

string resultName = value.Extract;
if (string.IsNullOrWhiteSpace(resultName))
resultName = "Description not available for this Search Result.";

double score = displayedName.SearchTokens(searchedText);
string wikiUrl = displayedName.Replace(' ', '_');
BitmapImageResult bitmapImageResult = null;

if (loadImage && value.Thumbnail != null)
{
string imgUrl = value.Thumbnail.Source;

using var imageClient = new HttpClient();
imageClient.DefaultRequestHeaders.UserAgent.TryParseAdd(UserAgentString);

await imageClient.GetStreamAsync(imgUrl).ContinueWith(task =>
{
if (!task.IsCompletedSuccessfully) return;
var bitmap =
new Bitmap(task.Result); // Wiki Images are not working with AvaloniaBitmap as of now.

if (!bitmap.Size.IsEmpty)
bitmapImageResult = new BitmapImageResult(bitmap);
});
}

bitmapImageResult ??= WikipediaLogo;

return new WikiPreviewSearchResult(resultName)
{
Url = wikiUrl,
PreviewImage = bitmapImageResult,
DisplayedName = displayedName,
SearchedText = searchedText,
Score = score,
SearchObjectId = pageId,
PinUniqueId = pageId
};
}

public static async ValueTask<WikiPreviewSearchResult> GenerateOnDemand(string searchId,
bool isCustomPreview = false,
bool loadImage = true)
{
if (string.IsNullOrWhiteSpace(searchId))
return default;

string searchType = isCustomPreview ? "titles=" : "pageids=";

string url = "https://en.wikipedia.org/w/api.php?action=query&prop=extracts|pageimages&" + searchType +
searchId +
"&explaintext&exintro&pilicense=any&pithumbsize=100&format=json";

using var httpClient = new HttpClient();
httpClient.DefaultRequestHeaders.UserAgent.TryParseAdd(UserAgentString);
var wiki = await httpClient.GetFromJsonAsync<Wiki>(url, SerializerOptions);

Dictionary<string, PageView>.ValueCollection pages = wiki?.Query?.Pages?.Values;
if (pages is { Count: 0 }) return default;

PageView pageView = pages?.First();
return await GenerateSearchResult(pageView, pageView?.Title, loadImage);
}
}
}
26 changes: 13 additions & 13 deletions WikiPreview.Fluent.Plugin/WikiPreview.Fluent.Plugin.csproj
Original file line number Diff line number Diff line change
@@ -1,18 +1,18 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>net5.0-windows10.0.19041</TargetFramework>
<ResolveAssemblyWarnOrErrorOnTargetArchitectureMismatch>
None
</ResolveAssemblyWarnOrErrorOnTargetArchitectureMismatch>
<Platforms>AnyCPU;x64</Platforms>
<AssemblyVersion>1.2.0.0</AssemblyVersion>
</PropertyGroup>
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<Platforms>AnyCPU;x64</Platforms>
<AssemblyVersion>1.3.0.0</AssemblyVersion>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="AsyncEnumerator" Version="4.0.2" />
<PackageReference Include="Blast.API" Version="0.9.76.5-beta" />
<PackageReference Include="TextCopy" Version="1.5.1" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="AsyncEnumerator" Version="4.0.2"/>
<PackageReference Include="Blast.API" Version="0.9.89.9990-beta"/>
</ItemGroup>

<ItemGroup>
<EmbeddedResource Include="Wikipedia-logo.png"/>
</ItemGroup>

</Project>
113 changes: 44 additions & 69 deletions WikiPreview.Fluent.Plugin/WikiPreviewSearchApp.cs
Original file line number Diff line number Diff line change
@@ -1,34 +1,32 @@
using Blast.API.Core.Processes;
using Blast.API.Processes;
using Blast.API.Search;
using Blast.Core.Interfaces;
using Blast.Core.Objects;
using Blast.Core.Results;
using Dasync.Collections;
using System;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Net.Http;
using System.Net.Http.Json;
using System.Text.Json;
using System.Threading;
using System.Threading.Channels;
using System.Threading.Tasks;
using Blast.API.Core.Processes;
using Blast.API.Processes;
using Blast.Core.Interfaces;
using Blast.Core.Objects;
using Blast.Core.Results;
using Dasync.Collections;
using TextCopy;
using static WikiPreview.Fluent.Plugin.WikiPreviewSearchResult;
using static WikiPreview.Fluent.Plugin.WikiResult;
using static WikiPreview.Fluent.Plugin.ResultGenerator;

namespace WikiPreview.Fluent.Plugin
{
internal class WikiPreviewSearchApp : ISearchApplication
{
private const string SearchAppName = "WikiPreview";
public const string SearchAppName = "WikiPreview";
public const string WikiSearchTagName = "Wiki";
private const string UserAgentString = "Mozilla/5.0 (Windows NT 10.0; Win64; x64)";
public const string UserAgentString = "Mozilla/5.0 (Windows NT 10.0; Win64; x64)";
public static readonly JsonSerializerOptions SerializerOptions = new() { PropertyNameCaseInsensitive = true };
private readonly SearchApplicationInfo _applicationInfo;
private readonly JsonSerializerOptions _serializerOptions = new() {PropertyNameCaseInsensitive = true};
private readonly WikiSettings _wikiSettings;

public WikiPreviewSearchApp()
{
Expand All @@ -41,8 +39,11 @@ public WikiPreviewSearchApp()
SearchTagOnly = true,
ApplicationIconGlyph = SearchResultIcon,
SearchAllTime = ApplicationSearchTime.Fast,
DefaultSearchTags = SearchTags
DefaultSearchTags = SearchTags,
PluginName = "Wikipedia Preview"
};

_applicationInfo.SettingsPage = _wikiSettings = new WikiSettings(_applicationInfo);
}

public SearchApplicationInfo GetApplicationInfo()
Expand All @@ -56,6 +57,7 @@ public ValueTask<IHandleResult> HandleSearchResult(ISearchResult searchResult)
throw new InvalidCastException(nameof(WikiPreviewSearchResult));

string displayedName = wikiPreviewSearchResult.DisplayedName;

if (string.IsNullOrWhiteSpace(displayedName))
return new ValueTask<IHandleResult>(new HandleResult(true, false));

Expand All @@ -73,8 +75,19 @@ public ValueTask<IHandleResult> HandleSearchResult(ISearchResult searchResult)

if (!string.IsNullOrWhiteSpace(actionUrl)) managerInstance.StartNewProcess(actionUrl);
}
else if (wikiPreviewSearchResult.SelectedOperation.OperationName == CopyContentsStr)
{
string contents = wikiPreviewSearchResult.ResultName;
if (!string.IsNullOrWhiteSpace(contents))
Clipboard.SetText(contents);
}
else
{
string pageUrl = wikiPreviewSearchResult.Url;

if (string.IsNullOrWhiteSpace(pageUrl))
return new ValueTask<IHandleResult>(new HandleResult(true, false));

string wikiUrl = WikiRootUrl + wikiPreviewSearchResult.Url;
Clipboard.SetText(wikiUrl);
}
Expand All @@ -84,6 +97,7 @@ public ValueTask<IHandleResult> HandleSearchResult(ISearchResult searchResult)

public ValueTask LoadSearchApplicationAsync()
{
SetImageSizePrefs(_wikiSettings.ImageSize);
return ValueTask.CompletedTask;
}

Expand All @@ -94,20 +108,30 @@ public async IAsyncEnumerable<ISearchResult> SearchAsync(SearchRequest searchReq
string searchedText = searchRequest.SearchedText;
searchedText = searchedText.Trim();

if (string.IsNullOrWhiteSpace(searchedTag) ||
if (!string.IsNullOrWhiteSpace(searchedTag) &&
!searchedTag.Equals(WikiSearchTagName, StringComparison.OrdinalIgnoreCase) ||
string.IsNullOrWhiteSpace(searchedText))
yield break;

// Change ImageSize in Singleton Instance whenever User Settings has been changed.
int currentImageSize = GetImageSizePrefs();
int userSetSize = _wikiSettings.ImageSize;
if (currentImageSize != userSetSize) SetImageSizePrefs(userSetSize);

// Wiki Namespace set to 0 for searching in main articles only.
QueryConfiguration queryConfiguration = new()
{SearchTerm = searchedText, WikiNameSpace = 0, ImageSize = 100, ResultsCount = 8};
{
SearchTerm = searchedText, WikiNameSpace = 0, ImageSize = userSetSize,
ResultsCount = _wikiSettings.MaxResults, LoadImage = _wikiSettings.LoadImages
};

string url = GetFormattedUrl(queryConfiguration);
using var httpClient = new HttpClient();
httpClient.DefaultRequestHeaders.UserAgent.TryParseAdd(UserAgentString);

var channel = Channel.CreateUnbounded<WikiPreviewSearchResult>();

_ = httpClient.GetFromJsonAsync<Wiki>(url, _serializerOptions, cancellationToken).ContinueWith(task =>
_ = httpClient.GetFromJsonAsync<Wiki>(url, SerializerOptions, cancellationToken).ContinueWith(task =>
{
if (task.IsCompletedSuccessfully)
_ = task.Result?.Query.Pages.ParallelForEachAsync(async entry =>
Expand All @@ -134,56 +158,7 @@ public async ValueTask<ISearchResult> GetSearchResultForId(object searchObjectId
if (string.IsNullOrWhiteSpace(pageId))
return default;

string url = "https://en.wikipedia.org/w/api.php?action=query&prop=extracts|pageimages&pageids=" +
pageId +
"&explaintext&exintro&pilicense=any&pithumbsize=100&format=json";

using var httpClient = new HttpClient();
httpClient.DefaultRequestHeaders.UserAgent.TryParseAdd(UserAgentString);
var wiki = await httpClient.GetFromJsonAsync<Wiki>(url, _serializerOptions);
if (wiki == null) return default;

Dictionary<string, PageView>.ValueCollection pages = wiki.Query.Pages.Values;
if (pages is {Count: 0}) return default;

PageView pageView = pages.First();
return await GenerateSearchResult(pageView, pageView?.Title);
}

private static async ValueTask<WikiPreviewSearchResult> GenerateSearchResult(PageView value,
string searchedText)
{
string resultName = value.Extract;
string displayedName = value.Title;
double score = displayedName.SearchDistanceScore(searchedText);
string pageId = value.PageId.ToString();
string wikiUrl = displayedName.Replace(' ', '_');
BitmapImageResult bitmapImageResult;

if (value.Thumbnail != null)
{
string imgUrl = value.Thumbnail.Source;
using var imageClient = new HttpClient();
imageClient.DefaultRequestHeaders.UserAgent.TryParseAdd(UserAgentString);
Stream stream = await imageClient.GetStreamAsync(imgUrl);
bitmapImageResult = new BitmapImageResult(new Bitmap(stream));
}
else
{
bitmapImageResult = null;
}

return new WikiPreviewSearchResult
{
Url = wikiUrl,
PreviewImage = bitmapImageResult,
DisplayedName = displayedName,
ResultName = resultName,
SearchedText = searchedText,
Score = score,
SearchObjectId = pageId,
PinUniqueId = pageId
};
return await GenerateOnDemand(pageId);
}
}
}
}
2 changes: 1 addition & 1 deletion WikiPreview.Fluent.Plugin/WikiPreviewSearchOperation.cs
Original file line number Diff line number Diff line change
Expand Up @@ -32,4 +32,4 @@ private WikiPreviewSearchOperation(ActionType actionType, string actionName, str
public static WikiPreviewSearchOperation OpenGoogle { get; } =
new(ActionType.GoogleSearch, "Search in Google", "Search with Google.", "\uE721");
}
}
}
Loading

0 comments on commit aee4954

Please sign in to comment.