Skip to content

Commit 8528746

Browse files
committed
@Pachat Added keyword in filter route
1 parent cec3bbc commit 8528746

3 files changed

Lines changed: 121 additions & 34 deletions

File tree

src/controllers/search.controller.js

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,27 @@ import extractSearchResults from "../extractors/search.extractor.js";
22

33
export const search = async (req) => {
44
try {
5-
let { keyword } = req.query;
5+
let { keyword, type, status, rated, score, season, language, genres, sort, sy, sm, sd, ey, em, ed } = req.query;
66
let page = parseInt(req.query.page) || 1;
77

8-
const [totalPage, data] = await extractSearchResults(
9-
encodeURIComponent(keyword),
10-
page
11-
);
8+
const [totalPage, data] = await extractSearchResults({
9+
keyword: keyword,
10+
type: type,
11+
status: status,
12+
rated: rated,
13+
score: score,
14+
season: season,
15+
language: language,
16+
genres: genres,
17+
sort: sort,
18+
page: page,
19+
sy: sy,
20+
sm: sm,
21+
sd: sd,
22+
ey: ey,
23+
em: em,
24+
ed: ed,
25+
});
1226
if (page > totalPage) {
1327
const error = new Error("Requested page exceeds total available pages.");
1428
error.status = 404;

src/extractors/filter.extractor.js

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -78,17 +78,21 @@ async function extractFilterResults(params = {}) {
7878

7979
const queryParams = new URLSearchParams(filteredParams).toString();
8080

81-
const resp = await axios.get(
82-
`https://${v1_base_url}/filter?${queryParams}`,
83-
{
84-
headers: {
85-
Accept:
86-
"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8",
87-
"Accept-Encoding": "gzip, deflate, br",
88-
"User-Agent": DEFAULT_HEADERS,
89-
},
90-
}
91-
);
81+
let apiUrl = `https://${v1_base_url}/filter?${queryParams}`;
82+
83+
if (filteredParams.keyword) {
84+
apiUrl = `https://${v1_base_url}/search?${queryParams}`;
85+
}
86+
87+
const resp = await axios.get(apiUrl, {
88+
headers: {
89+
Accept:
90+
"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8",
91+
92+
"Accept-Encoding": "gzip, deflate, br",
93+
"User-Agent": DEFAULT_HEADERS,
94+
},
95+
});
9296

9397
const $ = cheerio.load(resp.data);
9498
const elements = ".flw-item";
@@ -136,9 +140,7 @@ async function extractFilterResults(params = {}) {
136140
.replace(/[^0-9]/g, "")
137141
) || null,
138142
},
139-
adultContent:
140-
$el.find(".tick-rate").text().trim() ||
141-
null,
143+
adultContent: $el.find(".tick-rate").text().trim() || null,
142144
});
143145
});
144146

src/extractors/search.extractor.js

Lines changed: 86 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,90 @@ import axios from "axios";
22
import * as cheerio from "cheerio";
33
import { DEFAULT_HEADERS } from "../configs/header.config.js";
44
import { v1_base_url } from "../utils/base_v1.js";
5+
import {
6+
FILTER_LANGUAGE_MAP,
7+
GENRE_MAP,
8+
FILTER_TYPES,
9+
FILTER_STATUS,
10+
FILTER_RATED,
11+
FILTER_SCORE,
12+
FILTER_SEASON,
13+
FILTER_SORT,
14+
} from "../routes/filter.maping.js";
515

6-
async function extractSearchResults(search, page) {
16+
async function extractSearchResults(params = {}) {
717
try {
8-
const resp = await axios.get(
9-
`https://${v1_base_url}/search?keyword=${search}&page=${page}`,
10-
{
11-
headers: {
12-
Accept:
13-
"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",
14-
"Accept-Encoding": "gzip, deflate, br",
15-
"User-Agent": DEFAULT_HEADERS,
16-
},
18+
const normalizeParam = (param, mapping) => {
19+
if (!param) return undefined;
20+
21+
if (typeof param === "string") {
22+
const isAlreadyId = Object.values(mapping).includes(param);
23+
if (isAlreadyId) {
24+
return param;
25+
}
26+
27+
const key = param.trim().toUpperCase();
28+
return mapping.hasOwnProperty(key) ? mapping[key] : undefined;
1729
}
18-
);
30+
return param;
31+
};
32+
33+
const typeParam = normalizeParam(params.type, FILTER_TYPES);
34+
const statusParam = normalizeParam(params.status, FILTER_STATUS);
35+
const ratedParam = normalizeParam(params.rated, FILTER_RATED);
36+
const scoreParam = normalizeParam(params.score, FILTER_SCORE);
37+
const seasonParam = normalizeParam(params.season, FILTER_SEASON);
38+
const sortParam = normalizeParam(params.sort, FILTER_SORT);
39+
40+
let languageParam = params.language;
41+
if (typeof languageParam === "string") {
42+
languageParam = languageParam.trim().toUpperCase();
43+
languageParam = FILTER_LANGUAGE_MAP[languageParam] || undefined;
44+
}
45+
46+
let genresParam = params.genres;
47+
if (typeof genresParam === "string") {
48+
genresParam = genresParam
49+
.split(",")
50+
.map((genre) => GENRE_MAP[genre.trim().toUpperCase()] || genre.trim())
51+
.join(",");
52+
}
53+
54+
const filteredParams = {
55+
type: typeParam,
56+
status: statusParam,
57+
rated: ratedParam,
58+
score: scoreParam,
59+
season: seasonParam,
60+
language: languageParam,
61+
genres: genresParam,
62+
sort: sortParam,
63+
page: params.page || 1,
64+
sy: params.sy || undefined,
65+
sm: params.sm || undefined,
66+
sd: params.sd || undefined,
67+
ey: params.ey || undefined,
68+
em: params.em || undefined,
69+
ed: params.ed || undefined,
70+
keyword: params.keyword || undefined,
71+
};
72+
73+
Object.keys(filteredParams).forEach((key) => {
74+
if (filteredParams[key] === undefined) {
75+
delete filteredParams[key];
76+
}
77+
});
78+
79+
const queryParams = new URLSearchParams(filteredParams).toString();
80+
81+
const resp = await axios.get(`https://${v1_base_url}/search?${queryParams}`, {
82+
headers: {
83+
Accept:
84+
"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",
85+
"Accept-Encoding": "gzip, deflate, br",
86+
"User-Agent": DEFAULT_HEADERS,
87+
},
88+
});
1989

2090
const $ = cheerio.load(resp.data);
2191
const elements = "#main-content .film_list-wrap .flw-item";
@@ -59,10 +129,11 @@ async function extractSearchResults(search, page) {
59129
.find(".film-poster .film-poster-img")
60130
?.attr("data-src")
61131
?.trim() || null,
62-
duration: $(el)
63-
.find(".film-detail .fd-infor .fdi-item.fdi-duration")
64-
?.text()
65-
?.trim(),
132+
duration:
133+
$(el)
134+
.find(".film-detail .fd-infor .fdi-item.fdi-duration")
135+
?.text()
136+
?.trim(),
66137
tvInfo: {
67138
showType:
68139
$(el)

0 commit comments

Comments
 (0)