public async Task <int?> GetSearchCountAsync(VerseSetDescriptor setDescriptor) { int?searchCount = null; var url = GetSearchCountUrl(setDescriptor); try { var webClient = new HtmlWeb(); var document = await webClient.LoadFromWebAsync(url); var resultCountNode = document.DocumentNode.SelectSingleNode("//span[@id='resultsCount']/span"); if (!string.IsNullOrWhiteSpace(resultCountNode?.InnerText)) { var searchCountStr = Numbers.GetNumberFromStr(resultCountNode?.InnerText); if (int.TryParse(searchCountStr, out int count)) { searchCount = count; } } } catch (Exception ex) { _logger.LogError(ex, $"Error retrieving search count for \"{setDescriptor.Code}\"."); } return(searchCount); }
/// <summary> /// Given a string identifier code for a specific verse or sequence of /// verses, return a corresponding VerseSetDescriptor. /// /// Example: "40024013014" returns the VerseSetDescriptor for Matthew 24:13,14. /// </summary> public static VerseSetDescriptor FromCode(string verseSetCode) { VerseSetDescriptor descriptor = null; if (int.TryParse(verseSetCode.Substring(0, 2), out int bookId)) { if (int.TryParse(verseSetCode.Substring(2, 3), out int chapter)) { if (int.TryParse(verseSetCode.Substring(5, 3), out int start)) { var end = start; if (verseSetCode.Length == 11) { int.TryParse(verseSetCode.Substring(8, 3), out end); } descriptor = new VerseSetDescriptor { BookId = bookId, Chapter = chapter, Start = start, End = end }; } } } return(descriptor); }
/// <summary> /// Given a verse set identifying a single verse or sequence of verses from a /// single chapter, asynchronously retrieve the language-specific HTML from the /// WOL website, modifying the returned HTML in the process to suit our use. /// </summary> public async Task <string> GetVerseHtmlAsync(VerseSetDescriptor verseSet, string language) { string verseHtml = null; var url = GetVerseUrl(verseSet, language); try { var webClient = new HtmlWeb(); var document = await webClient.LoadFromWebAsync(url); var articleNode = document.DocumentNode.SelectSingleNode("//li[contains(@class,'bibleCitation')]/article"); if (!string.IsNullOrWhiteSpace(articleNode?.InnerHtml)) { verseHtml = CleanVerseHtml(articleNode); } } catch (Exception ex) { _logger.LogError(ex, $"Error retrieving HTML for \"{verseSet.Code}\"."); } return(verseHtml); }
public async Task <string> GetVerseHtmlFromSetCode(string verseCode, string language) { // first check the cache string html = _unitOfWork.VerseCacheRepo.GetVerseHtmlByCode(verseCode, language); // if not cached, use the web retriever if (html == null) { var verseDescriptor = VerseSetDescriptor.FromCode(verseCode); html = await _webRetriever.GetVerseHtmlAsync(verseDescriptor, language); if (html != null) { // do we already have a count from another language? var searchCount = _unitOfWork.VerseCacheRepo.GetSearchCountByCode(verseCode); if (searchCount == null) { searchCount = await _searchCountRetriever.GetSearchCountAsync(verseDescriptor); } _unitOfWork.VerseCacheRepo.AddVerseHtml(verseCode, language, html, searchCount ?? 0); _unitOfWork.SaveChanges(); } } return(html); }
/// <summary> /// Given a verse set id, get the url that will retrieve the /// search references from the WOL site (always uses Engligh). /// </summary> public string GetSearchCountUrl(VerseSetDescriptor setDescriptor) { var bookName = _verseParser.GetBookNameById(setDescriptor.BookId, "en"); var tokens = new Dictionary <string, string> { { "book", bookName }, { "chapter", setDescriptor.IsSingleChapterBook ? "" : $"{setDescriptor.Chapter}:" }, { "verseStart", setDescriptor.Start.ToString() }, { "verseEnd", setDescriptor.Start == setDescriptor.End ? "" : $"-{setDescriptor.End}" } }; // replace the tokens in the template with the values we obtained above var url = Settings.Default.SearchCountUrlTemplate.FormatToken(tokens); return(url); }
/// <summary> /// Given a verse set id, get the url that will retrieve the /// verse from the WOL site using the configured language. /// </summary> public string GetVerseUrl(VerseSetDescriptor setDescriptor, string language) { var bookName = _verseParser.GetBookNameById(setDescriptor.BookId, language); var tokens = new Dictionary <string, string> { { "book", bookName }, { "chapter", setDescriptor.IsSingleChapterBook ? "" : $"{setDescriptor.Chapter}:" }, { "verseStart", setDescriptor.Start.ToString() }, { "verseEnd", setDescriptor.Start == setDescriptor.End ? "" : $"-{setDescriptor.End}" } }; // get the URL template specified for the language var settings = _languageSettingsProvider.GetLanguageSettings(language); // replace the tokens in the template with the values we obtained above var url = settings.ScriptureLookupUrlTemplate.FormatToken(tokens); return(url); }