From ed401420272abe5b285459999d969d274c72f160 Mon Sep 17 00:00:00 2001 From: Glowstudent777 <55334764+Glowstudent777@users.noreply.github.com> Date: Fri, 25 Oct 2024 17:03:16 -0500 Subject: [PATCH] Add localization to VOTD, Thanks @Haluska77 --- src/functions/votd.ts | 161 ++++++++++++++++++++++++------------------ src/verseOfTheDay.ts | 6 +- tests/votd.test.ts | 5 +- 3 files changed, 100 insertions(+), 72 deletions(-) diff --git a/src/functions/votd.ts b/src/functions/votd.ts index f9a76e6..9caf24c 100644 --- a/src/functions/votd.ts +++ b/src/functions/votd.ts @@ -1,76 +1,101 @@ -import axios from 'axios'; +import axios, { AxiosError, AxiosResponse } from 'axios'; import * as cheerio from 'cheerio'; -const URL = "https://www.bible.com/verse-of-the-day"; -export const getVotd = async () => { +async function fetchData(language: string) { + const URL = `https://www.bible.com/${language}/verse-of-the-day`; try { - const { data } = await axios.get(URL); - const $ = cheerio.load(data); - - const imageArray: Array = []; - - // Nextjs way :) - const nextWay = $("script#__NEXT_DATA__").eq(0); - if (nextWay != null) { - let json = JSON.parse(nextWay.html() || ""); - const verse = json.props.pageProps.verses[0].content.replace(/\n/g, ' '); - const reference = json.props.pageProps.verses[0].reference.human; - const version = json.props.pageProps.versionData.abbreviation; - - const images = $("a.block"); - await images.each((i, p) => { - let image = `https://www.bible.com${$(p).find('img').attr()?.src}` - imageArray.push(image); - }) - - return { - citation: `${reference}`, - passage: verse, - images: imageArray ?? [], - version: version - } + const response = await axios.get(URL); + return response; + } catch (error) { + if (error instanceof AxiosError) { + console.error(`Error for language '${language}': ${error.response?.status}`); + } else if (error instanceof Error) { + console.error(`Network error for language '${language}': ${error.message}`); } - // Old way :( - else { - const versesArray: Array = []; - const citationsArray: Array = []; - let version; - - const verses = $("a.text-text-light.w-full.no-underline"); - const citations = $("p.text-gray-25"); - const images = $("a.block"); - - await citations.each((i, p) => { - let citation = $(p).eq(0).text(); - - // cut the ending (ESV), (NIV), etc and store it in version - version = citation.slice(-4).replace(/[()]/g, ''); - - // cut the version from the citation - citation = citation.slice(0, -6); - - citationsArray.push(citation) - }) - - await verses.each((i, p) => { - let unformattedVerse = $(p).eq(0).text(); - let formattedVerse = unformattedVerse.replace(/\n/g, ' '); - versesArray.push(formattedVerse) - }) - - await images.each((i, p) => { - let image = `https://www.bible.com${$(p).find('img').attr()?.src}` - imageArray.push(image); - }) - - return { - citation: citationsArray[0], - passage: versesArray[0], - image: imageArray ?? [], - version: version + return null; + } +} + +export const getVotd = async (lang: string) => { + const languageList = lang.split(','); + let index = 0; + let responseStatus = 0; + let data: AxiosResponse | null = null; + + while (index < languageList.length && responseStatus !== 200) { + const language = languageList[index].trim(); + + data = await fetchData(language); + if (data) { + responseStatus = data.status; + if (responseStatus === 200) { + const $ = cheerio.load(data.data); + + const imageArray: Array = []; + + // Nextjs way :) + const nextWay = $("script#__NEXT_DATA__").eq(0); + if (nextWay != null) { + let json = JSON.parse(nextWay.html() || ""); + const verse = json.props.pageProps.verses[0].content.replace(/\n/g, ' '); + const reference = json.props.pageProps.verses[0].reference.human; + const version = json.props.pageProps.versionData.abbreviation; + + const images = $("a.block"); + await images.each((i, p) => { + let image = `https://www.bible.com${$(p).find('img').attr()?.src}` + imageArray.push(image); + }) + + return { + citation: `${reference}`, + passage: verse, + images: imageArray ?? [], + version: version + } + } + // Old way :( + else { + const versesArray: Array = []; + const citationsArray: Array = []; + let version; + + const verses = $("a.text-text-light.w-full.no-underline"); + const citations = $("p.text-gray-25"); + const images = $("a.block"); + + await citations.each((i, p) => { + let citation = $(p).eq(0).text(); + + // cut the ending (ESV), (NIV), etc and store it in version + version = citation.slice(-4).replace(/[()]/g, ''); + + // cut the version from the citation + citation = citation.slice(0, -6); + + citationsArray.push(citation) + }) + + await verses.each((i, p) => { + let unformattedVerse = $(p).eq(0).text(); + let formattedVerse = unformattedVerse.replace(/\n/g, ' '); + versesArray.push(formattedVerse) + }) + + await images.each((i, p) => { + let image = `https://www.bible.com${$(p).find('img').attr()?.src}` + imageArray.push(image); + }) + + return { + citation: citationsArray[0], + passage: versesArray[0], + image: imageArray ?? [], + version: version + } + } } } - } catch (err) { - console.error(err); + index++; } } \ No newline at end of file diff --git a/src/verseOfTheDay.ts b/src/verseOfTheDay.ts index 189b8a9..c716207 100644 --- a/src/verseOfTheDay.ts +++ b/src/verseOfTheDay.ts @@ -2,7 +2,7 @@ import axios from 'axios' import * as cheerio from 'cheerio'; import { getVotd } from './functions/votd'; -export async function getVerseOfTheDay() { - const data = await getVotd(); +export async function getVerseOfTheDay(lang: string = "en") { + const data = await getVotd(lang); return data; -} +} \ No newline at end of file diff --git a/tests/votd.test.ts b/tests/votd.test.ts index 975e517..b6f2ee0 100644 --- a/tests/votd.test.ts +++ b/tests/votd.test.ts @@ -3,9 +3,12 @@ import { getVotd } from "../src/functions/votd"; describe("VOTD", () => { it("Should Return VOTD", async () => { - const verse = await getVotd(); + const verse = await getVotd("en"); + const verse2 = await getVotd("coffee"); expect(verse?.citation).toBeDefined(); expect(verse?.passage).toBeDefined(); + + expect(verse2).toBeUndefined(); }) }) \ No newline at end of file