diff options
| author | Ritesh Ghosh <[email protected]> | 2024-03-25 18:58:40 +0530 |
|---|---|---|
| committer | Ritesh Ghosh <[email protected]> | 2024-03-25 18:58:40 +0530 |
| commit | 1c02c9cf4f9c364c57a2f30471e676b5a5e5b5ca (patch) | |
| tree | 9fb49a4dc7b50d0dd1aa85b21b15352c5784cb94 /src | |
| parent | fef106da27270dcb86031e511a3cc428e40f41ff (diff) | |
| download | aniwatch-api-1c02c9cf4f9c364c57a2f30471e676b5a5e5b5ca.tar.xz aniwatch-api-1c02c9cf4f9c364c57a2f30471e676b5a5e5b5ca.zip | |
feat(advancedSearch): add advanced search feature
Diffstat (limited to 'src')
| -rw-r--r-- | src/parsers/animeSearch.ts | 52 |
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); |
