Files
LingvAI/utils/translate.ts

82 lines
2.2 KiB
TypeScript
Raw Normal View History

import UserAgent from "user-agents";
import cheerio from "cheerio";
2021-03-10 21:31:50 +01:00
import { replaceBoth } from "./language";
export async function googleScrape(
source: string,
target: string,
query: string
): Promise<{
translationRes: string
} | {
errorMsg: string
}> {
2021-03-10 21:31:50 +01:00
const parsed = replaceBoth("mapping", { source, target });
2021-03-12 16:18:26 +01:00
const res = await fetch(
`https://translate.google.com/m?sl=${parsed.source}&tl=${parsed.target}&q=${encodeURIComponent(query)}`,
{
headers: {
"User-Agent": new UserAgent().toString()
}
}
).catch(
() => null
);
2021-03-12 16:18:26 +01:00
if (!res?.ok)
2021-03-12 16:18:26 +01:00
return {
errorMsg: "An error occurred while retrieving the translation"
}
const html = await res.text();
2021-03-18 23:47:12 +01:00
const translationRes = cheerio.load(html)(".result-container").text().trim();
2021-03-12 16:18:26 +01:00
2021-03-18 23:47:12 +01:00
return translationRes
2021-03-12 16:18:26 +01:00
? {
2021-03-18 23:47:12 +01:00
translationRes
2021-03-12 16:18:26 +01:00
} : {
errorMsg: "An error occurred while parsing the translation"
};
}
export function extractSlug(slug: string[]): {
source?: string,
target?: string,
query?: string
} {
const [p1, p2, p3] = slug;
switch (slug.length) {
case 1:
return { query: p1 };
case 2:
2021-03-12 16:18:26 +01:00
return { target: p1, query: p2 };
case 3:
2021-03-12 16:18:26 +01:00
return { source: p1, target: p2, query: p3 };
default:
2021-03-12 16:18:26 +01:00
return {};
}
}
export async function textToSpeechScrape(lang: string, text: string) {
const { target: parsedLang } = replaceBoth("mapping", { source: "", target: lang });
const lastSpace = text.lastIndexOf(" ", 200);
const slicedText = text.slice(0, text.length > 200 && lastSpace !== -1 ? lastSpace : 200);
const res = await fetch(
`https://translate.google.com/translate_tts?tl=${parsedLang}&q=${encodeURIComponent(slicedText)}&textlen=${slicedText.length}&client=tw-ob`,
{
headers: {
"User-Agent": new UserAgent().toString()
}
}
).catch(
() => null
);
return res?.ok
? res.blob().then(blob => blob.arrayBuffer()).then(buffer => Array.from(new Uint8Array(buffer)))
: null;
}