node-csfd-api 3.0.0-next.9 → 3.0.1
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/LICENSE +21 -0
- package/README.md +89 -44
- package/_virtual/rolldown_runtime.js +25 -0
- package/dto/cinema.d.mts +28 -0
- package/dto/cinema.d.ts +28 -0
- package/dto/creator.d.mts +17 -0
- package/dto/creator.d.ts +17 -0
- package/dto/global.d.mts +26 -0
- package/dto/global.d.ts +26 -0
- package/dto/movie.d.mts +71 -0
- package/dto/movie.d.ts +71 -0
- package/dto/search.d.mts +32 -0
- package/dto/search.d.ts +32 -0
- package/dto/user-ratings.d.mts +23 -0
- package/dto/user-ratings.d.ts +23 -0
- package/fetchers/fetch.polyfill.js +10 -0
- package/fetchers/fetch.polyfill.js.map +1 -0
- package/fetchers/fetch.polyfill.mjs +8 -0
- package/fetchers/fetch.polyfill.mjs.map +1 -0
- package/fetchers/index.js +24 -0
- package/fetchers/index.js.map +1 -0
- package/fetchers/index.mjs +24 -0
- package/fetchers/index.mjs.map +1 -0
- package/helpers/cinema.helper.js +84 -0
- package/helpers/cinema.helper.js.map +1 -0
- package/helpers/cinema.helper.mjs +80 -0
- package/helpers/cinema.helper.mjs.map +1 -0
- package/helpers/creator.helper.js +73 -0
- package/helpers/creator.helper.js.map +1 -0
- package/helpers/creator.helper.mjs +69 -0
- package/helpers/creator.helper.mjs.map +1 -0
- package/helpers/global.helper.js +50 -0
- package/helpers/global.helper.js.map +1 -0
- package/helpers/global.helper.mjs +45 -0
- package/helpers/global.helper.mjs.map +1 -0
- package/helpers/movie.helper.js +162 -0
- package/helpers/movie.helper.js.map +1 -0
- package/helpers/movie.helper.mjs +144 -0
- package/helpers/movie.helper.mjs.map +1 -0
- package/helpers/search-user.helper.js +29 -0
- package/helpers/search-user.helper.js.map +1 -0
- package/helpers/search-user.helper.mjs +24 -0
- package/helpers/search-user.helper.mjs.map +1 -0
- package/helpers/search.helper.js +52 -0
- package/helpers/search.helper.js.map +1 -0
- package/helpers/search.helper.mjs +45 -0
- package/helpers/search.helper.mjs.map +1 -0
- package/helpers/user-ratings.helper.js +52 -0
- package/helpers/user-ratings.helper.js.map +1 -0
- package/helpers/user-ratings.helper.mjs +44 -0
- package/helpers/user-ratings.helper.mjs.map +1 -0
- package/index.d.mts +30 -0
- package/index.d.ts +30 -0
- package/index.js +42 -0
- package/index.js.map +1 -0
- package/index.mjs +41 -0
- package/index.mjs.map +1 -0
- package/package.json +15 -28
- package/services/cinema.service.d.mts +11 -0
- package/services/cinema.service.d.ts +11 -0
- package/services/cinema.service.js +35 -0
- package/services/cinema.service.js.map +1 -0
- package/services/cinema.service.mjs +33 -0
- package/services/cinema.service.mjs.map +1 -0
- package/services/creator.service.d.mts +11 -0
- package/services/creator.service.d.ts +11 -0
- package/services/creator.service.js +35 -0
- package/services/creator.service.js.map +1 -0
- package/services/creator.service.mjs +33 -0
- package/services/creator.service.mjs.map +1 -0
- package/services/movie.service.d.mts +11 -0
- package/services/movie.service.d.ts +11 -0
- package/services/movie.service.js +62 -0
- package/services/movie.service.js.map +1 -0
- package/services/movie.service.mjs +60 -0
- package/services/movie.service.mjs.map +1 -0
- package/services/search.service.d.mts +10 -0
- package/services/search.service.d.ts +10 -0
- package/services/search.service.js +81 -0
- package/services/search.service.js.map +1 -0
- package/services/search.service.mjs +79 -0
- package/services/search.service.mjs.map +1 -0
- package/services/user-ratings.service.d.mts +12 -0
- package/services/user-ratings.service.d.ts +12 -0
- package/services/user-ratings.service.js +66 -0
- package/services/user-ratings.service.js.map +1 -0
- package/services/user-ratings.service.mjs +64 -0
- package/services/user-ratings.service.mjs.map +1 -0
- package/{cjs/vars.js → vars.js} +13 -7
- package/vars.js.map +1 -0
- package/vars.mjs +12 -0
- package/vars.mjs.map +1 -0
- package/cjs/fetchers/index.js +0 -41
- package/cjs/helpers/creator.helper.js +0 -86
- package/cjs/helpers/global.helper.js +0 -64
- package/cjs/helpers/movie.helper.js +0 -248
- package/cjs/helpers/search-user.helper.js +0 -22
- package/cjs/helpers/search.helper.js +0 -60
- package/cjs/helpers/user-ratings.helper.js +0 -60
- package/cjs/index.js +0 -50
- package/cjs/services/creator.service.js +0 -43
- package/cjs/services/movie.service.js +0 -69
- package/cjs/services/search.service.js +0 -91
- package/cjs/services/user-ratings.service.js +0 -95
- package/esm/fetchers/index.js +0 -37
- package/esm/helpers/creator.helper.js +0 -73
- package/esm/helpers/global.helper.js +0 -56
- package/esm/helpers/movie.helper.js +0 -223
- package/esm/helpers/search-user.helper.js +0 -15
- package/esm/helpers/search.helper.js +0 -49
- package/esm/helpers/user-ratings.helper.js +0 -47
- package/esm/index.js +0 -46
- package/esm/services/creator.service.js +0 -39
- package/esm/services/movie.service.js +0 -65
- package/esm/services/search.service.js +0 -87
- package/esm/services/user-ratings.service.js +0 -91
- package/esm/vars.js +0 -4
- package/types/fetchers/index.d.ts +0 -1
- package/types/helpers/creator.helper.d.ts +0 -17
- package/types/helpers/global.helper.d.ts +0 -7
- package/types/helpers/movie.helper.d.ts +0 -25
- package/types/helpers/search-user.helper.d.ts +0 -5
- package/types/helpers/search.helper.d.ts +0 -11
- package/types/helpers/user-ratings.helper.d.ts +0 -13
- package/types/index.d.ts +0 -20
- package/types/index.ts +0 -22
- package/types/interfaces/creator.interface.d.ts +0 -12
- package/types/interfaces/global.d.ts +0 -22
- package/types/interfaces/movie.interface.d.ts +0 -66
- package/types/interfaces/search.interface.d.ts +0 -27
- package/types/interfaces/user-ratings.interface.d.ts +0 -18
- package/types/services/creator.service.d.ts +0 -6
- package/types/services/movie.service.d.ts +0 -6
- package/types/services/search.service.d.ts +0 -5
- package/types/services/user-ratings.service.d.ts +0 -7
- package/types/vars.d.ts +0 -4
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { fetchPage } from "../fetchers/index.mjs";
|
|
2
|
+
import { movieUrl } from "../vars.mjs";
|
|
3
|
+
import { getMovieBoxMovies, getMovieColorRating, getMovieDescriptions, getMovieDuration, getMovieGenres, getMovieGroup, getMovieOrigins, getMoviePoster, getMoviePremieres, getMovieRandomPhoto, getMovieRating, getMovieRatingCount, getMovieTags, getMovieTitle, getMovieTitlesOther, getMovieTrivia, getMovieType, getMovieVods, getMovieYear } from "../helpers/movie.helper.mjs";
|
|
4
|
+
import { parse } from "node-html-parser";
|
|
5
|
+
|
|
6
|
+
//#region src/services/movie.service.ts
|
|
7
|
+
var MovieScraper = class {
|
|
8
|
+
async movie(movieId) {
|
|
9
|
+
const id = Number(movieId);
|
|
10
|
+
if (isNaN(id)) throw new Error("node-csfd-api: movieId must be a valid number");
|
|
11
|
+
const movieHtml = parse(await fetchPage(movieUrl(id)));
|
|
12
|
+
const pageClasses = movieHtml.querySelector(".page-content").classNames.split(" ");
|
|
13
|
+
const asideNode = movieHtml.querySelector(".aside-movie-profile");
|
|
14
|
+
const movieNode = movieHtml.querySelector(".main-movie-profile");
|
|
15
|
+
const jsonLd = movieHtml.querySelector("script[type=\"application/ld+json\"]").innerText;
|
|
16
|
+
this.buildMovie(+movieId, movieNode, asideNode, pageClasses, jsonLd);
|
|
17
|
+
return this.film;
|
|
18
|
+
}
|
|
19
|
+
buildMovie(movieId, el, asideEl, pageClasses, jsonLd) {
|
|
20
|
+
this.film = {
|
|
21
|
+
id: movieId,
|
|
22
|
+
title: getMovieTitle(el),
|
|
23
|
+
year: getMovieYear(jsonLd),
|
|
24
|
+
duration: getMovieDuration(jsonLd, el),
|
|
25
|
+
descriptions: getMovieDescriptions(el),
|
|
26
|
+
genres: getMovieGenres(el),
|
|
27
|
+
type: getMovieType(el),
|
|
28
|
+
url: movieUrl(movieId),
|
|
29
|
+
origins: getMovieOrigins(el),
|
|
30
|
+
colorRating: getMovieColorRating(pageClasses),
|
|
31
|
+
rating: getMovieRating(asideEl),
|
|
32
|
+
ratingCount: getMovieRatingCount(asideEl),
|
|
33
|
+
titlesOther: getMovieTitlesOther(el),
|
|
34
|
+
poster: getMoviePoster(el),
|
|
35
|
+
photo: getMovieRandomPhoto(el),
|
|
36
|
+
trivia: getMovieTrivia(el),
|
|
37
|
+
creators: {
|
|
38
|
+
directors: getMovieGroup(el, "Režie"),
|
|
39
|
+
writers: getMovieGroup(el, "Scénář"),
|
|
40
|
+
cinematography: getMovieGroup(el, "Kamera"),
|
|
41
|
+
music: getMovieGroup(el, "Hudba"),
|
|
42
|
+
actors: getMovieGroup(el, "Hrají"),
|
|
43
|
+
basedOn: getMovieGroup(el, "Předloha"),
|
|
44
|
+
producers: getMovieGroup(el, "Produkce"),
|
|
45
|
+
filmEditing: getMovieGroup(el, "Střih"),
|
|
46
|
+
costumeDesign: getMovieGroup(el, "Kostýmy"),
|
|
47
|
+
productionDesign: getMovieGroup(el, "Scénografie")
|
|
48
|
+
},
|
|
49
|
+
vod: getMovieVods(asideEl),
|
|
50
|
+
tags: getMovieTags(asideEl),
|
|
51
|
+
premieres: getMoviePremieres(asideEl),
|
|
52
|
+
related: getMovieBoxMovies(asideEl, "Související"),
|
|
53
|
+
similar: getMovieBoxMovies(asideEl, "Podobné")
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
//#endregion
|
|
59
|
+
export { MovieScraper };
|
|
60
|
+
//# sourceMappingURL=movie.service.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"movie.service.mjs","names":[],"sources":["../../src/services/movie.service.ts"],"sourcesContent":["import { HTMLElement, parse } from 'node-html-parser';\nimport { CSFDFilmTypes } from '../dto/global';\nimport { CSFDMovie } from '../dto/movie';\nimport { fetchPage } from '../fetchers';\nimport {\n getMovieBoxMovies,\n getMovieColorRating,\n getMovieDescriptions,\n getMovieDuration,\n getMovieGenres,\n getMovieGroup,\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} from '../helpers/movie.helper';\nimport { movieUrl } from '../vars';\n\nexport class MovieScraper {\n private film: CSFDMovie;\n\n public async movie(movieId: number): 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);\n const response = await fetchPage(url);\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 jsonLd = movieHtml.querySelector('script[type=\"application/ld+json\"]').innerText;\n this.buildMovie(+movieId, movieNode, asideNode, pageClasses, jsonLd);\n return this.film;\n }\n\n private buildMovie(\n movieId: number,\n el: HTMLElement,\n asideEl: HTMLElement,\n pageClasses: string[],\n jsonLd: string\n ) {\n this.film = {\n id: movieId,\n title: getMovieTitle(el),\n year: getMovieYear(jsonLd),\n duration: getMovieDuration(jsonLd, el),\n descriptions: getMovieDescriptions(el),\n genres: getMovieGenres(el),\n type: getMovieType(el) as CSFDFilmTypes,\n url: movieUrl(movieId),\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: {\n directors: getMovieGroup(el, 'Režie'),\n writers: getMovieGroup(el, 'Scénář'),\n cinematography: getMovieGroup(el, 'Kamera'),\n music: getMovieGroup(el, 'Hudba'),\n actors: getMovieGroup(el, 'Hrají'),\n basedOn: getMovieGroup(el, 'Předloha'),\n producers: getMovieGroup(el, 'Produkce'),\n filmEditing: getMovieGroup(el, 'Střih'),\n costumeDesign: getMovieGroup(el, 'Kostýmy'),\n productionDesign: getMovieGroup(el, 'Scénografie')\n },\n vod: getMovieVods(asideEl),\n tags: getMovieTags(asideEl),\n premieres: getMoviePremieres(asideEl),\n related: getMovieBoxMovies(asideEl, 'Související'),\n similar: getMovieBoxMovies(asideEl, 'Podobné')\n };\n }\n}\n"],"mappings":";;;;;;AA2BA,IAAa,eAAb,MAA0B;CAGxB,MAAa,MAAM,SAAqC;EACtD,MAAM,KAAK,OAAO,QAAQ;AAC1B,MAAI,MAAM,GAAG,CACX,OAAM,IAAI,MAAM,gDAAgD;EAKlE,MAAM,YAAY,MAFD,MAAM,UADX,SAAS,GAAG,CACa,CAEJ;EAEjC,MAAM,cAAc,UAAU,cAAc,gBAAgB,CAAC,WAAW,MAAM,IAAI;EAClF,MAAM,YAAY,UAAU,cAAc,uBAAuB;EACjE,MAAM,YAAY,UAAU,cAAc,sBAAsB;EAChE,MAAM,SAAS,UAAU,cAAc,uCAAqC,CAAC;AAC7E,OAAK,WAAW,CAAC,SAAS,WAAW,WAAW,aAAa,OAAO;AACpE,SAAO,KAAK;;CAGd,AAAQ,WACN,SACA,IACA,SACA,aACA,QACA;AACA,OAAK,OAAO;GACV,IAAI;GACJ,OAAO,cAAc,GAAG;GACxB,MAAM,aAAa,OAAO;GAC1B,UAAU,iBAAiB,QAAQ,GAAG;GACtC,cAAc,qBAAqB,GAAG;GACtC,QAAQ,eAAe,GAAG;GAC1B,MAAM,aAAa,GAAG;GACtB,KAAK,SAAS,QAAQ;GACtB,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;IACR,WAAW,cAAc,IAAI,QAAQ;IACrC,SAAS,cAAc,IAAI,SAAS;IACpC,gBAAgB,cAAc,IAAI,SAAS;IAC3C,OAAO,cAAc,IAAI,QAAQ;IACjC,QAAQ,cAAc,IAAI,QAAQ;IAClC,SAAS,cAAc,IAAI,WAAW;IACtC,WAAW,cAAc,IAAI,WAAW;IACxC,aAAa,cAAc,IAAI,QAAQ;IACvC,eAAe,cAAc,IAAI,UAAU;IAC3C,kBAAkB,cAAc,IAAI,cAAc;IACnD;GACD,KAAK,aAAa,QAAQ;GAC1B,MAAM,aAAa,QAAQ;GAC3B,WAAW,kBAAkB,QAAQ;GACrC,SAAS,kBAAkB,SAAS,cAAc;GAClD,SAAS,kBAAkB,SAAS,UAAU;GAC/C"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { CSFDSearch } from "../dto/search.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/services/search.service.d.ts
|
|
4
|
+
declare class SearchScraper {
|
|
5
|
+
search(text: string): Promise<CSFDSearch>;
|
|
6
|
+
private parseSearch;
|
|
7
|
+
}
|
|
8
|
+
//#endregion
|
|
9
|
+
export { SearchScraper };
|
|
10
|
+
//# sourceMappingURL=search.service.d.mts.map
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { CSFDSearch } from "../dto/search.js";
|
|
2
|
+
|
|
3
|
+
//#region src/services/search.service.d.ts
|
|
4
|
+
declare class SearchScraper {
|
|
5
|
+
search(text: string): Promise<CSFDSearch>;
|
|
6
|
+
private parseSearch;
|
|
7
|
+
}
|
|
8
|
+
//#endregion
|
|
9
|
+
export { SearchScraper };
|
|
10
|
+
//# sourceMappingURL=search.service.d.ts.map
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
const require_rolldown_runtime = require('../_virtual/rolldown_runtime.js');
|
|
2
|
+
const require_index = require('../fetchers/index.js');
|
|
3
|
+
const require_vars = require('../vars.js');
|
|
4
|
+
const require_global_helper = require('../helpers/global.helper.js');
|
|
5
|
+
const require_search_user_helper = require('../helpers/search-user.helper.js');
|
|
6
|
+
const require_search_helper = require('../helpers/search.helper.js');
|
|
7
|
+
let node_html_parser = require("node-html-parser");
|
|
8
|
+
node_html_parser = require_rolldown_runtime.__toESM(node_html_parser);
|
|
9
|
+
|
|
10
|
+
//#region src/services/search.service.ts
|
|
11
|
+
var SearchScraper = class {
|
|
12
|
+
async search(text) {
|
|
13
|
+
const html = (0, node_html_parser.parse)(await require_index.fetchPage(require_vars.searchUrl(text)));
|
|
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
|
+
return this.parseSearch(moviesNode, usersNode, tvSeriesNode);
|
|
18
|
+
}
|
|
19
|
+
parseSearch(moviesNode, usersNode, tvSeriesNode) {
|
|
20
|
+
const movies = [];
|
|
21
|
+
const users = [];
|
|
22
|
+
const tvSeries = [];
|
|
23
|
+
moviesNode.forEach((m) => {
|
|
24
|
+
const url = require_search_helper.getSearchUrl(m);
|
|
25
|
+
const movie = {
|
|
26
|
+
id: require_global_helper.parseIdFromUrl(url),
|
|
27
|
+
title: require_search_helper.getSearchTitle(m),
|
|
28
|
+
year: require_search_helper.getSearchYear(m),
|
|
29
|
+
url: `https://www.csfd.cz${url}`,
|
|
30
|
+
type: require_search_helper.getSearchType(m),
|
|
31
|
+
colorRating: require_search_helper.getSearchColorRating(m),
|
|
32
|
+
poster: require_search_helper.getSearchPoster(m),
|
|
33
|
+
origins: require_search_helper.getSearchOrigins(m),
|
|
34
|
+
creators: {
|
|
35
|
+
directors: require_search_helper.parseSearchPeople(m, "directors"),
|
|
36
|
+
actors: require_search_helper.parseSearchPeople(m, "actors")
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
movies.push(movie);
|
|
40
|
+
});
|
|
41
|
+
usersNode.forEach((m) => {
|
|
42
|
+
const url = require_search_user_helper.getUserUrl(m);
|
|
43
|
+
const user = {
|
|
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: `https://www.csfd.cz${url}`
|
|
49
|
+
};
|
|
50
|
+
users.push(user);
|
|
51
|
+
});
|
|
52
|
+
tvSeriesNode.forEach((m) => {
|
|
53
|
+
const url = require_search_helper.getSearchUrl(m);
|
|
54
|
+
const user = {
|
|
55
|
+
id: require_global_helper.parseIdFromUrl(url),
|
|
56
|
+
title: require_search_helper.getSearchTitle(m),
|
|
57
|
+
year: require_search_helper.getSearchYear(m),
|
|
58
|
+
url: `https://www.csfd.cz${url}`,
|
|
59
|
+
type: require_search_helper.getSearchType(m),
|
|
60
|
+
colorRating: require_search_helper.getSearchColorRating(m),
|
|
61
|
+
poster: require_search_helper.getSearchPoster(m),
|
|
62
|
+
origins: require_search_helper.getSearchOrigins(m),
|
|
63
|
+
creators: {
|
|
64
|
+
directors: require_search_helper.parseSearchPeople(m, "directors"),
|
|
65
|
+
actors: require_search_helper.parseSearchPeople(m, "actors")
|
|
66
|
+
}
|
|
67
|
+
};
|
|
68
|
+
tvSeries.push(user);
|
|
69
|
+
});
|
|
70
|
+
return {
|
|
71
|
+
movies,
|
|
72
|
+
users,
|
|
73
|
+
tvSeries,
|
|
74
|
+
creators: []
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
//#endregion
|
|
80
|
+
exports.SearchScraper = SearchScraper;
|
|
81
|
+
//# sourceMappingURL=search.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.service.js","names":["fetchPage","searchUrl","movies: CSFDSearchMovie[]","users: CSFDSearchUser[]","tvSeries: CSFDSearchMovie[]","getSearchUrl","movie: CSFDSearchMovie","parseIdFromUrl","getSearchTitle","getSearchYear","getSearchType","getSearchColorRating","getSearchPoster","getSearchOrigins","parseSearchPeople","getUserUrl","user: CSFDSearchUser","getUser","getUserRealName","getAvatar","user: CSFDSearchMovie"],"sources":["../../src/services/search.service.ts"],"sourcesContent":["import { HTMLElement, parse } from 'node-html-parser';\nimport { CSFDSearch, CSFDSearchMovie, CSFDSearchUser } from '../dto/search';\nimport { fetchPage } from '../fetchers';\nimport { parseIdFromUrl } from '../helpers/global.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 { searchUrl } from '../vars';\n\nexport class SearchScraper {\n public async search(text: string): Promise<CSFDSearch> {\n const url = searchUrl(text);\n const response = await fetchPage(url);\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\n return this.parseSearch(moviesNode, usersNode, tvSeriesNode);\n }\n\n private parseSearch(\n moviesNode: HTMLElement[],\n usersNode: HTMLElement[],\n tvSeriesNode: HTMLElement[]\n ) {\n const movies: CSFDSearchMovie[] = [];\n const users: CSFDSearchUser[] = [];\n const tvSeries: CSFDSearchMovie[] = [];\n\n moviesNode.forEach((m) => {\n const url = getSearchUrl(m);\n\n const movie: CSFDSearchMovie = {\n id: parseIdFromUrl(url),\n title: getSearchTitle(m),\n year: getSearchYear(m),\n url: `https://www.csfd.cz${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 movies.push(movie);\n });\n\n usersNode.forEach((m) => {\n const url = getUserUrl(m);\n\n const user: CSFDSearchUser = {\n id: parseIdFromUrl(url),\n user: getUser(m),\n userRealName: getUserRealName(m),\n avatar: getAvatar(m),\n url: `https://www.csfd.cz${url}`\n };\n users.push(user);\n });\n\n tvSeriesNode.forEach((m) => {\n const url = getSearchUrl(m);\n\n const user: CSFDSearchMovie = {\n id: parseIdFromUrl(url),\n title: getSearchTitle(m),\n year: getSearchYear(m),\n url: `https://www.csfd.cz${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 tvSeries.push(user);\n });\n\n const search: CSFDSearch = {\n movies: movies,\n users: users,\n tvSeries: tvSeries,\n creators: []\n };\n return search;\n }\n}\n"],"mappings":";;;;;;;;;;AAiBA,IAAa,gBAAb,MAA2B;CACzB,MAAa,OAAO,MAAmC;EAIrD,MAAM,mCAFW,MAAMA,wBADXC,uBAAU,KAAK,CACU,CAET;EAC5B,MAAM,aAAa,KAAK,iBAAiB,uBAAuB;EAChE,MAAM,YAAY,KAAK,iBAAiB,sBAAsB;EAC9D,MAAM,eAAe,KAAK,iBAAiB,uBAAuB;AAElE,SAAO,KAAK,YAAY,YAAY,WAAW,aAAa;;CAG9D,AAAQ,YACN,YACA,WACA,cACA;EACA,MAAMC,SAA4B,EAAE;EACpC,MAAMC,QAA0B,EAAE;EAClC,MAAMC,WAA8B,EAAE;AAEtC,aAAW,SAAS,MAAM;GACxB,MAAM,MAAMC,mCAAa,EAAE;GAE3B,MAAMC,QAAyB;IAC7B,IAAIC,qCAAe,IAAI;IACvB,OAAOC,qCAAe,EAAE;IACxB,MAAMC,oCAAc,EAAE;IACtB,KAAK,sBAAsB;IAC3B,MAAMC,oCAAc,EAAE;IACtB,aAAaC,2CAAqB,EAAE;IACpC,QAAQC,sCAAgB,EAAE;IAC1B,SAASC,uCAAiB,EAAE;IAC5B,UAAU;KACR,WAAWC,wCAAkB,GAAG,YAAY;KAC5C,QAAQA,wCAAkB,GAAG,SAAS;KACvC;IACF;AACD,UAAO,KAAK,MAAM;IAClB;AAEF,YAAU,SAAS,MAAM;GACvB,MAAM,MAAMC,sCAAW,EAAE;GAEzB,MAAMC,OAAuB;IAC3B,IAAIT,qCAAe,IAAI;IACvB,MAAMU,mCAAQ,EAAE;IAChB,cAAcC,2CAAgB,EAAE;IAChC,QAAQC,qCAAU,EAAE;IACpB,KAAK,sBAAsB;IAC5B;AACD,SAAM,KAAK,KAAK;IAChB;AAEF,eAAa,SAAS,MAAM;GAC1B,MAAM,MAAMd,mCAAa,EAAE;GAE3B,MAAMe,OAAwB;IAC5B,IAAIb,qCAAe,IAAI;IACvB,OAAOC,qCAAe,EAAE;IACxB,MAAMC,oCAAc,EAAE;IACtB,KAAK,sBAAsB;IAC3B,MAAMC,oCAAc,EAAE;IACtB,aAAaC,2CAAqB,EAAE;IACpC,QAAQC,sCAAgB,EAAE;IAC1B,SAASC,uCAAiB,EAAE;IAC5B,UAAU;KACR,WAAWC,wCAAkB,GAAG,YAAY;KAC5C,QAAQA,wCAAkB,GAAG,SAAS;KACvC;IACF;AACD,YAAS,KAAK,KAAK;IACnB;AAQF,SAN2B;GACjB;GACD;GACG;GACV,UAAU,EAAE;GACb"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { fetchPage } from "../fetchers/index.mjs";
|
|
2
|
+
import { searchUrl } from "../vars.mjs";
|
|
3
|
+
import { parseIdFromUrl } from "../helpers/global.helper.mjs";
|
|
4
|
+
import { getAvatar, getUser, getUserRealName, getUserUrl } from "../helpers/search-user.helper.mjs";
|
|
5
|
+
import { getSearchColorRating, getSearchOrigins, getSearchPoster, getSearchTitle, getSearchType, getSearchUrl, getSearchYear, parseSearchPeople } from "../helpers/search.helper.mjs";
|
|
6
|
+
import { parse } from "node-html-parser";
|
|
7
|
+
|
|
8
|
+
//#region src/services/search.service.ts
|
|
9
|
+
var SearchScraper = class {
|
|
10
|
+
async search(text) {
|
|
11
|
+
const html = parse(await fetchPage(searchUrl(text)));
|
|
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
|
+
return this.parseSearch(moviesNode, usersNode, tvSeriesNode);
|
|
16
|
+
}
|
|
17
|
+
parseSearch(moviesNode, usersNode, tvSeriesNode) {
|
|
18
|
+
const movies = [];
|
|
19
|
+
const users = [];
|
|
20
|
+
const tvSeries = [];
|
|
21
|
+
moviesNode.forEach((m) => {
|
|
22
|
+
const url = getSearchUrl(m);
|
|
23
|
+
const movie = {
|
|
24
|
+
id: parseIdFromUrl(url),
|
|
25
|
+
title: getSearchTitle(m),
|
|
26
|
+
year: getSearchYear(m),
|
|
27
|
+
url: `https://www.csfd.cz${url}`,
|
|
28
|
+
type: getSearchType(m),
|
|
29
|
+
colorRating: getSearchColorRating(m),
|
|
30
|
+
poster: getSearchPoster(m),
|
|
31
|
+
origins: getSearchOrigins(m),
|
|
32
|
+
creators: {
|
|
33
|
+
directors: parseSearchPeople(m, "directors"),
|
|
34
|
+
actors: parseSearchPeople(m, "actors")
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
movies.push(movie);
|
|
38
|
+
});
|
|
39
|
+
usersNode.forEach((m) => {
|
|
40
|
+
const url = getUserUrl(m);
|
|
41
|
+
const user = {
|
|
42
|
+
id: parseIdFromUrl(url),
|
|
43
|
+
user: getUser(m),
|
|
44
|
+
userRealName: getUserRealName(m),
|
|
45
|
+
avatar: getAvatar(m),
|
|
46
|
+
url: `https://www.csfd.cz${url}`
|
|
47
|
+
};
|
|
48
|
+
users.push(user);
|
|
49
|
+
});
|
|
50
|
+
tvSeriesNode.forEach((m) => {
|
|
51
|
+
const url = getSearchUrl(m);
|
|
52
|
+
const user = {
|
|
53
|
+
id: parseIdFromUrl(url),
|
|
54
|
+
title: getSearchTitle(m),
|
|
55
|
+
year: getSearchYear(m),
|
|
56
|
+
url: `https://www.csfd.cz${url}`,
|
|
57
|
+
type: getSearchType(m),
|
|
58
|
+
colorRating: getSearchColorRating(m),
|
|
59
|
+
poster: getSearchPoster(m),
|
|
60
|
+
origins: getSearchOrigins(m),
|
|
61
|
+
creators: {
|
|
62
|
+
directors: parseSearchPeople(m, "directors"),
|
|
63
|
+
actors: parseSearchPeople(m, "actors")
|
|
64
|
+
}
|
|
65
|
+
};
|
|
66
|
+
tvSeries.push(user);
|
|
67
|
+
});
|
|
68
|
+
return {
|
|
69
|
+
movies,
|
|
70
|
+
users,
|
|
71
|
+
tvSeries,
|
|
72
|
+
creators: []
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
//#endregion
|
|
78
|
+
export { SearchScraper };
|
|
79
|
+
//# sourceMappingURL=search.service.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.service.mjs","names":["movies: CSFDSearchMovie[]","users: CSFDSearchUser[]","tvSeries: CSFDSearchMovie[]","movie: CSFDSearchMovie","user: CSFDSearchUser","user: CSFDSearchMovie"],"sources":["../../src/services/search.service.ts"],"sourcesContent":["import { HTMLElement, parse } from 'node-html-parser';\nimport { CSFDSearch, CSFDSearchMovie, CSFDSearchUser } from '../dto/search';\nimport { fetchPage } from '../fetchers';\nimport { parseIdFromUrl } from '../helpers/global.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 { searchUrl } from '../vars';\n\nexport class SearchScraper {\n public async search(text: string): Promise<CSFDSearch> {\n const url = searchUrl(text);\n const response = await fetchPage(url);\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\n return this.parseSearch(moviesNode, usersNode, tvSeriesNode);\n }\n\n private parseSearch(\n moviesNode: HTMLElement[],\n usersNode: HTMLElement[],\n tvSeriesNode: HTMLElement[]\n ) {\n const movies: CSFDSearchMovie[] = [];\n const users: CSFDSearchUser[] = [];\n const tvSeries: CSFDSearchMovie[] = [];\n\n moviesNode.forEach((m) => {\n const url = getSearchUrl(m);\n\n const movie: CSFDSearchMovie = {\n id: parseIdFromUrl(url),\n title: getSearchTitle(m),\n year: getSearchYear(m),\n url: `https://www.csfd.cz${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 movies.push(movie);\n });\n\n usersNode.forEach((m) => {\n const url = getUserUrl(m);\n\n const user: CSFDSearchUser = {\n id: parseIdFromUrl(url),\n user: getUser(m),\n userRealName: getUserRealName(m),\n avatar: getAvatar(m),\n url: `https://www.csfd.cz${url}`\n };\n users.push(user);\n });\n\n tvSeriesNode.forEach((m) => {\n const url = getSearchUrl(m);\n\n const user: CSFDSearchMovie = {\n id: parseIdFromUrl(url),\n title: getSearchTitle(m),\n year: getSearchYear(m),\n url: `https://www.csfd.cz${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 tvSeries.push(user);\n });\n\n const search: CSFDSearch = {\n movies: movies,\n users: users,\n tvSeries: tvSeries,\n creators: []\n };\n return search;\n }\n}\n"],"mappings":";;;;;;;;AAiBA,IAAa,gBAAb,MAA2B;CACzB,MAAa,OAAO,MAAmC;EAIrD,MAAM,OAAO,MAFI,MAAM,UADX,UAAU,KAAK,CACU,CAET;EAC5B,MAAM,aAAa,KAAK,iBAAiB,uBAAuB;EAChE,MAAM,YAAY,KAAK,iBAAiB,sBAAsB;EAC9D,MAAM,eAAe,KAAK,iBAAiB,uBAAuB;AAElE,SAAO,KAAK,YAAY,YAAY,WAAW,aAAa;;CAG9D,AAAQ,YACN,YACA,WACA,cACA;EACA,MAAMA,SAA4B,EAAE;EACpC,MAAMC,QAA0B,EAAE;EAClC,MAAMC,WAA8B,EAAE;AAEtC,aAAW,SAAS,MAAM;GACxB,MAAM,MAAM,aAAa,EAAE;GAE3B,MAAMC,QAAyB;IAC7B,IAAI,eAAe,IAAI;IACvB,OAAO,eAAe,EAAE;IACxB,MAAM,cAAc,EAAE;IACtB,KAAK,sBAAsB;IAC3B,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;AACD,UAAO,KAAK,MAAM;IAClB;AAEF,YAAU,SAAS,MAAM;GACvB,MAAM,MAAM,WAAW,EAAE;GAEzB,MAAMC,OAAuB;IAC3B,IAAI,eAAe,IAAI;IACvB,MAAM,QAAQ,EAAE;IAChB,cAAc,gBAAgB,EAAE;IAChC,QAAQ,UAAU,EAAE;IACpB,KAAK,sBAAsB;IAC5B;AACD,SAAM,KAAK,KAAK;IAChB;AAEF,eAAa,SAAS,MAAM;GAC1B,MAAM,MAAM,aAAa,EAAE;GAE3B,MAAMC,OAAwB;IAC5B,IAAI,eAAe,IAAI;IACvB,OAAO,eAAe,EAAE;IACxB,MAAM,cAAc,EAAE;IACtB,KAAK,sBAAsB;IAC3B,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;AACD,YAAS,KAAK,KAAK;IACnB;AAQF,SAN2B;GACjB;GACD;GACG;GACV,UAAU,EAAE;GACb"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { CSFDUserRatingConfig, CSFDUserRatings } from "../dto/user-ratings.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/services/user-ratings.service.d.ts
|
|
4
|
+
declare class UserRatingsScraper {
|
|
5
|
+
private films;
|
|
6
|
+
userRatings(user: string | number, config?: CSFDUserRatingConfig): Promise<CSFDUserRatings[]>;
|
|
7
|
+
private getPage;
|
|
8
|
+
private buildUserRatings;
|
|
9
|
+
}
|
|
10
|
+
//#endregion
|
|
11
|
+
export { UserRatingsScraper };
|
|
12
|
+
//# sourceMappingURL=user-ratings.service.d.mts.map
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { CSFDUserRatingConfig, CSFDUserRatings } from "../dto/user-ratings.js";
|
|
2
|
+
|
|
3
|
+
//#region src/services/user-ratings.service.d.ts
|
|
4
|
+
declare class UserRatingsScraper {
|
|
5
|
+
private films;
|
|
6
|
+
userRatings(user: string | number, config?: CSFDUserRatingConfig): Promise<CSFDUserRatings[]>;
|
|
7
|
+
private getPage;
|
|
8
|
+
private buildUserRatings;
|
|
9
|
+
}
|
|
10
|
+
//#endregion
|
|
11
|
+
export { UserRatingsScraper };
|
|
12
|
+
//# sourceMappingURL=user-ratings.service.d.ts.map
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
const require_rolldown_runtime = require('../_virtual/rolldown_runtime.js');
|
|
2
|
+
const require_index = require('../fetchers/index.js');
|
|
3
|
+
const require_vars = require('../vars.js');
|
|
4
|
+
const require_user_ratings_helper = require('../helpers/user-ratings.helper.js');
|
|
5
|
+
let node_html_parser = require("node-html-parser");
|
|
6
|
+
node_html_parser = require_rolldown_runtime.__toESM(node_html_parser);
|
|
7
|
+
|
|
8
|
+
//#region src/services/user-ratings.service.ts
|
|
9
|
+
var UserRatingsScraper = class {
|
|
10
|
+
constructor() {
|
|
11
|
+
this.films = [];
|
|
12
|
+
}
|
|
13
|
+
async userRatings(user, config) {
|
|
14
|
+
let allMovies = [];
|
|
15
|
+
const url = require_vars.userRatingsUrl(user);
|
|
16
|
+
const items = (0, node_html_parser.parse)(await require_index.fetchPage(url));
|
|
17
|
+
const movies = items.querySelectorAll(".box-user-rating .table-container tbody tr");
|
|
18
|
+
const pagesNode = items.querySelector(".pagination");
|
|
19
|
+
const pages = +pagesNode?.childNodes[pagesNode.childNodes.length - 4].rawText || 1;
|
|
20
|
+
allMovies = this.getPage(config, movies);
|
|
21
|
+
if (config?.allPages) {
|
|
22
|
+
console.log("User", user, url);
|
|
23
|
+
console.log("Fetching all pages", pages);
|
|
24
|
+
for (let i = 2; i <= pages; i++) {
|
|
25
|
+
console.log("Fetching page", i, "out of", pages, "...");
|
|
26
|
+
const movies$1 = (0, node_html_parser.parse)(await require_index.fetchPage(require_vars.userRatingsUrl(user, i))).querySelectorAll(".box-user-rating .table-container tbody tr");
|
|
27
|
+
allMovies = [...this.getPage(config, movies$1)];
|
|
28
|
+
if (config.allPagesDelay) await require_user_ratings_helper.sleep(config.allPagesDelay);
|
|
29
|
+
}
|
|
30
|
+
return allMovies;
|
|
31
|
+
}
|
|
32
|
+
return allMovies;
|
|
33
|
+
}
|
|
34
|
+
getPage(config, movies) {
|
|
35
|
+
if (config) {
|
|
36
|
+
if (config.includesOnly?.length && config.excludes?.length) console.warn(`node-csfd-api:
|
|
37
|
+
You can not use both parameters 'includesOnly' and 'excludes'.
|
|
38
|
+
Parameter 'includesOnly' will be used now:`, config.includesOnly);
|
|
39
|
+
}
|
|
40
|
+
for (const el of movies) {
|
|
41
|
+
const type = require_user_ratings_helper.getUserRatingType(el);
|
|
42
|
+
if (config?.includesOnly?.length) {
|
|
43
|
+
if (config.includesOnly.some((include) => type === include)) this.buildUserRatings(el);
|
|
44
|
+
} else if (config?.excludes?.length) {
|
|
45
|
+
if (!config.excludes.some((exclude) => type === exclude)) this.buildUserRatings(el);
|
|
46
|
+
} else this.buildUserRatings(el);
|
|
47
|
+
}
|
|
48
|
+
return this.films;
|
|
49
|
+
}
|
|
50
|
+
buildUserRatings(el) {
|
|
51
|
+
this.films.push({
|
|
52
|
+
id: require_user_ratings_helper.getUserRatingId(el),
|
|
53
|
+
title: require_user_ratings_helper.getUserRatingTitle(el),
|
|
54
|
+
year: require_user_ratings_helper.getUserRatingYear(el),
|
|
55
|
+
type: require_user_ratings_helper.getUserRatingType(el),
|
|
56
|
+
url: require_user_ratings_helper.getUserRatingUrl(el),
|
|
57
|
+
colorRating: require_user_ratings_helper.getUserRatingColorRating(el),
|
|
58
|
+
userDate: require_user_ratings_helper.getUserRatingDate(el),
|
|
59
|
+
userRating: require_user_ratings_helper.getUserRating(el)
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
//#endregion
|
|
65
|
+
exports.UserRatingsScraper = UserRatingsScraper;
|
|
66
|
+
//# sourceMappingURL=user-ratings.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user-ratings.service.js","names":["allMovies: CSFDUserRatings[]","userRatingsUrl","fetchPage","movies","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, CSFDStars } from '../dto/global';\nimport { CSFDUserRatingConfig, CSFDUserRatings } from '../dto/user-ratings';\nimport { fetchPage } from '../fetchers';\nimport {\n getUserRating,\n getUserRatingColorRating,\n getUserRatingDate,\n getUserRatingId,\n getUserRatingTitle,\n getUserRatingType,\n getUserRatingUrl,\n getUserRatingYear,\n sleep\n} from '../helpers/user-ratings.helper';\nimport { userRatingsUrl } from '../vars';\n\nexport class UserRatingsScraper {\n private films: CSFDUserRatings[] = [];\n\n public async userRatings(\n user: string | number,\n config?: CSFDUserRatingConfig\n ): Promise<CSFDUserRatings[]> {\n let allMovies: CSFDUserRatings[] = [];\n const url = userRatingsUrl(user);\n const response = await fetchPage(url);\n\n const items = parse(response);\n const movies = items.querySelectorAll('.box-user-rating .table-container tbody 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);\n const response = await fetchPage(url);\n\n const items = parse(response);\n const movies = items.querySelectorAll('.box-user-rating .table-container tbody tr');\n 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 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 for (const el of movies) {\n const type = getUserRatingType(el);\n\n // Filtering includesOnly\n if (config?.includesOnly?.length) {\n if (config.includesOnly.some((include) => type === include)) {\n this.buildUserRatings(el);\n }\n // Filter exludes\n } else if (config?.excludes?.length) {\n if (!config.excludes.some((exclude) => type === exclude)) {\n this.buildUserRatings(el);\n }\n } else {\n // Without filtering\n this.buildUserRatings(el);\n }\n }\n return this.films;\n }\n\n private buildUserRatings(el: HTMLElement) {\n this.films.push({\n id: getUserRatingId(el),\n title: getUserRatingTitle(el),\n year: getUserRatingYear(el),\n type: getUserRatingType(el),\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":";;;;;;;;AAiBA,IAAa,qBAAb,MAAgC;;eACK,EAAE;;CAErC,MAAa,YACX,MACA,QAC4B;EAC5B,IAAIA,YAA+B,EAAE;EACrC,MAAM,MAAMC,4BAAe,KAAK;EAGhC,MAAM,oCAFW,MAAMC,wBAAU,IAAI,CAER;EAC7B,MAAM,SAAS,MAAM,iBAAiB,6CAA6C;EAGnF,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,MAAMC,uCAHW,MAAMD,wBADXD,4BAAe,MAAM,EAAE,CACE,CAER,CACR,iBAAiB,6CAA6C;AACnF,gBAAY,CAAC,GAAG,KAAK,QAAQ,QAAQE,SAAO,CAAC;AAG7C,QAAI,OAAO,cACT,OAAMC,kCAAM,OAAO,cAAc;;AAGrC,UAAO;;AAGT,SAAO;;CAGT,AAAQ,QAAQ,QAA8B,QAAuB;AACnE,MAAI,QACF;OAAI,OAAO,cAAc,UAAU,OAAO,UAAU,OAClD,SAAQ,KACN;;qDAGA,OAAO,aACR;;AAIL,OAAK,MAAM,MAAM,QAAQ;GACvB,MAAM,OAAOC,8CAAkB,GAAG;AAGlC,OAAI,QAAQ,cAAc,QACxB;QAAI,OAAO,aAAa,MAAM,YAAY,SAAS,QAAQ,CACzD,MAAK,iBAAiB,GAAG;cAGlB,QAAQ,UAAU,QAC3B;QAAI,CAAC,OAAO,SAAS,MAAM,YAAY,SAAS,QAAQ,CACtD,MAAK,iBAAiB,GAAG;SAI3B,MAAK,iBAAiB,GAAG;;AAG7B,SAAO,KAAK;;CAGd,AAAQ,iBAAiB,IAAiB;AACxC,OAAK,MAAM,KAAK;GACd,IAAIC,4CAAgB,GAAG;GACvB,OAAOC,+CAAmB,GAAG;GAC7B,MAAMC,8CAAkB,GAAG;GAC3B,MAAMH,8CAAkB,GAAG;GAC3B,KAAKI,6CAAiB,GAAG;GACzB,aAAaC,qDAAyB,GAAG;GACzC,UAAUC,8CAAkB,GAAG;GAC/B,YAAYC,0CAAc,GAAG;GAC9B,CAAC"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { fetchPage } from "../fetchers/index.mjs";
|
|
2
|
+
import { userRatingsUrl } from "../vars.mjs";
|
|
3
|
+
import { getUserRating, getUserRatingColorRating, getUserRatingDate, getUserRatingId, getUserRatingTitle, getUserRatingType, getUserRatingUrl, getUserRatingYear, sleep } from "../helpers/user-ratings.helper.mjs";
|
|
4
|
+
import { parse } from "node-html-parser";
|
|
5
|
+
|
|
6
|
+
//#region src/services/user-ratings.service.ts
|
|
7
|
+
var UserRatingsScraper = class {
|
|
8
|
+
constructor() {
|
|
9
|
+
this.films = [];
|
|
10
|
+
}
|
|
11
|
+
async userRatings(user, config) {
|
|
12
|
+
let allMovies = [];
|
|
13
|
+
const url = userRatingsUrl(user);
|
|
14
|
+
const items = parse(await fetchPage(url));
|
|
15
|
+
const movies = items.querySelectorAll(".box-user-rating .table-container tbody 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$1 = parse(await fetchPage(userRatingsUrl(user, i))).querySelectorAll(".box-user-rating .table-container tbody tr");
|
|
25
|
+
allMovies = [...this.getPage(config, movies$1)];
|
|
26
|
+
if (config.allPagesDelay) await sleep(config.allPagesDelay);
|
|
27
|
+
}
|
|
28
|
+
return allMovies;
|
|
29
|
+
}
|
|
30
|
+
return allMovies;
|
|
31
|
+
}
|
|
32
|
+
getPage(config, movies) {
|
|
33
|
+
if (config) {
|
|
34
|
+
if (config.includesOnly?.length && config.excludes?.length) console.warn(`node-csfd-api:
|
|
35
|
+
You can not use both parameters 'includesOnly' and 'excludes'.
|
|
36
|
+
Parameter 'includesOnly' will be used now:`, config.includesOnly);
|
|
37
|
+
}
|
|
38
|
+
for (const el of movies) {
|
|
39
|
+
const type = getUserRatingType(el);
|
|
40
|
+
if (config?.includesOnly?.length) {
|
|
41
|
+
if (config.includesOnly.some((include) => type === include)) this.buildUserRatings(el);
|
|
42
|
+
} else if (config?.excludes?.length) {
|
|
43
|
+
if (!config.excludes.some((exclude) => type === exclude)) this.buildUserRatings(el);
|
|
44
|
+
} else this.buildUserRatings(el);
|
|
45
|
+
}
|
|
46
|
+
return this.films;
|
|
47
|
+
}
|
|
48
|
+
buildUserRatings(el) {
|
|
49
|
+
this.films.push({
|
|
50
|
+
id: getUserRatingId(el),
|
|
51
|
+
title: getUserRatingTitle(el),
|
|
52
|
+
year: getUserRatingYear(el),
|
|
53
|
+
type: getUserRatingType(el),
|
|
54
|
+
url: getUserRatingUrl(el),
|
|
55
|
+
colorRating: getUserRatingColorRating(el),
|
|
56
|
+
userDate: getUserRatingDate(el),
|
|
57
|
+
userRating: getUserRating(el)
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
//#endregion
|
|
63
|
+
export { UserRatingsScraper };
|
|
64
|
+
//# sourceMappingURL=user-ratings.service.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user-ratings.service.mjs","names":["allMovies: CSFDUserRatings[]","movies"],"sources":["../../src/services/user-ratings.service.ts"],"sourcesContent":["import { HTMLElement, parse } from 'node-html-parser';\nimport { CSFDColorRating, CSFDStars } from '../dto/global';\nimport { CSFDUserRatingConfig, CSFDUserRatings } from '../dto/user-ratings';\nimport { fetchPage } from '../fetchers';\nimport {\n getUserRating,\n getUserRatingColorRating,\n getUserRatingDate,\n getUserRatingId,\n getUserRatingTitle,\n getUserRatingType,\n getUserRatingUrl,\n getUserRatingYear,\n sleep\n} from '../helpers/user-ratings.helper';\nimport { userRatingsUrl } from '../vars';\n\nexport class UserRatingsScraper {\n private films: CSFDUserRatings[] = [];\n\n public async userRatings(\n user: string | number,\n config?: CSFDUserRatingConfig\n ): Promise<CSFDUserRatings[]> {\n let allMovies: CSFDUserRatings[] = [];\n const url = userRatingsUrl(user);\n const response = await fetchPage(url);\n\n const items = parse(response);\n const movies = items.querySelectorAll('.box-user-rating .table-container tbody 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);\n const response = await fetchPage(url);\n\n const items = parse(response);\n const movies = items.querySelectorAll('.box-user-rating .table-container tbody tr');\n 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 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 for (const el of movies) {\n const type = getUserRatingType(el);\n\n // Filtering includesOnly\n if (config?.includesOnly?.length) {\n if (config.includesOnly.some((include) => type === include)) {\n this.buildUserRatings(el);\n }\n // Filter exludes\n } else if (config?.excludes?.length) {\n if (!config.excludes.some((exclude) => type === exclude)) {\n this.buildUserRatings(el);\n }\n } else {\n // Without filtering\n this.buildUserRatings(el);\n }\n }\n return this.films;\n }\n\n private buildUserRatings(el: HTMLElement) {\n this.films.push({\n id: getUserRatingId(el),\n title: getUserRatingTitle(el),\n year: getUserRatingYear(el),\n type: getUserRatingType(el),\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":";;;;;;AAiBA,IAAa,qBAAb,MAAgC;;eACK,EAAE;;CAErC,MAAa,YACX,MACA,QAC4B;EAC5B,IAAIA,YAA+B,EAAE;EACrC,MAAM,MAAM,eAAe,KAAK;EAGhC,MAAM,QAAQ,MAFG,MAAM,UAAU,IAAI,CAER;EAC7B,MAAM,SAAS,MAAM,iBAAiB,6CAA6C;EAGnF,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,MAAMC,WADQ,MAFG,MAAM,UADX,eAAe,MAAM,EAAE,CACE,CAER,CACR,iBAAiB,6CAA6C;AACnF,gBAAY,CAAC,GAAG,KAAK,QAAQ,QAAQA,SAAO,CAAC;AAG7C,QAAI,OAAO,cACT,OAAM,MAAM,OAAO,cAAc;;AAGrC,UAAO;;AAGT,SAAO;;CAGT,AAAQ,QAAQ,QAA8B,QAAuB;AACnE,MAAI,QACF;OAAI,OAAO,cAAc,UAAU,OAAO,UAAU,OAClD,SAAQ,KACN;;qDAGA,OAAO,aACR;;AAIL,OAAK,MAAM,MAAM,QAAQ;GACvB,MAAM,OAAO,kBAAkB,GAAG;AAGlC,OAAI,QAAQ,cAAc,QACxB;QAAI,OAAO,aAAa,MAAM,YAAY,SAAS,QAAQ,CACzD,MAAK,iBAAiB,GAAG;cAGlB,QAAQ,UAAU,QAC3B;QAAI,CAAC,OAAO,SAAS,MAAM,YAAY,SAAS,QAAQ,CACtD,MAAK,iBAAiB,GAAG;SAI3B,MAAK,iBAAiB,GAAG;;AAG7B,SAAO,KAAK;;CAGd,AAAQ,iBAAiB,IAAiB;AACxC,OAAK,MAAM,KAAK;GACd,IAAI,gBAAgB,GAAG;GACvB,OAAO,mBAAmB,GAAG;GAC7B,MAAM,kBAAkB,GAAG;GAC3B,MAAM,kBAAkB,GAAG;GAC3B,KAAK,iBAAiB,GAAG;GACzB,aAAa,yBAAyB,GAAG;GACzC,UAAU,kBAAkB,GAAG;GAC/B,YAAY,cAAc,GAAG;GAC9B,CAAC"}
|
package/{cjs/vars.js → vars.js}
RENAMED
|
@@ -1,11 +1,17 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
const userRatingsUrl = (user, page) => `https://www.csfd.cz/uzivatel/${encodeURIComponent(user)}/hodnoceni/${page ? '?page=' + page : ''}`;
|
|
5
|
-
exports.userRatingsUrl = userRatingsUrl;
|
|
1
|
+
|
|
2
|
+
//#region src/vars.ts
|
|
3
|
+
const userRatingsUrl = (user, page) => `https://www.csfd.cz/uzivatel/${encodeURIComponent(user)}/hodnoceni/${page ? "?page=" + page : ""}`;
|
|
6
4
|
const movieUrl = (movie) => `https://www.csfd.cz/film/${encodeURIComponent(movie)}/prehled/`;
|
|
7
|
-
exports.movieUrl = movieUrl;
|
|
8
5
|
const creatorUrl = (creator) => `https://www.csfd.cz/tvurce/${encodeURIComponent(creator)}`;
|
|
9
|
-
|
|
6
|
+
const cinemasUrl = (district, period) => {
|
|
7
|
+
return `https://www.csfd.cz/kino/?period=${period}&district=${district}`;
|
|
8
|
+
};
|
|
10
9
|
const searchUrl = (text) => `https://www.csfd.cz/hledat/?q=${encodeURIComponent(text)}`;
|
|
10
|
+
|
|
11
|
+
//#endregion
|
|
12
|
+
exports.cinemasUrl = cinemasUrl;
|
|
13
|
+
exports.creatorUrl = creatorUrl;
|
|
14
|
+
exports.movieUrl = movieUrl;
|
|
11
15
|
exports.searchUrl = searchUrl;
|
|
16
|
+
exports.userRatingsUrl = userRatingsUrl;
|
|
17
|
+
//# sourceMappingURL=vars.js.map
|
package/vars.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vars.js","names":[],"sources":["../src/vars.ts"],"sourcesContent":["import { CSFDCinemaPeriod } from './dto/cinema';\n\nexport const userRatingsUrl = (user: string | number, page?: number): string =>\n `https://www.csfd.cz/uzivatel/${encodeURIComponent(user)}/hodnoceni/${page ? '?page=' + page : ''\n }`;\n\nexport const movieUrl = (movie: number): string =>\n `https://www.csfd.cz/film/${encodeURIComponent(movie)}/prehled/`;\n\nexport const creatorUrl = (creator: number | string): string =>\n `https://www.csfd.cz/tvurce/${encodeURIComponent(creator)}`;\n\nexport const cinemasUrl = (district: number | string, period: CSFDCinemaPeriod): string => {\n return `https://www.csfd.cz/kino/?period=${period}&district=${district}`;\n};\n\nexport const searchUrl = (text: string): string =>\n `https://www.csfd.cz/hledat/?q=${encodeURIComponent(text)}`;\n"],"mappings":";;AAEA,MAAa,kBAAkB,MAAuB,SACpD,gCAAgC,mBAAmB,KAAK,CAAC,aAAa,OAAO,WAAW,OAAO;AAGjG,MAAa,YAAY,UACvB,4BAA4B,mBAAmB,MAAM,CAAC;AAExD,MAAa,cAAc,YACzB,8BAA8B,mBAAmB,QAAQ;AAE3D,MAAa,cAAc,UAA2B,WAAqC;AACzF,QAAO,oCAAoC,OAAO,YAAY;;AAGhE,MAAa,aAAa,SACxB,iCAAiC,mBAAmB,KAAK"}
|
package/vars.mjs
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
//#region src/vars.ts
|
|
2
|
+
const userRatingsUrl = (user, page) => `https://www.csfd.cz/uzivatel/${encodeURIComponent(user)}/hodnoceni/${page ? "?page=" + page : ""}`;
|
|
3
|
+
const movieUrl = (movie) => `https://www.csfd.cz/film/${encodeURIComponent(movie)}/prehled/`;
|
|
4
|
+
const creatorUrl = (creator) => `https://www.csfd.cz/tvurce/${encodeURIComponent(creator)}`;
|
|
5
|
+
const cinemasUrl = (district, period) => {
|
|
6
|
+
return `https://www.csfd.cz/kino/?period=${period}&district=${district}`;
|
|
7
|
+
};
|
|
8
|
+
const searchUrl = (text) => `https://www.csfd.cz/hledat/?q=${encodeURIComponent(text)}`;
|
|
9
|
+
|
|
10
|
+
//#endregion
|
|
11
|
+
export { cinemasUrl, creatorUrl, movieUrl, searchUrl, userRatingsUrl };
|
|
12
|
+
//# sourceMappingURL=vars.mjs.map
|
package/vars.mjs.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vars.mjs","names":[],"sources":["../src/vars.ts"],"sourcesContent":["import { CSFDCinemaPeriod } from './dto/cinema';\n\nexport const userRatingsUrl = (user: string | number, page?: number): string =>\n `https://www.csfd.cz/uzivatel/${encodeURIComponent(user)}/hodnoceni/${page ? '?page=' + page : ''\n }`;\n\nexport const movieUrl = (movie: number): string =>\n `https://www.csfd.cz/film/${encodeURIComponent(movie)}/prehled/`;\n\nexport const creatorUrl = (creator: number | string): string =>\n `https://www.csfd.cz/tvurce/${encodeURIComponent(creator)}`;\n\nexport const cinemasUrl = (district: number | string, period: CSFDCinemaPeriod): string => {\n return `https://www.csfd.cz/kino/?period=${period}&district=${district}`;\n};\n\nexport const searchUrl = (text: string): string =>\n `https://www.csfd.cz/hledat/?q=${encodeURIComponent(text)}`;\n"],"mappings":";AAEA,MAAa,kBAAkB,MAAuB,SACpD,gCAAgC,mBAAmB,KAAK,CAAC,aAAa,OAAO,WAAW,OAAO;AAGjG,MAAa,YAAY,UACvB,4BAA4B,mBAAmB,MAAM,CAAC;AAExD,MAAa,cAAc,YACzB,8BAA8B,mBAAmB,QAAQ;AAE3D,MAAa,cAAc,UAA2B,WAAqC;AACzF,QAAO,oCAAoC,OAAO,YAAY;;AAGhE,MAAa,aAAa,SACxB,iCAAiC,mBAAmB,KAAK"}
|
package/cjs/fetchers/index.js
DELETED
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
-
});
|
|
10
|
-
};
|
|
11
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
-
exports.fetchPage = void 0;
|
|
13
|
-
// Check if `fetch` is available in global scope (nodejs 18+) or in window (browser). If not, use cross-fetch polyfill.
|
|
14
|
-
const cross_fetch_1 = require("cross-fetch");
|
|
15
|
-
const fetchSafe = (typeof fetch === 'function' && fetch) || // ServiceWorker fetch (Cloud Functions + Chrome extension)
|
|
16
|
-
(typeof global === 'object' && global.fetch) || // Node.js 18+ fetch
|
|
17
|
-
(typeof window !== 'undefined' && window.fetch) || // Browser fetch
|
|
18
|
-
cross_fetch_1.fetch; // Polyfill fetch
|
|
19
|
-
const USER_AGENTS = [
|
|
20
|
-
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36',
|
|
21
|
-
'Mozilla/5.0 (iPhone; CPU iPhone OS 14_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) CriOS/87.0.4280.77 Mobile/15E148 Safari/604.1',
|
|
22
|
-
'Mozilla/5.0 (Linux; Android 10; SM-A205U) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.101 Mobile Safari/537.36',
|
|
23
|
-
'Mozilla/5.0 (Linux; Android 10) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.101 Mobile Safari/537.36'
|
|
24
|
-
];
|
|
25
|
-
const headers = {
|
|
26
|
-
'User-Agent': USER_AGENTS[Math.floor(Math.random() * USER_AGENTS.length)]
|
|
27
|
-
};
|
|
28
|
-
const fetchPage = (url) => __awaiter(void 0, void 0, void 0, function* () {
|
|
29
|
-
try {
|
|
30
|
-
const response = yield fetchSafe(url, { headers });
|
|
31
|
-
if (response.status >= 400 && response.status < 600) {
|
|
32
|
-
throw new Error(`node-csfd-api: Bad response ${response.status} for url: ${url}`);
|
|
33
|
-
}
|
|
34
|
-
return yield response.text();
|
|
35
|
-
}
|
|
36
|
-
catch (e) {
|
|
37
|
-
console.error(e);
|
|
38
|
-
return 'Error';
|
|
39
|
-
}
|
|
40
|
-
});
|
|
41
|
-
exports.fetchPage = fetchPage;
|
|
@@ -1,86 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.getFilms = exports.parseBirthPlace = exports.parseAge = exports.parseBirthday = exports.getPhoto = exports.getBio = exports.getBirthdayInfo = exports.getName = exports.getId = exports.getColorRating = void 0;
|
|
4
|
-
const global_helper_1 = require("./global.helper");
|
|
5
|
-
const getColorRating = (el) => {
|
|
6
|
-
return (0, global_helper_1.parseColor)(el === null || el === void 0 ? void 0 : el.classNames.split(' ').pop());
|
|
7
|
-
};
|
|
8
|
-
exports.getColorRating = getColorRating;
|
|
9
|
-
const getId = (url) => {
|
|
10
|
-
if (url) {
|
|
11
|
-
return (0, global_helper_1.parseIdFromUrl)(url);
|
|
12
|
-
}
|
|
13
|
-
return null;
|
|
14
|
-
};
|
|
15
|
-
exports.getId = getId;
|
|
16
|
-
const getName = (el) => {
|
|
17
|
-
return el.querySelector('h1').innerText.trim();
|
|
18
|
-
};
|
|
19
|
-
exports.getName = getName;
|
|
20
|
-
const getBirthdayInfo = (el) => {
|
|
21
|
-
const text = el.querySelector('h1 + p').innerHTML.trim();
|
|
22
|
-
const parts = text.split('\n');
|
|
23
|
-
let birthday;
|
|
24
|
-
let age;
|
|
25
|
-
let birthPlace;
|
|
26
|
-
if (parts.length) {
|
|
27
|
-
const birthdayRow = parts.find((x) => x.includes('nar.'));
|
|
28
|
-
const ageRow = parts.find((x) => x.includes('let)'));
|
|
29
|
-
const birthPlaceRow = parts.find((x) => x.includes('<br>')); // Ugly but there is no other way to detect
|
|
30
|
-
birthday = birthdayRow ? (0, exports.parseBirthday)(birthdayRow) : '';
|
|
31
|
-
age = ageRow ? +(0, exports.parseAge)(ageRow) : null;
|
|
32
|
-
birthPlace = birthPlaceRow ? (0, exports.parseBirthPlace)(birthPlaceRow) : '';
|
|
33
|
-
}
|
|
34
|
-
return { birthday, age, birthPlace };
|
|
35
|
-
};
|
|
36
|
-
exports.getBirthdayInfo = getBirthdayInfo;
|
|
37
|
-
const getBio = (el) => {
|
|
38
|
-
return el.querySelector('.article-content p').text.trim().split('\n')[0].trim();
|
|
39
|
-
};
|
|
40
|
-
exports.getBio = getBio;
|
|
41
|
-
const getPhoto = (el) => {
|
|
42
|
-
const image = el.querySelector('img').attributes.src;
|
|
43
|
-
return (0, global_helper_1.addProtocol)(image);
|
|
44
|
-
};
|
|
45
|
-
exports.getPhoto = getPhoto;
|
|
46
|
-
const parseBirthday = (text) => {
|
|
47
|
-
return text.replace(/nar./g, '').trim();
|
|
48
|
-
};
|
|
49
|
-
exports.parseBirthday = parseBirthday;
|
|
50
|
-
const parseAge = (text) => {
|
|
51
|
-
return text.trim().replace(/\(/g, '').replace(/let\)/g, '').trim();
|
|
52
|
-
};
|
|
53
|
-
exports.parseAge = parseAge;
|
|
54
|
-
const parseBirthPlace = (text) => {
|
|
55
|
-
return text.trim().replace(/<br>/g, '').trim();
|
|
56
|
-
};
|
|
57
|
-
exports.parseBirthPlace = parseBirthPlace;
|
|
58
|
-
const getFilms = (el) => {
|
|
59
|
-
var _a;
|
|
60
|
-
const filmNodes = (_a = el.querySelectorAll('.box')[0]) === null || _a === void 0 ? void 0 : _a.querySelectorAll('table tr');
|
|
61
|
-
let yearCache;
|
|
62
|
-
const films = filmNodes.map((filmNode) => {
|
|
63
|
-
var _a, _b, _c;
|
|
64
|
-
const id = (0, exports.getId)((_a = filmNode.querySelector('td.name .film-title-name')) === null || _a === void 0 ? void 0 : _a.attributes.href);
|
|
65
|
-
const title = (_b = filmNode.querySelector('.name')) === null || _b === void 0 ? void 0 : _b.text.trim();
|
|
66
|
-
const year = +((_c = filmNode.querySelector('.year')) === null || _c === void 0 ? void 0 : _c.text.trim());
|
|
67
|
-
const colorRating = (0, exports.getColorRating)(filmNode.querySelector('.name .icon'));
|
|
68
|
-
// Cache year from previous film because there is a gap between movies with same year
|
|
69
|
-
if (year) {
|
|
70
|
-
yearCache = +year;
|
|
71
|
-
}
|
|
72
|
-
if (id && title) {
|
|
73
|
-
return {
|
|
74
|
-
id,
|
|
75
|
-
title,
|
|
76
|
-
year: year || yearCache,
|
|
77
|
-
colorRating
|
|
78
|
-
};
|
|
79
|
-
}
|
|
80
|
-
return {};
|
|
81
|
-
});
|
|
82
|
-
// Remove empty objects
|
|
83
|
-
const filmsUnique = films.filter((value) => Object.keys(value).length !== 0);
|
|
84
|
-
return filmsUnique;
|
|
85
|
-
};
|
|
86
|
-
exports.getFilms = getFilms;
|