From a19d705c909827566d91841360aa472bdfbf6e82 Mon Sep 17 00:00:00 2001 From: Ritesh Ghosh Date: Sun, 17 Dec 2023 19:35:52 +0530 Subject: feat(estimatedSchedule): add `/schedule` route --- src/routes/index.ts | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'src') diff --git a/src/routes/index.ts b/src/routes/index.ts index e3f6d8e..7046ae1 100644 --- a/src/routes/index.ts +++ b/src/routes/index.ts @@ -8,6 +8,7 @@ import { getEpisodeServers, getProducerAnimes, getAnimeAboutInfo, + getEstimatedSchedule, getAnimeEpisodeSources, getAnimeSearchSuggestion, } from "../controllers/index.js"; @@ -42,6 +43,9 @@ router.get("/servers", getEpisodeServers); // /anime/episode-srcs?id=${episodeId}?server=${server}&category=${category (dub or sub)} router.get("/episode-srcs", getAnimeEpisodeSources); +// /anime/schedule?date=${date} +router.get("/schedule", getEstimatedSchedule); + // /anime/producer/${name}?page=${page} router.get("/producer/:name", getProducerAnimes); -- cgit v1.2.3 From caec8b684d0afb5fb97ea6fd5a03e8001e2db648 Mon Sep 17 00:00:00 2001 From: Ritesh Ghosh Date: Sun, 17 Dec 2023 19:37:14 +0530 Subject: feat(estimatedSchedule): add `/schedule` endpoint controller --- src/controllers/estimatedSchedule.controller.ts | 36 +++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 src/controllers/estimatedSchedule.controller.ts (limited to 'src') diff --git a/src/controllers/estimatedSchedule.controller.ts b/src/controllers/estimatedSchedule.controller.ts new file mode 100644 index 0000000..bead83e --- /dev/null +++ b/src/controllers/estimatedSchedule.controller.ts @@ -0,0 +1,36 @@ +import createHttpError from "http-errors"; +import { type RequestHandler } from "express"; +import { scrapeEstimatedSchedule } from "../parsers/index.js"; +import { type EstimatedScheduleQueryParams } from "../models/controllers/index.js"; + +// /anime/schedule?date=${date} +const getEstimatedSchedule: RequestHandler< + unknown, + Awaited>, + unknown, + EstimatedScheduleQueryParams +> = async (req, res, next) => { + try { + const dateQuery = req.query.date + ? decodeURIComponent(req.query.date as string) + : null; + + if (dateQuery === null) { + throw createHttpError.BadRequest("Date payload required"); + } + if (!/^\d{4}-\d{2}-\d{2}$/.test(dateQuery)) { + throw createHttpError.BadRequest( + "Invalid date payload format. Months and days must have 2 digits" + ); + } + + const data = await scrapeEstimatedSchedule(dateQuery); + + res.status(200).json(data); + } catch (err: any) { + console.error(err); + next(err); + } +}; + +export default getEstimatedSchedule; -- cgit v1.2.3 From 0685c200dd0ccd3de9ed88996b1e55f0e7ce4bf7 Mon Sep 17 00:00:00 2001 From: Ritesh Ghosh Date: Sun, 17 Dec 2023 19:38:04 +0530 Subject: feat(estimatedSchedule): add `/schedule` endpoint controller query params type --- src/models/controllers/estimatedSchedule.ts | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 src/models/controllers/estimatedSchedule.ts (limited to 'src') diff --git a/src/models/controllers/estimatedSchedule.ts b/src/models/controllers/estimatedSchedule.ts new file mode 100644 index 0000000..e732aaa --- /dev/null +++ b/src/models/controllers/estimatedSchedule.ts @@ -0,0 +1,3 @@ +export type EstimatedScheduleQueryParams = { + date?: string; +}; -- cgit v1.2.3 From 9b88ae9cc9f63f98bb1aae3de1f78d70132c72c3 Mon Sep 17 00:00:00 2001 From: Ritesh Ghosh Date: Sun, 17 Dec 2023 19:38:56 +0530 Subject: refactor: controllers import export --- src/controllers/index.ts | 2 ++ 1 file changed, 2 insertions(+) (limited to 'src') diff --git a/src/controllers/index.ts b/src/controllers/index.ts index 21f9d10..6e90440 100644 --- a/src/controllers/index.ts +++ b/src/controllers/index.ts @@ -6,6 +6,7 @@ import getAnimeCategory from "./animeCategory.controller.js"; import getProducerAnimes from "./animeProducer.controller.js"; import getEpisodeServers from "./episodeServers.controller.js"; import getAnimeAboutInfo from "./animeAboutInfo.controller.js"; +import getEstimatedSchedule from "./estimatedSchedule.controller.js"; import getAnimeEpisodeSources from "./animeEpisodeSrcs.controller.js"; import getAnimeSearchSuggestion from "./animeSearchSuggestion.controller.js"; @@ -18,6 +19,7 @@ export { getEpisodeServers, getProducerAnimes, getAnimeAboutInfo, + getEstimatedSchedule, getAnimeEpisodeSources, getAnimeSearchSuggestion, }; -- cgit v1.2.3 From 24c2520151b880095ff7966c353793f2cd83024e Mon Sep 17 00:00:00 2001 From: Ritesh Ghosh Date: Sun, 17 Dec 2023 19:39:24 +0530 Subject: refactor: controller models import export --- src/models/controllers/index.ts | 2 ++ 1 file changed, 2 insertions(+) (limited to 'src') diff --git a/src/models/controllers/index.ts b/src/models/controllers/index.ts index df9beff..fab25b6 100644 --- a/src/models/controllers/index.ts +++ b/src/models/controllers/index.ts @@ -15,6 +15,7 @@ import type { AnimeEpisodePathParams } from "./animeEpisodes.js"; import type { EpisodeServersQueryParams } from "./episodeServers.js"; import type { AnimeAboutInfoQueryParams } from "./animeAboutInfo.js"; import type { AnimeEpisodeSrcsQueryParams } from "./animeEpisodeSrcs.js"; +import type { EstimatedScheduleQueryParams } from "./estimatedSchedule.js"; import type { AnimeSearchSuggestQueryParams } from "./animeSearchSuggestion.js"; export type { @@ -29,5 +30,6 @@ export type { AnimeAboutInfoQueryParams, EpisodeServersQueryParams, AnimeEpisodeSrcsQueryParams, + EstimatedScheduleQueryParams, AnimeSearchSuggestQueryParams, }; -- cgit v1.2.3 From 3531e7299896a48a66bdeac0bf858a081f70d129 Mon Sep 17 00:00:00 2001 From: Ritesh Ghosh Date: Sun, 17 Dec 2023 19:39:46 +0530 Subject: refactor: parser models import export --- src/models/parsers/index.ts | 2 ++ 1 file changed, 2 insertions(+) (limited to 'src') diff --git a/src/models/parsers/index.ts b/src/models/parsers/index.ts index 2fb15af..057e2fc 100644 --- a/src/models/parsers/index.ts +++ b/src/models/parsers/index.ts @@ -6,6 +6,7 @@ import type { ScrapedProducerAnime } from "./animeProducer.js"; import type { ScrapedEpisodeServers } from "./episodeServers.js"; import type { ScrapedAnimeAboutInfo } from "./animeAboutInfo.js"; import type { ScrapedAnimeSearchResult } from "./animeSearch.js"; +import type { ScrapedEstimatedSchedule } from "./estimatedSchedule.js"; import type { ScrapedAnimeEpisodesSources } from "./animeEpisodeSrcs.js"; import type { ScrapedAnimeSearchSuggestion } from "./animeSearchSuggestion.js"; @@ -18,6 +19,7 @@ export type { ScrapedEpisodeServers, ScrapedAnimeAboutInfo, ScrapedAnimeSearchResult, + ScrapedEstimatedSchedule, ScrapedAnimeEpisodesSources, ScrapedAnimeSearchSuggestion, }; -- cgit v1.2.3 From 083ccbfd720523e70f88e61493ed606ee0b45f69 Mon Sep 17 00:00:00 2001 From: Ritesh Ghosh Date: Sun, 17 Dec 2023 19:40:02 +0530 Subject: refactor: parsers import export --- src/parsers/index.ts | 2 ++ 1 file changed, 2 insertions(+) (limited to 'src') diff --git a/src/parsers/index.ts b/src/parsers/index.ts index 49a78b9..395833a 100644 --- a/src/parsers/index.ts +++ b/src/parsers/index.ts @@ -6,6 +6,7 @@ import scrapeAnimeCategory from "./animeCategory.js"; import scrapeProducerAnimes from "./animeProducer.js"; import scrapeEpisodeServers from "./episodeServers.js"; import scrapeAnimeAboutInfo from "./animeAboutInfo.js"; +import scrapeEstimatedSchedule from "./estimatedSchedule.js"; import scrapeAnimeEpisodeSources from "./animeEpisodeSrcs.js"; import scrapeAnimeSearchSuggestion from "./animeSearchSuggestion.js"; @@ -18,6 +19,7 @@ export { scrapeEpisodeServers, scrapeProducerAnimes, scrapeAnimeAboutInfo, + scrapeEstimatedSchedule, scrapeAnimeEpisodeSources, scrapeAnimeSearchSuggestion, }; -- cgit v1.2.3 From 0ca9a82a2bd5b769e252424a78a08a17a62e9854 Mon Sep 17 00:00:00 2001 From: Ritesh Ghosh Date: Sun, 17 Dec 2023 19:40:40 +0530 Subject: feat(estimatedSchedule): add `EstimatedSchedule` types --- src/models/parsers/estimatedSchedule.ts | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 src/models/parsers/estimatedSchedule.ts (limited to 'src') diff --git a/src/models/parsers/estimatedSchedule.ts b/src/models/parsers/estimatedSchedule.ts new file mode 100644 index 0000000..f62dd14 --- /dev/null +++ b/src/models/parsers/estimatedSchedule.ts @@ -0,0 +1,10 @@ +type EstimatedSchedule = { + id: string | null; + time: string | null; + name: string | null; + jname: string | null; +}; + +export type ScrapedEstimatedSchedule = { + scheduledAnimes: Array; +}; -- cgit v1.2.3 From 8826dd276fe4a5ccab2b074d77191b81b265e528 Mon Sep 17 00:00:00 2001 From: Ritesh Ghosh Date: Sun, 17 Dec 2023 19:41:22 +0530 Subject: feat(estimatedSchedule): add `estimatedSchedule` parser --- src/parsers/estimatedSchedule.ts | 67 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 src/parsers/estimatedSchedule.ts (limited to 'src') diff --git a/src/parsers/estimatedSchedule.ts b/src/parsers/estimatedSchedule.ts new file mode 100644 index 0000000..b700054 --- /dev/null +++ b/src/parsers/estimatedSchedule.ts @@ -0,0 +1,67 @@ +import { + SRC_HOME_URL, + SRC_AJAX_URL, + 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 ScrapedEstimatedSchedule } from "../models/parsers/index.js"; + +// /anime/schedule?date=${date} +async function scrapeEstimatedSchedule( + date: string +): Promise { + const res: ScrapedEstimatedSchedule = { + scheduledAnimes: [], + }; + + try { + const estScheduleURL = + `${SRC_AJAX_URL}/schedule/list?tzOffset=-330&date=${date}` as const; + + const mainPage = await axios.get(estScheduleURL, { + headers: { + Accept: "*/*", + Referer: SRC_HOME_URL, + "User-Agent": USER_AGENT_HEADER, + "X-Requested-With": "XMLHttpRequest", + "Accept-Encoding": ACCEPT_ENCODING_HEADER, + }, + }); + + const $: CheerioAPI = load(mainPage?.data?.html); + + const selector: SelectorType = "li"; + + if ($(selector)?.text()?.trim()?.includes("No data to display")) { + return res; + } + + $(selector).each((_, el) => { + res.scheduledAnimes.push({ + id: $(el)?.find("a")?.attr("href")?.slice(1)?.trim() || null, + time: $(el)?.find("a .time")?.text()?.trim() || null, + name: $(el)?.find("a .film-name.dynamic-name")?.text()?.trim() || null, + jname: + $(el) + ?.find("a .film-name.dynamic-name") + ?.attr("data-jname") + ?.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 scrapeEstimatedSchedule; -- cgit v1.2.3