Skip to content

Commit

Permalink
Add localization to VOTD, Thanks @Haluska77
Browse files Browse the repository at this point in the history
  • Loading branch information
Glowstudent777 committed Oct 25, 2024
1 parent eef3131 commit ed40142
Show file tree
Hide file tree
Showing 3 changed files with 100 additions and 72 deletions.
161 changes: 93 additions & 68 deletions src/functions/votd.ts
Original file line number Diff line number Diff line change
@@ -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<String> = [];

// 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<String> = [];
const citationsArray: Array<String> = [];
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<String> = [];

// 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<String> = [];
const citationsArray: Array<String> = [];
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++;
}
}
6 changes: 3 additions & 3 deletions src/verseOfTheDay.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
}
5 changes: 4 additions & 1 deletion tests/votd.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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();
})
})

0 comments on commit ed40142

Please sign in to comment.