aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRitesh Ghosh <[email protected]>2024-03-25 18:58:40 +0530
committerRitesh Ghosh <[email protected]>2024-03-25 18:58:40 +0530
commit1c02c9cf4f9c364c57a2f30471e676b5a5e5b5ca (patch)
tree9fb49a4dc7b50d0dd1aa85b21b15352c5784cb94 /src
parentfef106da27270dcb86031e511a3cc428e40f41ff (diff)
downloadaniwatch-api-1c02c9cf4f9c364c57a2f30471e676b5a5e5b5ca.tar.xz
aniwatch-api-1c02c9cf4f9c364c57a2f30471e676b5a5e5b5ca.zip
feat(advancedSearch): add advanced search feature
Diffstat (limited to 'src')
-rw-r--r--src/parsers/animeSearch.ts52
1 files changed, 41 insertions, 11 deletions
diff --git a/src/parsers/animeSearch.ts b/src/parsers/animeSearch.ts
index 43a9fdd..16818c6 100644
--- a/src/parsers/animeSearch.ts
+++ b/src/parsers/animeSearch.ts
@@ -3,18 +3,22 @@ import {
ACCEPT_HEADER,
USER_AGENT_HEADER,
ACCEPT_ENCODING_HEADER,
- extractMostPopularAnimes,
extractAnimes,
+ getSearchFilterValue,
+ extractMostPopularAnimes,
+ getSearchDateFilterValue,
} 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 { ScrapedAnimeSearchResult } from "../types/parsers/index.js";
+import type { SearchFilters, FilterKeys } from "../types/controllers/index.js";
// /anime/search?q=${query}&page=${page}
async function scrapeAnimeSearch(
q: string,
- page: number = 1
+ page: number = 1,
+ filters: SearchFilters
): Promise<ScrapedAnimeSearchResult | HttpError> {
const res: ScrapedAnimeSearchResult = {
animes: [],
@@ -22,19 +26,45 @@ async function scrapeAnimeSearch(
currentPage: Number(page),
hasNextPage: false,
totalPages: 1,
+ searchQuery: q,
+ searchFilters: filters,
};
try {
- const mainPage = await axios.get(
- `${SRC_SEARCH_URL}?keyword=${q}&page=${page}`,
- {
- headers: {
- "User-Agent": USER_AGENT_HEADER,
- "Accept-Encoding": ACCEPT_ENCODING_HEADER,
- Accept: ACCEPT_HEADER,
- },
+ const url = new URL(SRC_SEARCH_URL);
+ url.searchParams.set("keyword", q);
+ url.searchParams.set("page", `${page}`);
+ url.searchParams.set("sort", "default");
+
+ for (const key in filters) {
+ if (key.includes("_date")) {
+ const dates = getSearchDateFilterValue(
+ key === "start_date",
+ filters[key as keyof SearchFilters] || ""
+ );
+ if (!dates) continue;
+
+ dates.map((dateParam) => {
+ const [key, val] = dateParam.split("=");
+ url.searchParams.set(key, val);
+ });
+ continue;
}
- );
+
+ const filterVal = getSearchFilterValue(
+ key as FilterKeys,
+ filters[key as keyof SearchFilters] || ""
+ );
+ filterVal && url.searchParams.set(key, filterVal);
+ }
+
+ const mainPage = await axios.get(url.href, {
+ headers: {
+ "User-Agent": USER_AGENT_HEADER,
+ "Accept-Encoding": ACCEPT_ENCODING_HEADER,
+ Accept: ACCEPT_HEADER,
+ },
+ });
const $: CheerioAPI = load(mainPage.data);