aboutsummaryrefslogtreecommitdiff
path: root/src/utils
diff options
context:
space:
mode:
Diffstat (limited to 'src/utils')
-rw-r--r--src/utils/constants.ts115
-rw-r--r--src/utils/index.ts35
-rw-r--r--src/utils/methods.ts85
3 files changed, 200 insertions, 35 deletions
diff --git a/src/utils/constants.ts b/src/utils/constants.ts
index 21a6db8..8615050 100644
--- a/src/utils/constants.ts
+++ b/src/utils/constants.ts
@@ -1,11 +1,10 @@
import { config } from "dotenv";
+
config();
export const ACCEPT_ENCODING_HEADER = "gzip, deflate, br";
-
export const USER_AGENT_HEADER =
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4692.71 Safari/537.36";
-
export const ACCEPT_HEADER =
"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9";
@@ -16,3 +15,115 @@ export const SRC_BASE_URL = `https://${DOMAIN}`;
export const SRC_AJAX_URL = `${SRC_BASE_URL}/ajax`;
export const SRC_HOME_URL = `${SRC_BASE_URL}/home`;
export const SRC_SEARCH_URL = `${SRC_BASE_URL}/search`;
+
+// <SearchPageFilters>
+export const genresIdMap: Record<string, number> = {
+ action: 1,
+ adventure: 2,
+ cars: 3,
+ comedy: 4,
+ dementia: 5,
+ demons: 6,
+ drama: 8,
+ ecchi: 9,
+ fantasy: 10,
+ game: 11,
+ harem: 35,
+ historical: 13,
+ horror: 14,
+ isekai: 44,
+ josei: 43,
+ kids: 15,
+ magic: 16,
+ "martial-arts": 17,
+ mecha: 18,
+ military: 38,
+ music: 19,
+ mystery: 7,
+ parody: 20,
+ police: 39,
+ psychological: 40,
+ romance: 22,
+ samurai: 21,
+ school: 23,
+ "sci-fi": 24,
+ seinen: 42,
+ shoujo: 25,
+ "shoujo-ai": 26,
+ shounen: 27,
+ "shounen-ai": 28,
+ "slice-of-life": 36,
+ space: 29,
+ sports: 30,
+ "super-power": 31,
+ supernatural: 37,
+ thriller: 41,
+ vampire: 32,
+} as const;
+
+export const typeIdMap: Record<string, number> = {
+ all: 0,
+ movie: 1,
+ tv: 2,
+ ova: 3,
+ ona: 4,
+ special: 5,
+ music: 6,
+} as const;
+
+export const statusIdMap: Record<string, number> = {
+ all: 0,
+ "finished-airing": 1,
+ "currently-airing": 2,
+ "not-yet-aired": 3,
+} as const;
+
+export const ratedIdMap: Record<string, number> = {
+ all: 0,
+ g: 1,
+ pg: 2,
+ "pg-13": 3,
+ r: 4,
+ "r+": 5,
+ rx: 6,
+} as const;
+
+export const scoreIdMap: Record<string, number> = {
+ all: 0,
+ appalling: 1,
+ horrible: 2,
+ "very-bad": 3,
+ bad: 4,
+ average: 5,
+ fine: 6,
+ good: 7,
+ "very-good": 8,
+ great: 9,
+ masterpiece: 10,
+} as const;
+
+export const seasonIdMap: Record<string, number> = {
+ all: 0,
+ spring: 1,
+ summer: 2,
+ fall: 3,
+ winter: 4,
+} as const;
+
+export const languageIdMap: Record<string, number> = {
+ all: 0,
+ sub: 1,
+ dub: 2,
+ "sub-&-dub": 3,
+} as const;
+
+export const sortIdMap: Record<string, string> = {
+ default: "default",
+ "recently-added": "recently_added",
+ "recently-updated": "recently_updated",
+ score: "score",
+ "name-a-z": "name_az",
+ "released-date": "released_date",
+ "most-watched": "most_watched",
+} as const;
+// </SearchPageFilters>
diff --git a/src/utils/index.ts b/src/utils/index.ts
index 42492ef..b514c85 100644
--- a/src/utils/index.ts
+++ b/src/utils/index.ts
@@ -1,33 +1,2 @@
-import {
- SRC_AJAX_URL,
- SRC_HOME_URL,
- SRC_BASE_URL,
- ACCEPT_HEADER,
- SRC_SEARCH_URL,
- USER_AGENT_HEADER,
- ACCEPT_ENCODING_HEADER,
-} from "./constants.js";
-import {
- extractAnimes,
- substringAfter,
- substringBefore,
- retrieveServerId,
- extractTop10Animes,
- extractMostPopularAnimes,
-} from "./methods.js";
-
-export {
- SRC_AJAX_URL,
- SRC_HOME_URL,
- SRC_BASE_URL,
- ACCEPT_HEADER,
- SRC_SEARCH_URL,
- USER_AGENT_HEADER,
- ACCEPT_ENCODING_HEADER,
- extractAnimes,
- substringAfter,
- substringBefore,
- retrieveServerId,
- extractTop10Animes,
- extractMostPopularAnimes,
-};
+export * from "./methods.js";
+export * from "./constants.js";
diff --git a/src/utils/methods.ts b/src/utils/methods.ts
index 2e062d7..9d89822 100644
--- a/src/utils/methods.ts
+++ b/src/utils/methods.ts
@@ -5,6 +5,17 @@ import type {
Top10AnimeTimePeriod,
} from "../types/anime.js";
import type { CheerioAPI, SelectorType } from "cheerio";
+import {
+ genresIdMap,
+ languageIdMap,
+ ratedIdMap,
+ scoreIdMap,
+ seasonIdMap,
+ sortIdMap,
+ statusIdMap,
+ typeIdMap,
+} from "./constants.js";
+import { type FilterKeys } from "../types/controllers/animeSearch.js";
import createHttpError, { HttpError } from "http-errors";
export const extractAnimes = (
@@ -192,6 +203,80 @@ export function retrieveServerId(
);
}
+function getGenresFilterVal(genreNames: string[]): string | undefined {
+ if (genreNames.length < 1) {
+ return undefined;
+ }
+ return genreNames.map((name) => genresIdMap[name]).join(",");
+}
+
+export function getSearchFilterValue(
+ key: FilterKeys,
+ rawValue: string
+): string | undefined {
+ rawValue = rawValue.trim();
+ if (!rawValue) return undefined;
+
+ switch (key) {
+ case "genres": {
+ return getGenresFilterVal(rawValue.split(","));
+ }
+ case "type": {
+ const val = typeIdMap[rawValue] ?? 0;
+ return val === 0 ? undefined : `${val}`;
+ }
+ case "status": {
+ const val = statusIdMap[rawValue] ?? 0;
+ return val === 0 ? undefined : `${val}`;
+ }
+ case "rated": {
+ const val = ratedIdMap[rawValue] ?? 0;
+ return val === 0 ? undefined : `${val}`;
+ }
+ case "score": {
+ const val = scoreIdMap[rawValue] ?? 0;
+ return val === 0 ? undefined : `${val}`;
+ }
+ case "season": {
+ const val = seasonIdMap[rawValue] ?? 0;
+ return val === 0 ? undefined : `${val}`;
+ }
+ case "language": {
+ const val = languageIdMap[rawValue] ?? 0;
+ return val === 0 ? undefined : `${val}`;
+ }
+ case "sort": {
+ return sortIdMap[rawValue] ?? undefined;
+ }
+ default:
+ return undefined;
+ }
+}
+
+// this fn tackles both start_date and end_date
+export function getSearchDateFilterValue(
+ isStartDate: boolean,
+ rawValue: string
+): string[] | undefined {
+ rawValue = rawValue.trim();
+ if (!rawValue) return undefined;
+
+ const dateRegex = /^\d{4}-([0-9]|1[0-2])-([0-9]|[12][0-9]|3[01])$/;
+ const dateCategory = isStartDate ? "s" : "e";
+ const [year, month, date] = rawValue.split("-");
+
+ if (!dateRegex.test(rawValue)) {
+ return undefined;
+ }
+
+ // sample return -> [sy=2023, sm=10, sd=11]
+ return [
+ Number(year) > 0 ? `${dateCategory}y=${year}` : "",
+ Number(month) > 0 ? `${dateCategory}m=${month}` : "",
+ Number(date) > 0 ? `${dateCategory}d=${date}` : "",
+ ].filter((d) => Boolean(d));
+}
+
export function substringAfter(str: string, toFind: string) {
const index = str.indexOf(toFind);
return index == -1 ? "" : str.substring(index + toFind.length);