diff options
| author | Ritesh Ghosh <[email protected]> | 2023-08-28 17:48:57 +0530 |
|---|---|---|
| committer | Ritesh Ghosh <[email protected]> | 2023-08-28 17:48:57 +0530 |
| commit | 64ede2033cf9b433503fa9d08c3debce1eecc179 (patch) | |
| tree | 66eea9b0f7edc3178f65fabf2ecf28c56b703e0f | |
| parent | dfe284a9a7bbef76b59a88c3f75d294663b6001d (diff) | |
| download | aniwatch-api-64ede2033cf9b433503fa9d08c3debce1eecc179.tar.xz aniwatch-api-64ede2033cf9b433503fa9d08c3debce1eecc179.zip | |
feat(episodeServers): added `scrapeEpisodeServers` parser
| -rw-r--r-- | src/parsers/episodeServers.ts | 75 |
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; |
