using Flow.Launcher.Infrastructure.Http; using Flow.Launcher.Infrastructure.Logger; using System; using System.Collections.Generic; using System.IO; using System.Net.Http; using System.Text; using System.Text.RegularExpressions; using System.Threading.Tasks; using System.Text.Json; using System.Linq; using System.Threading; namespace Flow.Launcher.Plugin.WebSearch.SuggestionSources { class Bing : SuggestionSource { public override async Task> Suggestions(string query, CancellationToken token) { JsonElement json; try { const string api = "https://api.bing.com/qsonhs.aspx?q="; using var resultStream = await Http.GetStreamAsync(api + Uri.EscapeUriString(query), token).ConfigureAwait(false); if (resultStream.Length == 0) return new List(); // this handles the cancellation json = (await JsonDocument.ParseAsync(resultStream, cancellationToken: token)).RootElement.GetProperty("AS"); } catch (TaskCanceledException) { return null; } catch (HttpRequestException e) { Log.Exception("|Bing.Suggestions|Can't get suggestion from Bing", e); return new List(); } catch (JsonException e) { Log.Exception("|Bing.Suggestions|can't parse suggestions", e); return new List(); } if (json.GetProperty("FullResults").GetInt32() == 0) return new List(); return json.GetProperty("Results") .EnumerateArray() .SelectMany(r => r.GetProperty("Suggests") .EnumerateArray() .Select(s => s.GetProperty("Txt").GetString())) .ToList(); } public override string ToString() { return "Bing"; } } }