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.
Files changed (132) hide show
  1. package/bin/{export-ratings.mjs → export-ratings.js} +1 -1
  2. package/bin/{mcp-server.mjs → mcp-server.js} +2 -2
  3. package/bin/{server.mjs → server.js} +2 -2
  4. package/{cli.mjs → cli.js} +3 -3
  5. package/dto/{cinema.d.mts → cinema.d.cts} +2 -2
  6. package/dto/{creator.d.mts → creator.d.cts} +2 -2
  7. package/dto/{global.d.mts → global.d.cts} +1 -1
  8. package/dto/{movie.d.mts → movie.d.cts} +2 -2
  9. package/dto/{options.d.mts → options.d.cts} +1 -1
  10. package/dto/{search.d.mts → search.d.cts} +3 -3
  11. package/dto/{user-ratings.d.mts → user-ratings.d.cts} +2 -2
  12. package/dto/{user-reviews.d.mts → user-reviews.d.cts} +2 -2
  13. package/fetchers/{fetch.polyfill.mjs → fetch.polyfill.cjs} +3 -4
  14. package/fetchers/fetch.polyfill.cjs.map +1 -0
  15. package/fetchers/fetch.polyfill.js +2 -3
  16. package/fetchers/fetch.polyfill.js.map +1 -1
  17. package/fetchers/index.cjs +75 -0
  18. package/fetchers/index.cjs.map +1 -0
  19. package/fetchers/index.js +56 -12
  20. package/fetchers/index.js.map +1 -1
  21. package/helpers/cinema.helper.cjs +83 -0
  22. package/helpers/cinema.helper.cjs.map +1 -0
  23. package/helpers/cinema.helper.js +4 -8
  24. package/helpers/cinema.helper.js.map +1 -1
  25. package/helpers/creator.helper.cjs +72 -0
  26. package/helpers/creator.helper.cjs.map +1 -0
  27. package/helpers/creator.helper.js +6 -10
  28. package/helpers/creator.helper.js.map +1 -1
  29. package/helpers/global.helper.cjs +109 -0
  30. package/helpers/{global.helper.mjs.map → global.helper.cjs.map} +1 -1
  31. package/helpers/global.helper.js +1 -9
  32. package/helpers/movie.helper.cjs +324 -0
  33. package/helpers/movie.helper.cjs.map +1 -0
  34. package/helpers/movie.helper.js +12 -35
  35. package/helpers/movie.helper.js.map +1 -1
  36. package/helpers/search-creator.helper.cjs +18 -0
  37. package/helpers/search-creator.helper.cjs.map +1 -0
  38. package/helpers/search-creator.helper.js +3 -5
  39. package/helpers/search-creator.helper.js.map +1 -1
  40. package/helpers/search-user.helper.cjs +26 -0
  41. package/helpers/search-user.helper.cjs.map +1 -0
  42. package/helpers/search-user.helper.js +5 -8
  43. package/helpers/search-user.helper.js.map +1 -1
  44. package/helpers/search.helper.cjs +52 -0
  45. package/helpers/search.helper.cjs.map +1 -0
  46. package/helpers/search.helper.js +6 -13
  47. package/helpers/search.helper.js.map +1 -1
  48. package/helpers/user-ratings.helper.cjs +41 -0
  49. package/helpers/user-ratings.helper.cjs.map +1 -0
  50. package/helpers/user-ratings.helper.js +6 -13
  51. package/helpers/user-ratings.helper.js.map +1 -1
  52. package/helpers/user-reviews.helper.cjs +56 -0
  53. package/helpers/user-reviews.helper.cjs.map +1 -0
  54. package/helpers/user-reviews.helper.js +6 -15
  55. package/helpers/user-reviews.helper.js.map +1 -1
  56. package/index.cjs +64 -0
  57. package/index.cjs.map +1 -0
  58. package/{index.d.mts → index.d.cts} +15 -15
  59. package/index.js +13 -14
  60. package/index.js.map +1 -1
  61. package/{package.mjs → package.js} +1 -1
  62. package/package.json +13 -7
  63. package/services/cinema.service.cjs +31 -0
  64. package/services/cinema.service.cjs.map +1 -0
  65. package/services/{cinema.service.d.mts → cinema.service.d.cts} +3 -3
  66. package/services/cinema.service.js +11 -11
  67. package/services/cinema.service.js.map +1 -1
  68. package/services/creator.service.cjs +32 -0
  69. package/services/creator.service.cjs.map +1 -0
  70. package/services/{creator.service.d.mts → creator.service.d.cts} +3 -3
  71. package/services/creator.service.js +11 -11
  72. package/services/creator.service.js.map +1 -1
  73. package/services/movie.service.cjs +61 -0
  74. package/services/movie.service.cjs.map +1 -0
  75. package/services/{movie.service.d.mts → movie.service.d.cts} +3 -3
  76. package/services/movie.service.js +33 -33
  77. package/services/movie.service.js.map +1 -1
  78. package/services/search.service.cjs +75 -0
  79. package/services/search.service.cjs.map +1 -0
  80. package/services/{search.service.d.mts → search.service.d.cts} +3 -3
  81. package/services/search.service.js +29 -29
  82. package/services/search.service.js.map +1 -1
  83. package/services/user-ratings.service.cjs +65 -0
  84. package/services/user-ratings.service.cjs.map +1 -0
  85. package/services/{user-ratings.service.d.mts → user-ratings.service.d.cts} +3 -3
  86. package/services/user-ratings.service.js +18 -18
  87. package/services/user-ratings.service.js.map +1 -1
  88. package/services/user-reviews.service.cjs +67 -0
  89. package/services/user-reviews.service.cjs.map +1 -0
  90. package/services/{user-reviews.service.d.mts → user-reviews.service.d.cts} +3 -3
  91. package/services/user-reviews.service.js +20 -20
  92. package/services/user-reviews.service.js.map +1 -1
  93. package/src/fetchers/fetch.polyfill.js +6 -0
  94. package/src/fetchers/index.js +76 -0
  95. package/{helpers/cinema.helper.mjs → src/helpers/cinema.helper.js} +5 -4
  96. package/{helpers/creator.helper.mjs → src/helpers/creator.helper.js} +5 -4
  97. package/{helpers/global.helper.mjs → src/helpers/global.helper.js} +3 -3
  98. package/{helpers/movie.helper.mjs → src/helpers/movie.helper.js} +5 -4
  99. package/{helpers/search-creator.helper.mjs → src/helpers/search-creator.helper.js} +5 -4
  100. package/{helpers/search-user.helper.mjs → src/helpers/search-user.helper.js} +5 -4
  101. package/{helpers/search.helper.mjs → src/helpers/search.helper.js} +5 -4
  102. package/{helpers/user-ratings.helper.mjs → src/helpers/user-ratings.helper.js} +5 -4
  103. package/{helpers/user-reviews.helper.mjs → src/helpers/user-reviews.helper.js} +5 -4
  104. package/{index.mjs → src/index.js} +14 -10
  105. package/{services/cinema.service.mjs → src/services/cinema.service.js} +7 -6
  106. package/{services/creator.service.mjs → src/services/creator.service.js} +7 -6
  107. package/{services/movie.service.mjs → src/services/movie.service.js} +7 -6
  108. package/{services/search.service.mjs → src/services/search.service.js} +10 -9
  109. package/{services/user-ratings.service.mjs → src/services/user-ratings.service.js} +8 -7
  110. package/{services/user-reviews.service.mjs → src/services/user-reviews.service.js} +8 -7
  111. package/{vars.mjs → src/vars.js} +3 -3
  112. package/vars.cjs +28 -0
  113. package/{vars.mjs.map → vars.cjs.map} +1 -1
  114. package/vars.js +1 -7
  115. package/fetchers/fetch.polyfill.mjs.map +0 -1
  116. package/fetchers/index.mjs +0 -31
  117. package/fetchers/index.mjs.map +0 -1
  118. package/helpers/cinema.helper.mjs.map +0 -1
  119. package/helpers/creator.helper.mjs.map +0 -1
  120. package/helpers/movie.helper.mjs.map +0 -1
  121. package/helpers/search-creator.helper.mjs.map +0 -1
  122. package/helpers/search-user.helper.mjs.map +0 -1
  123. package/helpers/search.helper.mjs.map +0 -1
  124. package/helpers/user-ratings.helper.mjs.map +0 -1
  125. package/helpers/user-reviews.helper.mjs.map +0 -1
  126. package/index.mjs.map +0 -1
  127. package/services/cinema.service.mjs.map +0 -1
  128. package/services/creator.service.mjs.map +0 -1
  129. package/services/movie.service.mjs.map +0 -1
  130. package/services/search.service.mjs.map +0 -1
  131. package/services/user-ratings.service.mjs.map +0 -1
  132. package/services/user-reviews.service.mjs.map +0 -1
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { csfd } from "../index.mjs";
2
+ import { csfd } from "../src/index.js";
3
3
  import { writeFile } from "node:fs/promises";
4
4
 
5
5
  //#region src/bin/export-ratings.ts
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
- import { csfd } from "../index.mjs";
3
- import { name, version } from "../package.mjs";
2
+ import { csfd } from "../src/index.js";
3
+ import { name, version } from "../package.js";
4
4
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
5
5
  import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
6
6
  import { z } from "zod";
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
- import { csfd } from "../index.mjs";
3
- import { homepage, name, version } from "../package.mjs";
2
+ import { csfd } from "../src/index.js";
3
+ import { homepage, name, version } from "../package.js";
4
4
  import "dotenv/config";
5
5
  import express from "express";
6
6
 
@@ -9,7 +9,7 @@ async function main() {
9
9
  case "server":
10
10
  case "api":
11
11
  try {
12
- await import("./bin/server.mjs");
12
+ await import("./bin/server.js");
13
13
  } catch (error) {
14
14
  console.error("Failed to start server:", error);
15
15
  process.exit(1);
@@ -17,7 +17,7 @@ async function main() {
17
17
  break;
18
18
  case "mcp":
19
19
  try {
20
- await import("./bin/mcp-server.mjs");
20
+ await import("./bin/mcp-server.js");
21
21
  } catch (error) {
22
22
  console.error("Failed to start MCP server:", error);
23
23
  process.exit(1);
@@ -40,7 +40,7 @@ async function main() {
40
40
  else if (isJson) format = "json";
41
41
  else if (isCsv) format = "csv";
42
42
  try {
43
- const { runRatingsExport } = await import("./bin/export-ratings.mjs");
43
+ const { runRatingsExport } = await import("./bin/export-ratings.js");
44
44
  await runRatingsExport(userId, {
45
45
  format,
46
46
  userRatingsOptions: {
@@ -1,4 +1,4 @@
1
- import { CSFDMovieListItem } from "./movie.mjs";
1
+ import { CSFDMovieListItem } from "./movie.cjs";
2
2
 
3
3
  //#region src/dto/cinema.d.ts
4
4
  interface CSFDCinema {
@@ -25,4 +25,4 @@ type CSFDCinemaMeta = 'dubbing' | '3D' | 'subtitles' | string;
25
25
  type CSFDCinemaPeriod = 'today' | 'weekend' | 'week' | 'tomorrow' | 'month';
26
26
  //#endregion
27
27
  export { CSFDCinema, CSFDCinemaGroupedFilmsByDate, CSFDCinemaMeta, CSFDCinemaMovie, CSFDCinemaPeriod };
28
- //# sourceMappingURL=cinema.d.mts.map
28
+ //# sourceMappingURL=cinema.d.cts.map
@@ -1,4 +1,4 @@
1
- import { CSFDScreening } from "./global.mjs";
1
+ import { CSFDScreening } from "./global.cjs";
2
2
 
3
3
  //#region src/dto/creator.d.ts
4
4
  interface CSFDCreator {
@@ -14,4 +14,4 @@ interface CSFDCreator {
14
14
  type CSFDCreatorScreening = Omit<CSFDScreening, 'url' | 'type'>;
15
15
  //#endregion
16
16
  export { CSFDCreator, CSFDCreatorScreening };
17
- //# sourceMappingURL=creator.d.mts.map
17
+ //# sourceMappingURL=creator.d.cts.map
@@ -23,4 +23,4 @@ type CSFDStars = 0 | 1 | 2 | 3 | 4 | 5;
23
23
  type CSFDFilmTypes = 'film' | 'tv-film' | 'tv-show' | 'series' | 'theatrical' | 'concert' | 'season' | 'student-film' | 'amateur-film' | 'music-video' | 'episode' | 'video-compilation';
24
24
  //#endregion
25
25
  export { CSFDColorRating, CSFDFilmTypes, CSFDScreening, CSFDStars };
26
- //# sourceMappingURL=global.d.mts.map
26
+ //# sourceMappingURL=global.d.cts.map
@@ -1,4 +1,4 @@
1
- import { CSFDScreening } from "./global.mjs";
1
+ import { CSFDScreening } from "./global.cjs";
2
2
 
3
3
  //#region src/dto/movie.d.ts
4
4
  interface CSFDMovie extends CSFDScreening {
@@ -96,4 +96,4 @@ interface CSFDSeriesChild {
96
96
  }
97
97
  //#endregion
98
98
  export { CSFDBoxContent, CSFDCreatorGroups, CSFDCreatorGroupsEnglish, CSFDCreatorGroupsSlovak, CSFDCreators, CSFDGenres, CSFDMovie, CSFDMovieCreator, CSFDMovieListItem, CSFDParent, CSFDPremiere, CSFDSeriesChild, CSFDTitlesOther, CSFDVod, CSFDVodService, MovieJsonLd };
99
- //# sourceMappingURL=movie.d.mts.map
99
+ //# sourceMappingURL=movie.d.cts.map
@@ -6,4 +6,4 @@ interface CSFDOptions {
6
6
  type CSFDLanguage = 'cs' | 'en' | 'sk';
7
7
  //#endregion
8
8
  export { CSFDOptions };
9
- //# sourceMappingURL=options.d.mts.map
9
+ //# sourceMappingURL=options.d.cts.map
@@ -1,5 +1,5 @@
1
- import { CSFDScreening } from "./global.mjs";
2
- import { CSFDMovieCreator } from "./movie.mjs";
1
+ import { CSFDScreening } from "./global.cjs";
2
+ import { CSFDMovieCreator } from "./movie.cjs";
3
3
 
4
4
  //#region src/dto/search.d.ts
5
5
  interface CSFDSearch {
@@ -29,4 +29,4 @@ interface CSFDSearchCreators {
29
29
  }
30
30
  //#endregion
31
31
  export { CSFDSearch, CSFDSearchCreator, CSFDSearchCreators, CSFDSearchMovie, CSFDSearchUser };
32
- //# sourceMappingURL=search.d.mts.map
32
+ //# sourceMappingURL=search.d.cts.map
@@ -1,4 +1,4 @@
1
- import { CSFDFilmTypes, CSFDScreening, CSFDStars } from "./global.mjs";
1
+ import { CSFDFilmTypes, CSFDScreening, CSFDStars } from "./global.cjs";
2
2
 
3
3
  //#region src/dto/user-ratings.d.ts
4
4
  interface CSFDUserRatings extends CSFDScreening {
@@ -24,4 +24,4 @@ interface CSFDUserRatingConfig {
24
24
  type CSFDColors = 'lightgrey' | 'blue' | 'red' | 'grey';
25
25
  //#endregion
26
26
  export { CSFDColors, CSFDUserRatingConfig, CSFDUserRatings };
27
- //# sourceMappingURL=user-ratings.d.mts.map
27
+ //# sourceMappingURL=user-ratings.d.cts.map
@@ -1,4 +1,4 @@
1
- import { CSFDFilmTypes, CSFDScreening, CSFDStars } from "./global.mjs";
1
+ import { CSFDFilmTypes, CSFDScreening, CSFDStars } from "./global.cjs";
2
2
 
3
3
  //#region src/dto/user-reviews.d.ts
4
4
  interface CSFDUserReviews extends CSFDScreening {
@@ -25,4 +25,4 @@ interface CSFDUserReviewsConfig {
25
25
  }
26
26
  //#endregion
27
27
  export { CSFDUserReviews, CSFDUserReviewsConfig };
28
- //# sourceMappingURL=user-reviews.d.mts.map
28
+ //# sourceMappingURL=user-reviews.d.cts.map
@@ -1,7 +1,6 @@
1
- import { fetch as fetch$1 } from "cross-fetch";
2
1
  //#region src/fetchers/fetch.polyfill.ts
3
- const fetchSafe = typeof fetch === "function" && fetch || typeof global === "object" && global.fetch || typeof window !== "undefined" && window.fetch || fetch$1;
2
+ const fetchSafe = typeof fetch === "function" && fetch || typeof global === "object" && global.fetch || typeof window !== "undefined" && window.fetch;
4
3
  //#endregion
5
- export { fetchSafe };
4
+ exports.fetchSafe = fetchSafe;
6
5
 
7
- //# sourceMappingURL=fetch.polyfill.mjs.map
6
+ //# sourceMappingURL=fetch.polyfill.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetch.polyfill.cjs","names":[],"sources":["../../src/fetchers/fetch.polyfill.ts"],"sourcesContent":["// Check if `fetch` is available in global scope (nodejs 18+) or in window (browser).\nexport const fetchSafe =\n (typeof fetch === 'function' && fetch) || // ServiceWorker fetch (Cloud Functions + Chrome extension)\n (typeof global === 'object' && global.fetch) || // Node.js 18+ fetch\n (typeof window !== 'undefined' && window.fetch); // Browser fetch\n"],"mappings":";AACA,MAAa,YACV,OAAO,UAAU,cAAc,SAC/B,OAAO,WAAW,YAAY,OAAO,SACrC,OAAO,WAAW,eAAe,OAAO"}
@@ -1,7 +1,6 @@
1
- let cross_fetch = require("cross-fetch");
2
1
  //#region src/fetchers/fetch.polyfill.ts
3
- const fetchSafe = typeof fetch === "function" && fetch || typeof global === "object" && global.fetch || typeof window !== "undefined" && window.fetch || cross_fetch.fetch;
2
+ const fetchSafe = typeof fetch === "function" && fetch || typeof global === "object" && global.fetch || typeof window !== "undefined" && window.fetch;
4
3
  //#endregion
5
- exports.fetchSafe = fetchSafe;
4
+ export { fetchSafe };
6
5
 
7
6
  //# sourceMappingURL=fetch.polyfill.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"fetch.polyfill.js","names":["crossFetch"],"sources":["../../src/fetchers/fetch.polyfill.ts"],"sourcesContent":["// Check if `fetch` is available in global scope (nodejs 18+) or in window (browser). If not, use cross-fetch polyfill.\nimport { fetch as crossFetch } from 'cross-fetch';\nexport const fetchSafe =\n (typeof fetch === 'function' && fetch) || // ServiceWorker fetch (Cloud Functions + Chrome extension)\n (typeof global === 'object' && global.fetch) || // Node.js 18+ fetch\n (typeof window !== 'undefined' && window.fetch) || // Browser fetch\n crossFetch; // Polyfill fetch\n"],"mappings":";;AAEA,MAAa,YACV,OAAO,UAAU,cAAc,SAC/B,OAAO,WAAW,YAAY,OAAO,SACrC,OAAO,WAAW,eAAe,OAAO,SACzCA,YAAAA"}
1
+ {"version":3,"file":"fetch.polyfill.js","names":[],"sources":["../../src/fetchers/fetch.polyfill.ts"],"sourcesContent":["// Check if `fetch` is available in global scope (nodejs 18+) or in window (browser).\nexport const fetchSafe =\n (typeof fetch === 'function' && fetch) || // ServiceWorker fetch (Cloud Functions + Chrome extension)\n (typeof global === 'object' && global.fetch) || // Node.js 18+ fetch\n (typeof window !== 'undefined' && window.fetch); // Browser fetch\n"],"mappings":";AACA,MAAa,YACV,OAAO,UAAU,cAAc,SAC/B,OAAO,WAAW,YAAY,OAAO,SACrC,OAAO,WAAW,eAAe,OAAO"}
@@ -0,0 +1,75 @@
1
+ const require_fetch_polyfill = require("./fetch.polyfill.cjs");
2
+ //#region src/fetchers/index.ts
3
+ const browserProfiles = [
4
+ {
5
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36",
6
+ "Sec-Ch-Ua": "\"Google Chrome\";v=\"131\", \"Chromium\";v=\"131\", \"Not_A Brand\";v=\"24\"",
7
+ "Sec-Ch-Ua-Platform": "\"Windows\""
8
+ },
9
+ {
10
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36",
11
+ "Sec-Ch-Ua": "\"Google Chrome\";v=\"130\", \"Chromium\";v=\"130\", \"Not_A Brand\";v=\"24\"",
12
+ "Sec-Ch-Ua-Platform": "\"Windows\""
13
+ },
14
+ {
15
+ "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36",
16
+ "Sec-Ch-Ua": "\"Google Chrome\";v=\"131\", \"Chromium\";v=\"131\", \"Not_A Brand\";v=\"24\"",
17
+ "Sec-Ch-Ua-Platform": "\"macOS\""
18
+ },
19
+ {
20
+ "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36",
21
+ "Sec-Ch-Ua": "\"Google Chrome\";v=\"130\", \"Chromium\";v=\"130\", \"Not_A Brand\";v=\"24\"",
22
+ "Sec-Ch-Ua-Platform": "\"macOS\""
23
+ },
24
+ {
25
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0",
26
+ "Sec-Ch-Ua": "\"Microsoft Edge\";v=\"131\", \"Chromium\";v=\"131\", \"Not_A Brand\";v=\"24\"",
27
+ "Sec-Ch-Ua-Platform": "\"Windows\""
28
+ },
29
+ {
30
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36 Edg/130.0.0.0",
31
+ "Sec-Ch-Ua": "\"Microsoft Edge\";v=\"130\", \"Chromium\";v=\"130\", \"Not_A Brand\";v=\"24\"",
32
+ "Sec-Ch-Ua-Platform": "\"Windows\""
33
+ }
34
+ ];
35
+ const randomProfile = () => browserProfiles[Math.floor(Math.random() * browserProfiles.length)];
36
+ const baseHeaders = {
37
+ Accept: "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7",
38
+ "Accept-Language": "cs-CZ,cs;q=0.9,en-US;q=0.8,en;q=0.7",
39
+ "Accept-Encoding": "gzip, deflate, br",
40
+ "Cache-Control": "max-age=0",
41
+ Connection: "keep-alive",
42
+ "Sec-Ch-Ua-Mobile": "?0",
43
+ "Sec-Fetch-Dest": "document",
44
+ "Sec-Fetch-Mode": "navigate",
45
+ "Sec-Fetch-Site": "none",
46
+ "Sec-Fetch-User": "?1",
47
+ "Upgrade-Insecure-Requests": "1"
48
+ };
49
+ const fetchPage = async (url, optionsRequest) => {
50
+ try {
51
+ const mergedHeaders = new Headers({
52
+ ...baseHeaders,
53
+ ...randomProfile()
54
+ });
55
+ if (optionsRequest?.headers) new Headers(optionsRequest.headers).forEach((value, key) => mergedHeaders.set(key, value));
56
+ const { headers: _, ...restOptions } = optionsRequest || {};
57
+ const response = await require_fetch_polyfill.fetchSafe(url, {
58
+ credentials: "omit",
59
+ ...restOptions,
60
+ headers: mergedHeaders
61
+ });
62
+ if (!response.ok) throw new Error(`node-csfd-api: Bad response ${response.status} for url: ${url}`);
63
+ const html = await response.text();
64
+ if (html.includes("Making sure you're not a bot!")) console.warn("node-csfd-api: Trap detected.");
65
+ return html;
66
+ } catch (e) {
67
+ if (e instanceof Error) console.error(e.message);
68
+ else console.error(String(e));
69
+ return "Error";
70
+ }
71
+ };
72
+ //#endregion
73
+ exports.fetchPage = fetchPage;
74
+
75
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","names":["fetchSafe"],"sources":["../../src/fetchers/index.ts"],"sourcesContent":["import { fetchSafe } from './fetch.polyfill';\n\ninterface BrowserProfile {\n 'User-Agent': string;\n 'Sec-Ch-Ua': string;\n 'Sec-Ch-Ua-Platform': string;\n}\n\nconst browserProfiles: BrowserProfile[] = [\n // Chrome 131 / Windows\n {\n 'User-Agent':\n 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36',\n 'Sec-Ch-Ua': '\"Google Chrome\";v=\"131\", \"Chromium\";v=\"131\", \"Not_A Brand\";v=\"24\"',\n 'Sec-Ch-Ua-Platform': '\"Windows\"'\n },\n // Chrome 130 / Windows\n {\n 'User-Agent':\n 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36',\n 'Sec-Ch-Ua': '\"Google Chrome\";v=\"130\", \"Chromium\";v=\"130\", \"Not_A Brand\";v=\"24\"',\n 'Sec-Ch-Ua-Platform': '\"Windows\"'\n },\n // Chrome 131 / macOS\n {\n 'User-Agent':\n 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36',\n 'Sec-Ch-Ua': '\"Google Chrome\";v=\"131\", \"Chromium\";v=\"131\", \"Not_A Brand\";v=\"24\"',\n 'Sec-Ch-Ua-Platform': '\"macOS\"'\n },\n // Chrome 130 / macOS\n {\n 'User-Agent':\n 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36',\n 'Sec-Ch-Ua': '\"Google Chrome\";v=\"130\", \"Chromium\";v=\"130\", \"Not_A Brand\";v=\"24\"',\n 'Sec-Ch-Ua-Platform': '\"macOS\"'\n },\n // Edge 131 / Windows\n {\n 'User-Agent':\n 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0',\n 'Sec-Ch-Ua': '\"Microsoft Edge\";v=\"131\", \"Chromium\";v=\"131\", \"Not_A Brand\";v=\"24\"',\n 'Sec-Ch-Ua-Platform': '\"Windows\"'\n },\n // Edge 130 / Windows\n {\n 'User-Agent':\n 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36 Edg/130.0.0.0',\n 'Sec-Ch-Ua': '\"Microsoft Edge\";v=\"130\", \"Chromium\";v=\"130\", \"Not_A Brand\";v=\"24\"',\n 'Sec-Ch-Ua-Platform': '\"Windows\"'\n }\n];\n\nconst randomProfile = (): BrowserProfile =>\n browserProfiles[Math.floor(Math.random() * browserProfiles.length)];\n\nconst baseHeaders = {\n Accept:\n 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',\n 'Accept-Language': 'cs-CZ,cs;q=0.9,en-US;q=0.8,en;q=0.7',\n 'Accept-Encoding': 'gzip, deflate, br',\n 'Cache-Control': 'max-age=0',\n Connection: 'keep-alive',\n 'Sec-Ch-Ua-Mobile': '?0',\n 'Sec-Fetch-Dest': 'document',\n 'Sec-Fetch-Mode': 'navigate',\n 'Sec-Fetch-Site': 'none',\n 'Sec-Fetch-User': '?1',\n 'Upgrade-Insecure-Requests': '1'\n};\n\nexport const fetchPage = async (url: string, optionsRequest?: RequestInit): Promise<string> => {\n try {\n const mergedHeaders = new Headers({ ...baseHeaders, ...randomProfile() });\n\n // Merge any custom headers provided in the function arguments\n if (optionsRequest?.headers) {\n const reqHeaders = new Headers(optionsRequest.headers);\n reqHeaders.forEach((value, key) => mergedHeaders.set(key, value));\n }\n\n const { headers: _, ...restOptions } = optionsRequest || {};\n\n const response = await fetchSafe(url, {\n credentials: 'omit',\n ...restOptions,\n headers: mergedHeaders\n });\n\n if (!response.ok) {\n throw new Error(`node-csfd-api: Bad response ${response.status} for url: ${url}`);\n }\n\n const html = await response.text();\n\n // Quickly check if we hit the trap\n if (html.includes(\"Making sure you're not a bot!\")) {\n console.warn('node-csfd-api: Trap detected.');\n }\n\n return html;\n } catch (e: unknown) {\n if (e instanceof Error) {\n console.error(e.message);\n } else {\n console.error(String(e));\n }\n return 'Error';\n }\n};\n"],"mappings":";;AAQA,MAAM,kBAAoC;CAExC;EACE,cACE;EACF,aAAa;EACb,sBAAsB;EACvB;CAED;EACE,cACE;EACF,aAAa;EACb,sBAAsB;EACvB;CAED;EACE,cACE;EACF,aAAa;EACb,sBAAsB;EACvB;CAED;EACE,cACE;EACF,aAAa;EACb,sBAAsB;EACvB;CAED;EACE,cACE;EACF,aAAa;EACb,sBAAsB;EACvB;CAED;EACE,cACE;EACF,aAAa;EACb,sBAAsB;EACvB;CACF;AAED,MAAM,sBACJ,gBAAgB,KAAK,MAAM,KAAK,QAAQ,GAAG,gBAAgB,OAAO;AAEpE,MAAM,cAAc;CAClB,QACE;CACF,mBAAmB;CACnB,mBAAmB;CACnB,iBAAiB;CACjB,YAAY;CACZ,oBAAoB;CACpB,kBAAkB;CAClB,kBAAkB;CAClB,kBAAkB;CAClB,kBAAkB;CAClB,6BAA6B;CAC9B;AAED,MAAa,YAAY,OAAO,KAAa,mBAAkD;AAC7F,KAAI;EACF,MAAM,gBAAgB,IAAI,QAAQ;GAAE,GAAG;GAAa,GAAG,eAAe;GAAE,CAAC;AAGzE,MAAI,gBAAgB,QACC,KAAI,QAAQ,eAAe,QAAQ,CAC3C,SAAS,OAAO,QAAQ,cAAc,IAAI,KAAK,MAAM,CAAC;EAGnE,MAAM,EAAE,SAAS,GAAG,GAAG,gBAAgB,kBAAkB,EAAE;EAE3D,MAAM,WAAW,MAAMA,uBAAAA,UAAU,KAAK;GACpC,aAAa;GACb,GAAG;GACH,SAAS;GACV,CAAC;AAEF,MAAI,CAAC,SAAS,GACZ,OAAM,IAAI,MAAM,+BAA+B,SAAS,OAAO,YAAY,MAAM;EAGnF,MAAM,OAAO,MAAM,SAAS,MAAM;AAGlC,MAAI,KAAK,SAAS,gCAAgC,CAChD,SAAQ,KAAK,gCAAgC;AAG/C,SAAO;UACA,GAAY;AACnB,MAAI,aAAa,MACf,SAAQ,MAAM,EAAE,QAAQ;MAExB,SAAQ,MAAM,OAAO,EAAE,CAAC;AAE1B,SAAO"}
package/fetchers/index.js CHANGED
@@ -1,24 +1,68 @@
1
- const require_fetch_polyfill = require("./fetch.polyfill.js");
1
+ import { fetchSafe } from "./fetch.polyfill.js";
2
2
  //#region src/fetchers/index.ts
3
- const USER_AGENTS = [
4
- "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36",
5
- "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",
6
- "Mozilla/5.0 (Linux; Android 10; SM-A205U) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.101 Mobile Safari/537.36",
7
- "Mozilla/5.0 (Linux; Android 10) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.101 Mobile Safari/537.36"
3
+ const browserProfiles = [
4
+ {
5
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36",
6
+ "Sec-Ch-Ua": "\"Google Chrome\";v=\"131\", \"Chromium\";v=\"131\", \"Not_A Brand\";v=\"24\"",
7
+ "Sec-Ch-Ua-Platform": "\"Windows\""
8
+ },
9
+ {
10
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36",
11
+ "Sec-Ch-Ua": "\"Google Chrome\";v=\"130\", \"Chromium\";v=\"130\", \"Not_A Brand\";v=\"24\"",
12
+ "Sec-Ch-Ua-Platform": "\"Windows\""
13
+ },
14
+ {
15
+ "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36",
16
+ "Sec-Ch-Ua": "\"Google Chrome\";v=\"131\", \"Chromium\";v=\"131\", \"Not_A Brand\";v=\"24\"",
17
+ "Sec-Ch-Ua-Platform": "\"macOS\""
18
+ },
19
+ {
20
+ "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36",
21
+ "Sec-Ch-Ua": "\"Google Chrome\";v=\"130\", \"Chromium\";v=\"130\", \"Not_A Brand\";v=\"24\"",
22
+ "Sec-Ch-Ua-Platform": "\"macOS\""
23
+ },
24
+ {
25
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0",
26
+ "Sec-Ch-Ua": "\"Microsoft Edge\";v=\"131\", \"Chromium\";v=\"131\", \"Not_A Brand\";v=\"24\"",
27
+ "Sec-Ch-Ua-Platform": "\"Windows\""
28
+ },
29
+ {
30
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36 Edg/130.0.0.0",
31
+ "Sec-Ch-Ua": "\"Microsoft Edge\";v=\"130\", \"Chromium\";v=\"130\", \"Not_A Brand\";v=\"24\"",
32
+ "Sec-Ch-Ua-Platform": "\"Windows\""
33
+ }
8
34
  ];
9
- const defaultHeaders = { "User-Agent": USER_AGENTS[Math.floor(Math.random() * USER_AGENTS.length)] };
35
+ const randomProfile = () => browserProfiles[Math.floor(Math.random() * browserProfiles.length)];
36
+ const baseHeaders = {
37
+ Accept: "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7",
38
+ "Accept-Language": "cs-CZ,cs;q=0.9,en-US;q=0.8,en;q=0.7",
39
+ "Accept-Encoding": "gzip, deflate, br",
40
+ "Cache-Control": "max-age=0",
41
+ Connection: "keep-alive",
42
+ "Sec-Ch-Ua-Mobile": "?0",
43
+ "Sec-Fetch-Dest": "document",
44
+ "Sec-Fetch-Mode": "navigate",
45
+ "Sec-Fetch-Site": "none",
46
+ "Sec-Fetch-User": "?1",
47
+ "Upgrade-Insecure-Requests": "1"
48
+ };
10
49
  const fetchPage = async (url, optionsRequest) => {
11
50
  try {
12
- const mergedHeaders = new Headers(defaultHeaders);
51
+ const mergedHeaders = new Headers({
52
+ ...baseHeaders,
53
+ ...randomProfile()
54
+ });
13
55
  if (optionsRequest?.headers) new Headers(optionsRequest.headers).forEach((value, key) => mergedHeaders.set(key, value));
14
56
  const { headers: _, ...restOptions } = optionsRequest || {};
15
- const response = await require_fetch_polyfill.fetchSafe(url, {
57
+ const response = await fetchSafe(url, {
16
58
  credentials: "omit",
17
59
  ...restOptions,
18
60
  headers: mergedHeaders
19
61
  });
20
- if (response.status >= 400 && response.status < 600) throw new Error(`node-csfd-api: Bad response ${response.status} for url: ${url}`);
21
- return await response.text();
62
+ if (!response.ok) throw new Error(`node-csfd-api: Bad response ${response.status} for url: ${url}`);
63
+ const html = await response.text();
64
+ if (html.includes("Making sure you're not a bot!")) console.warn("node-csfd-api: Trap detected.");
65
+ return html;
22
66
  } catch (e) {
23
67
  if (e instanceof Error) console.error(e.message);
24
68
  else console.error(String(e));
@@ -26,6 +70,6 @@ const fetchPage = async (url, optionsRequest) => {
26
70
  }
27
71
  };
28
72
  //#endregion
29
- exports.fetchPage = fetchPage;
73
+ export { fetchPage };
30
74
 
31
75
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["fetchSafe"],"sources":["../../src/fetchers/index.ts"],"sourcesContent":["import { fetchSafe } from './fetch.polyfill';\n\nconst USER_AGENTS: string[] = [\n 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36',\n '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',\n 'Mozilla/5.0 (Linux; Android 10; SM-A205U) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.101 Mobile Safari/537.36',\n 'Mozilla/5.0 (Linux; Android 10) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.101 Mobile Safari/537.36'\n];\n\nconst defaultHeaders = {\n 'User-Agent': USER_AGENTS[Math.floor(Math.random() * USER_AGENTS.length)],\n};\n\nexport const fetchPage = async (url: string, optionsRequest?: RequestInit): Promise<string> => {\n try {\n const mergedHeaders = new Headers(defaultHeaders);\n if (optionsRequest?.headers) {\n const reqHeaders = new Headers(optionsRequest.headers);\n reqHeaders.forEach((value, key) => mergedHeaders.set(key, value));\n }\n const { headers: _, ...restOptions } = optionsRequest || {};\n\n const response = await fetchSafe(url, { credentials: 'omit', ...restOptions, headers: mergedHeaders });\n if (response.status >= 400 && response.status < 600) {\n throw new Error(`node-csfd-api: Bad response ${response.status} for url: ${url}`);\n }\n return await response.text();\n } catch (e: unknown) {\n if (e instanceof Error) {\n console.error(e.message);\n } else {\n console.error(String(e));\n }\n return 'Error';\n }\n};\n"],"mappings":";;AAEA,MAAM,cAAwB;CAC5B;CACA;CACA;CACA;CACD;AAED,MAAM,iBAAiB,EACrB,cAAc,YAAY,KAAK,MAAM,KAAK,QAAQ,GAAG,YAAY,OAAO,GACzE;AAED,MAAa,YAAY,OAAO,KAAa,mBAAkD;AAC7F,KAAI;EACF,MAAM,gBAAgB,IAAI,QAAQ,eAAe;AACjD,MAAI,gBAAgB,QACC,KAAI,QAAQ,eAAe,QAAQ,CAC3C,SAAS,OAAO,QAAQ,cAAc,IAAI,KAAK,MAAM,CAAC;EAEnE,MAAM,EAAE,SAAS,GAAG,GAAG,gBAAgB,kBAAkB,EAAE;EAE3D,MAAM,WAAW,MAAMA,uBAAAA,UAAU,KAAK;GAAE,aAAa;GAAQ,GAAG;GAAa,SAAS;GAAe,CAAC;AACtG,MAAI,SAAS,UAAU,OAAO,SAAS,SAAS,IAC9C,OAAM,IAAI,MAAM,+BAA+B,SAAS,OAAO,YAAY,MAAM;AAEnF,SAAO,MAAM,SAAS,MAAM;UACrB,GAAY;AACnB,MAAI,aAAa,MACf,SAAQ,MAAM,EAAE,QAAQ;MAExB,SAAQ,MAAM,OAAO,EAAE,CAAC;AAE1B,SAAO"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../src/fetchers/index.ts"],"sourcesContent":["import { fetchSafe } from './fetch.polyfill';\n\ninterface BrowserProfile {\n 'User-Agent': string;\n 'Sec-Ch-Ua': string;\n 'Sec-Ch-Ua-Platform': string;\n}\n\nconst browserProfiles: BrowserProfile[] = [\n // Chrome 131 / Windows\n {\n 'User-Agent':\n 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36',\n 'Sec-Ch-Ua': '\"Google Chrome\";v=\"131\", \"Chromium\";v=\"131\", \"Not_A Brand\";v=\"24\"',\n 'Sec-Ch-Ua-Platform': '\"Windows\"'\n },\n // Chrome 130 / Windows\n {\n 'User-Agent':\n 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36',\n 'Sec-Ch-Ua': '\"Google Chrome\";v=\"130\", \"Chromium\";v=\"130\", \"Not_A Brand\";v=\"24\"',\n 'Sec-Ch-Ua-Platform': '\"Windows\"'\n },\n // Chrome 131 / macOS\n {\n 'User-Agent':\n 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36',\n 'Sec-Ch-Ua': '\"Google Chrome\";v=\"131\", \"Chromium\";v=\"131\", \"Not_A Brand\";v=\"24\"',\n 'Sec-Ch-Ua-Platform': '\"macOS\"'\n },\n // Chrome 130 / macOS\n {\n 'User-Agent':\n 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36',\n 'Sec-Ch-Ua': '\"Google Chrome\";v=\"130\", \"Chromium\";v=\"130\", \"Not_A Brand\";v=\"24\"',\n 'Sec-Ch-Ua-Platform': '\"macOS\"'\n },\n // Edge 131 / Windows\n {\n 'User-Agent':\n 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0',\n 'Sec-Ch-Ua': '\"Microsoft Edge\";v=\"131\", \"Chromium\";v=\"131\", \"Not_A Brand\";v=\"24\"',\n 'Sec-Ch-Ua-Platform': '\"Windows\"'\n },\n // Edge 130 / Windows\n {\n 'User-Agent':\n 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36 Edg/130.0.0.0',\n 'Sec-Ch-Ua': '\"Microsoft Edge\";v=\"130\", \"Chromium\";v=\"130\", \"Not_A Brand\";v=\"24\"',\n 'Sec-Ch-Ua-Platform': '\"Windows\"'\n }\n];\n\nconst randomProfile = (): BrowserProfile =>\n browserProfiles[Math.floor(Math.random() * browserProfiles.length)];\n\nconst baseHeaders = {\n Accept:\n 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',\n 'Accept-Language': 'cs-CZ,cs;q=0.9,en-US;q=0.8,en;q=0.7',\n 'Accept-Encoding': 'gzip, deflate, br',\n 'Cache-Control': 'max-age=0',\n Connection: 'keep-alive',\n 'Sec-Ch-Ua-Mobile': '?0',\n 'Sec-Fetch-Dest': 'document',\n 'Sec-Fetch-Mode': 'navigate',\n 'Sec-Fetch-Site': 'none',\n 'Sec-Fetch-User': '?1',\n 'Upgrade-Insecure-Requests': '1'\n};\n\nexport const fetchPage = async (url: string, optionsRequest?: RequestInit): Promise<string> => {\n try {\n const mergedHeaders = new Headers({ ...baseHeaders, ...randomProfile() });\n\n // Merge any custom headers provided in the function arguments\n if (optionsRequest?.headers) {\n const reqHeaders = new Headers(optionsRequest.headers);\n reqHeaders.forEach((value, key) => mergedHeaders.set(key, value));\n }\n\n const { headers: _, ...restOptions } = optionsRequest || {};\n\n const response = await fetchSafe(url, {\n credentials: 'omit',\n ...restOptions,\n headers: mergedHeaders\n });\n\n if (!response.ok) {\n throw new Error(`node-csfd-api: Bad response ${response.status} for url: ${url}`);\n }\n\n const html = await response.text();\n\n // Quickly check if we hit the trap\n if (html.includes(\"Making sure you're not a bot!\")) {\n console.warn('node-csfd-api: Trap detected.');\n }\n\n return html;\n } catch (e: unknown) {\n if (e instanceof Error) {\n console.error(e.message);\n } else {\n console.error(String(e));\n }\n return 'Error';\n }\n};\n"],"mappings":";;AAQA,MAAM,kBAAoC;CAExC;EACE,cACE;EACF,aAAa;EACb,sBAAsB;EACvB;CAED;EACE,cACE;EACF,aAAa;EACb,sBAAsB;EACvB;CAED;EACE,cACE;EACF,aAAa;EACb,sBAAsB;EACvB;CAED;EACE,cACE;EACF,aAAa;EACb,sBAAsB;EACvB;CAED;EACE,cACE;EACF,aAAa;EACb,sBAAsB;EACvB;CAED;EACE,cACE;EACF,aAAa;EACb,sBAAsB;EACvB;CACF;AAED,MAAM,sBACJ,gBAAgB,KAAK,MAAM,KAAK,QAAQ,GAAG,gBAAgB,OAAO;AAEpE,MAAM,cAAc;CAClB,QACE;CACF,mBAAmB;CACnB,mBAAmB;CACnB,iBAAiB;CACjB,YAAY;CACZ,oBAAoB;CACpB,kBAAkB;CAClB,kBAAkB;CAClB,kBAAkB;CAClB,kBAAkB;CAClB,6BAA6B;CAC9B;AAED,MAAa,YAAY,OAAO,KAAa,mBAAkD;AAC7F,KAAI;EACF,MAAM,gBAAgB,IAAI,QAAQ;GAAE,GAAG;GAAa,GAAG,eAAe;GAAE,CAAC;AAGzE,MAAI,gBAAgB,QACC,KAAI,QAAQ,eAAe,QAAQ,CAC3C,SAAS,OAAO,QAAQ,cAAc,IAAI,KAAK,MAAM,CAAC;EAGnE,MAAM,EAAE,SAAS,GAAG,GAAG,gBAAgB,kBAAkB,EAAE;EAE3D,MAAM,WAAW,MAAM,UAAU,KAAK;GACpC,aAAa;GACb,GAAG;GACH,SAAS;GACV,CAAC;AAEF,MAAI,CAAC,SAAS,GACZ,OAAM,IAAI,MAAM,+BAA+B,SAAS,OAAO,YAAY,MAAM;EAGnF,MAAM,OAAO,MAAM,SAAS,MAAM;AAGlC,MAAI,KAAK,SAAS,gCAAgC,CAChD,SAAQ,KAAK,gCAAgC;AAG/C,SAAO;UACA,GAAY;AACnB,MAAI,aAAa,MACf,SAAQ,MAAM,EAAE,QAAQ;MAExB,SAAQ,MAAM,OAAO,EAAE,CAAC;AAE1B,SAAO"}
@@ -0,0 +1,83 @@
1
+ const require_global_helper = require("./global.helper.cjs");
2
+ //#region src/helpers/cinema.helper.ts
3
+ const getCinemaColorRating = (el) => {
4
+ const classes = el?.classNames.split(" ") ?? [];
5
+ const last = classes.length ? classes[classes.length - 1] : void 0;
6
+ return last ? require_global_helper.parseColor(last) : "unknown";
7
+ };
8
+ const getCinemaId = (el) => {
9
+ return +el?.id?.split("-")[1];
10
+ };
11
+ const getCinemaUrlId = (url) => {
12
+ if (!url) return null;
13
+ return require_global_helper.parseIdFromUrl(url);
14
+ };
15
+ const getCinemaCoords = (el) => {
16
+ if (!el) return null;
17
+ const linkMapsEl = el.querySelector("a[href*=\"q=\"]");
18
+ if (!linkMapsEl) return null;
19
+ const [_, latLng] = linkMapsEl.getAttribute("href").split("q=");
20
+ const coords = latLng.split(",");
21
+ if (coords.length !== 2) return null;
22
+ const lat = Number(coords[0]);
23
+ const lng = Number(coords[1]);
24
+ if (Number.isFinite(lat) && Number.isFinite(lng)) return {
25
+ lat,
26
+ lng
27
+ };
28
+ return null;
29
+ };
30
+ const getCinemaUrl = (el) => {
31
+ if (!el) return "";
32
+ return el.querySelector(".cinema-logo a")?.attributes.href ?? "";
33
+ };
34
+ const parseCinema = (el) => {
35
+ const [city, name] = el.querySelector("header h2").innerText.trim().split(" - ");
36
+ return {
37
+ city,
38
+ name
39
+ };
40
+ };
41
+ const getGroupedFilmsByDate = (el) => {
42
+ const divs = el.querySelectorAll(":scope > div");
43
+ return divs.map((_, index) => index).filter((index) => index % 2 === 0).map((index) => {
44
+ const [date, films] = divs.slice(index, index + 2);
45
+ return {
46
+ date: date?.firstChild?.textContent?.trim() ?? null,
47
+ films: getCinemaFilms("", films)
48
+ };
49
+ });
50
+ };
51
+ const getCinemaFilms = (date, el) => {
52
+ return el.querySelectorAll(".cinema-table tr").map((filmNode) => {
53
+ const url = filmNode.querySelector("td.name h3 a")?.attributes.href;
54
+ const id = url ? getCinemaUrlId(url) : null;
55
+ const title = filmNode.querySelector(".name h3")?.text.trim();
56
+ const colorRating = getCinemaColorRating(filmNode.querySelector(".name .icon"));
57
+ const showTimes = filmNode.querySelectorAll(".td-time")?.map((x) => x.textContent.trim());
58
+ const meta = filmNode.querySelectorAll(".td-title span")?.map((x) => x.text.trim());
59
+ return {
60
+ id,
61
+ title,
62
+ url,
63
+ colorRating,
64
+ showTimes,
65
+ meta: parseMeta(meta)
66
+ };
67
+ });
68
+ };
69
+ const parseMeta = (meta) => {
70
+ const metaConvert = [];
71
+ for (const element of meta) if (element === "T") metaConvert.push("subtitles");
72
+ else if (element === "D") metaConvert.push("dubbing");
73
+ else metaConvert.push(element);
74
+ return metaConvert;
75
+ };
76
+ //#endregion
77
+ exports.getCinemaCoords = getCinemaCoords;
78
+ exports.getCinemaId = getCinemaId;
79
+ exports.getCinemaUrl = getCinemaUrl;
80
+ exports.getGroupedFilmsByDate = getGroupedFilmsByDate;
81
+ exports.parseCinema = parseCinema;
82
+
83
+ //# sourceMappingURL=cinema.helper.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cinema.helper.cjs","names":["parseColor","parseIdFromUrl"],"sources":["../../src/helpers/cinema.helper.ts"],"sourcesContent":["import { HTMLElement } from 'node-html-parser';\nimport { CSFDCinemaGroupedFilmsByDate, CSFDCinemaMeta, CSFDCinemaMovie } from '../dto/cinema';\nimport { CSFDColorRating } from '../dto/global';\nimport { CSFDColors } from '../dto/user-ratings';\nimport { parseColor, parseIdFromUrl } from './global.helper';\n\nexport const getCinemaColorRating = (el: HTMLElement | null): CSFDColorRating => {\n const classes: string[] = el?.classNames.split(' ') ?? [];\n const last = classes.length ? classes[classes.length - 1] : undefined;\n return last ? parseColor(last as CSFDColors) : 'unknown';\n};\n\nexport const getCinemaId = (el: HTMLElement | null): number => {\n const id = el?.id?.split('-')[1];\n return +id;\n};\n\nexport const getCinemaUrlId = (url: string | null | undefined): number | null => {\n if (!url) return null;\n return parseIdFromUrl(url);\n};\n\nexport const getCinemaCoords = (el: HTMLElement | null): { lat: number; lng: number } | null => {\n if (!el) return null;\n const linkMapsEl = el.querySelector('a[href*=\"q=\"]');\n if (!linkMapsEl) return null;\n\n const linkMaps = linkMapsEl.getAttribute('href');\n const [_, latLng] = linkMaps.split('q=');\n\n const coords = latLng.split(',');\n if (coords.length !== 2) return null;\n\n const lat = Number(coords[0]);\n const lng = Number(coords[1]);\n if (Number.isFinite(lat) && Number.isFinite(lng)) {\n return { lat, lng };\n }\n return null;\n};\n\nexport const getCinemaUrl = (el: HTMLElement | null): string => {\n if (!el) return '';\n return el.querySelector('.cinema-logo a')?.attributes.href ?? '';\n};\n\nexport const parseCinema = (el: HTMLElement | null): { city: string; name: string } => {\n const title = el.querySelector('header h2').innerText.trim();\n const [city, name] = title.split(' - ');\n return { city, name };\n};\n\nexport const getGroupedFilmsByDate = (el: HTMLElement | null): CSFDCinemaGroupedFilmsByDate[] => {\n const divs = el.querySelectorAll(':scope > div');\n const getDatesAndFilms = divs\n .map((_, index) => index)\n .filter((index) => index % 2 === 0)\n .map((index) => {\n const [date, films] = divs.slice(index, index + 2);\n const dateText = date?.firstChild?.textContent?.trim() ?? null;\n return { date: dateText, films: getCinemaFilms('', films) };\n });\n\n return getDatesAndFilms;\n};\n\nexport const getCinemaFilms = (date: string, el: HTMLElement | null): CSFDCinemaMovie[] => {\n const filmNodes = el.querySelectorAll('.cinema-table tr');\n\n const films = filmNodes.map((filmNode) => {\n const url = filmNode.querySelector('td.name h3 a')?.attributes.href;\n const id = url ? getCinemaUrlId(url) : null;\n const title = filmNode.querySelector('.name h3')?.text.trim();\n const colorRating = getCinemaColorRating(filmNode.querySelector('.name .icon'));\n const showTimes = filmNode.querySelectorAll('.td-time')?.map((x) => x.textContent.trim());\n const meta = filmNode.querySelectorAll('.td-title span')?.map((x) => x.text.trim());\n\n return {\n id,\n title,\n url,\n colorRating,\n showTimes,\n meta: parseMeta(meta)\n };\n });\n return films;\n};\n\nexport const parseMeta = (meta: string[]): CSFDCinemaMeta[] => {\n const metaConvert: CSFDCinemaMeta[] = [];\n\n for (const element of meta) {\n if (element === 'T') {\n metaConvert.push('subtitles');\n } else if (element === 'D') {\n metaConvert.push('dubbing');\n } else {\n metaConvert.push(element);\n }\n }\n\n return metaConvert;\n};\n"],"mappings":";;AAMA,MAAa,wBAAwB,OAA4C;CAC/E,MAAM,UAAoB,IAAI,WAAW,MAAM,IAAI,IAAI,EAAE;CACzD,MAAM,OAAO,QAAQ,SAAS,QAAQ,QAAQ,SAAS,KAAK,KAAA;AAC5D,QAAO,OAAOA,sBAAAA,WAAW,KAAmB,GAAG;;AAGjD,MAAa,eAAe,OAAmC;AAE7D,QAAO,CADI,IAAI,IAAI,MAAM,IAAI,CAAC;;AAIhC,MAAa,kBAAkB,QAAkD;AAC/E,KAAI,CAAC,IAAK,QAAO;AACjB,QAAOC,sBAAAA,eAAe,IAAI;;AAG5B,MAAa,mBAAmB,OAAgE;AAC9F,KAAI,CAAC,GAAI,QAAO;CAChB,MAAM,aAAa,GAAG,cAAc,kBAAgB;AACpD,KAAI,CAAC,WAAY,QAAO;CAGxB,MAAM,CAAC,GAAG,UADO,WAAW,aAAa,OAAO,CACnB,MAAM,KAAK;CAExC,MAAM,SAAS,OAAO,MAAM,IAAI;AAChC,KAAI,OAAO,WAAW,EAAG,QAAO;CAEhC,MAAM,MAAM,OAAO,OAAO,GAAG;CAC7B,MAAM,MAAM,OAAO,OAAO,GAAG;AAC7B,KAAI,OAAO,SAAS,IAAI,IAAI,OAAO,SAAS,IAAI,CAC9C,QAAO;EAAE;EAAK;EAAK;AAErB,QAAO;;AAGT,MAAa,gBAAgB,OAAmC;AAC9D,KAAI,CAAC,GAAI,QAAO;AAChB,QAAO,GAAG,cAAc,iBAAiB,EAAE,WAAW,QAAQ;;AAGhE,MAAa,eAAe,OAA2D;CAErF,MAAM,CAAC,MAAM,QADC,GAAG,cAAc,YAAY,CAAC,UAAU,MAAM,CACjC,MAAM,MAAM;AACvC,QAAO;EAAE;EAAM;EAAM;;AAGvB,MAAa,yBAAyB,OAA2D;CAC/F,MAAM,OAAO,GAAG,iBAAiB,eAAe;AAUhD,QATyB,KACtB,KAAK,GAAG,UAAU,MAAM,CACxB,QAAQ,UAAU,QAAQ,MAAM,EAAE,CAClC,KAAK,UAAU;EACd,MAAM,CAAC,MAAM,SAAS,KAAK,MAAM,OAAO,QAAQ,EAAE;AAElD,SAAO;GAAE,MADQ,MAAM,YAAY,aAAa,MAAM,IAAI;GACjC,OAAO,eAAe,IAAI,MAAM;GAAE;GAC3D;;AAKN,MAAa,kBAAkB,MAAc,OAA8C;AAoBzF,QAnBkB,GAAG,iBAAiB,mBAAmB,CAEjC,KAAK,aAAa;EACxC,MAAM,MAAM,SAAS,cAAc,eAAe,EAAE,WAAW;EAC/D,MAAM,KAAK,MAAM,eAAe,IAAI,GAAG;EACvC,MAAM,QAAQ,SAAS,cAAc,WAAW,EAAE,KAAK,MAAM;EAC7D,MAAM,cAAc,qBAAqB,SAAS,cAAc,cAAc,CAAC;EAC/E,MAAM,YAAY,SAAS,iBAAiB,WAAW,EAAE,KAAK,MAAM,EAAE,YAAY,MAAM,CAAC;EACzF,MAAM,OAAO,SAAS,iBAAiB,iBAAiB,EAAE,KAAK,MAAM,EAAE,KAAK,MAAM,CAAC;AAEnF,SAAO;GACL;GACA;GACA;GACA;GACA;GACA,MAAM,UAAU,KAAK;GACtB;GACD;;AAIJ,MAAa,aAAa,SAAqC;CAC7D,MAAM,cAAgC,EAAE;AAExC,MAAK,MAAM,WAAW,KACpB,KAAI,YAAY,IACd,aAAY,KAAK,YAAY;UACpB,YAAY,IACrB,aAAY,KAAK,UAAU;KAE3B,aAAY,KAAK,QAAQ;AAI7B,QAAO"}
@@ -1,16 +1,16 @@
1
- const require_global_helper = require("./global.helper.js");
1
+ import { parseColor, parseIdFromUrl } from "./global.helper.js";
2
2
  //#region src/helpers/cinema.helper.ts
3
3
  const getCinemaColorRating = (el) => {
4
4
  const classes = el?.classNames.split(" ") ?? [];
5
5
  const last = classes.length ? classes[classes.length - 1] : void 0;
6
- return last ? require_global_helper.parseColor(last) : "unknown";
6
+ return last ? parseColor(last) : "unknown";
7
7
  };
8
8
  const getCinemaId = (el) => {
9
9
  return +el?.id?.split("-")[1];
10
10
  };
11
11
  const getCinemaUrlId = (url) => {
12
12
  if (!url) return null;
13
- return require_global_helper.parseIdFromUrl(url);
13
+ return parseIdFromUrl(url);
14
14
  };
15
15
  const getCinemaCoords = (el) => {
16
16
  if (!el) return null;
@@ -74,10 +74,6 @@ const parseMeta = (meta) => {
74
74
  return metaConvert;
75
75
  };
76
76
  //#endregion
77
- exports.getCinemaCoords = getCinemaCoords;
78
- exports.getCinemaId = getCinemaId;
79
- exports.getCinemaUrl = getCinemaUrl;
80
- exports.getGroupedFilmsByDate = getGroupedFilmsByDate;
81
- exports.parseCinema = parseCinema;
77
+ export { getCinemaCoords, getCinemaId, getCinemaUrl, getGroupedFilmsByDate, parseCinema };
82
78
 
83
79
  //# sourceMappingURL=cinema.helper.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"cinema.helper.js","names":["parseColor","parseIdFromUrl"],"sources":["../../src/helpers/cinema.helper.ts"],"sourcesContent":["import { HTMLElement } from 'node-html-parser';\nimport { CSFDCinemaGroupedFilmsByDate, CSFDCinemaMeta, CSFDCinemaMovie } from '../dto/cinema';\nimport { CSFDColorRating } from '../dto/global';\nimport { CSFDColors } from '../dto/user-ratings';\nimport { parseColor, parseIdFromUrl } from './global.helper';\n\nexport const getCinemaColorRating = (el: HTMLElement | null): CSFDColorRating => {\n const classes: string[] = el?.classNames.split(' ') ?? [];\n const last = classes.length ? classes[classes.length - 1] : undefined;\n return last ? parseColor(last as CSFDColors) : 'unknown';\n};\n\nexport const getCinemaId = (el: HTMLElement | null): number => {\n const id = el?.id?.split('-')[1];\n return +id;\n};\n\nexport const getCinemaUrlId = (url: string | null | undefined): number | null => {\n if (!url) return null;\n return parseIdFromUrl(url);\n};\n\nexport const getCinemaCoords = (el: HTMLElement | null): { lat: number; lng: number } | null => {\n if (!el) return null;\n const linkMapsEl = el.querySelector('a[href*=\"q=\"]');\n if (!linkMapsEl) return null;\n\n const linkMaps = linkMapsEl.getAttribute('href');\n const [_, latLng] = linkMaps.split('q=');\n\n const coords = latLng.split(',');\n if (coords.length !== 2) return null;\n\n const lat = Number(coords[0]);\n const lng = Number(coords[1]);\n if (Number.isFinite(lat) && Number.isFinite(lng)) {\n return { lat, lng };\n }\n return null;\n};\n\nexport const getCinemaUrl = (el: HTMLElement | null): string => {\n if (!el) return '';\n return el.querySelector('.cinema-logo a')?.attributes.href ?? '';\n};\n\nexport const parseCinema = (el: HTMLElement | null): { city: string; name: string } => {\n const title = el.querySelector('header h2').innerText.trim();\n const [city, name] = title.split(' - ');\n return { city, name };\n};\n\nexport const getGroupedFilmsByDate = (el: HTMLElement | null): CSFDCinemaGroupedFilmsByDate[] => {\n const divs = el.querySelectorAll(':scope > div');\n const getDatesAndFilms = divs\n .map((_, index) => index)\n .filter((index) => index % 2 === 0)\n .map((index) => {\n const [date, films] = divs.slice(index, index + 2);\n const dateText = date?.firstChild?.textContent?.trim() ?? null;\n return { date: dateText, films: getCinemaFilms('', films) };\n });\n\n return getDatesAndFilms;\n};\n\nexport const getCinemaFilms = (date: string, el: HTMLElement | null): CSFDCinemaMovie[] => {\n const filmNodes = el.querySelectorAll('.cinema-table tr');\n\n const films = filmNodes.map((filmNode) => {\n const url = filmNode.querySelector('td.name h3 a')?.attributes.href;\n const id = url ? getCinemaUrlId(url) : null;\n const title = filmNode.querySelector('.name h3')?.text.trim();\n const colorRating = getCinemaColorRating(filmNode.querySelector('.name .icon'));\n const showTimes = filmNode.querySelectorAll('.td-time')?.map((x) => x.textContent.trim());\n const meta = filmNode.querySelectorAll('.td-title span')?.map((x) => x.text.trim());\n\n return {\n id,\n title,\n url,\n colorRating,\n showTimes,\n meta: parseMeta(meta)\n };\n });\n return films;\n};\n\nexport const parseMeta = (meta: string[]): CSFDCinemaMeta[] => {\n const metaConvert: CSFDCinemaMeta[] = [];\n\n for (const element of meta) {\n if (element === 'T') {\n metaConvert.push('subtitles');\n } else if (element === 'D') {\n metaConvert.push('dubbing');\n } else {\n metaConvert.push(element);\n }\n }\n\n return metaConvert;\n};\n"],"mappings":";;AAMA,MAAa,wBAAwB,OAA4C;CAC/E,MAAM,UAAoB,IAAI,WAAW,MAAM,IAAI,IAAI,EAAE;CACzD,MAAM,OAAO,QAAQ,SAAS,QAAQ,QAAQ,SAAS,KAAK,KAAA;AAC5D,QAAO,OAAOA,sBAAAA,WAAW,KAAmB,GAAG;;AAGjD,MAAa,eAAe,OAAmC;AAE7D,QAAO,CADI,IAAI,IAAI,MAAM,IAAI,CAAC;;AAIhC,MAAa,kBAAkB,QAAkD;AAC/E,KAAI,CAAC,IAAK,QAAO;AACjB,QAAOC,sBAAAA,eAAe,IAAI;;AAG5B,MAAa,mBAAmB,OAAgE;AAC9F,KAAI,CAAC,GAAI,QAAO;CAChB,MAAM,aAAa,GAAG,cAAc,kBAAgB;AACpD,KAAI,CAAC,WAAY,QAAO;CAGxB,MAAM,CAAC,GAAG,UADO,WAAW,aAAa,OAAO,CACnB,MAAM,KAAK;CAExC,MAAM,SAAS,OAAO,MAAM,IAAI;AAChC,KAAI,OAAO,WAAW,EAAG,QAAO;CAEhC,MAAM,MAAM,OAAO,OAAO,GAAG;CAC7B,MAAM,MAAM,OAAO,OAAO,GAAG;AAC7B,KAAI,OAAO,SAAS,IAAI,IAAI,OAAO,SAAS,IAAI,CAC9C,QAAO;EAAE;EAAK;EAAK;AAErB,QAAO;;AAGT,MAAa,gBAAgB,OAAmC;AAC9D,KAAI,CAAC,GAAI,QAAO;AAChB,QAAO,GAAG,cAAc,iBAAiB,EAAE,WAAW,QAAQ;;AAGhE,MAAa,eAAe,OAA2D;CAErF,MAAM,CAAC,MAAM,QADC,GAAG,cAAc,YAAY,CAAC,UAAU,MAAM,CACjC,MAAM,MAAM;AACvC,QAAO;EAAE;EAAM;EAAM;;AAGvB,MAAa,yBAAyB,OAA2D;CAC/F,MAAM,OAAO,GAAG,iBAAiB,eAAe;AAUhD,QATyB,KACtB,KAAK,GAAG,UAAU,MAAM,CACxB,QAAQ,UAAU,QAAQ,MAAM,EAAE,CAClC,KAAK,UAAU;EACd,MAAM,CAAC,MAAM,SAAS,KAAK,MAAM,OAAO,QAAQ,EAAE;AAElD,SAAO;GAAE,MADQ,MAAM,YAAY,aAAa,MAAM,IAAI;GACjC,OAAO,eAAe,IAAI,MAAM;GAAE;GAC3D;;AAKN,MAAa,kBAAkB,MAAc,OAA8C;AAoBzF,QAnBkB,GAAG,iBAAiB,mBAAmB,CAEjC,KAAK,aAAa;EACxC,MAAM,MAAM,SAAS,cAAc,eAAe,EAAE,WAAW;EAC/D,MAAM,KAAK,MAAM,eAAe,IAAI,GAAG;EACvC,MAAM,QAAQ,SAAS,cAAc,WAAW,EAAE,KAAK,MAAM;EAC7D,MAAM,cAAc,qBAAqB,SAAS,cAAc,cAAc,CAAC;EAC/E,MAAM,YAAY,SAAS,iBAAiB,WAAW,EAAE,KAAK,MAAM,EAAE,YAAY,MAAM,CAAC;EACzF,MAAM,OAAO,SAAS,iBAAiB,iBAAiB,EAAE,KAAK,MAAM,EAAE,KAAK,MAAM,CAAC;AAEnF,SAAO;GACL;GACA;GACA;GACA;GACA;GACA,MAAM,UAAU,KAAK;GACtB;GACD;;AAIJ,MAAa,aAAa,SAAqC;CAC7D,MAAM,cAAgC,EAAE;AAExC,MAAK,MAAM,WAAW,KACpB,KAAI,YAAY,IACd,aAAY,KAAK,YAAY;UACpB,YAAY,IACrB,aAAY,KAAK,UAAU;KAE3B,aAAY,KAAK,QAAQ;AAI7B,QAAO"}
1
+ {"version":3,"file":"cinema.helper.js","names":[],"sources":["../../src/helpers/cinema.helper.ts"],"sourcesContent":["import { HTMLElement } from 'node-html-parser';\nimport { CSFDCinemaGroupedFilmsByDate, CSFDCinemaMeta, CSFDCinemaMovie } from '../dto/cinema';\nimport { CSFDColorRating } from '../dto/global';\nimport { CSFDColors } from '../dto/user-ratings';\nimport { parseColor, parseIdFromUrl } from './global.helper';\n\nexport const getCinemaColorRating = (el: HTMLElement | null): CSFDColorRating => {\n const classes: string[] = el?.classNames.split(' ') ?? [];\n const last = classes.length ? classes[classes.length - 1] : undefined;\n return last ? parseColor(last as CSFDColors) : 'unknown';\n};\n\nexport const getCinemaId = (el: HTMLElement | null): number => {\n const id = el?.id?.split('-')[1];\n return +id;\n};\n\nexport const getCinemaUrlId = (url: string | null | undefined): number | null => {\n if (!url) return null;\n return parseIdFromUrl(url);\n};\n\nexport const getCinemaCoords = (el: HTMLElement | null): { lat: number; lng: number } | null => {\n if (!el) return null;\n const linkMapsEl = el.querySelector('a[href*=\"q=\"]');\n if (!linkMapsEl) return null;\n\n const linkMaps = linkMapsEl.getAttribute('href');\n const [_, latLng] = linkMaps.split('q=');\n\n const coords = latLng.split(',');\n if (coords.length !== 2) return null;\n\n const lat = Number(coords[0]);\n const lng = Number(coords[1]);\n if (Number.isFinite(lat) && Number.isFinite(lng)) {\n return { lat, lng };\n }\n return null;\n};\n\nexport const getCinemaUrl = (el: HTMLElement | null): string => {\n if (!el) return '';\n return el.querySelector('.cinema-logo a')?.attributes.href ?? '';\n};\n\nexport const parseCinema = (el: HTMLElement | null): { city: string; name: string } => {\n const title = el.querySelector('header h2').innerText.trim();\n const [city, name] = title.split(' - ');\n return { city, name };\n};\n\nexport const getGroupedFilmsByDate = (el: HTMLElement | null): CSFDCinemaGroupedFilmsByDate[] => {\n const divs = el.querySelectorAll(':scope > div');\n const getDatesAndFilms = divs\n .map((_, index) => index)\n .filter((index) => index % 2 === 0)\n .map((index) => {\n const [date, films] = divs.slice(index, index + 2);\n const dateText = date?.firstChild?.textContent?.trim() ?? null;\n return { date: dateText, films: getCinemaFilms('', films) };\n });\n\n return getDatesAndFilms;\n};\n\nexport const getCinemaFilms = (date: string, el: HTMLElement | null): CSFDCinemaMovie[] => {\n const filmNodes = el.querySelectorAll('.cinema-table tr');\n\n const films = filmNodes.map((filmNode) => {\n const url = filmNode.querySelector('td.name h3 a')?.attributes.href;\n const id = url ? getCinemaUrlId(url) : null;\n const title = filmNode.querySelector('.name h3')?.text.trim();\n const colorRating = getCinemaColorRating(filmNode.querySelector('.name .icon'));\n const showTimes = filmNode.querySelectorAll('.td-time')?.map((x) => x.textContent.trim());\n const meta = filmNode.querySelectorAll('.td-title span')?.map((x) => x.text.trim());\n\n return {\n id,\n title,\n url,\n colorRating,\n showTimes,\n meta: parseMeta(meta)\n };\n });\n return films;\n};\n\nexport const parseMeta = (meta: string[]): CSFDCinemaMeta[] => {\n const metaConvert: CSFDCinemaMeta[] = [];\n\n for (const element of meta) {\n if (element === 'T') {\n metaConvert.push('subtitles');\n } else if (element === 'D') {\n metaConvert.push('dubbing');\n } else {\n metaConvert.push(element);\n }\n }\n\n return metaConvert;\n};\n"],"mappings":";;AAMA,MAAa,wBAAwB,OAA4C;CAC/E,MAAM,UAAoB,IAAI,WAAW,MAAM,IAAI,IAAI,EAAE;CACzD,MAAM,OAAO,QAAQ,SAAS,QAAQ,QAAQ,SAAS,KAAK,KAAA;AAC5D,QAAO,OAAO,WAAW,KAAmB,GAAG;;AAGjD,MAAa,eAAe,OAAmC;AAE7D,QAAO,CADI,IAAI,IAAI,MAAM,IAAI,CAAC;;AAIhC,MAAa,kBAAkB,QAAkD;AAC/E,KAAI,CAAC,IAAK,QAAO;AACjB,QAAO,eAAe,IAAI;;AAG5B,MAAa,mBAAmB,OAAgE;AAC9F,KAAI,CAAC,GAAI,QAAO;CAChB,MAAM,aAAa,GAAG,cAAc,kBAAgB;AACpD,KAAI,CAAC,WAAY,QAAO;CAGxB,MAAM,CAAC,GAAG,UADO,WAAW,aAAa,OAAO,CACnB,MAAM,KAAK;CAExC,MAAM,SAAS,OAAO,MAAM,IAAI;AAChC,KAAI,OAAO,WAAW,EAAG,QAAO;CAEhC,MAAM,MAAM,OAAO,OAAO,GAAG;CAC7B,MAAM,MAAM,OAAO,OAAO,GAAG;AAC7B,KAAI,OAAO,SAAS,IAAI,IAAI,OAAO,SAAS,IAAI,CAC9C,QAAO;EAAE;EAAK;EAAK;AAErB,QAAO;;AAGT,MAAa,gBAAgB,OAAmC;AAC9D,KAAI,CAAC,GAAI,QAAO;AAChB,QAAO,GAAG,cAAc,iBAAiB,EAAE,WAAW,QAAQ;;AAGhE,MAAa,eAAe,OAA2D;CAErF,MAAM,CAAC,MAAM,QADC,GAAG,cAAc,YAAY,CAAC,UAAU,MAAM,CACjC,MAAM,MAAM;AACvC,QAAO;EAAE;EAAM;EAAM;;AAGvB,MAAa,yBAAyB,OAA2D;CAC/F,MAAM,OAAO,GAAG,iBAAiB,eAAe;AAUhD,QATyB,KACtB,KAAK,GAAG,UAAU,MAAM,CACxB,QAAQ,UAAU,QAAQ,MAAM,EAAE,CAClC,KAAK,UAAU;EACd,MAAM,CAAC,MAAM,SAAS,KAAK,MAAM,OAAO,QAAQ,EAAE;AAElD,SAAO;GAAE,MADQ,MAAM,YAAY,aAAa,MAAM,IAAI;GACjC,OAAO,eAAe,IAAI,MAAM;GAAE;GAC3D;;AAKN,MAAa,kBAAkB,MAAc,OAA8C;AAoBzF,QAnBkB,GAAG,iBAAiB,mBAAmB,CAEjC,KAAK,aAAa;EACxC,MAAM,MAAM,SAAS,cAAc,eAAe,EAAE,WAAW;EAC/D,MAAM,KAAK,MAAM,eAAe,IAAI,GAAG;EACvC,MAAM,QAAQ,SAAS,cAAc,WAAW,EAAE,KAAK,MAAM;EAC7D,MAAM,cAAc,qBAAqB,SAAS,cAAc,cAAc,CAAC;EAC/E,MAAM,YAAY,SAAS,iBAAiB,WAAW,EAAE,KAAK,MAAM,EAAE,YAAY,MAAM,CAAC;EACzF,MAAM,OAAO,SAAS,iBAAiB,iBAAiB,EAAE,KAAK,MAAM,EAAE,KAAK,MAAM,CAAC;AAEnF,SAAO;GACL;GACA;GACA;GACA;GACA;GACA,MAAM,UAAU,KAAK;GACtB;GACD;;AAIJ,MAAa,aAAa,SAAqC;CAC7D,MAAM,cAAgC,EAAE;AAExC,MAAK,MAAM,WAAW,KACpB,KAAI,YAAY,IACd,aAAY,KAAK,YAAY;UACpB,YAAY,IACrB,aAAY,KAAK,UAAU;KAE3B,aAAY,KAAK,QAAQ;AAI7B,QAAO"}
@@ -0,0 +1,72 @@
1
+ const require_global_helper = require("./global.helper.cjs");
2
+ //#region src/helpers/creator.helper.ts
3
+ const getCreatorColorRating = (el) => {
4
+ const classes = el?.classNames.split(" ") ?? [];
5
+ const last = classes[classes.length - 1];
6
+ return require_global_helper.parseColor(last);
7
+ };
8
+ const getCreatorId = (url) => {
9
+ return url ? require_global_helper.parseIdFromUrl(url) : null;
10
+ };
11
+ const getCreatorName = (el) => {
12
+ return (el?.querySelector("h1"))?.innerText?.trim() ?? null;
13
+ };
14
+ const getCreatorBirthdayInfo = (el) => {
15
+ const infoBlock = el?.querySelector(".creator-profile-details p");
16
+ const text = infoBlock?.innerHTML.trim();
17
+ const birthPlaceRow = infoBlock?.querySelector(".info-place")?.innerText.trim();
18
+ const ageRow = infoBlock?.querySelector(".info")?.innerText.trim();
19
+ let birthday = null;
20
+ if (text) {
21
+ const birthdayRow = text.split("\n").find((x) => x.includes("nar."));
22
+ birthday = birthdayRow ? require_global_helper.parseDate(parseBirthday(birthdayRow)) : null;
23
+ }
24
+ const age = ageRow ? +parseAge(ageRow) : null;
25
+ const birthPlace = birthPlaceRow ? parseBirthPlace(birthPlaceRow) : "";
26
+ return {
27
+ birthday,
28
+ age,
29
+ birthPlace
30
+ };
31
+ };
32
+ const getCreatorBio = (el) => {
33
+ return (el?.querySelector(".article-content p"))?.text?.trim().split("\n")[0]?.trim() || null;
34
+ };
35
+ const getCreatorPhoto = (el) => {
36
+ const src = el?.querySelector("img")?.getAttribute("src");
37
+ return src ? require_global_helper.addProtocol(src) : null;
38
+ };
39
+ const parseBirthday = (text) => text.replace(/nar\./g, "").trim();
40
+ const parseAge = (text) => {
41
+ const digits = text.replace(/[^\d]/g, "");
42
+ return digits ? Number(digits) : null;
43
+ };
44
+ const parseBirthPlace = (text) => text.trim().replace(/<br>/g, "").trim();
45
+ const getCreatorFilms = (el) => {
46
+ const filmNodes = el?.querySelectorAll(".updated-box")?.[0]?.querySelectorAll("table tr") ?? [];
47
+ let yearCache = null;
48
+ return filmNodes.map((filmNode) => {
49
+ const id = getCreatorId(filmNode.querySelector("td.name .film-title-name")?.attributes?.href);
50
+ const title = filmNode.querySelector(".name")?.text?.trim();
51
+ const yearText = filmNode.querySelector(".year")?.text?.trim();
52
+ const year = yearText ? +yearText : null;
53
+ const colorRating = getCreatorColorRating(filmNode.querySelector(".name .icon"));
54
+ if (typeof year === "number" && !isNaN(year)) yearCache = +year;
55
+ const finalYear = year ?? yearCache;
56
+ if (id != null && title && finalYear != null) return {
57
+ id,
58
+ title,
59
+ year: finalYear,
60
+ colorRating
61
+ };
62
+ return null;
63
+ }).filter(Boolean);
64
+ };
65
+ //#endregion
66
+ exports.getCreatorBio = getCreatorBio;
67
+ exports.getCreatorBirthdayInfo = getCreatorBirthdayInfo;
68
+ exports.getCreatorFilms = getCreatorFilms;
69
+ exports.getCreatorName = getCreatorName;
70
+ exports.getCreatorPhoto = getCreatorPhoto;
71
+
72
+ //# sourceMappingURL=creator.helper.cjs.map