namespace VideoDownloader.Browser;
/// 검색엔진 정의. QueryTemplate 의 {0} 이 URL 인코딩된 검색어로 치환된다.
public sealed record SearchEngine(string Name, string Keyword, string QueryTemplate);
/// 기본 프리셋 엔진. Keyword 는 주소창에서 `<키워드> <검색어>` 형태로 즉시 전환에 쓰인다.
public static class SearchEngines
{
public static readonly IReadOnlyList Presets = new[]
{
new SearchEngine("Google", "g", "https://www.google.com/search?q={0}"),
new SearchEngine("Bing", "b", "https://www.bing.com/search?q={0}"),
new SearchEngine("DuckDuckGo", "d", "https://duckduckgo.com/?q={0}"),
new SearchEngine("Naver", "n", "https://search.naver.com/search.naver?query={0}"),
new SearchEngine("YouTube", "yt", "https://www.youtube.com/results?search_query={0}"),
};
public static SearchEngine? FindByName(string? name, IEnumerable? extra = null)
{
var pool = extra != null ? Presets.Concat(extra) : Presets;
return pool.FirstOrDefault(e =>
string.Equals(e.Name, name, StringComparison.OrdinalIgnoreCase));
}
public static SearchEngine? FindByKeyword(string? keyword, IEnumerable? extra = null)
{
var pool = extra != null ? Presets.Concat(extra) : Presets;
return pool.FirstOrDefault(e =>
string.Equals(e.Keyword, keyword, StringComparison.OrdinalIgnoreCase));
}
}
/// 주소창 입력에 대한 네비게이션 의도. IsUrl=false 면 Target 은 검색 결과 URL.
public sealed record NavigationIntent(bool IsUrl, string Target, string? EngineName = null);