File size: 2,160 Bytes
11acfd9 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 |
import {
SRC_BASE_URL,
SRC_AJAX_URL,
ACCEPT_HEADER,
USER_AGENT_HEADER,
ACCEPT_ENCODING_HEADER,
} from "../utils/index.js";
import axios, { AxiosError } from "axios";
import createHttpError, { type HttpError } from "http-errors";
import { load, type CheerioAPI, type SelectorType } from "cheerio";
import type { ScrapedEpisodeServers } from "../types/parsers/index.js";
// /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;
|