node-csfd-api 5.2.2 → 5.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/export-ratings.mjs +1 -1
- package/bin/mcp-server.mjs +1 -1
- package/bin/server.mjs +1 -1
- package/fetchers/fetch.polyfill.js +1 -2
- package/fetchers/fetch.polyfill.js.map +1 -1
- package/fetchers/fetch.polyfill.mjs +1 -2
- package/fetchers/fetch.polyfill.mjs.map +1 -1
- package/fetchers/index.js +55 -12
- package/fetchers/index.js.map +1 -1
- package/fetchers/index.mjs +54 -11
- package/fetchers/index.mjs.map +1 -1
- package/helpers/cinema.helper.js +2 -3
- package/helpers/cinema.helper.js.map +1 -1
- package/helpers/cinema.helper.mjs +1 -2
- package/helpers/cinema.helper.mjs.map +1 -1
- package/helpers/creator.helper.js +2 -3
- package/helpers/creator.helper.js.map +1 -1
- package/helpers/creator.helper.mjs +1 -2
- package/helpers/creator.helper.mjs.map +1 -1
- package/helpers/global.helper.js +17 -18
- package/helpers/global.helper.js.map +1 -1
- package/helpers/global.helper.mjs +17 -17
- package/helpers/global.helper.mjs.map +1 -1
- package/helpers/movie.helper.js +5 -12
- package/helpers/movie.helper.js.map +1 -1
- package/helpers/movie.helper.mjs +4 -11
- package/helpers/movie.helper.mjs.map +1 -1
- package/helpers/search-creator.helper.js +2 -3
- package/helpers/search-creator.helper.js.map +1 -1
- package/helpers/search-creator.helper.mjs +1 -2
- package/helpers/search-creator.helper.mjs.map +1 -1
- package/helpers/search-user.helper.js +2 -3
- package/helpers/search-user.helper.js.map +1 -1
- package/helpers/search-user.helper.mjs +1 -2
- package/helpers/search-user.helper.mjs.map +1 -1
- package/helpers/search.helper.js +2 -3
- package/helpers/search.helper.js.map +1 -1
- package/helpers/search.helper.mjs +1 -2
- package/helpers/search.helper.mjs.map +1 -1
- package/helpers/user-ratings.helper.js +7 -7
- package/helpers/user-ratings.helper.js.map +1 -1
- package/helpers/user-ratings.helper.mjs +7 -7
- package/helpers/user-ratings.helper.mjs.map +1 -1
- package/helpers/user-reviews.helper.js +5 -6
- package/helpers/user-reviews.helper.js.map +1 -1
- package/helpers/user-reviews.helper.mjs +4 -5
- package/helpers/user-reviews.helper.mjs.map +1 -1
- package/index.js +9 -12
- package/index.js.map +1 -1
- package/index.mjs +2 -5
- package/index.mjs.map +1 -1
- package/package.json +1 -1
- package/package.mjs +1 -1
- package/services/cinema.service.js +4 -5
- package/services/cinema.service.js.map +1 -1
- package/services/cinema.service.mjs +1 -2
- package/services/cinema.service.mjs.map +1 -1
- package/services/creator.service.js +4 -5
- package/services/creator.service.js.map +1 -1
- package/services/creator.service.mjs +1 -2
- package/services/creator.service.mjs.map +1 -1
- package/services/movie.service.js +6 -11
- package/services/movie.service.js.map +1 -1
- package/services/movie.service.mjs +3 -8
- package/services/movie.service.mjs.map +1 -1
- package/services/search.service.js +7 -8
- package/services/search.service.js.map +1 -1
- package/services/search.service.mjs +1 -2
- package/services/search.service.mjs.map +1 -1
- package/services/user-ratings.service.js +5 -6
- package/services/user-ratings.service.js.map +1 -1
- package/services/user-ratings.service.mjs +1 -2
- package/services/user-ratings.service.mjs.map +1 -1
- package/services/user-reviews.service.js +5 -6
- package/services/user-reviews.service.js.map +1 -1
- package/services/user-reviews.service.mjs +1 -2
- package/services/user-reviews.service.mjs.map +1 -1
- package/src/fetchers/fetch.polyfill.mjs +8 -0
- package/src/fetchers/index.mjs +76 -0
- package/src/helpers/cinema.helper.mjs +80 -0
- package/src/helpers/creator.helper.mjs +69 -0
- package/src/helpers/global.helper.mjs +101 -0
- package/src/helpers/movie.helper.mjs +302 -0
- package/src/helpers/search-creator.helper.mjs +17 -0
- package/src/helpers/search-user.helper.mjs +24 -0
- package/src/helpers/search.helper.mjs +46 -0
- package/src/helpers/user-ratings.helper.mjs +35 -0
- package/src/helpers/user-reviews.helper.mjs +48 -0
- package/src/index.mjs +64 -0
- package/src/services/cinema.service.mjs +32 -0
- package/src/services/creator.service.mjs +33 -0
- package/src/services/movie.service.mjs +62 -0
- package/src/services/search.service.mjs +76 -0
- package/src/services/user-ratings.service.mjs +66 -0
- package/src/services/user-reviews.service.mjs +68 -0
- package/src/vars.mjs +22 -0
- package/vars.js +1 -2
- package/vars.js.map +1 -1
- package/vars.mjs +1 -1
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { fetchPage } from "../fetchers/index.mjs";
|
|
3
|
+
import { creatorUrl } from "../vars.mjs";
|
|
4
|
+
import { getCreatorBio, getCreatorBirthdayInfo, getCreatorFilms, getCreatorName, getCreatorPhoto } from "../helpers/creator.helper.mjs";
|
|
5
|
+
import { parse } from "node-html-parser";
|
|
6
|
+
|
|
7
|
+
//#region src/services/creator.service.ts
|
|
8
|
+
var CreatorScraper = class {
|
|
9
|
+
async creator(creatorId, options) {
|
|
10
|
+
const id = Number(creatorId);
|
|
11
|
+
if (isNaN(id)) throw new Error("node-csfd-api: creatorId must be a valid number");
|
|
12
|
+
const creatorHtml = parse(await fetchPage(creatorUrl(id, { language: options?.language }), { ...options?.request }));
|
|
13
|
+
const asideNode = creatorHtml.querySelector(".creator-about");
|
|
14
|
+
const filmsNode = creatorHtml.querySelector(".creator-filmography");
|
|
15
|
+
return this.buildCreator(+creatorId, asideNode, filmsNode);
|
|
16
|
+
}
|
|
17
|
+
buildCreator(id, asideEl, filmsNode) {
|
|
18
|
+
const birthdayInfo = getCreatorBirthdayInfo(asideEl);
|
|
19
|
+
return {
|
|
20
|
+
id,
|
|
21
|
+
name: getCreatorName(asideEl),
|
|
22
|
+
birthday: birthdayInfo?.birthday,
|
|
23
|
+
birthplace: birthdayInfo?.birthPlace,
|
|
24
|
+
photo: getCreatorPhoto(asideEl),
|
|
25
|
+
age: birthdayInfo?.age || null,
|
|
26
|
+
bio: getCreatorBio(asideEl),
|
|
27
|
+
films: getCreatorFilms(filmsNode)
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
//#endregion
|
|
33
|
+
export { CreatorScraper };
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { fetchPage } from "../fetchers/index.mjs";
|
|
3
|
+
import { movieUrl } from "../vars.mjs";
|
|
4
|
+
import { detectSeasonOrEpisodeListType, getEpisodeCode, getMovieBoxMovies, getMovieColorRating, getMovieCreators, getMovieDescriptions, getMovieDuration, getMovieGenres, getMovieOrigins, getMoviePoster, getMoviePremieres, getMovieRandomPhoto, getMovieRating, getMovieRatingCount, getMovieTags, getMovieTitle, getMovieTitlesOther, getMovieTrivia, getMovieType, getMovieVods, getMovieYear, getSeasonOrEpisodeParent, getSeasonsOrEpisodes, getSeriesAndSeasonTitle } from "../helpers/movie.helper.mjs";
|
|
5
|
+
import { parse } from "node-html-parser";
|
|
6
|
+
|
|
7
|
+
//#region src/services/movie.service.ts
|
|
8
|
+
var MovieScraper = class {
|
|
9
|
+
async movie(movieId, options) {
|
|
10
|
+
const id = Number(movieId);
|
|
11
|
+
if (isNaN(id)) throw new Error("node-csfd-api: movieId must be a valid number");
|
|
12
|
+
const movieHtml = parse(await fetchPage(movieUrl(id, { language: options?.language }), { ...options?.request }));
|
|
13
|
+
const pageClasses = movieHtml.querySelector(".page-content").classNames.split(" ");
|
|
14
|
+
const asideNode = movieHtml.querySelector(".aside-movie-profile");
|
|
15
|
+
const movieNode = movieHtml.querySelector(".main-movie-profile");
|
|
16
|
+
const jsonLdString = movieHtml.querySelector("script[type=\"application/ld+json\"]").innerText;
|
|
17
|
+
let jsonLd = null;
|
|
18
|
+
try {
|
|
19
|
+
jsonLd = JSON.parse(jsonLdString);
|
|
20
|
+
} catch (e) {
|
|
21
|
+
console.error("node-csfd-api: Error parsing JSON-LD", e);
|
|
22
|
+
}
|
|
23
|
+
return this.buildMovie(+movieId, movieNode, asideNode, pageClasses, jsonLd, options);
|
|
24
|
+
}
|
|
25
|
+
buildMovie(movieId, el, asideEl, pageClasses, jsonLd, options) {
|
|
26
|
+
const type = getMovieType(el);
|
|
27
|
+
const { seriesName = null, seasonName = null } = type === "season" ? getSeriesAndSeasonTitle(el) : {};
|
|
28
|
+
const seasonOrEpisodeListType = detectSeasonOrEpisodeListType(el);
|
|
29
|
+
return {
|
|
30
|
+
id: movieId,
|
|
31
|
+
title: type === "season" && seriesName ? seriesName : getMovieTitle(el),
|
|
32
|
+
year: getMovieYear(jsonLd),
|
|
33
|
+
duration: getMovieDuration(jsonLd, el),
|
|
34
|
+
descriptions: getMovieDescriptions(el),
|
|
35
|
+
genres: getMovieGenres(el),
|
|
36
|
+
type,
|
|
37
|
+
url: movieUrl(movieId, { language: options?.language }),
|
|
38
|
+
origins: getMovieOrigins(el),
|
|
39
|
+
colorRating: getMovieColorRating(pageClasses),
|
|
40
|
+
rating: getMovieRating(asideEl),
|
|
41
|
+
ratingCount: getMovieRatingCount(asideEl),
|
|
42
|
+
titlesOther: getMovieTitlesOther(el),
|
|
43
|
+
poster: getMoviePoster(el),
|
|
44
|
+
photo: getMovieRandomPhoto(el),
|
|
45
|
+
trivia: getMovieTrivia(el),
|
|
46
|
+
creators: getMovieCreators(el, options),
|
|
47
|
+
vod: getMovieVods(asideEl),
|
|
48
|
+
tags: getMovieTags(asideEl),
|
|
49
|
+
premieres: getMoviePremieres(asideEl),
|
|
50
|
+
related: getMovieBoxMovies(asideEl, "Související"),
|
|
51
|
+
similar: getMovieBoxMovies(asideEl, "Podobné"),
|
|
52
|
+
seasons: seasonOrEpisodeListType === "seasons" ? getSeasonsOrEpisodes(el) : null,
|
|
53
|
+
episodes: seasonOrEpisodeListType === "episodes" ? getSeasonsOrEpisodes(el) : null,
|
|
54
|
+
parent: type === "season" || type === "episode" ? getSeasonOrEpisodeParent(el) : null,
|
|
55
|
+
episodeCode: type === "episode" ? getEpisodeCode(el) : null,
|
|
56
|
+
seasonName
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
//#endregion
|
|
62
|
+
export { MovieScraper };
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { fetchPage } from "../fetchers/index.mjs";
|
|
3
|
+
import { getUrlByLanguage, searchUrl } from "../vars.mjs";
|
|
4
|
+
import { parseIdFromUrl } from "../helpers/global.helper.mjs";
|
|
5
|
+
import { getCreatorImage, getCreatorName, getCreatorUrl } from "../helpers/search-creator.helper.mjs";
|
|
6
|
+
import { getAvatar, getUser, getUserRealName, getUserUrl } from "../helpers/search-user.helper.mjs";
|
|
7
|
+
import { getSearchColorRating, getSearchOrigins, getSearchPoster, getSearchTitle, getSearchType, getSearchUrl, getSearchYear, parseSearchPeople } from "../helpers/search.helper.mjs";
|
|
8
|
+
import { parse } from "node-html-parser";
|
|
9
|
+
|
|
10
|
+
//#region src/services/search.service.ts
|
|
11
|
+
var SearchScraper = class {
|
|
12
|
+
async search(text, options) {
|
|
13
|
+
const html = parse(await fetchPage(searchUrl(text, { language: options?.language }), { ...options?.request }));
|
|
14
|
+
const moviesNode = html.querySelectorAll(".main-movies article");
|
|
15
|
+
const usersNode = html.querySelectorAll(".main-users article");
|
|
16
|
+
const tvSeriesNode = html.querySelectorAll(".main-series article");
|
|
17
|
+
const creatorsNode = html.querySelectorAll(".main-authors article");
|
|
18
|
+
return this.parseSearch(moviesNode, usersNode, tvSeriesNode, creatorsNode, options?.language);
|
|
19
|
+
}
|
|
20
|
+
parseSearch(moviesNode, usersNode, tvSeriesNode, creatorsNode, language) {
|
|
21
|
+
const baseUrl = getUrlByLanguage(language);
|
|
22
|
+
const movies = [];
|
|
23
|
+
const users = [];
|
|
24
|
+
const tvSeries = [];
|
|
25
|
+
const creators = [];
|
|
26
|
+
const movieMapper = (m) => {
|
|
27
|
+
const url = getSearchUrl(m);
|
|
28
|
+
return {
|
|
29
|
+
id: parseIdFromUrl(url),
|
|
30
|
+
title: getSearchTitle(m),
|
|
31
|
+
year: getSearchYear(m),
|
|
32
|
+
url: `${baseUrl}${url}`,
|
|
33
|
+
type: getSearchType(m),
|
|
34
|
+
colorRating: getSearchColorRating(m),
|
|
35
|
+
poster: getSearchPoster(m),
|
|
36
|
+
origins: getSearchOrigins(m),
|
|
37
|
+
creators: {
|
|
38
|
+
directors: parseSearchPeople(m, "directors"),
|
|
39
|
+
actors: parseSearchPeople(m, "actors")
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
};
|
|
43
|
+
const userMapper = (m) => {
|
|
44
|
+
const url = getUserUrl(m);
|
|
45
|
+
return {
|
|
46
|
+
id: parseIdFromUrl(url),
|
|
47
|
+
user: getUser(m),
|
|
48
|
+
userRealName: getUserRealName(m),
|
|
49
|
+
avatar: getAvatar(m),
|
|
50
|
+
url: `${baseUrl}${url}`
|
|
51
|
+
};
|
|
52
|
+
};
|
|
53
|
+
const creatorMapper = (m) => {
|
|
54
|
+
const url = getCreatorUrl(m);
|
|
55
|
+
return {
|
|
56
|
+
id: parseIdFromUrl(url),
|
|
57
|
+
name: getCreatorName(m),
|
|
58
|
+
image: getCreatorImage(m),
|
|
59
|
+
url: `${baseUrl}${url}`
|
|
60
|
+
};
|
|
61
|
+
};
|
|
62
|
+
movies.push(...moviesNode.map(movieMapper));
|
|
63
|
+
users.push(...usersNode.map(userMapper));
|
|
64
|
+
tvSeries.push(...tvSeriesNode.map(movieMapper));
|
|
65
|
+
creators.push(...creatorsNode.map(creatorMapper));
|
|
66
|
+
return {
|
|
67
|
+
movies,
|
|
68
|
+
users,
|
|
69
|
+
tvSeries,
|
|
70
|
+
creators
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
//#endregion
|
|
76
|
+
export { SearchScraper };
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { fetchPage } from "../fetchers/index.mjs";
|
|
3
|
+
import { userRatingsUrl } from "../vars.mjs";
|
|
4
|
+
import { sleep } from "../helpers/global.helper.mjs";
|
|
5
|
+
import { getUserRating, getUserRatingColorRating, getUserRatingDate, getUserRatingId, getUserRatingTitle, getUserRatingType, getUserRatingUrl, getUserRatingYear } from "../helpers/user-ratings.helper.mjs";
|
|
6
|
+
import { parse } from "node-html-parser";
|
|
7
|
+
|
|
8
|
+
//#region src/services/user-ratings.service.ts
|
|
9
|
+
var UserRatingsScraper = class {
|
|
10
|
+
async userRatings(user, config, options) {
|
|
11
|
+
let allMovies = [];
|
|
12
|
+
const pageToFetch = config?.page || 1;
|
|
13
|
+
const url = userRatingsUrl(user, pageToFetch > 1 ? pageToFetch : void 0, { language: options?.language });
|
|
14
|
+
const items = parse(await fetchPage(url, { ...options?.request }));
|
|
15
|
+
const movies = items.querySelectorAll("#snippet--ratings table tr");
|
|
16
|
+
const pagesNode = items.querySelector(".pagination");
|
|
17
|
+
const pages = +pagesNode?.childNodes[pagesNode.childNodes.length - 4].rawText || 1;
|
|
18
|
+
allMovies = this.getPage(config, movies);
|
|
19
|
+
if (config?.allPages) {
|
|
20
|
+
console.log("User", user, url);
|
|
21
|
+
console.log("Fetching all pages", pages);
|
|
22
|
+
for (let i = 2; i <= pages; i++) {
|
|
23
|
+
console.log("Fetching page", i, "out of", pages, "...");
|
|
24
|
+
const movies = parse(await fetchPage(userRatingsUrl(user, i, { language: options?.language }), { ...options?.request })).querySelectorAll("#snippet--ratings table tr");
|
|
25
|
+
allMovies = [...allMovies, ...this.getPage(config, movies)];
|
|
26
|
+
if (config.allPagesDelay) await sleep(config.allPagesDelay);
|
|
27
|
+
}
|
|
28
|
+
return allMovies;
|
|
29
|
+
}
|
|
30
|
+
return allMovies;
|
|
31
|
+
}
|
|
32
|
+
getPage(config, movies) {
|
|
33
|
+
const films = [];
|
|
34
|
+
if (config) {
|
|
35
|
+
if (config.includesOnly?.length && config.excludes?.length) console.warn(`node-csfd-api:
|
|
36
|
+
You can not use both parameters 'includesOnly' and 'excludes'.
|
|
37
|
+
Parameter 'includesOnly' will be used now:`, config.includesOnly);
|
|
38
|
+
}
|
|
39
|
+
const includesSet = config?.includesOnly?.length ? new Set(config.includesOnly) : null;
|
|
40
|
+
const excludesSet = config?.excludes?.length ? new Set(config.excludes) : null;
|
|
41
|
+
for (const el of movies) {
|
|
42
|
+
const type = getUserRatingType(el);
|
|
43
|
+
if (includesSet) {
|
|
44
|
+
if (includesSet.has(type)) films.push(this.buildUserRatings(el, type));
|
|
45
|
+
} else if (excludesSet) {
|
|
46
|
+
if (!excludesSet.has(type)) films.push(this.buildUserRatings(el, type));
|
|
47
|
+
} else films.push(this.buildUserRatings(el, type));
|
|
48
|
+
}
|
|
49
|
+
return films;
|
|
50
|
+
}
|
|
51
|
+
buildUserRatings(el, type) {
|
|
52
|
+
return {
|
|
53
|
+
id: getUserRatingId(el),
|
|
54
|
+
title: getUserRatingTitle(el),
|
|
55
|
+
year: getUserRatingYear(el),
|
|
56
|
+
type,
|
|
57
|
+
url: getUserRatingUrl(el),
|
|
58
|
+
colorRating: getUserRatingColorRating(el),
|
|
59
|
+
userDate: getUserRatingDate(el),
|
|
60
|
+
userRating: getUserRating(el)
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
//#endregion
|
|
66
|
+
export { UserRatingsScraper };
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { fetchPage } from "../fetchers/index.mjs";
|
|
3
|
+
import { userReviewsUrl } from "../vars.mjs";
|
|
4
|
+
import { sleep } from "../helpers/global.helper.mjs";
|
|
5
|
+
import { getUserReviewColorRating, getUserReviewDate, getUserReviewId, getUserReviewPoster, getUserReviewRating, getUserReviewText, getUserReviewTitle, getUserReviewType, getUserReviewUrl, getUserReviewYear } from "../helpers/user-reviews.helper.mjs";
|
|
6
|
+
import { parse } from "node-html-parser";
|
|
7
|
+
|
|
8
|
+
//#region src/services/user-reviews.service.ts
|
|
9
|
+
var UserReviewsScraper = class {
|
|
10
|
+
async userReviews(user, config, options) {
|
|
11
|
+
let allReviews = [];
|
|
12
|
+
const pageToFetch = config?.page || 1;
|
|
13
|
+
const url = userReviewsUrl(user, pageToFetch > 1 ? pageToFetch : void 0, { language: options?.language });
|
|
14
|
+
const items = parse(await fetchPage(url, { ...options?.request }));
|
|
15
|
+
const reviews = items.querySelectorAll(".user-tab-reviews .article");
|
|
16
|
+
const pagesNode = items.querySelector(".pagination");
|
|
17
|
+
const pages = +pagesNode?.childNodes[pagesNode.childNodes.length - 4].rawText || 1;
|
|
18
|
+
allReviews = this.getPage(config, reviews);
|
|
19
|
+
if (config?.allPages) {
|
|
20
|
+
console.log("User", user, url);
|
|
21
|
+
console.log("Fetching all pages", pages);
|
|
22
|
+
for (let i = 2; i <= pages; i++) {
|
|
23
|
+
console.log("Fetching page", i, "out of", pages, "...");
|
|
24
|
+
const reviews = parse(await fetchPage(userReviewsUrl(user, i, { language: options?.language }), { ...options?.request })).querySelectorAll(".user-tab-reviews .article");
|
|
25
|
+
allReviews = [...allReviews, ...this.getPage(config, reviews)];
|
|
26
|
+
if (config.allPagesDelay) await sleep(config.allPagesDelay);
|
|
27
|
+
}
|
|
28
|
+
return allReviews;
|
|
29
|
+
}
|
|
30
|
+
return allReviews;
|
|
31
|
+
}
|
|
32
|
+
getPage(config, reviews) {
|
|
33
|
+
const films = [];
|
|
34
|
+
if (config) {
|
|
35
|
+
if (config.includesOnly?.length && config.excludes?.length) console.warn(`node-csfd-api:
|
|
36
|
+
You can not use both parameters 'includesOnly' and 'excludes'.
|
|
37
|
+
Parameter 'includesOnly' will be used now:`, config.includesOnly);
|
|
38
|
+
}
|
|
39
|
+
const includesSet = config?.includesOnly?.length ? new Set(config.includesOnly) : null;
|
|
40
|
+
const excludesSet = config?.excludes?.length ? new Set(config.excludes) : null;
|
|
41
|
+
for (const el of reviews) {
|
|
42
|
+
const type = getUserReviewType(el);
|
|
43
|
+
if (includesSet) {
|
|
44
|
+
if (includesSet.has(type)) films.push(this.buildUserReviews(el, type));
|
|
45
|
+
} else if (excludesSet) {
|
|
46
|
+
if (!excludesSet.has(type)) films.push(this.buildUserReviews(el, type));
|
|
47
|
+
} else films.push(this.buildUserReviews(el, type));
|
|
48
|
+
}
|
|
49
|
+
return films;
|
|
50
|
+
}
|
|
51
|
+
buildUserReviews(el, type) {
|
|
52
|
+
return {
|
|
53
|
+
id: getUserReviewId(el),
|
|
54
|
+
title: getUserReviewTitle(el),
|
|
55
|
+
year: getUserReviewYear(el),
|
|
56
|
+
type,
|
|
57
|
+
url: getUserReviewUrl(el),
|
|
58
|
+
colorRating: getUserReviewColorRating(el),
|
|
59
|
+
userDate: getUserReviewDate(el),
|
|
60
|
+
userRating: getUserReviewRating(el),
|
|
61
|
+
text: getUserReviewText(el),
|
|
62
|
+
poster: getUserReviewPoster(el)
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
//#endregion
|
|
68
|
+
export { UserReviewsScraper };
|
package/src/vars.mjs
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
//#region src/vars.ts
|
|
3
|
+
const LANGUAGE_DOMAIN_MAP = {
|
|
4
|
+
cs: "https://www.csfd.cz",
|
|
5
|
+
en: "https://www.csfd.cz/en",
|
|
6
|
+
sk: "https://www.csfd.cz/sk"
|
|
7
|
+
};
|
|
8
|
+
let BASE_URL = LANGUAGE_DOMAIN_MAP.cs;
|
|
9
|
+
const getUrlByLanguage = (language) => {
|
|
10
|
+
if (language && language in LANGUAGE_DOMAIN_MAP) return LANGUAGE_DOMAIN_MAP[language];
|
|
11
|
+
return BASE_URL;
|
|
12
|
+
};
|
|
13
|
+
const userUrl = (user, options) => `${getUrlByLanguage(options?.language)}/uzivatel/${encodeURIComponent(user)}`;
|
|
14
|
+
const userRatingsUrl = (user, page, options = {}) => `${userUrl(user, options)}/hodnoceni/${page ? "?page=" + page : ""}`;
|
|
15
|
+
const userReviewsUrl = (user, page, options = {}) => `${userUrl(user, options)}/recenze/${page ? "?page=" + page : ""}`;
|
|
16
|
+
const movieUrl = (movie, options) => `${getUrlByLanguage(options?.language)}/film/${encodeURIComponent(movie)}/prehled/`;
|
|
17
|
+
const creatorUrl = (creator, options) => `${getUrlByLanguage(options?.language)}/tvurce/${encodeURIComponent(creator)}`;
|
|
18
|
+
const cinemasUrl = (district, period, options) => `${getUrlByLanguage(options?.language)}/kino/?period=${period}&district=${district}`;
|
|
19
|
+
const searchUrl = (text, options) => `${getUrlByLanguage(options?.language)}/hledat/?q=${encodeURIComponent(text)}`;
|
|
20
|
+
|
|
21
|
+
//#endregion
|
|
22
|
+
export { cinemasUrl, creatorUrl, getUrlByLanguage, movieUrl, searchUrl, userRatingsUrl, userReviewsUrl };
|
package/vars.js
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
|
|
2
1
|
//#region src/vars.ts
|
|
3
2
|
const LANGUAGE_DOMAIN_MAP = {
|
|
4
3
|
cs: "https://www.csfd.cz",
|
|
@@ -17,7 +16,6 @@ const movieUrl = (movie, options) => `${getUrlByLanguage(options?.language)}/fil
|
|
|
17
16
|
const creatorUrl = (creator, options) => `${getUrlByLanguage(options?.language)}/tvurce/${encodeURIComponent(creator)}`;
|
|
18
17
|
const cinemasUrl = (district, period, options) => `${getUrlByLanguage(options?.language)}/kino/?period=${period}&district=${district}`;
|
|
19
18
|
const searchUrl = (text, options) => `${getUrlByLanguage(options?.language)}/hledat/?q=${encodeURIComponent(text)}`;
|
|
20
|
-
|
|
21
19
|
//#endregion
|
|
22
20
|
exports.cinemasUrl = cinemasUrl;
|
|
23
21
|
exports.creatorUrl = creatorUrl;
|
|
@@ -26,4 +24,5 @@ exports.movieUrl = movieUrl;
|
|
|
26
24
|
exports.searchUrl = searchUrl;
|
|
27
25
|
exports.userRatingsUrl = userRatingsUrl;
|
|
28
26
|
exports.userReviewsUrl = userReviewsUrl;
|
|
27
|
+
|
|
29
28
|
//# sourceMappingURL=vars.js.map
|
package/vars.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vars.js","names":[],"sources":["../src/vars.ts"],"sourcesContent":["import { CSFDCinemaPeriod } from './dto/cinema';\nimport { CSFDLanguage } from './types';\n\ntype Options = {\n language?: CSFDLanguage;\n};\n\n// Language to domain mapping\nconst LANGUAGE_DOMAIN_MAP: Record<CSFDLanguage, string> = {\n cs: 'https://www.csfd.cz',\n en: 'https://www.csfd.cz/en',\n sk: 'https://www.csfd.cz/sk',\n};\n\nlet BASE_URL = LANGUAGE_DOMAIN_MAP.cs;\n\nexport const getBaseUrl = (): string => BASE_URL;\nexport const setBaseUrl = (language: CSFDLanguage): void => {\n BASE_URL = getUrlByLanguage(language);\n};\n\nexport const getUrlByLanguage = (language?: CSFDLanguage): string => {\n if (language && language in LANGUAGE_DOMAIN_MAP) {\n return LANGUAGE_DOMAIN_MAP[language];\n }\n return BASE_URL;\n};\n\n// User URLs\nexport const userUrl = (user: string | number, options: Options): string =>\n `${getUrlByLanguage(options?.language)}/uzivatel/${encodeURIComponent(user)}`;\n\nexport const userRatingsUrl = (user: string | number, page?: number, options: Options = {}): string =>\n `${userUrl(user, options)}/hodnoceni/${page ? '?page=' + page : ''}`;\nexport const userReviewsUrl = (user: string | number, page?: number, options: Options = {}): string =>\n `${userUrl(user, options)}/recenze/${page ? '?page=' + page : ''}`;\n\n// Movie URLs\nexport const movieUrl = (movie: number, options: Options): string =>\n `${getUrlByLanguage(options?.language)}/film/${encodeURIComponent(movie)}/prehled/`;\n// Creator URLs\nexport const creatorUrl = (creator: number | string, options: Options): string =>\n `${getUrlByLanguage(options?.language)}/tvurce/${encodeURIComponent(creator)}`;\n\n// Cinema URLs\nexport const cinemasUrl = (district: number | string, period: CSFDCinemaPeriod, options: Options): string =>\n `${getUrlByLanguage(options?.language)}/kino/?period=${period}&district=${district}`;\n\n// Search URLs\nexport const searchUrl = (text: string, options: Options): string =>\n `${getUrlByLanguage(options?.language)}/hledat/?q=${encodeURIComponent(text)}`;"],"mappings":"
|
|
1
|
+
{"version":3,"file":"vars.js","names":[],"sources":["../src/vars.ts"],"sourcesContent":["import { CSFDCinemaPeriod } from './dto/cinema';\nimport { CSFDLanguage } from './types';\n\ntype Options = {\n language?: CSFDLanguage;\n};\n\n// Language to domain mapping\nconst LANGUAGE_DOMAIN_MAP: Record<CSFDLanguage, string> = {\n cs: 'https://www.csfd.cz',\n en: 'https://www.csfd.cz/en',\n sk: 'https://www.csfd.cz/sk',\n};\n\nlet BASE_URL = LANGUAGE_DOMAIN_MAP.cs;\n\nexport const getBaseUrl = (): string => BASE_URL;\nexport const setBaseUrl = (language: CSFDLanguage): void => {\n BASE_URL = getUrlByLanguage(language);\n};\n\nexport const getUrlByLanguage = (language?: CSFDLanguage): string => {\n if (language && language in LANGUAGE_DOMAIN_MAP) {\n return LANGUAGE_DOMAIN_MAP[language];\n }\n return BASE_URL;\n};\n\n// User URLs\nexport const userUrl = (user: string | number, options: Options): string =>\n `${getUrlByLanguage(options?.language)}/uzivatel/${encodeURIComponent(user)}`;\n\nexport const userRatingsUrl = (user: string | number, page?: number, options: Options = {}): string =>\n `${userUrl(user, options)}/hodnoceni/${page ? '?page=' + page : ''}`;\nexport const userReviewsUrl = (user: string | number, page?: number, options: Options = {}): string =>\n `${userUrl(user, options)}/recenze/${page ? '?page=' + page : ''}`;\n\n// Movie URLs\nexport const movieUrl = (movie: number, options: Options): string =>\n `${getUrlByLanguage(options?.language)}/film/${encodeURIComponent(movie)}/prehled/`;\n// Creator URLs\nexport const creatorUrl = (creator: number | string, options: Options): string =>\n `${getUrlByLanguage(options?.language)}/tvurce/${encodeURIComponent(creator)}`;\n\n// Cinema URLs\nexport const cinemasUrl = (district: number | string, period: CSFDCinemaPeriod, options: Options): string =>\n `${getUrlByLanguage(options?.language)}/kino/?period=${period}&district=${district}`;\n\n// Search URLs\nexport const searchUrl = (text: string, options: Options): string =>\n `${getUrlByLanguage(options?.language)}/hledat/?q=${encodeURIComponent(text)}`;"],"mappings":";AAQA,MAAM,sBAAoD;CACxD,IAAI;CACJ,IAAI;CACJ,IAAI;CACL;AAED,IAAI,WAAW,oBAAoB;AAOnC,MAAa,oBAAoB,aAAoC;AACnE,KAAI,YAAY,YAAY,oBAC1B,QAAO,oBAAoB;AAE7B,QAAO;;AAIT,MAAa,WAAW,MAAuB,YAC7C,GAAG,iBAAiB,SAAS,SAAS,CAAC,YAAY,mBAAmB,KAAK;AAE7E,MAAa,kBAAkB,MAAuB,MAAe,UAAmB,EAAE,KACxF,GAAG,QAAQ,MAAM,QAAQ,CAAC,aAAa,OAAO,WAAW,OAAO;AAClE,MAAa,kBAAkB,MAAuB,MAAe,UAAmB,EAAE,KACxF,GAAG,QAAQ,MAAM,QAAQ,CAAC,WAAW,OAAO,WAAW,OAAO;AAGhE,MAAa,YAAY,OAAe,YACtC,GAAG,iBAAiB,SAAS,SAAS,CAAC,QAAQ,mBAAmB,MAAM,CAAC;AAE3E,MAAa,cAAc,SAA0B,YACnD,GAAG,iBAAiB,SAAS,SAAS,CAAC,UAAU,mBAAmB,QAAQ;AAG9E,MAAa,cAAc,UAA2B,QAA0B,YAC9E,GAAG,iBAAiB,SAAS,SAAS,CAAC,gBAAgB,OAAO,YAAY;AAG5E,MAAa,aAAa,MAAc,YACtC,GAAG,iBAAiB,SAAS,SAAS,CAAC,aAAa,mBAAmB,KAAK"}
|
package/vars.mjs
CHANGED
|
@@ -16,7 +16,7 @@ const movieUrl = (movie, options) => `${getUrlByLanguage(options?.language)}/fil
|
|
|
16
16
|
const creatorUrl = (creator, options) => `${getUrlByLanguage(options?.language)}/tvurce/${encodeURIComponent(creator)}`;
|
|
17
17
|
const cinemasUrl = (district, period, options) => `${getUrlByLanguage(options?.language)}/kino/?period=${period}&district=${district}`;
|
|
18
18
|
const searchUrl = (text, options) => `${getUrlByLanguage(options?.language)}/hledat/?q=${encodeURIComponent(text)}`;
|
|
19
|
-
|
|
20
19
|
//#endregion
|
|
21
20
|
export { cinemasUrl, creatorUrl, getUrlByLanguage, movieUrl, searchUrl, userRatingsUrl, userReviewsUrl };
|
|
21
|
+
|
|
22
22
|
//# sourceMappingURL=vars.mjs.map
|