node-csfd-api 3.0.0-next.20 → 3.0.0-next.21

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.
Files changed (72) hide show
  1. package/README.md +41 -3
  2. package/{cjs/fetchers → fetchers}/index.js +4 -13
  3. package/{cjs/helpers → helpers}/cinema.helper.js +18 -7
  4. package/{cjs/helpers → helpers}/creator.helper.js +12 -11
  5. package/{types/helpers → helpers}/search.helper.d.ts +1 -1
  6. package/{cjs/helpers → helpers}/search.helper.js +5 -3
  7. package/{cjs/helpers → helpers}/user-ratings.helper.js +2 -1
  8. package/index.js +39 -0
  9. package/package.json +10 -12
  10. package/services/cinema.service.js +34 -0
  11. package/services/creator.service.js +32 -0
  12. package/{cjs/services → services}/movie.service.js +10 -21
  13. package/{cjs/services → services}/search.service.js +8 -19
  14. package/{cjs/services → services}/user-ratings.service.js +25 -36
  15. package/cjs/index.js +0 -58
  16. package/cjs/services/cinema.service.js +0 -45
  17. package/cjs/services/creator.service.js +0 -43
  18. package/esm/fetchers/fetch.polyfill.js +0 -6
  19. package/esm/fetchers/index.js +0 -32
  20. package/esm/helpers/cinema.helper.js +0 -81
  21. package/esm/helpers/creator.helper.js +0 -73
  22. package/esm/helpers/global.helper.js +0 -59
  23. package/esm/helpers/movie.helper.js +0 -228
  24. package/esm/helpers/search-user.helper.js +0 -15
  25. package/esm/helpers/search.helper.js +0 -49
  26. package/esm/helpers/user-ratings.helper.js +0 -47
  27. package/esm/index.js +0 -54
  28. package/esm/interfaces/cinema.interface.js +0 -1
  29. package/esm/interfaces/creator.interface.js +0 -1
  30. package/esm/interfaces/global.js +0 -1
  31. package/esm/interfaces/movie.interface.js +0 -1
  32. package/esm/interfaces/search.interface.js +0 -1
  33. package/esm/interfaces/user-ratings.interface.js +0 -1
  34. package/esm/services/cinema.service.js +0 -41
  35. package/esm/services/creator.service.js +0 -39
  36. package/esm/services/movie.service.js +0 -65
  37. package/esm/services/search.service.js +0 -87
  38. package/esm/services/user-ratings.service.js +0 -91
  39. package/esm/vars.js +0 -7
  40. package/types/index.ts +0 -26
  41. /package/{types/fetchers → fetchers}/fetch.polyfill.d.ts +0 -0
  42. /package/{cjs/fetchers → fetchers}/fetch.polyfill.js +0 -0
  43. /package/{types/fetchers → fetchers}/index.d.ts +0 -0
  44. /package/{types/helpers → helpers}/cinema.helper.d.ts +0 -0
  45. /package/{types/helpers → helpers}/creator.helper.d.ts +0 -0
  46. /package/{types/helpers → helpers}/global.helper.d.ts +0 -0
  47. /package/{cjs/helpers → helpers}/global.helper.js +0 -0
  48. /package/{types/helpers → helpers}/movie.helper.d.ts +0 -0
  49. /package/{cjs/helpers → helpers}/movie.helper.js +0 -0
  50. /package/{types/helpers → helpers}/search-user.helper.d.ts +0 -0
  51. /package/{cjs/helpers → helpers}/search-user.helper.js +0 -0
  52. /package/{types/helpers → helpers}/user-ratings.helper.d.ts +0 -0
  53. /package/{types/index.d.ts → index.d.ts} +0 -0
  54. /package/{types/interfaces → interfaces}/cinema.interface.d.ts +0 -0
  55. /package/{cjs/interfaces → interfaces}/cinema.interface.js +0 -0
  56. /package/{types/interfaces → interfaces}/creator.interface.d.ts +0 -0
  57. /package/{cjs/interfaces → interfaces}/creator.interface.js +0 -0
  58. /package/{types/interfaces → interfaces}/global.d.ts +0 -0
  59. /package/{cjs/interfaces → interfaces}/global.js +0 -0
  60. /package/{types/interfaces → interfaces}/movie.interface.d.ts +0 -0
  61. /package/{cjs/interfaces → interfaces}/movie.interface.js +0 -0
  62. /package/{types/interfaces → interfaces}/search.interface.d.ts +0 -0
  63. /package/{cjs/interfaces → interfaces}/search.interface.js +0 -0
  64. /package/{types/interfaces → interfaces}/user-ratings.interface.d.ts +0 -0
  65. /package/{cjs/interfaces → interfaces}/user-ratings.interface.js +0 -0
  66. /package/{types/services → services}/cinema.service.d.ts +0 -0
  67. /package/{types/services → services}/creator.service.d.ts +0 -0
  68. /package/{types/services → services}/movie.service.d.ts +0 -0
  69. /package/{types/services → services}/search.service.d.ts +0 -0
  70. /package/{types/services → services}/user-ratings.service.d.ts +0 -0
  71. /package/{types/vars.d.ts → vars.d.ts} +0 -0
  72. /package/{cjs/vars.js → vars.js} +0 -0
package/README.md CHANGED
@@ -3,15 +3,16 @@
3
3
  [![Build & Publish](https://github.com/bartholomej/node-csfd-api/workflows/Publish/badge.svg)](https://github.com/bartholomej/node-csfd-api/actions)
4
4
  [![codecov](https://codecov.io/gh/bartholomej/node-csfd-api/branch/master/graph/badge.svg?token=YQH9UoVrGP)](https://codecov.io/gh/bartholomej/node-csfd-api)
5
5
 
6
- # CSFD API 🎥 2024
6
+ # CSFD API 🎥 2025
7
7
 
8
8
  > JavaScript NPM library for scraping **Czech Movie Database (csfd.cz)**
9
9
  >
10
10
  > - JavaScript / TypeScript
11
11
  > - Browser + Node.js (SSR)
12
12
  > - Tested (~100% Code coverage)
13
- > - ✅ Ready for new ČSFD 2024!
13
+ > - ✅ Ready for new ČSFD 2025!
14
14
  > - You can use in:
15
+ > - Docker – [_How to do it?_](#-docker)
15
16
  > - Firebase function
16
17
  > - AWS λ (lambda function)
17
18
  > - CloudFlare Worker
@@ -361,6 +362,43 @@ csfd
361
362
 
362
363
  _Note: You can not use both parameters `includesOnly` and `excludes`. Parameter `includesOnly` has a priority._
363
364
 
365
+ ## 📦 Docker
366
+
367
+ You can use this library in Docker.
368
+
369
+ We have [prepared a Docker image](https://hub.docker.com/r/bartholomej/node-csfd-api) for you.
370
+
371
+ ### Prebuilt image
372
+
373
+ ```bash
374
+ docker pull bartholomej/node-csfd-api
375
+ ```
376
+
377
+ ### Build & run your own image
378
+
379
+ > Build image
380
+
381
+ ```bash
382
+ docker build -t node-csfd-api .
383
+ ```
384
+
385
+ > Run image on port 3000
386
+
387
+ ```bash
388
+ docker run -p 3000:3000 node-csfd-api
389
+ ```
390
+
391
+ > Open http://localhost:3000
392
+
393
+ ### API endpoints
394
+
395
+ > Some examples
396
+
397
+ - `/movie/535121`
398
+ - `/search/quentin+tarantino`
399
+ - `/creator/2120`
400
+ - `/user-ratings/912-bart`
401
+
364
402
  ## 🧑‍💻 Used by
365
403
 
366
404
  ### Web extensions
@@ -463,7 +501,7 @@ That's why, with node-csfd-api, what happens on your device stays on your device
463
501
 
464
502
  ## 📝 License
465
503
 
466
- Copyright © 2020 – 2024 [Lukas Bartak](http://bartweb.cz)
504
+ Copyright © 2020 – 2025 [Lukas Bartak](http://bartweb.cz)
467
505
 
468
506
  Proudly powered by nature 🗻, wind 💨, tea 🍵 and beer 🍺 ;)
469
507
 
@@ -1,13 +1,4 @@
1
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
2
  Object.defineProperty(exports, "__esModule", { value: true });
12
3
  exports.fetchPage = void 0;
13
4
  const fetch_polyfill_1 = require("./fetch.polyfill");
@@ -20,17 +11,17 @@ const USER_AGENTS = [
20
11
  const headers = {
21
12
  'User-Agent': USER_AGENTS[Math.floor(Math.random() * USER_AGENTS.length)]
22
13
  };
23
- const fetchPage = (url) => __awaiter(void 0, void 0, void 0, function* () {
14
+ const fetchPage = async (url) => {
24
15
  try {
25
- const response = yield (0, fetch_polyfill_1.fetchSafe)(url, { headers });
16
+ const response = await (0, fetch_polyfill_1.fetchSafe)(url, { headers });
26
17
  if (response.status >= 400 && response.status < 600) {
27
18
  throw new Error(`node-csfd-api: Bad response ${response.status} for url: ${url}`);
28
19
  }
29
- return yield response.text();
20
+ return await response.text();
30
21
  }
31
22
  catch (e) {
32
23
  console.error(e);
33
24
  return 'Error';
34
25
  }
35
- });
26
+ };
36
27
  exports.fetchPage = fetchPage;
@@ -24,15 +24,25 @@ const getName = (el) => {
24
24
  };
25
25
  exports.getName = getName;
26
26
  const getCoords = (el) => {
27
- const link = el === null || el === void 0 ? void 0 : el.querySelector('.box-header img[alt="Google Maps"]').closest('a').getAttribute('href');
28
- const coords = link.split('q=')[1].split(',');
29
- const [lat, lng] = coords;
30
- return { lat: +lat, lng: +lng };
27
+ const linkMapsEl = el.querySelector('a[href*="q="]');
28
+ if (!linkMapsEl)
29
+ return null;
30
+ const linkMaps = linkMapsEl.getAttribute('href');
31
+ const [_, latLng] = linkMaps.split('q=');
32
+ const coords = latLng.split(',');
33
+ if (coords.length !== 2)
34
+ return null;
35
+ const lat = Number(coords[0]);
36
+ const lng = Number(coords[1]);
37
+ if (Number.isFinite(lat) && Number.isFinite(lng)) {
38
+ return { lat, lng };
39
+ }
40
+ return null;
31
41
  };
32
42
  exports.getCoords = getCoords;
33
43
  const getCinemaUrl = (el) => {
34
- var _a;
35
- return (_a = el.querySelector('.box-header .cinema-logo a')) === null || _a === void 0 ? void 0 : _a.attributes.href;
44
+ var _a, _b;
45
+ return (_b = (_a = el.querySelector('a[title="Přejít na webovou stránku kina"]')) === null || _a === void 0 ? void 0 : _a.attributes.href) !== null && _b !== void 0 ? _b : '';
36
46
  };
37
47
  exports.getCinemaUrl = getCinemaUrl;
38
48
  const parseCinema = (el) => {
@@ -47,8 +57,9 @@ const getGroupedFilmsByDate = (el) => {
47
57
  .map((_, index) => index)
48
58
  .filter((index) => index % 2 === 0)
49
59
  .map((index) => {
60
+ var _a, _b, _c;
50
61
  const [date, films] = divs.slice(index, index + 2);
51
- const dateText = date === null || date === void 0 ? void 0 : date.innerText.trim();
62
+ const dateText = (_c = (_b = (_a = date === null || date === void 0 ? void 0 : date.firstChild) === null || _a === void 0 ? void 0 : _a.textContent) === null || _b === void 0 ? void 0 : _b.trim()) !== null && _c !== void 0 ? _c : "";
52
63
  return { date: dateText, films: (0, exports.getFilms)('', films) };
53
64
  });
54
65
  return getDatesAndFilms;
@@ -18,24 +18,25 @@ const getName = (el) => {
18
18
  };
19
19
  exports.getName = getName;
20
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) {
21
+ var _a, _b;
22
+ const infoBlock = el.querySelector('h1 + p');
23
+ const text = infoBlock === null || infoBlock === void 0 ? void 0 : infoBlock.innerHTML.trim();
24
+ const birthPlaceRow = (_a = infoBlock === null || infoBlock === void 0 ? void 0 : infoBlock.querySelector('.info-place')) === null || _a === void 0 ? void 0 : _a.innerHTML.trim();
25
+ const ageRow = (_b = infoBlock === null || infoBlock === void 0 ? void 0 : infoBlock.querySelector('.info')) === null || _b === void 0 ? void 0 : _b.innerHTML.trim();
26
+ let birthday = '';
27
+ if (text) {
28
+ const parts = text.split('\n');
27
29
  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
30
  birthday = birthdayRow ? (0, exports.parseBirthday)(birthdayRow) : '';
31
- age = ageRow ? +(0, exports.parseAge)(ageRow) : null;
32
- birthPlace = birthPlaceRow ? (0, exports.parseBirthPlace)(birthPlaceRow) : '';
33
31
  }
32
+ const age = ageRow ? +(0, exports.parseAge)(ageRow) : null;
33
+ const birthPlace = birthPlaceRow ? (0, exports.parseBirthPlace)(birthPlaceRow) : '';
34
34
  return { birthday, age, birthPlace };
35
35
  };
36
36
  exports.getBirthdayInfo = getBirthdayInfo;
37
37
  const getBio = (el) => {
38
- return el.querySelector('.article-content p').text.trim().split('\n')[0].trim();
38
+ var _a;
39
+ return ((_a = el.querySelector('.article-content p')) === null || _a === void 0 ? void 0 : _a.text.trim().split('\n')[0].trim()) || null;
39
40
  };
40
41
  exports.getBio = getBio;
41
42
  const getPhoto = (el) => {
@@ -8,4 +8,4 @@ export declare const getUrl: (el: HTMLElement) => string;
8
8
  export declare const getColorRating: (el: HTMLElement) => CSFDColorRating;
9
9
  export declare const getPoster: (el: HTMLElement) => string;
10
10
  export declare const getOrigins: (el: HTMLElement) => string[];
11
- export declare const parsePeople: (el: HTMLElement, type: 'directors' | 'actors') => CSFDCreator[];
11
+ export declare const parsePeople: (el: HTMLElement, type: "directors" | "actors") => CSFDCreator[];
@@ -30,9 +30,11 @@ const getPoster = (el) => {
30
30
  };
31
31
  exports.getPoster = getPoster;
32
32
  const getOrigins = (el) => {
33
- var _a;
34
- const originsRaw = el.querySelector('.article-content p .info').text;
35
- const originsAll = (_a = originsRaw === null || originsRaw === void 0 ? void 0 : originsRaw.split(', ')) === null || _a === void 0 ? void 0 : _a[0];
33
+ var _a, _b;
34
+ const originsRaw = (_a = el.querySelector('.article-content p .info')) === null || _a === void 0 ? void 0 : _a.text;
35
+ if (!originsRaw)
36
+ return [];
37
+ const originsAll = (_b = originsRaw === null || originsRaw === void 0 ? void 0 : originsRaw.split(', ')) === null || _b === void 0 ? void 0 : _b[0];
36
38
  return originsAll === null || originsAll === void 0 ? void 0 : originsAll.split('/').map((country) => country.trim());
37
39
  };
38
40
  exports.getOrigins = getOrigins;
@@ -23,7 +23,8 @@ const getTitle = (el) => {
23
23
  };
24
24
  exports.getTitle = getTitle;
25
25
  const getYear = (el) => {
26
- return +el.querySelectorAll('td.name .film-title-info .info')[0].text.slice(1, -1);
26
+ var _a;
27
+ return +((_a = el.querySelectorAll('td.name .film-title-info .info')[0]) === null || _a === void 0 ? void 0 : _a.text.slice(1, -1)) || null;
27
28
  };
28
29
  exports.getYear = getYear;
29
30
  const getColorRating = (el) => {
package/index.js ADDED
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.csfd = exports.Csfd = void 0;
4
+ const cinema_service_1 = require("./services/cinema.service");
5
+ const creator_service_1 = require("./services/creator.service");
6
+ const movie_service_1 = require("./services/movie.service");
7
+ const search_service_1 = require("./services/search.service");
8
+ const user_ratings_service_1 = require("./services/user-ratings.service");
9
+ class Csfd {
10
+ constructor(userRatingsService, movieService, creatorService, searchService, cinemaService) {
11
+ this.userRatingsService = userRatingsService;
12
+ this.movieService = movieService;
13
+ this.creatorService = creatorService;
14
+ this.searchService = searchService;
15
+ this.cinemaService = cinemaService;
16
+ }
17
+ async userRatings(user, config) {
18
+ return this.userRatingsService.userRatings(user, config);
19
+ }
20
+ async movie(movie) {
21
+ return this.movieService.movie(+movie);
22
+ }
23
+ async creator(creator) {
24
+ return this.creatorService.creator(+creator);
25
+ }
26
+ async search(text) {
27
+ return this.searchService.search(text);
28
+ }
29
+ async cinema(district, period) {
30
+ return this.cinemaService.cinemas(+district, period);
31
+ }
32
+ }
33
+ exports.Csfd = Csfd;
34
+ const movieScraper = new movie_service_1.MovieScraper();
35
+ const userRatingsScraper = new user_ratings_service_1.UserRatingsScraper();
36
+ const cinemaScraper = new cinema_service_1.CinemaScraper();
37
+ const creatorScraper = new creator_service_1.CreatorScraper();
38
+ const searchScraper = new search_service_1.SearchScraper();
39
+ exports.csfd = new Csfd(userRatingsScraper, movieScraper, creatorScraper, searchScraper, cinemaScraper);
package/package.json CHANGED
@@ -1,21 +1,19 @@
1
1
  {
2
2
  "name": "node-csfd-api",
3
- "version": "3.0.0-next.20",
3
+ "version": "3.0.0-next.21",
4
4
  "description": "ČSFD API in JavaScript. Amazing NPM library for scrapping csfd.cz :)",
5
- "main": "./cjs/index.js",
5
+ "main": "./index.js",
6
6
  "author": "BART! <bart@bartweb.cz>",
7
7
  "scripts": {
8
8
  "start": "tsc -w",
9
9
  "prebuild": "rimraf dist",
10
- "build": "tsc && tsc -p tsconfig-cjs.json && yarn barrels",
11
- "barrels": "barrelsby --delete -c barrels.json",
12
- "postbuild": "npm-prepare-dist -s postinstall -s prepare && yarn fix-paths",
10
+ "build": "tsc",
11
+ "postbuild": "npm-prepare-dist -s postinstall -s prepare",
13
12
  "tsc": "tsc",
14
13
  "demo": "tsx demo",
15
14
  "lint": "eslint ./src/**/**/* --fix",
16
15
  "test": "vitest",
17
16
  "test:coverage": "yarn test run --coverage",
18
- "fix-paths": "yarn json -I -f ./dist/package.json -e \"this.module='./esm/index.js';this.main='./cjs/index.js';this.types='./types/index.d.ts'\"",
19
17
  "publish:next": "yarn && yarn build && yarn test:coverage && cd dist && npm publish --tag next",
20
18
  "postversion": "git push && git push --follow-tags",
21
19
  "release:beta": "npm version preminor --preid=beta -m \"chore(update): prelease %s β\"",
@@ -29,8 +27,8 @@
29
27
  "registry": "https://registry.npmjs.org"
30
28
  },
31
29
  "dependencies": {
32
- "cross-fetch": "^4.0.0",
33
- "node-html-parser": "^6.1.12"
30
+ "cross-fetch": "^4.1.0",
31
+ "node-html-parser": "^7.0.1"
34
32
  },
35
33
  "repository": {
36
34
  "url": "git+https://github.com/bartholomej/node-csfd-api.git",
@@ -54,12 +52,12 @@
54
52
  "api"
55
53
  ],
56
54
  "engines": {
57
- "node": ">= 14"
55
+ "node": ">= 18"
58
56
  },
59
57
  "license": "MIT",
60
58
  "lint-staged": {
61
59
  "*.ts": "eslint --cache --fix"
62
60
  },
63
- "module": "./esm/index.js",
64
- "types": "./types/index.d.ts"
65
- }
61
+ "module": "./index.js",
62
+ "types": "./index.d.ts"
63
+ }
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CinemaScraper = void 0;
4
+ const node_html_parser_1 = require("node-html-parser");
5
+ const fetchers_1 = require("../fetchers");
6
+ const vars_1 = require("../vars");
7
+ const cinema_helper_1 = require("./../helpers/cinema.helper");
8
+ class CinemaScraper {
9
+ async cinemas(district = 1, period = 'today') {
10
+ const url = (0, vars_1.cinemasUrl)(district, period);
11
+ const response = await (0, fetchers_1.fetchPage)(url);
12
+ const cinemasHtml = (0, node_html_parser_1.parse)(response);
13
+ const contentNode = cinemasHtml.querySelectorAll('#snippet--cinemas section.box');
14
+ this.buildCinemas(contentNode);
15
+ return this.cinema;
16
+ }
17
+ buildCinemas(contentNode) {
18
+ const cinemas = [];
19
+ contentNode.map((x) => {
20
+ var _a, _b;
21
+ const cinema = {
22
+ id: (0, cinema_helper_1.getCinemaId)(x),
23
+ name: (_a = (0, cinema_helper_1.parseCinema)(x)) === null || _a === void 0 ? void 0 : _a.name,
24
+ city: (_b = (0, cinema_helper_1.parseCinema)(x)) === null || _b === void 0 ? void 0 : _b.city,
25
+ url: (0, cinema_helper_1.getCinemaUrl)(x),
26
+ coords: (0, cinema_helper_1.getCoords)(x),
27
+ screenings: (0, cinema_helper_1.getGroupedFilmsByDate)(x)
28
+ };
29
+ cinemas.push(cinema);
30
+ });
31
+ this.cinema = cinemas;
32
+ }
33
+ }
34
+ exports.CinemaScraper = CinemaScraper;
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CreatorScraper = void 0;
4
+ const node_html_parser_1 = require("node-html-parser");
5
+ const fetchers_1 = require("../fetchers");
6
+ const creator_helper_1 = require("../helpers/creator.helper");
7
+ const vars_1 = require("../vars");
8
+ class CreatorScraper {
9
+ async creator(creatorId) {
10
+ const url = (0, vars_1.creatorUrl)(+creatorId);
11
+ const response = await (0, fetchers_1.fetchPage)(url);
12
+ const creatorHtml = (0, node_html_parser_1.parse)(response);
13
+ const asideNode = creatorHtml.querySelector('.creator-about');
14
+ const filmsNode = creatorHtml.querySelector('.creator-filmography');
15
+ this.buildCreator(+creatorId, asideNode, filmsNode);
16
+ return this.person;
17
+ }
18
+ buildCreator(id, asideEl, filmsNode) {
19
+ var _a, _b, _c;
20
+ this.person = {
21
+ id,
22
+ name: (0, creator_helper_1.getName)(asideEl),
23
+ birthday: (_a = (0, creator_helper_1.getBirthdayInfo)(asideEl)) === null || _a === void 0 ? void 0 : _a.birthday,
24
+ birthplace: (_b = (0, creator_helper_1.getBirthdayInfo)(asideEl)) === null || _b === void 0 ? void 0 : _b.birthPlace,
25
+ photo: (0, creator_helper_1.getPhoto)(asideEl),
26
+ age: ((_c = (0, creator_helper_1.getBirthdayInfo)(asideEl)) === null || _c === void 0 ? void 0 : _c.age) || null,
27
+ bio: (0, creator_helper_1.getBio)(asideEl),
28
+ films: (0, creator_helper_1.getFilms)(filmsNode)
29
+ };
30
+ }
31
+ }
32
+ exports.CreatorScraper = CreatorScraper;
@@ -1,13 +1,4 @@
1
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
2
  Object.defineProperty(exports, "__esModule", { value: true });
12
3
  exports.MovieScraper = void 0;
13
4
  const node_html_parser_1 = require("node-html-parser");
@@ -15,18 +6,16 @@ const fetchers_1 = require("../fetchers");
15
6
  const movie_helper_1 = require("../helpers/movie.helper");
16
7
  const vars_1 = require("../vars");
17
8
  class MovieScraper {
18
- movie(movieId) {
19
- return __awaiter(this, void 0, void 0, function* () {
20
- const url = (0, vars_1.movieUrl)(+movieId);
21
- const response = yield (0, fetchers_1.fetchPage)(url);
22
- const movieHtml = (0, node_html_parser_1.parse)(response);
23
- const pageClasses = movieHtml.querySelector('.page-content').classNames.split(' ');
24
- const asideNode = movieHtml.querySelector('.aside-movie-profile');
25
- const movieNode = movieHtml.querySelector('.main-movie-profile');
26
- const jsonLd = movieHtml.querySelector('script[type="application/ld+json"]').innerText;
27
- this.buildMovie(+movieId, movieNode, asideNode, pageClasses, jsonLd);
28
- return this.film;
29
- });
9
+ async movie(movieId) {
10
+ const url = (0, vars_1.movieUrl)(+movieId);
11
+ const response = await (0, fetchers_1.fetchPage)(url);
12
+ const movieHtml = (0, node_html_parser_1.parse)(response);
13
+ const pageClasses = movieHtml.querySelector('.page-content').classNames.split(' ');
14
+ const asideNode = movieHtml.querySelector('.aside-movie-profile');
15
+ const movieNode = movieHtml.querySelector('.main-movie-profile');
16
+ const jsonLd = movieHtml.querySelector('script[type="application/ld+json"]').innerText;
17
+ this.buildMovie(+movieId, movieNode, asideNode, pageClasses, jsonLd);
18
+ return this.film;
30
19
  }
31
20
  buildMovie(movieId, el, asideEl, pageClasses, jsonLd) {
32
21
  this.film = {
@@ -1,13 +1,4 @@
1
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
2
  Object.defineProperty(exports, "__esModule", { value: true });
12
3
  exports.SearchScraper = void 0;
13
4
  const node_html_parser_1 = require("node-html-parser");
@@ -17,16 +8,14 @@ const search_user_helper_1 = require("../helpers/search-user.helper");
17
8
  const search_helper_1 = require("../helpers/search.helper");
18
9
  const vars_1 = require("../vars");
19
10
  class SearchScraper {
20
- search(text) {
21
- return __awaiter(this, void 0, void 0, function* () {
22
- const url = (0, vars_1.searchUrl)(text);
23
- const response = yield (0, fetchers_1.fetchPage)(url);
24
- const html = (0, node_html_parser_1.parse)(response);
25
- const moviesNode = html.querySelectorAll('.main-movies article');
26
- const usersNode = html.querySelectorAll('.main-users article');
27
- const tvSeriesNode = html.querySelectorAll('.main-series article');
28
- return this.parseSearch(moviesNode, usersNode, tvSeriesNode);
29
- });
11
+ async search(text) {
12
+ const url = (0, vars_1.searchUrl)(text);
13
+ const response = await (0, fetchers_1.fetchPage)(url);
14
+ const html = (0, node_html_parser_1.parse)(response);
15
+ const moviesNode = html.querySelectorAll('.main-movies article');
16
+ const usersNode = html.querySelectorAll('.main-users article');
17
+ const tvSeriesNode = html.querySelectorAll('.main-series article');
18
+ return this.parseSearch(moviesNode, usersNode, tvSeriesNode);
30
19
  }
31
20
  parseSearch(moviesNode, usersNode, tvSeriesNode) {
32
21
  const movies = [];
@@ -1,13 +1,4 @@
1
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
2
  Object.defineProperty(exports, "__esModule", { value: true });
12
3
  exports.UserRatingsScraper = void 0;
13
4
  const node_html_parser_1 = require("node-html-parser");
@@ -18,36 +9,34 @@ class UserRatingsScraper {
18
9
  constructor() {
19
10
  this.films = [];
20
11
  }
21
- userRatings(user, config) {
22
- return __awaiter(this, void 0, void 0, function* () {
23
- let allMovies = [];
24
- const url = (0, vars_1.userRatingsUrl)(user);
25
- const response = yield (0, fetchers_1.fetchPage)(url);
26
- const items = (0, node_html_parser_1.parse)(response);
27
- const movies = items.querySelectorAll('.box-user-rating .table-container tbody tr');
28
- // Get number of pages
29
- const pagesNode = items.querySelector('.pagination');
30
- const pages = +(pagesNode === null || pagesNode === void 0 ? void 0 : pagesNode.childNodes[pagesNode.childNodes.length - 4].rawText) || 1;
31
- allMovies = this.getPage(config, movies);
32
- if (config === null || config === void 0 ? void 0 : config.allPages) {
33
- console.log('User', user, url);
34
- console.log('Fetching all pages', pages);
35
- for (let i = 2; i <= pages; i++) {
36
- console.log('Fetching page', i, 'out of', pages, '...');
37
- const url = (0, vars_1.userRatingsUrl)(user, i);
38
- const response = yield (0, fetchers_1.fetchPage)(url);
39
- const items = (0, node_html_parser_1.parse)(response);
40
- const movies = items.querySelectorAll('.box-user-rating .table-container tbody tr');
41
- allMovies = [...this.getPage(config, movies)];
42
- // Sleep
43
- if (config.allPagesDelay) {
44
- yield (0, user_ratings_helper_1.sleep)(config.allPagesDelay);
45
- }
12
+ async userRatings(user, config) {
13
+ let allMovies = [];
14
+ const url = (0, vars_1.userRatingsUrl)(user);
15
+ const response = await (0, fetchers_1.fetchPage)(url);
16
+ const items = (0, node_html_parser_1.parse)(response);
17
+ const movies = items.querySelectorAll('.box-user-rating .table-container tbody tr');
18
+ // Get number of pages
19
+ const pagesNode = items.querySelector('.pagination');
20
+ const pages = +(pagesNode === null || pagesNode === void 0 ? void 0 : pagesNode.childNodes[pagesNode.childNodes.length - 4].rawText) || 1;
21
+ allMovies = this.getPage(config, movies);
22
+ if (config === null || config === void 0 ? void 0 : config.allPages) {
23
+ console.log('User', user, url);
24
+ console.log('Fetching all pages', pages);
25
+ for (let i = 2; i <= pages; i++) {
26
+ console.log('Fetching page', i, 'out of', pages, '...');
27
+ const url = (0, vars_1.userRatingsUrl)(user, i);
28
+ const response = await (0, fetchers_1.fetchPage)(url);
29
+ const items = (0, node_html_parser_1.parse)(response);
30
+ const movies = items.querySelectorAll('.box-user-rating .table-container tbody tr');
31
+ allMovies = [...this.getPage(config, movies)];
32
+ // Sleep
33
+ if (config.allPagesDelay) {
34
+ await (0, user_ratings_helper_1.sleep)(config.allPagesDelay);
46
35
  }
47
- return allMovies;
48
36
  }
49
37
  return allMovies;
50
- });
38
+ }
39
+ return allMovies;
51
40
  }
52
41
  getPage(config, movies) {
53
42
  var _a, _b, _c, _d;
package/cjs/index.js DELETED
@@ -1,58 +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.csfd = exports.Csfd = void 0;
13
- const cinema_service_1 = require("./services/cinema.service");
14
- const creator_service_1 = require("./services/creator.service");
15
- const movie_service_1 = require("./services/movie.service");
16
- const search_service_1 = require("./services/search.service");
17
- const user_ratings_service_1 = require("./services/user-ratings.service");
18
- class Csfd {
19
- constructor(userRatingsService, movieService, creatorService, searchService, cinemaService) {
20
- this.userRatingsService = userRatingsService;
21
- this.movieService = movieService;
22
- this.creatorService = creatorService;
23
- this.searchService = searchService;
24
- this.cinemaService = cinemaService;
25
- }
26
- userRatings(user, config) {
27
- return __awaiter(this, void 0, void 0, function* () {
28
- return this.userRatingsService.userRatings(user, config);
29
- });
30
- }
31
- movie(movie) {
32
- return __awaiter(this, void 0, void 0, function* () {
33
- return this.movieService.movie(+movie);
34
- });
35
- }
36
- creator(creator) {
37
- return __awaiter(this, void 0, void 0, function* () {
38
- return this.creatorService.creator(+creator);
39
- });
40
- }
41
- search(text) {
42
- return __awaiter(this, void 0, void 0, function* () {
43
- return this.searchService.search(text);
44
- });
45
- }
46
- cinema(district, period) {
47
- return __awaiter(this, void 0, void 0, function* () {
48
- return this.cinemaService.cinemas(+district, period);
49
- });
50
- }
51
- }
52
- exports.Csfd = Csfd;
53
- const movieScraper = new movie_service_1.MovieScraper();
54
- const userRatingsScraper = new user_ratings_service_1.UserRatingsScraper();
55
- const cinemaScraper = new cinema_service_1.CinemaScraper();
56
- const creatorScraper = new creator_service_1.CreatorScraper();
57
- const searchScraper = new search_service_1.SearchScraper();
58
- exports.csfd = new Csfd(userRatingsScraper, movieScraper, creatorScraper, searchScraper, cinemaScraper);