namespace VideoDownloader.App.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);