node-csfd-api 5.3.0 → 5.5.0-next.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 → export-ratings.js} +1 -1
- package/bin/{mcp-server.mjs → mcp-server.js} +2 -2
- package/bin/{server.mjs → server.js} +2 -2
- package/{cli.mjs → cli.js} +3 -3
- package/dto/{cinema.d.mts → cinema.d.cts} +2 -2
- package/dto/{creator.d.mts → creator.d.cts} +2 -2
- package/dto/{global.d.mts → global.d.cts} +1 -1
- package/dto/{movie.d.mts → movie.d.cts} +2 -2
- package/dto/{options.d.mts → options.d.cts} +1 -1
- package/dto/{search.d.mts → search.d.cts} +3 -3
- package/dto/{user-ratings.d.mts → user-ratings.d.cts} +2 -2
- package/dto/{user-reviews.d.mts → user-reviews.d.cts} +2 -2
- package/fetchers/{fetch.polyfill.mjs → fetch.polyfill.cjs} +3 -4
- package/fetchers/fetch.polyfill.cjs.map +1 -0
- package/fetchers/fetch.polyfill.js +2 -3
- package/fetchers/fetch.polyfill.js.map +1 -1
- package/fetchers/index.cjs +75 -0
- package/fetchers/index.cjs.map +1 -0
- package/fetchers/index.js +56 -12
- package/fetchers/index.js.map +1 -1
- package/helpers/cinema.helper.cjs +83 -0
- package/helpers/cinema.helper.cjs.map +1 -0
- package/helpers/cinema.helper.js +4 -8
- package/helpers/cinema.helper.js.map +1 -1
- package/helpers/creator.helper.cjs +72 -0
- package/helpers/creator.helper.cjs.map +1 -0
- package/helpers/creator.helper.js +6 -10
- package/helpers/creator.helper.js.map +1 -1
- package/helpers/global.helper.cjs +109 -0
- package/helpers/{global.helper.mjs.map → global.helper.cjs.map} +1 -1
- package/helpers/global.helper.js +1 -9
- package/helpers/movie.helper.cjs +324 -0
- package/helpers/movie.helper.cjs.map +1 -0
- package/helpers/movie.helper.js +12 -35
- package/helpers/movie.helper.js.map +1 -1
- package/helpers/search-creator.helper.cjs +18 -0
- package/helpers/search-creator.helper.cjs.map +1 -0
- package/helpers/search-creator.helper.js +3 -5
- package/helpers/search-creator.helper.js.map +1 -1
- package/helpers/search-user.helper.cjs +26 -0
- package/helpers/search-user.helper.cjs.map +1 -0
- package/helpers/search-user.helper.js +5 -8
- package/helpers/search-user.helper.js.map +1 -1
- package/helpers/search.helper.cjs +52 -0
- package/helpers/search.helper.cjs.map +1 -0
- package/helpers/search.helper.js +6 -13
- package/helpers/search.helper.js.map +1 -1
- package/helpers/user-ratings.helper.cjs +41 -0
- package/helpers/user-ratings.helper.cjs.map +1 -0
- package/helpers/user-ratings.helper.js +6 -13
- package/helpers/user-ratings.helper.js.map +1 -1
- package/helpers/user-reviews.helper.cjs +56 -0
- package/helpers/user-reviews.helper.cjs.map +1 -0
- package/helpers/user-reviews.helper.js +6 -15
- package/helpers/user-reviews.helper.js.map +1 -1
- package/index.cjs +64 -0
- package/index.cjs.map +1 -0
- package/{index.d.mts → index.d.cts} +15 -15
- package/index.js +13 -14
- package/index.js.map +1 -1
- package/{package.mjs → package.js} +1 -1
- package/package.json +13 -7
- package/services/cinema.service.cjs +31 -0
- package/services/cinema.service.cjs.map +1 -0
- package/services/{cinema.service.d.mts → cinema.service.d.cts} +3 -3
- package/services/cinema.service.js +11 -11
- package/services/cinema.service.js.map +1 -1
- package/services/creator.service.cjs +32 -0
- package/services/creator.service.cjs.map +1 -0
- package/services/{creator.service.d.mts → creator.service.d.cts} +3 -3
- package/services/creator.service.js +11 -11
- package/services/creator.service.js.map +1 -1
- package/services/movie.service.cjs +61 -0
- package/services/movie.service.cjs.map +1 -0
- package/services/{movie.service.d.mts → movie.service.d.cts} +3 -3
- package/services/movie.service.js +33 -33
- package/services/movie.service.js.map +1 -1
- package/services/search.service.cjs +75 -0
- package/services/search.service.cjs.map +1 -0
- package/services/{search.service.d.mts → search.service.d.cts} +3 -3
- package/services/search.service.js +29 -29
- package/services/search.service.js.map +1 -1
- package/services/user-ratings.service.cjs +65 -0
- package/services/user-ratings.service.cjs.map +1 -0
- package/services/{user-ratings.service.d.mts → user-ratings.service.d.cts} +3 -3
- package/services/user-ratings.service.js +18 -18
- package/services/user-ratings.service.js.map +1 -1
- package/services/user-reviews.service.cjs +67 -0
- package/services/user-reviews.service.cjs.map +1 -0
- package/services/{user-reviews.service.d.mts → user-reviews.service.d.cts} +3 -3
- package/services/user-reviews.service.js +20 -20
- package/services/user-reviews.service.js.map +1 -1
- package/src/fetchers/fetch.polyfill.js +6 -0
- package/src/fetchers/index.js +76 -0
- package/{helpers/cinema.helper.mjs → src/helpers/cinema.helper.js} +5 -4
- package/{helpers/creator.helper.mjs → src/helpers/creator.helper.js} +5 -4
- package/{helpers/global.helper.mjs → src/helpers/global.helper.js} +3 -3
- package/{helpers/movie.helper.mjs → src/helpers/movie.helper.js} +5 -4
- package/{helpers/search-creator.helper.mjs → src/helpers/search-creator.helper.js} +5 -4
- package/{helpers/search-user.helper.mjs → src/helpers/search-user.helper.js} +5 -4
- package/{helpers/search.helper.mjs → src/helpers/search.helper.js} +5 -4
- package/{helpers/user-ratings.helper.mjs → src/helpers/user-ratings.helper.js} +5 -4
- package/{helpers/user-reviews.helper.mjs → src/helpers/user-reviews.helper.js} +5 -4
- package/{index.mjs → src/index.js} +14 -10
- package/{services/cinema.service.mjs → src/services/cinema.service.js} +7 -6
- package/{services/creator.service.mjs → src/services/creator.service.js} +7 -6
- package/{services/movie.service.mjs → src/services/movie.service.js} +7 -6
- package/{services/search.service.mjs → src/services/search.service.js} +10 -9
- package/{services/user-ratings.service.mjs → src/services/user-ratings.service.js} +8 -7
- package/{services/user-reviews.service.mjs → src/services/user-reviews.service.js} +8 -7
- package/{vars.mjs → src/vars.js} +3 -3
- package/vars.cjs +28 -0
- package/{vars.mjs.map → vars.cjs.map} +1 -1
- package/vars.js +1 -7
- package/fetchers/fetch.polyfill.mjs.map +0 -1
- package/fetchers/index.mjs +0 -31
- package/fetchers/index.mjs.map +0 -1
- package/helpers/cinema.helper.mjs.map +0 -1
- package/helpers/creator.helper.mjs.map +0 -1
- package/helpers/movie.helper.mjs.map +0 -1
- package/helpers/search-creator.helper.mjs.map +0 -1
- package/helpers/search-user.helper.mjs.map +0 -1
- package/helpers/search.helper.mjs.map +0 -1
- package/helpers/user-ratings.helper.mjs.map +0 -1
- package/helpers/user-reviews.helper.mjs.map +0 -1
- package/index.mjs.map +0 -1
- package/services/cinema.service.mjs.map +0 -1
- package/services/creator.service.mjs.map +0 -1
- package/services/movie.service.mjs.map +0 -1
- package/services/search.service.mjs.map +0 -1
- package/services/user-ratings.service.mjs.map +0 -1
- package/services/user-reviews.service.mjs.map +0 -1
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
const require_index = require("../fetchers/index.cjs");
|
|
2
|
+
const require_vars = require("../vars.cjs");
|
|
3
|
+
const require_movie_helper = require("../helpers/movie.helper.cjs");
|
|
4
|
+
let node_html_parser = require("node-html-parser");
|
|
5
|
+
//#region src/services/movie.service.ts
|
|
6
|
+
var MovieScraper = class {
|
|
7
|
+
async movie(movieId, options) {
|
|
8
|
+
const id = Number(movieId);
|
|
9
|
+
if (isNaN(id)) throw new Error("node-csfd-api: movieId must be a valid number");
|
|
10
|
+
const movieHtml = (0, node_html_parser.parse)(await require_index.fetchPage(require_vars.movieUrl(id, { language: options?.language }), { ...options?.request }));
|
|
11
|
+
const pageClasses = movieHtml.querySelector(".page-content").classNames.split(" ");
|
|
12
|
+
const asideNode = movieHtml.querySelector(".aside-movie-profile");
|
|
13
|
+
const movieNode = movieHtml.querySelector(".main-movie-profile");
|
|
14
|
+
const jsonLdString = movieHtml.querySelector("script[type=\"application/ld+json\"]").innerText;
|
|
15
|
+
let jsonLd = null;
|
|
16
|
+
try {
|
|
17
|
+
jsonLd = JSON.parse(jsonLdString);
|
|
18
|
+
} catch (e) {
|
|
19
|
+
console.error("node-csfd-api: Error parsing JSON-LD", e);
|
|
20
|
+
}
|
|
21
|
+
return this.buildMovie(+movieId, movieNode, asideNode, pageClasses, jsonLd, options);
|
|
22
|
+
}
|
|
23
|
+
buildMovie(movieId, el, asideEl, pageClasses, jsonLd, options) {
|
|
24
|
+
const type = require_movie_helper.getMovieType(el);
|
|
25
|
+
const { seriesName = null, seasonName = null } = type === "season" ? require_movie_helper.getSeriesAndSeasonTitle(el) : {};
|
|
26
|
+
const seasonOrEpisodeListType = require_movie_helper.detectSeasonOrEpisodeListType(el);
|
|
27
|
+
return {
|
|
28
|
+
id: movieId,
|
|
29
|
+
title: type === "season" && seriesName ? seriesName : require_movie_helper.getMovieTitle(el),
|
|
30
|
+
year: require_movie_helper.getMovieYear(jsonLd),
|
|
31
|
+
duration: require_movie_helper.getMovieDuration(jsonLd, el),
|
|
32
|
+
descriptions: require_movie_helper.getMovieDescriptions(el),
|
|
33
|
+
genres: require_movie_helper.getMovieGenres(el),
|
|
34
|
+
type,
|
|
35
|
+
url: require_vars.movieUrl(movieId, { language: options?.language }),
|
|
36
|
+
origins: require_movie_helper.getMovieOrigins(el),
|
|
37
|
+
colorRating: require_movie_helper.getMovieColorRating(pageClasses),
|
|
38
|
+
rating: require_movie_helper.getMovieRating(asideEl),
|
|
39
|
+
ratingCount: require_movie_helper.getMovieRatingCount(asideEl),
|
|
40
|
+
titlesOther: require_movie_helper.getMovieTitlesOther(el),
|
|
41
|
+
poster: require_movie_helper.getMoviePoster(el),
|
|
42
|
+
photo: require_movie_helper.getMovieRandomPhoto(el),
|
|
43
|
+
trivia: require_movie_helper.getMovieTrivia(el),
|
|
44
|
+
creators: require_movie_helper.getMovieCreators(el, options),
|
|
45
|
+
vod: require_movie_helper.getMovieVods(asideEl),
|
|
46
|
+
tags: require_movie_helper.getMovieTags(asideEl),
|
|
47
|
+
premieres: require_movie_helper.getMoviePremieres(asideEl),
|
|
48
|
+
related: require_movie_helper.getMovieBoxMovies(asideEl, "Související"),
|
|
49
|
+
similar: require_movie_helper.getMovieBoxMovies(asideEl, "Podobné"),
|
|
50
|
+
seasons: seasonOrEpisodeListType === "seasons" ? require_movie_helper.getSeasonsOrEpisodes(el) : null,
|
|
51
|
+
episodes: seasonOrEpisodeListType === "episodes" ? require_movie_helper.getSeasonsOrEpisodes(el) : null,
|
|
52
|
+
parent: type === "season" || type === "episode" ? require_movie_helper.getSeasonOrEpisodeParent(el) : null,
|
|
53
|
+
episodeCode: type === "episode" ? require_movie_helper.getEpisodeCode(el) : null,
|
|
54
|
+
seasonName
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
//#endregion
|
|
59
|
+
exports.MovieScraper = MovieScraper;
|
|
60
|
+
|
|
61
|
+
//# sourceMappingURL=movie.service.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"movie.service.cjs","names":["fetchPage","movieUrl","getMovieType","getSeriesAndSeasonTitle","detectSeasonOrEpisodeListType","getMovieTitle","getMovieYear","getMovieDuration","getMovieDescriptions","getMovieGenres","getMovieOrigins","getMovieColorRating","getMovieRating","getMovieRatingCount","getMovieTitlesOther","getMoviePoster","getMovieRandomPhoto","getMovieTrivia","getMovieCreators","getMovieVods","getMovieTags","getMoviePremieres","getMovieBoxMovies","getSeasonsOrEpisodes","getSeasonOrEpisodeParent","getEpisodeCode"],"sources":["../../src/services/movie.service.ts"],"sourcesContent":["import { HTMLElement, parse } from 'node-html-parser';\nimport { CSFDFilmTypes } from '../dto/global';\nimport { CSFDMovie, MovieJsonLd } from '../dto/movie';\nimport { fetchPage } from '../fetchers';\nimport {\n detectSeasonOrEpisodeListType,\n getEpisodeCode,\n getMovieBoxMovies,\n getMovieColorRating,\n getMovieCreators,\n getMovieDescriptions,\n getMovieDuration,\n getMovieGenres,\n getMovieOrigins,\n getMoviePoster,\n getMoviePremieres,\n getMovieRandomPhoto,\n getMovieRating,\n getMovieRatingCount,\n getMovieTags,\n getMovieTitle,\n getMovieTitlesOther,\n getMovieTrivia,\n getMovieType,\n getMovieVods,\n getMovieYear,\n getSeasonOrEpisodeParent,\n getSeasonsOrEpisodes,\n getSeriesAndSeasonTitle\n} from '../helpers/movie.helper';\nimport { CSFDOptions } from '../types';\nimport { movieUrl } from '../vars';\n\nexport class MovieScraper {\n public async movie(movieId: number, options?: CSFDOptions): Promise<CSFDMovie> {\n const id = Number(movieId);\n if (isNaN(id)) {\n throw new Error('node-csfd-api: movieId must be a valid number');\n }\n const url = movieUrl(id, { language: options?.language });\n const response = await fetchPage(url, { ...options?.request });\n\n const movieHtml = parse(response);\n\n const pageClasses = movieHtml.querySelector('.page-content').classNames.split(' ');\n const asideNode = movieHtml.querySelector('.aside-movie-profile');\n const movieNode = movieHtml.querySelector('.main-movie-profile');\n const jsonLdString = movieHtml.querySelector('script[type=\"application/ld+json\"]').innerText;\n let jsonLd: MovieJsonLd | null = null;\n try {\n jsonLd = JSON.parse(jsonLdString);\n } catch (e) {\n console.error('node-csfd-api: Error parsing JSON-LD', e);\n }\n return this.buildMovie(+movieId, movieNode, asideNode, pageClasses, jsonLd, options);\n }\n\n private buildMovie(\n movieId: number,\n el: HTMLElement,\n asideEl: HTMLElement,\n pageClasses: string[],\n jsonLd: MovieJsonLd | null,\n options: CSFDOptions\n ) {\n const type = getMovieType(el) as CSFDFilmTypes;\n const { seriesName = null, seasonName = null } =\n type === 'season' ? getSeriesAndSeasonTitle(el) : {};\n const seasonOrEpisodeListType = detectSeasonOrEpisodeListType(el);\n\n const title = type === 'season' && seriesName ? seriesName : getMovieTitle(el);\n return {\n id: movieId,\n title,\n year: getMovieYear(jsonLd),\n duration: getMovieDuration(jsonLd, el),\n descriptions: getMovieDescriptions(el),\n genres: getMovieGenres(el),\n type,\n url: movieUrl(movieId, { language: options?.language }),\n origins: getMovieOrigins(el),\n colorRating: getMovieColorRating(pageClasses),\n rating: getMovieRating(asideEl),\n ratingCount: getMovieRatingCount(asideEl),\n titlesOther: getMovieTitlesOther(el),\n poster: getMoviePoster(el),\n photo: getMovieRandomPhoto(el),\n trivia: getMovieTrivia(el),\n creators: getMovieCreators(el, options),\n vod: getMovieVods(asideEl),\n tags: getMovieTags(asideEl),\n premieres: getMoviePremieres(asideEl),\n related: getMovieBoxMovies(asideEl, 'Související'),\n similar: getMovieBoxMovies(asideEl, 'Podobné'),\n seasons: seasonOrEpisodeListType === 'seasons' ? getSeasonsOrEpisodes(el) : null,\n episodes: seasonOrEpisodeListType === 'episodes' ? getSeasonsOrEpisodes(el) : null,\n parent: type === 'season' || type === 'episode' ? getSeasonOrEpisodeParent(el) : null,\n episodeCode: type === 'episode' ? getEpisodeCode(el) : null,\n seasonName\n };\n }\n}\n"],"mappings":";;;;;AAiCA,IAAa,eAAb,MAA0B;CACxB,MAAa,MAAM,SAAiB,SAA2C;EAC7E,MAAM,KAAK,OAAO,QAAQ;AAC1B,MAAI,MAAM,GAAG,CACX,OAAM,IAAI,MAAM,gDAAgD;EAKlE,MAAM,aAAA,GAAA,iBAAA,OAFW,MAAMA,cAAAA,UADXC,aAAAA,SAAS,IAAI,EAAE,UAAU,SAAS,UAAU,CAAC,EACnB,EAAE,GAAG,SAAS,SAAS,CAAC,CAE7B;EAEjC,MAAM,cAAc,UAAU,cAAc,gBAAgB,CAAC,WAAW,MAAM,IAAI;EAClF,MAAM,YAAY,UAAU,cAAc,uBAAuB;EACjE,MAAM,YAAY,UAAU,cAAc,sBAAsB;EAChE,MAAM,eAAe,UAAU,cAAc,uCAAqC,CAAC;EACnF,IAAI,SAA6B;AACjC,MAAI;AACF,YAAS,KAAK,MAAM,aAAa;WAC1B,GAAG;AACV,WAAQ,MAAM,wCAAwC,EAAE;;AAE1D,SAAO,KAAK,WAAW,CAAC,SAAS,WAAW,WAAW,aAAa,QAAQ,QAAQ;;CAGtF,WACE,SACA,IACA,SACA,aACA,QACA,SACA;EACA,MAAM,OAAOC,qBAAAA,aAAa,GAAG;EAC7B,MAAM,EAAE,aAAa,MAAM,aAAa,SACtC,SAAS,WAAWC,qBAAAA,wBAAwB,GAAG,GAAG,EAAE;EACtD,MAAM,0BAA0BC,qBAAAA,8BAA8B,GAAG;AAGjE,SAAO;GACL,IAAI;GACJ,OAHY,SAAS,YAAY,aAAa,aAAaC,qBAAAA,cAAc,GAAG;GAI5E,MAAMC,qBAAAA,aAAa,OAAO;GAC1B,UAAUC,qBAAAA,iBAAiB,QAAQ,GAAG;GACtC,cAAcC,qBAAAA,qBAAqB,GAAG;GACtC,QAAQC,qBAAAA,eAAe,GAAG;GAC1B;GACA,KAAKR,aAAAA,SAAS,SAAS,EAAE,UAAU,SAAS,UAAU,CAAC;GACvD,SAASS,qBAAAA,gBAAgB,GAAG;GAC5B,aAAaC,qBAAAA,oBAAoB,YAAY;GAC7C,QAAQC,qBAAAA,eAAe,QAAQ;GAC/B,aAAaC,qBAAAA,oBAAoB,QAAQ;GACzC,aAAaC,qBAAAA,oBAAoB,GAAG;GACpC,QAAQC,qBAAAA,eAAe,GAAG;GAC1B,OAAOC,qBAAAA,oBAAoB,GAAG;GAC9B,QAAQC,qBAAAA,eAAe,GAAG;GAC1B,UAAUC,qBAAAA,iBAAiB,IAAI,QAAQ;GACvC,KAAKC,qBAAAA,aAAa,QAAQ;GAC1B,MAAMC,qBAAAA,aAAa,QAAQ;GAC3B,WAAWC,qBAAAA,kBAAkB,QAAQ;GACrC,SAASC,qBAAAA,kBAAkB,SAAS,cAAc;GAClD,SAASA,qBAAAA,kBAAkB,SAAS,UAAU;GAC9C,SAAS,4BAA4B,YAAYC,qBAAAA,qBAAqB,GAAG,GAAG;GAC5E,UAAU,4BAA4B,aAAaA,qBAAAA,qBAAqB,GAAG,GAAG;GAC9E,QAAQ,SAAS,YAAY,SAAS,YAAYC,qBAAAA,yBAAyB,GAAG,GAAG;GACjF,aAAa,SAAS,YAAYC,qBAAAA,eAAe,GAAG,GAAG;GACvD;GACD"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { CSFDMovie } from "../dto/movie.
|
|
2
|
-
import { CSFDOptions } from "../dto/options.
|
|
1
|
+
import { CSFDMovie } from "../dto/movie.cjs";
|
|
2
|
+
import { CSFDOptions } from "../dto/options.cjs";
|
|
3
3
|
|
|
4
4
|
//#region src/services/movie.service.d.ts
|
|
5
5
|
declare class MovieScraper {
|
|
@@ -8,4 +8,4 @@ declare class MovieScraper {
|
|
|
8
8
|
}
|
|
9
9
|
//#endregion
|
|
10
10
|
export { MovieScraper };
|
|
11
|
-
//# sourceMappingURL=movie.service.d.
|
|
11
|
+
//# sourceMappingURL=movie.service.d.cts.map
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
import { fetchPage } from "../fetchers/index.js";
|
|
2
|
+
import { movieUrl } from "../vars.js";
|
|
3
|
+
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.js";
|
|
4
|
+
import { parse } from "node-html-parser";
|
|
5
5
|
//#region src/services/movie.service.ts
|
|
6
6
|
var MovieScraper = class {
|
|
7
7
|
async movie(movieId, options) {
|
|
8
8
|
const id = Number(movieId);
|
|
9
9
|
if (isNaN(id)) throw new Error("node-csfd-api: movieId must be a valid number");
|
|
10
|
-
const movieHtml =
|
|
10
|
+
const movieHtml = parse(await fetchPage(movieUrl(id, { language: options?.language }), { ...options?.request }));
|
|
11
11
|
const pageClasses = movieHtml.querySelector(".page-content").classNames.split(" ");
|
|
12
12
|
const asideNode = movieHtml.querySelector(".aside-movie-profile");
|
|
13
13
|
const movieNode = movieHtml.querySelector(".main-movie-profile");
|
|
@@ -21,41 +21,41 @@ var MovieScraper = class {
|
|
|
21
21
|
return this.buildMovie(+movieId, movieNode, asideNode, pageClasses, jsonLd, options);
|
|
22
22
|
}
|
|
23
23
|
buildMovie(movieId, el, asideEl, pageClasses, jsonLd, options) {
|
|
24
|
-
const type =
|
|
25
|
-
const { seriesName = null, seasonName = null } = type === "season" ?
|
|
26
|
-
const seasonOrEpisodeListType =
|
|
24
|
+
const type = getMovieType(el);
|
|
25
|
+
const { seriesName = null, seasonName = null } = type === "season" ? getSeriesAndSeasonTitle(el) : {};
|
|
26
|
+
const seasonOrEpisodeListType = detectSeasonOrEpisodeListType(el);
|
|
27
27
|
return {
|
|
28
28
|
id: movieId,
|
|
29
|
-
title: type === "season" && seriesName ? seriesName :
|
|
30
|
-
year:
|
|
31
|
-
duration:
|
|
32
|
-
descriptions:
|
|
33
|
-
genres:
|
|
29
|
+
title: type === "season" && seriesName ? seriesName : getMovieTitle(el),
|
|
30
|
+
year: getMovieYear(jsonLd),
|
|
31
|
+
duration: getMovieDuration(jsonLd, el),
|
|
32
|
+
descriptions: getMovieDescriptions(el),
|
|
33
|
+
genres: getMovieGenres(el),
|
|
34
34
|
type,
|
|
35
|
-
url:
|
|
36
|
-
origins:
|
|
37
|
-
colorRating:
|
|
38
|
-
rating:
|
|
39
|
-
ratingCount:
|
|
40
|
-
titlesOther:
|
|
41
|
-
poster:
|
|
42
|
-
photo:
|
|
43
|
-
trivia:
|
|
44
|
-
creators:
|
|
45
|
-
vod:
|
|
46
|
-
tags:
|
|
47
|
-
premieres:
|
|
48
|
-
related:
|
|
49
|
-
similar:
|
|
50
|
-
seasons: seasonOrEpisodeListType === "seasons" ?
|
|
51
|
-
episodes: seasonOrEpisodeListType === "episodes" ?
|
|
52
|
-
parent: type === "season" || type === "episode" ?
|
|
53
|
-
episodeCode: type === "episode" ?
|
|
35
|
+
url: movieUrl(movieId, { language: options?.language }),
|
|
36
|
+
origins: getMovieOrigins(el),
|
|
37
|
+
colorRating: getMovieColorRating(pageClasses),
|
|
38
|
+
rating: getMovieRating(asideEl),
|
|
39
|
+
ratingCount: getMovieRatingCount(asideEl),
|
|
40
|
+
titlesOther: getMovieTitlesOther(el),
|
|
41
|
+
poster: getMoviePoster(el),
|
|
42
|
+
photo: getMovieRandomPhoto(el),
|
|
43
|
+
trivia: getMovieTrivia(el),
|
|
44
|
+
creators: getMovieCreators(el, options),
|
|
45
|
+
vod: getMovieVods(asideEl),
|
|
46
|
+
tags: getMovieTags(asideEl),
|
|
47
|
+
premieres: getMoviePremieres(asideEl),
|
|
48
|
+
related: getMovieBoxMovies(asideEl, "Související"),
|
|
49
|
+
similar: getMovieBoxMovies(asideEl, "Podobné"),
|
|
50
|
+
seasons: seasonOrEpisodeListType === "seasons" ? getSeasonsOrEpisodes(el) : null,
|
|
51
|
+
episodes: seasonOrEpisodeListType === "episodes" ? getSeasonsOrEpisodes(el) : null,
|
|
52
|
+
parent: type === "season" || type === "episode" ? getSeasonOrEpisodeParent(el) : null,
|
|
53
|
+
episodeCode: type === "episode" ? getEpisodeCode(el) : null,
|
|
54
54
|
seasonName
|
|
55
55
|
};
|
|
56
56
|
}
|
|
57
57
|
};
|
|
58
58
|
//#endregion
|
|
59
|
-
|
|
59
|
+
export { MovieScraper };
|
|
60
60
|
|
|
61
61
|
//# sourceMappingURL=movie.service.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"movie.service.js","names":[
|
|
1
|
+
{"version":3,"file":"movie.service.js","names":[],"sources":["../../src/services/movie.service.ts"],"sourcesContent":["import { HTMLElement, parse } from 'node-html-parser';\nimport { CSFDFilmTypes } from '../dto/global';\nimport { CSFDMovie, MovieJsonLd } from '../dto/movie';\nimport { fetchPage } from '../fetchers';\nimport {\n detectSeasonOrEpisodeListType,\n getEpisodeCode,\n getMovieBoxMovies,\n getMovieColorRating,\n getMovieCreators,\n getMovieDescriptions,\n getMovieDuration,\n getMovieGenres,\n getMovieOrigins,\n getMoviePoster,\n getMoviePremieres,\n getMovieRandomPhoto,\n getMovieRating,\n getMovieRatingCount,\n getMovieTags,\n getMovieTitle,\n getMovieTitlesOther,\n getMovieTrivia,\n getMovieType,\n getMovieVods,\n getMovieYear,\n getSeasonOrEpisodeParent,\n getSeasonsOrEpisodes,\n getSeriesAndSeasonTitle\n} from '../helpers/movie.helper';\nimport { CSFDOptions } from '../types';\nimport { movieUrl } from '../vars';\n\nexport class MovieScraper {\n public async movie(movieId: number, options?: CSFDOptions): Promise<CSFDMovie> {\n const id = Number(movieId);\n if (isNaN(id)) {\n throw new Error('node-csfd-api: movieId must be a valid number');\n }\n const url = movieUrl(id, { language: options?.language });\n const response = await fetchPage(url, { ...options?.request });\n\n const movieHtml = parse(response);\n\n const pageClasses = movieHtml.querySelector('.page-content').classNames.split(' ');\n const asideNode = movieHtml.querySelector('.aside-movie-profile');\n const movieNode = movieHtml.querySelector('.main-movie-profile');\n const jsonLdString = movieHtml.querySelector('script[type=\"application/ld+json\"]').innerText;\n let jsonLd: MovieJsonLd | null = null;\n try {\n jsonLd = JSON.parse(jsonLdString);\n } catch (e) {\n console.error('node-csfd-api: Error parsing JSON-LD', e);\n }\n return this.buildMovie(+movieId, movieNode, asideNode, pageClasses, jsonLd, options);\n }\n\n private buildMovie(\n movieId: number,\n el: HTMLElement,\n asideEl: HTMLElement,\n pageClasses: string[],\n jsonLd: MovieJsonLd | null,\n options: CSFDOptions\n ) {\n const type = getMovieType(el) as CSFDFilmTypes;\n const { seriesName = null, seasonName = null } =\n type === 'season' ? getSeriesAndSeasonTitle(el) : {};\n const seasonOrEpisodeListType = detectSeasonOrEpisodeListType(el);\n\n const title = type === 'season' && seriesName ? seriesName : getMovieTitle(el);\n return {\n id: movieId,\n title,\n year: getMovieYear(jsonLd),\n duration: getMovieDuration(jsonLd, el),\n descriptions: getMovieDescriptions(el),\n genres: getMovieGenres(el),\n type,\n url: movieUrl(movieId, { language: options?.language }),\n origins: getMovieOrigins(el),\n colorRating: getMovieColorRating(pageClasses),\n rating: getMovieRating(asideEl),\n ratingCount: getMovieRatingCount(asideEl),\n titlesOther: getMovieTitlesOther(el),\n poster: getMoviePoster(el),\n photo: getMovieRandomPhoto(el),\n trivia: getMovieTrivia(el),\n creators: getMovieCreators(el, options),\n vod: getMovieVods(asideEl),\n tags: getMovieTags(asideEl),\n premieres: getMoviePremieres(asideEl),\n related: getMovieBoxMovies(asideEl, 'Související'),\n similar: getMovieBoxMovies(asideEl, 'Podobné'),\n seasons: seasonOrEpisodeListType === 'seasons' ? getSeasonsOrEpisodes(el) : null,\n episodes: seasonOrEpisodeListType === 'episodes' ? getSeasonsOrEpisodes(el) : null,\n parent: type === 'season' || type === 'episode' ? getSeasonOrEpisodeParent(el) : null,\n episodeCode: type === 'episode' ? getEpisodeCode(el) : null,\n seasonName\n };\n }\n}\n"],"mappings":";;;;;AAiCA,IAAa,eAAb,MAA0B;CACxB,MAAa,MAAM,SAAiB,SAA2C;EAC7E,MAAM,KAAK,OAAO,QAAQ;AAC1B,MAAI,MAAM,GAAG,CACX,OAAM,IAAI,MAAM,gDAAgD;EAKlE,MAAM,YAAY,MAFD,MAAM,UADX,SAAS,IAAI,EAAE,UAAU,SAAS,UAAU,CAAC,EACnB,EAAE,GAAG,SAAS,SAAS,CAAC,CAE7B;EAEjC,MAAM,cAAc,UAAU,cAAc,gBAAgB,CAAC,WAAW,MAAM,IAAI;EAClF,MAAM,YAAY,UAAU,cAAc,uBAAuB;EACjE,MAAM,YAAY,UAAU,cAAc,sBAAsB;EAChE,MAAM,eAAe,UAAU,cAAc,uCAAqC,CAAC;EACnF,IAAI,SAA6B;AACjC,MAAI;AACF,YAAS,KAAK,MAAM,aAAa;WAC1B,GAAG;AACV,WAAQ,MAAM,wCAAwC,EAAE;;AAE1D,SAAO,KAAK,WAAW,CAAC,SAAS,WAAW,WAAW,aAAa,QAAQ,QAAQ;;CAGtF,WACE,SACA,IACA,SACA,aACA,QACA,SACA;EACA,MAAM,OAAO,aAAa,GAAG;EAC7B,MAAM,EAAE,aAAa,MAAM,aAAa,SACtC,SAAS,WAAW,wBAAwB,GAAG,GAAG,EAAE;EACtD,MAAM,0BAA0B,8BAA8B,GAAG;AAGjE,SAAO;GACL,IAAI;GACJ,OAHY,SAAS,YAAY,aAAa,aAAa,cAAc,GAAG;GAI5E,MAAM,aAAa,OAAO;GAC1B,UAAU,iBAAiB,QAAQ,GAAG;GACtC,cAAc,qBAAqB,GAAG;GACtC,QAAQ,eAAe,GAAG;GAC1B;GACA,KAAK,SAAS,SAAS,EAAE,UAAU,SAAS,UAAU,CAAC;GACvD,SAAS,gBAAgB,GAAG;GAC5B,aAAa,oBAAoB,YAAY;GAC7C,QAAQ,eAAe,QAAQ;GAC/B,aAAa,oBAAoB,QAAQ;GACzC,aAAa,oBAAoB,GAAG;GACpC,QAAQ,eAAe,GAAG;GAC1B,OAAO,oBAAoB,GAAG;GAC9B,QAAQ,eAAe,GAAG;GAC1B,UAAU,iBAAiB,IAAI,QAAQ;GACvC,KAAK,aAAa,QAAQ;GAC1B,MAAM,aAAa,QAAQ;GAC3B,WAAW,kBAAkB,QAAQ;GACrC,SAAS,kBAAkB,SAAS,cAAc;GAClD,SAAS,kBAAkB,SAAS,UAAU;GAC9C,SAAS,4BAA4B,YAAY,qBAAqB,GAAG,GAAG;GAC5E,UAAU,4BAA4B,aAAa,qBAAqB,GAAG,GAAG;GAC9E,QAAQ,SAAS,YAAY,SAAS,YAAY,yBAAyB,GAAG,GAAG;GACjF,aAAa,SAAS,YAAY,eAAe,GAAG,GAAG;GACvD;GACD"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
const require_index = require("../fetchers/index.cjs");
|
|
2
|
+
const require_vars = require("../vars.cjs");
|
|
3
|
+
const require_global_helper = require("../helpers/global.helper.cjs");
|
|
4
|
+
const require_search_creator_helper = require("../helpers/search-creator.helper.cjs");
|
|
5
|
+
const require_search_user_helper = require("../helpers/search-user.helper.cjs");
|
|
6
|
+
const require_search_helper = require("../helpers/search.helper.cjs");
|
|
7
|
+
let node_html_parser = require("node-html-parser");
|
|
8
|
+
//#region src/services/search.service.ts
|
|
9
|
+
var SearchScraper = class {
|
|
10
|
+
async search(text, options) {
|
|
11
|
+
const html = (0, node_html_parser.parse)(await require_index.fetchPage(require_vars.searchUrl(text, { language: options?.language }), { ...options?.request }));
|
|
12
|
+
const moviesNode = html.querySelectorAll(".main-movies article");
|
|
13
|
+
const usersNode = html.querySelectorAll(".main-users article");
|
|
14
|
+
const tvSeriesNode = html.querySelectorAll(".main-series article");
|
|
15
|
+
const creatorsNode = html.querySelectorAll(".main-authors article");
|
|
16
|
+
return this.parseSearch(moviesNode, usersNode, tvSeriesNode, creatorsNode, options?.language);
|
|
17
|
+
}
|
|
18
|
+
parseSearch(moviesNode, usersNode, tvSeriesNode, creatorsNode, language) {
|
|
19
|
+
const baseUrl = require_vars.getUrlByLanguage(language);
|
|
20
|
+
const movies = [];
|
|
21
|
+
const users = [];
|
|
22
|
+
const tvSeries = [];
|
|
23
|
+
const creators = [];
|
|
24
|
+
const movieMapper = (m) => {
|
|
25
|
+
const url = require_search_helper.getSearchUrl(m);
|
|
26
|
+
return {
|
|
27
|
+
id: require_global_helper.parseIdFromUrl(url),
|
|
28
|
+
title: require_search_helper.getSearchTitle(m),
|
|
29
|
+
year: require_search_helper.getSearchYear(m),
|
|
30
|
+
url: `${baseUrl}${url}`,
|
|
31
|
+
type: require_search_helper.getSearchType(m),
|
|
32
|
+
colorRating: require_search_helper.getSearchColorRating(m),
|
|
33
|
+
poster: require_search_helper.getSearchPoster(m),
|
|
34
|
+
origins: require_search_helper.getSearchOrigins(m),
|
|
35
|
+
creators: {
|
|
36
|
+
directors: require_search_helper.parseSearchPeople(m, "directors"),
|
|
37
|
+
actors: require_search_helper.parseSearchPeople(m, "actors")
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
};
|
|
41
|
+
const userMapper = (m) => {
|
|
42
|
+
const url = require_search_user_helper.getUserUrl(m);
|
|
43
|
+
return {
|
|
44
|
+
id: require_global_helper.parseIdFromUrl(url),
|
|
45
|
+
user: require_search_user_helper.getUser(m),
|
|
46
|
+
userRealName: require_search_user_helper.getUserRealName(m),
|
|
47
|
+
avatar: require_search_user_helper.getAvatar(m),
|
|
48
|
+
url: `${baseUrl}${url}`
|
|
49
|
+
};
|
|
50
|
+
};
|
|
51
|
+
const creatorMapper = (m) => {
|
|
52
|
+
const url = require_search_creator_helper.getCreatorUrl(m);
|
|
53
|
+
return {
|
|
54
|
+
id: require_global_helper.parseIdFromUrl(url),
|
|
55
|
+
name: require_search_creator_helper.getCreatorName(m),
|
|
56
|
+
image: require_search_creator_helper.getCreatorImage(m),
|
|
57
|
+
url: `${baseUrl}${url}`
|
|
58
|
+
};
|
|
59
|
+
};
|
|
60
|
+
movies.push(...moviesNode.map(movieMapper));
|
|
61
|
+
users.push(...usersNode.map(userMapper));
|
|
62
|
+
tvSeries.push(...tvSeriesNode.map(movieMapper));
|
|
63
|
+
creators.push(...creatorsNode.map(creatorMapper));
|
|
64
|
+
return {
|
|
65
|
+
movies,
|
|
66
|
+
users,
|
|
67
|
+
tvSeries,
|
|
68
|
+
creators
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
//#endregion
|
|
73
|
+
exports.SearchScraper = SearchScraper;
|
|
74
|
+
|
|
75
|
+
//# sourceMappingURL=search.service.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.service.cjs","names":["fetchPage","searchUrl","getUrlByLanguage","getSearchUrl","parseIdFromUrl","getSearchTitle","getSearchYear","getSearchType","getSearchColorRating","getSearchPoster","getSearchOrigins","parseSearchPeople","getUserUrl","getUser","getUserRealName","getAvatar","getCreatorUrl","getCreatorName","getCreatorImage"],"sources":["../../src/services/search.service.ts"],"sourcesContent":["import { HTMLElement, parse } from 'node-html-parser';\nimport { CSFDSearch, CSFDSearchCreator, CSFDSearchMovie, CSFDSearchUser } from '../dto/search';\nimport { fetchPage } from '../fetchers';\nimport { parseIdFromUrl } from '../helpers/global.helper';\nimport { getCreatorImage, getCreatorName, getCreatorUrl } from '../helpers/search-creator.helper';\nimport { getAvatar, getUser, getUserRealName, getUserUrl } from '../helpers/search-user.helper';\nimport {\n getSearchColorRating,\n getSearchOrigins,\n getSearchPoster,\n getSearchTitle,\n getSearchType,\n getSearchUrl,\n getSearchYear,\n parseSearchPeople\n} from '../helpers/search.helper';\nimport { CSFDLanguage, CSFDOptions } from '../types';\nimport { getUrlByLanguage, searchUrl } from '../vars';\n\nexport class SearchScraper {\n public async search(text: string, options?: CSFDOptions): Promise<CSFDSearch> {\n const url = searchUrl(text, { language: options?.language });\n const response = await fetchPage(url, { ...options?.request });\n\n const html = parse(response);\n const moviesNode = html.querySelectorAll('.main-movies article');\n const usersNode = html.querySelectorAll('.main-users article');\n const tvSeriesNode = html.querySelectorAll('.main-series article');\n const creatorsNode = html.querySelectorAll('.main-authors article');\n\n return this.parseSearch(moviesNode, usersNode, tvSeriesNode, creatorsNode, options?.language);\n }\n\n private parseSearch(\n moviesNode: HTMLElement[],\n usersNode: HTMLElement[],\n tvSeriesNode: HTMLElement[],\n creatorsNode: HTMLElement[],\n language?: CSFDLanguage\n ) {\n const baseUrl = getUrlByLanguage(language);\n\n const movies: CSFDSearchMovie[] = [];\n const users: CSFDSearchUser[] = [];\n const tvSeries: CSFDSearchMovie[] = [];\n const creators: CSFDSearchCreator[] = [];\n\n const movieMapper = (m: HTMLElement): CSFDSearchMovie => {\n const url = getSearchUrl(m);\n return {\n id: parseIdFromUrl(url),\n title: getSearchTitle(m),\n year: getSearchYear(m),\n url: `${baseUrl}${url}`,\n type: getSearchType(m),\n colorRating: getSearchColorRating(m),\n poster: getSearchPoster(m),\n origins: getSearchOrigins(m),\n creators: {\n directors: parseSearchPeople(m, 'directors'),\n actors: parseSearchPeople(m, 'actors')\n }\n };\n };\n\n const userMapper = (m: HTMLElement): CSFDSearchUser => {\n const url = getUserUrl(m);\n return {\n id: parseIdFromUrl(url),\n user: getUser(m),\n userRealName: getUserRealName(m),\n avatar: getAvatar(m),\n url: `${baseUrl}${url}`\n };\n };\n\n const creatorMapper = (m: HTMLElement): CSFDSearchCreator => {\n const url = getCreatorUrl(m);\n return {\n id: parseIdFromUrl(url),\n name: getCreatorName(m),\n image: getCreatorImage(m),\n url: `${baseUrl}${url}`\n };\n };\n\n movies.push(...moviesNode.map(movieMapper));\n users.push(...usersNode.map(userMapper));\n tvSeries.push(...tvSeriesNode.map(movieMapper));\n creators.push(...creatorsNode.map(creatorMapper));\n\n const search: CSFDSearch = {\n movies,\n users,\n tvSeries,\n creators\n };\n return search;\n }\n}\n"],"mappings":";;;;;;;;AAmBA,IAAa,gBAAb,MAA2B;CACzB,MAAa,OAAO,MAAc,SAA4C;EAI5E,MAAM,QAAA,GAAA,iBAAA,OAFW,MAAMA,cAAAA,UADXC,aAAAA,UAAU,MAAM,EAAE,UAAU,SAAS,UAAU,CAAC,EACtB,EAAE,GAAG,SAAS,SAAS,CAAC,CAElC;EAC5B,MAAM,aAAa,KAAK,iBAAiB,uBAAuB;EAChE,MAAM,YAAY,KAAK,iBAAiB,sBAAsB;EAC9D,MAAM,eAAe,KAAK,iBAAiB,uBAAuB;EAClE,MAAM,eAAe,KAAK,iBAAiB,wBAAwB;AAEnE,SAAO,KAAK,YAAY,YAAY,WAAW,cAAc,cAAc,SAAS,SAAS;;CAG/F,YACE,YACA,WACA,cACA,cACA,UACA;EACA,MAAM,UAAUC,aAAAA,iBAAiB,SAAS;EAE1C,MAAM,SAA4B,EAAE;EACpC,MAAM,QAA0B,EAAE;EAClC,MAAM,WAA8B,EAAE;EACtC,MAAM,WAAgC,EAAE;EAExC,MAAM,eAAe,MAAoC;GACvD,MAAM,MAAMC,sBAAAA,aAAa,EAAE;AAC3B,UAAO;IACL,IAAIC,sBAAAA,eAAe,IAAI;IACvB,OAAOC,sBAAAA,eAAe,EAAE;IACxB,MAAMC,sBAAAA,cAAc,EAAE;IACtB,KAAK,GAAG,UAAU;IAClB,MAAMC,sBAAAA,cAAc,EAAE;IACtB,aAAaC,sBAAAA,qBAAqB,EAAE;IACpC,QAAQC,sBAAAA,gBAAgB,EAAE;IAC1B,SAASC,sBAAAA,iBAAiB,EAAE;IAC5B,UAAU;KACR,WAAWC,sBAAAA,kBAAkB,GAAG,YAAY;KAC5C,QAAQA,sBAAAA,kBAAkB,GAAG,SAAS;KACvC;IACF;;EAGH,MAAM,cAAc,MAAmC;GACrD,MAAM,MAAMC,2BAAAA,WAAW,EAAE;AACzB,UAAO;IACL,IAAIR,sBAAAA,eAAe,IAAI;IACvB,MAAMS,2BAAAA,QAAQ,EAAE;IAChB,cAAcC,2BAAAA,gBAAgB,EAAE;IAChC,QAAQC,2BAAAA,UAAU,EAAE;IACpB,KAAK,GAAG,UAAU;IACnB;;EAGH,MAAM,iBAAiB,MAAsC;GAC3D,MAAM,MAAMC,8BAAAA,cAAc,EAAE;AAC5B,UAAO;IACL,IAAIZ,sBAAAA,eAAe,IAAI;IACvB,MAAMa,8BAAAA,eAAe,EAAE;IACvB,OAAOC,8BAAAA,gBAAgB,EAAE;IACzB,KAAK,GAAG,UAAU;IACnB;;AAGH,SAAO,KAAK,GAAG,WAAW,IAAI,YAAY,CAAC;AAC3C,QAAM,KAAK,GAAG,UAAU,IAAI,WAAW,CAAC;AACxC,WAAS,KAAK,GAAG,aAAa,IAAI,YAAY,CAAC;AAC/C,WAAS,KAAK,GAAG,aAAa,IAAI,cAAc,CAAC;AAQjD,SAN2B;GACzB;GACA;GACA;GACA;GACD"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { CSFDSearch } from "../dto/search.
|
|
2
|
-
import { CSFDOptions } from "../dto/options.
|
|
1
|
+
import { CSFDSearch } from "../dto/search.cjs";
|
|
2
|
+
import { CSFDOptions } from "../dto/options.cjs";
|
|
3
3
|
|
|
4
4
|
//#region src/services/search.service.d.ts
|
|
5
5
|
declare class SearchScraper {
|
|
@@ -8,4 +8,4 @@ declare class SearchScraper {
|
|
|
8
8
|
}
|
|
9
9
|
//#endregion
|
|
10
10
|
export { SearchScraper };
|
|
11
|
-
//# sourceMappingURL=search.service.d.
|
|
11
|
+
//# sourceMappingURL=search.service.d.cts.map
|
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
1
|
+
import { fetchPage } from "../fetchers/index.js";
|
|
2
|
+
import { getUrlByLanguage, searchUrl } from "../vars.js";
|
|
3
|
+
import { parseIdFromUrl } from "../helpers/global.helper.js";
|
|
4
|
+
import { getCreatorImage, getCreatorName, getCreatorUrl } from "../helpers/search-creator.helper.js";
|
|
5
|
+
import { getAvatar, getUser, getUserRealName, getUserUrl } from "../helpers/search-user.helper.js";
|
|
6
|
+
import { getSearchColorRating, getSearchOrigins, getSearchPoster, getSearchTitle, getSearchType, getSearchUrl, getSearchYear, parseSearchPeople } from "../helpers/search.helper.js";
|
|
7
|
+
import { parse } from "node-html-parser";
|
|
8
8
|
//#region src/services/search.service.ts
|
|
9
9
|
var SearchScraper = class {
|
|
10
10
|
async search(text, options) {
|
|
11
|
-
const html =
|
|
11
|
+
const html = parse(await fetchPage(searchUrl(text, { language: options?.language }), { ...options?.request }));
|
|
12
12
|
const moviesNode = html.querySelectorAll(".main-movies article");
|
|
13
13
|
const usersNode = html.querySelectorAll(".main-users article");
|
|
14
14
|
const tvSeriesNode = html.querySelectorAll(".main-series article");
|
|
@@ -16,44 +16,44 @@ var SearchScraper = class {
|
|
|
16
16
|
return this.parseSearch(moviesNode, usersNode, tvSeriesNode, creatorsNode, options?.language);
|
|
17
17
|
}
|
|
18
18
|
parseSearch(moviesNode, usersNode, tvSeriesNode, creatorsNode, language) {
|
|
19
|
-
const baseUrl =
|
|
19
|
+
const baseUrl = getUrlByLanguage(language);
|
|
20
20
|
const movies = [];
|
|
21
21
|
const users = [];
|
|
22
22
|
const tvSeries = [];
|
|
23
23
|
const creators = [];
|
|
24
24
|
const movieMapper = (m) => {
|
|
25
|
-
const url =
|
|
25
|
+
const url = getSearchUrl(m);
|
|
26
26
|
return {
|
|
27
|
-
id:
|
|
28
|
-
title:
|
|
29
|
-
year:
|
|
27
|
+
id: parseIdFromUrl(url),
|
|
28
|
+
title: getSearchTitle(m),
|
|
29
|
+
year: getSearchYear(m),
|
|
30
30
|
url: `${baseUrl}${url}`,
|
|
31
|
-
type:
|
|
32
|
-
colorRating:
|
|
33
|
-
poster:
|
|
34
|
-
origins:
|
|
31
|
+
type: getSearchType(m),
|
|
32
|
+
colorRating: getSearchColorRating(m),
|
|
33
|
+
poster: getSearchPoster(m),
|
|
34
|
+
origins: getSearchOrigins(m),
|
|
35
35
|
creators: {
|
|
36
|
-
directors:
|
|
37
|
-
actors:
|
|
36
|
+
directors: parseSearchPeople(m, "directors"),
|
|
37
|
+
actors: parseSearchPeople(m, "actors")
|
|
38
38
|
}
|
|
39
39
|
};
|
|
40
40
|
};
|
|
41
41
|
const userMapper = (m) => {
|
|
42
|
-
const url =
|
|
42
|
+
const url = getUserUrl(m);
|
|
43
43
|
return {
|
|
44
|
-
id:
|
|
45
|
-
user:
|
|
46
|
-
userRealName:
|
|
47
|
-
avatar:
|
|
44
|
+
id: parseIdFromUrl(url),
|
|
45
|
+
user: getUser(m),
|
|
46
|
+
userRealName: getUserRealName(m),
|
|
47
|
+
avatar: getAvatar(m),
|
|
48
48
|
url: `${baseUrl}${url}`
|
|
49
49
|
};
|
|
50
50
|
};
|
|
51
51
|
const creatorMapper = (m) => {
|
|
52
|
-
const url =
|
|
52
|
+
const url = getCreatorUrl(m);
|
|
53
53
|
return {
|
|
54
|
-
id:
|
|
55
|
-
name:
|
|
56
|
-
image:
|
|
54
|
+
id: parseIdFromUrl(url),
|
|
55
|
+
name: getCreatorName(m),
|
|
56
|
+
image: getCreatorImage(m),
|
|
57
57
|
url: `${baseUrl}${url}`
|
|
58
58
|
};
|
|
59
59
|
};
|
|
@@ -70,6 +70,6 @@ var SearchScraper = class {
|
|
|
70
70
|
}
|
|
71
71
|
};
|
|
72
72
|
//#endregion
|
|
73
|
-
|
|
73
|
+
export { SearchScraper };
|
|
74
74
|
|
|
75
75
|
//# sourceMappingURL=search.service.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search.service.js","names":[
|
|
1
|
+
{"version":3,"file":"search.service.js","names":[],"sources":["../../src/services/search.service.ts"],"sourcesContent":["import { HTMLElement, parse } from 'node-html-parser';\nimport { CSFDSearch, CSFDSearchCreator, CSFDSearchMovie, CSFDSearchUser } from '../dto/search';\nimport { fetchPage } from '../fetchers';\nimport { parseIdFromUrl } from '../helpers/global.helper';\nimport { getCreatorImage, getCreatorName, getCreatorUrl } from '../helpers/search-creator.helper';\nimport { getAvatar, getUser, getUserRealName, getUserUrl } from '../helpers/search-user.helper';\nimport {\n getSearchColorRating,\n getSearchOrigins,\n getSearchPoster,\n getSearchTitle,\n getSearchType,\n getSearchUrl,\n getSearchYear,\n parseSearchPeople\n} from '../helpers/search.helper';\nimport { CSFDLanguage, CSFDOptions } from '../types';\nimport { getUrlByLanguage, searchUrl } from '../vars';\n\nexport class SearchScraper {\n public async search(text: string, options?: CSFDOptions): Promise<CSFDSearch> {\n const url = searchUrl(text, { language: options?.language });\n const response = await fetchPage(url, { ...options?.request });\n\n const html = parse(response);\n const moviesNode = html.querySelectorAll('.main-movies article');\n const usersNode = html.querySelectorAll('.main-users article');\n const tvSeriesNode = html.querySelectorAll('.main-series article');\n const creatorsNode = html.querySelectorAll('.main-authors article');\n\n return this.parseSearch(moviesNode, usersNode, tvSeriesNode, creatorsNode, options?.language);\n }\n\n private parseSearch(\n moviesNode: HTMLElement[],\n usersNode: HTMLElement[],\n tvSeriesNode: HTMLElement[],\n creatorsNode: HTMLElement[],\n language?: CSFDLanguage\n ) {\n const baseUrl = getUrlByLanguage(language);\n\n const movies: CSFDSearchMovie[] = [];\n const users: CSFDSearchUser[] = [];\n const tvSeries: CSFDSearchMovie[] = [];\n const creators: CSFDSearchCreator[] = [];\n\n const movieMapper = (m: HTMLElement): CSFDSearchMovie => {\n const url = getSearchUrl(m);\n return {\n id: parseIdFromUrl(url),\n title: getSearchTitle(m),\n year: getSearchYear(m),\n url: `${baseUrl}${url}`,\n type: getSearchType(m),\n colorRating: getSearchColorRating(m),\n poster: getSearchPoster(m),\n origins: getSearchOrigins(m),\n creators: {\n directors: parseSearchPeople(m, 'directors'),\n actors: parseSearchPeople(m, 'actors')\n }\n };\n };\n\n const userMapper = (m: HTMLElement): CSFDSearchUser => {\n const url = getUserUrl(m);\n return {\n id: parseIdFromUrl(url),\n user: getUser(m),\n userRealName: getUserRealName(m),\n avatar: getAvatar(m),\n url: `${baseUrl}${url}`\n };\n };\n\n const creatorMapper = (m: HTMLElement): CSFDSearchCreator => {\n const url = getCreatorUrl(m);\n return {\n id: parseIdFromUrl(url),\n name: getCreatorName(m),\n image: getCreatorImage(m),\n url: `${baseUrl}${url}`\n };\n };\n\n movies.push(...moviesNode.map(movieMapper));\n users.push(...usersNode.map(userMapper));\n tvSeries.push(...tvSeriesNode.map(movieMapper));\n creators.push(...creatorsNode.map(creatorMapper));\n\n const search: CSFDSearch = {\n movies,\n users,\n tvSeries,\n creators\n };\n return search;\n }\n}\n"],"mappings":";;;;;;;;AAmBA,IAAa,gBAAb,MAA2B;CACzB,MAAa,OAAO,MAAc,SAA4C;EAI5E,MAAM,OAAO,MAFI,MAAM,UADX,UAAU,MAAM,EAAE,UAAU,SAAS,UAAU,CAAC,EACtB,EAAE,GAAG,SAAS,SAAS,CAAC,CAElC;EAC5B,MAAM,aAAa,KAAK,iBAAiB,uBAAuB;EAChE,MAAM,YAAY,KAAK,iBAAiB,sBAAsB;EAC9D,MAAM,eAAe,KAAK,iBAAiB,uBAAuB;EAClE,MAAM,eAAe,KAAK,iBAAiB,wBAAwB;AAEnE,SAAO,KAAK,YAAY,YAAY,WAAW,cAAc,cAAc,SAAS,SAAS;;CAG/F,YACE,YACA,WACA,cACA,cACA,UACA;EACA,MAAM,UAAU,iBAAiB,SAAS;EAE1C,MAAM,SAA4B,EAAE;EACpC,MAAM,QAA0B,EAAE;EAClC,MAAM,WAA8B,EAAE;EACtC,MAAM,WAAgC,EAAE;EAExC,MAAM,eAAe,MAAoC;GACvD,MAAM,MAAM,aAAa,EAAE;AAC3B,UAAO;IACL,IAAI,eAAe,IAAI;IACvB,OAAO,eAAe,EAAE;IACxB,MAAM,cAAc,EAAE;IACtB,KAAK,GAAG,UAAU;IAClB,MAAM,cAAc,EAAE;IACtB,aAAa,qBAAqB,EAAE;IACpC,QAAQ,gBAAgB,EAAE;IAC1B,SAAS,iBAAiB,EAAE;IAC5B,UAAU;KACR,WAAW,kBAAkB,GAAG,YAAY;KAC5C,QAAQ,kBAAkB,GAAG,SAAS;KACvC;IACF;;EAGH,MAAM,cAAc,MAAmC;GACrD,MAAM,MAAM,WAAW,EAAE;AACzB,UAAO;IACL,IAAI,eAAe,IAAI;IACvB,MAAM,QAAQ,EAAE;IAChB,cAAc,gBAAgB,EAAE;IAChC,QAAQ,UAAU,EAAE;IACpB,KAAK,GAAG,UAAU;IACnB;;EAGH,MAAM,iBAAiB,MAAsC;GAC3D,MAAM,MAAM,cAAc,EAAE;AAC5B,UAAO;IACL,IAAI,eAAe,IAAI;IACvB,MAAM,eAAe,EAAE;IACvB,OAAO,gBAAgB,EAAE;IACzB,KAAK,GAAG,UAAU;IACnB;;AAGH,SAAO,KAAK,GAAG,WAAW,IAAI,YAAY,CAAC;AAC3C,QAAM,KAAK,GAAG,UAAU,IAAI,WAAW,CAAC;AACxC,WAAS,KAAK,GAAG,aAAa,IAAI,YAAY,CAAC;AAC/C,WAAS,KAAK,GAAG,aAAa,IAAI,cAAc,CAAC;AAQjD,SAN2B;GACzB;GACA;GACA;GACA;GACD"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
const require_index = require("../fetchers/index.cjs");
|
|
2
|
+
const require_vars = require("../vars.cjs");
|
|
3
|
+
const require_global_helper = require("../helpers/global.helper.cjs");
|
|
4
|
+
const require_user_ratings_helper = require("../helpers/user-ratings.helper.cjs");
|
|
5
|
+
let node_html_parser = require("node-html-parser");
|
|
6
|
+
//#region src/services/user-ratings.service.ts
|
|
7
|
+
var UserRatingsScraper = class {
|
|
8
|
+
async userRatings(user, config, options) {
|
|
9
|
+
let allMovies = [];
|
|
10
|
+
const pageToFetch = config?.page || 1;
|
|
11
|
+
const url = require_vars.userRatingsUrl(user, pageToFetch > 1 ? pageToFetch : void 0, { language: options?.language });
|
|
12
|
+
const items = (0, node_html_parser.parse)(await require_index.fetchPage(url, { ...options?.request }));
|
|
13
|
+
const movies = items.querySelectorAll("#snippet--ratings table tr");
|
|
14
|
+
const pagesNode = items.querySelector(".pagination");
|
|
15
|
+
const pages = +pagesNode?.childNodes[pagesNode.childNodes.length - 4].rawText || 1;
|
|
16
|
+
allMovies = this.getPage(config, movies);
|
|
17
|
+
if (config?.allPages) {
|
|
18
|
+
console.log("User", user, url);
|
|
19
|
+
console.log("Fetching all pages", pages);
|
|
20
|
+
for (let i = 2; i <= pages; i++) {
|
|
21
|
+
console.log("Fetching page", i, "out of", pages, "...");
|
|
22
|
+
const movies = (0, node_html_parser.parse)(await require_index.fetchPage(require_vars.userRatingsUrl(user, i, { language: options?.language }), { ...options?.request })).querySelectorAll("#snippet--ratings table tr");
|
|
23
|
+
allMovies = [...allMovies, ...this.getPage(config, movies)];
|
|
24
|
+
if (config.allPagesDelay) await require_global_helper.sleep(config.allPagesDelay);
|
|
25
|
+
}
|
|
26
|
+
return allMovies;
|
|
27
|
+
}
|
|
28
|
+
return allMovies;
|
|
29
|
+
}
|
|
30
|
+
getPage(config, movies) {
|
|
31
|
+
const films = [];
|
|
32
|
+
if (config) {
|
|
33
|
+
if (config.includesOnly?.length && config.excludes?.length) console.warn(`node-csfd-api:
|
|
34
|
+
You can not use both parameters 'includesOnly' and 'excludes'.
|
|
35
|
+
Parameter 'includesOnly' will be used now:`, config.includesOnly);
|
|
36
|
+
}
|
|
37
|
+
const includesSet = config?.includesOnly?.length ? new Set(config.includesOnly) : null;
|
|
38
|
+
const excludesSet = config?.excludes?.length ? new Set(config.excludes) : null;
|
|
39
|
+
for (const el of movies) {
|
|
40
|
+
const type = require_user_ratings_helper.getUserRatingType(el);
|
|
41
|
+
if (includesSet) {
|
|
42
|
+
if (includesSet.has(type)) films.push(this.buildUserRatings(el, type));
|
|
43
|
+
} else if (excludesSet) {
|
|
44
|
+
if (!excludesSet.has(type)) films.push(this.buildUserRatings(el, type));
|
|
45
|
+
} else films.push(this.buildUserRatings(el, type));
|
|
46
|
+
}
|
|
47
|
+
return films;
|
|
48
|
+
}
|
|
49
|
+
buildUserRatings(el, type) {
|
|
50
|
+
return {
|
|
51
|
+
id: require_user_ratings_helper.getUserRatingId(el),
|
|
52
|
+
title: require_user_ratings_helper.getUserRatingTitle(el),
|
|
53
|
+
year: require_user_ratings_helper.getUserRatingYear(el),
|
|
54
|
+
type,
|
|
55
|
+
url: require_user_ratings_helper.getUserRatingUrl(el),
|
|
56
|
+
colorRating: require_user_ratings_helper.getUserRatingColorRating(el),
|
|
57
|
+
userDate: require_user_ratings_helper.getUserRatingDate(el),
|
|
58
|
+
userRating: require_user_ratings_helper.getUserRating(el)
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
//#endregion
|
|
63
|
+
exports.UserRatingsScraper = UserRatingsScraper;
|
|
64
|
+
|
|
65
|
+
//# sourceMappingURL=user-ratings.service.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user-ratings.service.cjs","names":["userRatingsUrl","fetchPage","sleep","getUserRatingType","getUserRatingId","getUserRatingTitle","getUserRatingYear","getUserRatingUrl","getUserRatingColorRating","getUserRatingDate","getUserRating"],"sources":["../../src/services/user-ratings.service.ts"],"sourcesContent":["import { HTMLElement, parse } from 'node-html-parser';\nimport { CSFDColorRating, CSFDFilmTypes, CSFDStars } from '../dto/global';\nimport { CSFDUserRatingConfig, CSFDUserRatings } from '../dto/user-ratings';\nimport { fetchPage } from '../fetchers';\nimport { sleep } from '../helpers/global.helper';\nimport {\n getUserRating,\n getUserRatingColorRating,\n getUserRatingDate,\n getUserRatingId,\n getUserRatingTitle,\n getUserRatingType,\n getUserRatingUrl,\n getUserRatingYear\n} from '../helpers/user-ratings.helper';\nimport { CSFDOptions } from '../types';\nimport { userRatingsUrl } from '../vars';\n\nexport class UserRatingsScraper {\n public async userRatings(\n user: string | number,\n config?: CSFDUserRatingConfig,\n options?: CSFDOptions\n ): Promise<CSFDUserRatings[]> {\n let allMovies: CSFDUserRatings[] = [];\n const pageToFetch = config?.page || 1;\n const url = userRatingsUrl(user, pageToFetch > 1 ? pageToFetch : undefined, {\n language: options?.language\n });\n const response = await fetchPage(url, { ...options?.request });\n const items = parse(response);\n const movies = items.querySelectorAll('#snippet--ratings table tr');\n\n // Get number of pages\n const pagesNode = items.querySelector('.pagination');\n const pages = +pagesNode?.childNodes[pagesNode.childNodes.length - 4].rawText || 1;\n\n allMovies = this.getPage(config, movies);\n\n if (config?.allPages) {\n console.log('User', user, url);\n console.log('Fetching all pages', pages);\n for (let i = 2; i <= pages; i++) {\n console.log('Fetching page', i, 'out of', pages, '...');\n const url = userRatingsUrl(user, i, { language: options?.language });\n const response = await fetchPage(url, { ...options?.request });\n\n const items = parse(response);\n const movies = items.querySelectorAll('#snippet--ratings table tr');\n allMovies = [...allMovies, ...this.getPage(config, movies)];\n\n // Sleep\n if (config.allPagesDelay) {\n await sleep(config.allPagesDelay);\n }\n }\n return allMovies;\n }\n\n return allMovies;\n }\n\n private getPage(config: CSFDUserRatingConfig, movies: HTMLElement[]) {\n const films: CSFDUserRatings[] = [];\n if (config) {\n if (config.includesOnly?.length && config.excludes?.length) {\n console.warn(\n `node-csfd-api:\n You can not use both parameters 'includesOnly' and 'excludes'.\n Parameter 'includesOnly' will be used now:`,\n config.includesOnly\n );\n }\n }\n\n const includesSet = config?.includesOnly?.length ? new Set(config.includesOnly) : null;\n const excludesSet = config?.excludes?.length ? new Set(config.excludes) : null;\n\n for (const el of movies) {\n const type = getUserRatingType(el);\n\n // Filtering includesOnly\n if (includesSet) {\n if (includesSet.has(type)) {\n films.push(this.buildUserRatings(el, type));\n }\n // Filter excludes\n } else if (excludesSet) {\n if (!excludesSet.has(type)) {\n films.push(this.buildUserRatings(el, type));\n }\n } else {\n // Without filtering\n films.push(this.buildUserRatings(el, type));\n }\n }\n return films;\n }\n\n private buildUserRatings(el: HTMLElement, type: CSFDFilmTypes): CSFDUserRatings {\n return {\n id: getUserRatingId(el),\n title: getUserRatingTitle(el),\n year: getUserRatingYear(el),\n type,\n url: getUserRatingUrl(el),\n colorRating: getUserRatingColorRating(el) as CSFDColorRating,\n userDate: getUserRatingDate(el),\n userRating: getUserRating(el) as CSFDStars\n };\n }\n}\n"],"mappings":";;;;;;AAkBA,IAAa,qBAAb,MAAgC;CAC9B,MAAa,YACX,MACA,QACA,SAC4B;EAC5B,IAAI,YAA+B,EAAE;EACrC,MAAM,cAAc,QAAQ,QAAQ;EACpC,MAAM,MAAMA,aAAAA,eAAe,MAAM,cAAc,IAAI,cAAc,KAAA,GAAW,EAC1E,UAAU,SAAS,UACpB,CAAC;EAEF,MAAM,SAAA,GAAA,iBAAA,OADW,MAAMC,cAAAA,UAAU,KAAK,EAAE,GAAG,SAAS,SAAS,CAAC,CACjC;EAC7B,MAAM,SAAS,MAAM,iBAAiB,6BAA6B;EAGnE,MAAM,YAAY,MAAM,cAAc,cAAc;EACpD,MAAM,QAAQ,CAAC,WAAW,WAAW,UAAU,WAAW,SAAS,GAAG,WAAW;AAEjF,cAAY,KAAK,QAAQ,QAAQ,OAAO;AAExC,MAAI,QAAQ,UAAU;AACpB,WAAQ,IAAI,QAAQ,MAAM,IAAI;AAC9B,WAAQ,IAAI,sBAAsB,MAAM;AACxC,QAAK,IAAI,IAAI,GAAG,KAAK,OAAO,KAAK;AAC/B,YAAQ,IAAI,iBAAiB,GAAG,UAAU,OAAO,MAAM;IAKvD,MAAM,UAAA,GAAA,iBAAA,OAHW,MAAMA,cAAAA,UADXD,aAAAA,eAAe,MAAM,GAAG,EAAE,UAAU,SAAS,UAAU,CAAC,EAC9B,EAAE,GAAG,SAAS,SAAS,CAAC,CAEjC,CACR,iBAAiB,6BAA6B;AACnE,gBAAY,CAAC,GAAG,WAAW,GAAG,KAAK,QAAQ,QAAQ,OAAO,CAAC;AAG3D,QAAI,OAAO,cACT,OAAME,sBAAAA,MAAM,OAAO,cAAc;;AAGrC,UAAO;;AAGT,SAAO;;CAGT,QAAgB,QAA8B,QAAuB;EACnE,MAAM,QAA2B,EAAE;AACnC,MAAI;OACE,OAAO,cAAc,UAAU,OAAO,UAAU,OAClD,SAAQ,KACN;;qDAGA,OAAO,aACR;;EAIL,MAAM,cAAc,QAAQ,cAAc,SAAS,IAAI,IAAI,OAAO,aAAa,GAAG;EAClF,MAAM,cAAc,QAAQ,UAAU,SAAS,IAAI,IAAI,OAAO,SAAS,GAAG;AAE1E,OAAK,MAAM,MAAM,QAAQ;GACvB,MAAM,OAAOC,4BAAAA,kBAAkB,GAAG;AAGlC,OAAI;QACE,YAAY,IAAI,KAAK,CACvB,OAAM,KAAK,KAAK,iBAAiB,IAAI,KAAK,CAAC;cAGpC;QACL,CAAC,YAAY,IAAI,KAAK,CACxB,OAAM,KAAK,KAAK,iBAAiB,IAAI,KAAK,CAAC;SAI7C,OAAM,KAAK,KAAK,iBAAiB,IAAI,KAAK,CAAC;;AAG/C,SAAO;;CAGT,iBAAyB,IAAiB,MAAsC;AAC9E,SAAO;GACL,IAAIC,4BAAAA,gBAAgB,GAAG;GACvB,OAAOC,4BAAAA,mBAAmB,GAAG;GAC7B,MAAMC,4BAAAA,kBAAkB,GAAG;GAC3B;GACA,KAAKC,4BAAAA,iBAAiB,GAAG;GACzB,aAAaC,4BAAAA,yBAAyB,GAAG;GACzC,UAAUC,4BAAAA,kBAAkB,GAAG;GAC/B,YAAYC,4BAAAA,cAAc,GAAG;GAC9B"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { CSFDUserRatingConfig, CSFDUserRatings } from "../dto/user-ratings.
|
|
2
|
-
import { CSFDOptions } from "../dto/options.
|
|
1
|
+
import { CSFDUserRatingConfig, CSFDUserRatings } from "../dto/user-ratings.cjs";
|
|
2
|
+
import { CSFDOptions } from "../dto/options.cjs";
|
|
3
3
|
|
|
4
4
|
//#region src/services/user-ratings.service.d.ts
|
|
5
5
|
declare class UserRatingsScraper {
|
|
@@ -9,4 +9,4 @@ declare class UserRatingsScraper {
|
|
|
9
9
|
}
|
|
10
10
|
//#endregion
|
|
11
11
|
export { UserRatingsScraper };
|
|
12
|
-
//# sourceMappingURL=user-ratings.service.d.
|
|
12
|
+
//# sourceMappingURL=user-ratings.service.d.cts.map
|
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
import { fetchPage } from "../fetchers/index.js";
|
|
2
|
+
import { userRatingsUrl } from "../vars.js";
|
|
3
|
+
import { sleep } from "../helpers/global.helper.js";
|
|
4
|
+
import { getUserRating, getUserRatingColorRating, getUserRatingDate, getUserRatingId, getUserRatingTitle, getUserRatingType, getUserRatingUrl, getUserRatingYear } from "../helpers/user-ratings.helper.js";
|
|
5
|
+
import { parse } from "node-html-parser";
|
|
6
6
|
//#region src/services/user-ratings.service.ts
|
|
7
7
|
var UserRatingsScraper = class {
|
|
8
8
|
async userRatings(user, config, options) {
|
|
9
9
|
let allMovies = [];
|
|
10
10
|
const pageToFetch = config?.page || 1;
|
|
11
|
-
const url =
|
|
12
|
-
const items =
|
|
11
|
+
const url = userRatingsUrl(user, pageToFetch > 1 ? pageToFetch : void 0, { language: options?.language });
|
|
12
|
+
const items = parse(await fetchPage(url, { ...options?.request }));
|
|
13
13
|
const movies = items.querySelectorAll("#snippet--ratings table tr");
|
|
14
14
|
const pagesNode = items.querySelector(".pagination");
|
|
15
15
|
const pages = +pagesNode?.childNodes[pagesNode.childNodes.length - 4].rawText || 1;
|
|
@@ -19,9 +19,9 @@ var UserRatingsScraper = class {
|
|
|
19
19
|
console.log("Fetching all pages", pages);
|
|
20
20
|
for (let i = 2; i <= pages; i++) {
|
|
21
21
|
console.log("Fetching page", i, "out of", pages, "...");
|
|
22
|
-
const movies =
|
|
22
|
+
const movies = parse(await fetchPage(userRatingsUrl(user, i, { language: options?.language }), { ...options?.request })).querySelectorAll("#snippet--ratings table tr");
|
|
23
23
|
allMovies = [...allMovies, ...this.getPage(config, movies)];
|
|
24
|
-
if (config.allPagesDelay) await
|
|
24
|
+
if (config.allPagesDelay) await sleep(config.allPagesDelay);
|
|
25
25
|
}
|
|
26
26
|
return allMovies;
|
|
27
27
|
}
|
|
@@ -37,7 +37,7 @@ var UserRatingsScraper = class {
|
|
|
37
37
|
const includesSet = config?.includesOnly?.length ? new Set(config.includesOnly) : null;
|
|
38
38
|
const excludesSet = config?.excludes?.length ? new Set(config.excludes) : null;
|
|
39
39
|
for (const el of movies) {
|
|
40
|
-
const type =
|
|
40
|
+
const type = getUserRatingType(el);
|
|
41
41
|
if (includesSet) {
|
|
42
42
|
if (includesSet.has(type)) films.push(this.buildUserRatings(el, type));
|
|
43
43
|
} else if (excludesSet) {
|
|
@@ -48,18 +48,18 @@ var UserRatingsScraper = class {
|
|
|
48
48
|
}
|
|
49
49
|
buildUserRatings(el, type) {
|
|
50
50
|
return {
|
|
51
|
-
id:
|
|
52
|
-
title:
|
|
53
|
-
year:
|
|
51
|
+
id: getUserRatingId(el),
|
|
52
|
+
title: getUserRatingTitle(el),
|
|
53
|
+
year: getUserRatingYear(el),
|
|
54
54
|
type,
|
|
55
|
-
url:
|
|
56
|
-
colorRating:
|
|
57
|
-
userDate:
|
|
58
|
-
userRating:
|
|
55
|
+
url: getUserRatingUrl(el),
|
|
56
|
+
colorRating: getUserRatingColorRating(el),
|
|
57
|
+
userDate: getUserRatingDate(el),
|
|
58
|
+
userRating: getUserRating(el)
|
|
59
59
|
};
|
|
60
60
|
}
|
|
61
61
|
};
|
|
62
62
|
//#endregion
|
|
63
|
-
|
|
63
|
+
export { UserRatingsScraper };
|
|
64
64
|
|
|
65
65
|
//# sourceMappingURL=user-ratings.service.js.map
|