aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRitesh Ghosh <[email protected]>2023-08-28 17:48:57 +0530
committerRitesh Ghosh <[email protected]>2023-08-28 17:48:57 +0530
commit64ede2033cf9b433503fa9d08c3debce1eecc179 (patch)
tree66eea9b0f7edc3178f65fabf2ecf28c56b703e0f /src
parentdfe284a9a7bbef76b59a88c3f75d294663b6001d (diff)
downloadaniwatch-api-64ede2033cf9b433503fa9d08c3debce1eecc179.tar.xz
aniwatch-api-64ede2033cf9b433503fa9d08c3debce1eecc179.zip
feat(episodeServers): added `scrapeEpisodeServers` parser
Diffstat (limited to 'src')
-rw-r--r--src/parsers/episodeServers.ts75
1 files changed, 75 insertions, 0 deletions
diff --git a/src/parsers/episodeServers.ts b/src/parsers/episodeServers.ts
new file mode 100644
index 0000000..5e5ee00
--- /dev/null
+++ b/src/parsers/episodeServers.ts
@@ -0,0 +1,75 @@
+import {
+ SRC_BASE_URL,
+ SRC_AJAX_URL,
+ ACCEPT_HEADER,
+ USER_AGENT_HEADER,
+ ACCEPT_ENCODING_HEADER,
+} from "../utils";
+import axios, { AxiosError } from "axios";
+import createHttpError, { HttpError } from "http-errors";
+import { load, CheerioAPI, SelectorType } from "cheerio";
+import { ScrapedEpisodeServers } from "../models/parsers";
+
+// /anime/servers?episodeId=${id}
+async function scrapeEpisodeServers(
+ episodeId: string
+): Promise<ScrapedEpisodeServers | HttpError> {
+ const res: ScrapedEpisodeServers = {
+ sub: [],
+ dub: [],
+ episodeId,
+ episodeNo: 0,
+ };
+
+ try {
+ const epId = episodeId.split("?ep=")[1];
+
+ const { data } = await axios.get(
+ `${SRC_AJAX_URL}/v2/episode/servers?episodeId=${epId}`,
+ {
+ headers: {
+ Accept: ACCEPT_HEADER,
+ "User-Agent": USER_AGENT_HEADER,
+ "X-Requested-With": "XMLHttpRequest",
+ "Accept-Encoding": ACCEPT_ENCODING_HEADER,
+ Referer: new URL(`/watch/${episodeId}`, SRC_BASE_URL).href,
+ },
+ }
+ );
+
+ const $: CheerioAPI = load(data.html);
+
+ const epNoSelector: SelectorType = ".server-notice strong";
+ res.episodeNo = Number($(epNoSelector).text().split(" ").pop()) || 0;
+
+ $(`.ps_-block.ps_-block-sub.servers-sub .ps__-list .server-item`).each(
+ (_, el) => {
+ res.sub.push({
+ serverName: $(el).find("a").text().toLowerCase().trim(),
+ serverId: Number($(el)?.attr("data-server-id")?.trim()) || null,
+ });
+ }
+ );
+
+ $(`.ps_-block.ps_-block-sub.servers-dub .ps__-list .server-item`).each(
+ (_, el) => {
+ res.dub.push({
+ serverName: $(el).find("a").text().toLowerCase().trim(),
+ serverId: Number($(el)?.attr("data-server-id")?.trim()) || null,
+ });
+ }
+ );
+
+ return res;
+ } catch (err: any) {
+ if (err instanceof AxiosError) {
+ throw createHttpError(
+ err?.response?.status || 500,
+ err?.response?.statusText || "Something went wrong"
+ );
+ }
+ throw createHttpError.InternalServerError(err?.message);
+ }
+}
+
+export default scrapeEpisodeServers;