node-csfd-api 3.0.0-next.8 → 3.0.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 (146) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +89 -44
  3. package/_virtual/rolldown_runtime.js +25 -0
  4. package/dto/cinema.d.mts +28 -0
  5. package/dto/cinema.d.ts +28 -0
  6. package/dto/creator.d.mts +17 -0
  7. package/dto/creator.d.ts +17 -0
  8. package/dto/global.d.mts +26 -0
  9. package/dto/global.d.ts +26 -0
  10. package/dto/movie.d.mts +71 -0
  11. package/dto/movie.d.ts +71 -0
  12. package/dto/search.d.mts +32 -0
  13. package/dto/search.d.ts +32 -0
  14. package/dto/user-ratings.d.mts +23 -0
  15. package/dto/user-ratings.d.ts +23 -0
  16. package/fetchers/fetch.polyfill.js +10 -0
  17. package/fetchers/fetch.polyfill.js.map +1 -0
  18. package/fetchers/fetch.polyfill.mjs +8 -0
  19. package/fetchers/fetch.polyfill.mjs.map +1 -0
  20. package/fetchers/index.js +24 -0
  21. package/fetchers/index.js.map +1 -0
  22. package/fetchers/index.mjs +24 -0
  23. package/fetchers/index.mjs.map +1 -0
  24. package/helpers/cinema.helper.js +84 -0
  25. package/helpers/cinema.helper.js.map +1 -0
  26. package/helpers/cinema.helper.mjs +80 -0
  27. package/helpers/cinema.helper.mjs.map +1 -0
  28. package/helpers/creator.helper.js +73 -0
  29. package/helpers/creator.helper.js.map +1 -0
  30. package/helpers/creator.helper.mjs +69 -0
  31. package/helpers/creator.helper.mjs.map +1 -0
  32. package/helpers/global.helper.js +50 -0
  33. package/helpers/global.helper.js.map +1 -0
  34. package/helpers/global.helper.mjs +45 -0
  35. package/helpers/global.helper.mjs.map +1 -0
  36. package/helpers/movie.helper.js +162 -0
  37. package/helpers/movie.helper.js.map +1 -0
  38. package/helpers/movie.helper.mjs +144 -0
  39. package/helpers/movie.helper.mjs.map +1 -0
  40. package/helpers/search-user.helper.js +29 -0
  41. package/helpers/search-user.helper.js.map +1 -0
  42. package/helpers/search-user.helper.mjs +24 -0
  43. package/helpers/search-user.helper.mjs.map +1 -0
  44. package/helpers/search.helper.js +52 -0
  45. package/helpers/search.helper.js.map +1 -0
  46. package/helpers/search.helper.mjs +45 -0
  47. package/helpers/search.helper.mjs.map +1 -0
  48. package/helpers/user-ratings.helper.js +52 -0
  49. package/helpers/user-ratings.helper.js.map +1 -0
  50. package/helpers/user-ratings.helper.mjs +44 -0
  51. package/helpers/user-ratings.helper.mjs.map +1 -0
  52. package/index.d.mts +30 -0
  53. package/index.d.ts +30 -0
  54. package/index.js +42 -0
  55. package/index.js.map +1 -0
  56. package/index.mjs +41 -0
  57. package/index.mjs.map +1 -0
  58. package/package.json +15 -27
  59. package/services/cinema.service.d.mts +11 -0
  60. package/services/cinema.service.d.ts +11 -0
  61. package/services/cinema.service.js +35 -0
  62. package/services/cinema.service.js.map +1 -0
  63. package/services/cinema.service.mjs +33 -0
  64. package/services/cinema.service.mjs.map +1 -0
  65. package/services/creator.service.d.mts +11 -0
  66. package/services/creator.service.d.ts +11 -0
  67. package/services/creator.service.js +35 -0
  68. package/services/creator.service.js.map +1 -0
  69. package/services/creator.service.mjs +33 -0
  70. package/services/creator.service.mjs.map +1 -0
  71. package/services/movie.service.d.mts +11 -0
  72. package/services/movie.service.d.ts +11 -0
  73. package/services/movie.service.js +62 -0
  74. package/services/movie.service.js.map +1 -0
  75. package/services/movie.service.mjs +60 -0
  76. package/services/movie.service.mjs.map +1 -0
  77. package/services/search.service.d.mts +10 -0
  78. package/services/search.service.d.ts +10 -0
  79. package/services/search.service.js +81 -0
  80. package/services/search.service.js.map +1 -0
  81. package/services/search.service.mjs +79 -0
  82. package/services/search.service.mjs.map +1 -0
  83. package/services/user-ratings.service.d.mts +12 -0
  84. package/services/user-ratings.service.d.ts +12 -0
  85. package/services/user-ratings.service.js +66 -0
  86. package/services/user-ratings.service.js.map +1 -0
  87. package/services/user-ratings.service.mjs +64 -0
  88. package/services/user-ratings.service.mjs.map +1 -0
  89. package/{cjs/vars.js → vars.js} +13 -7
  90. package/vars.js.map +1 -0
  91. package/vars.mjs +12 -0
  92. package/vars.mjs.map +1 -0
  93. package/cjs/fetchers/index.js +0 -41
  94. package/cjs/helpers/creator.helper.js +0 -86
  95. package/cjs/helpers/global.helper.js +0 -64
  96. package/cjs/helpers/movie.helper.js +0 -248
  97. package/cjs/helpers/search-user.helper.js +0 -22
  98. package/cjs/helpers/search.helper.js +0 -60
  99. package/cjs/helpers/user-ratings.helper.js +0 -60
  100. package/cjs/index.js +0 -50
  101. package/cjs/interfaces/creator.interface.js +0 -2
  102. package/cjs/interfaces/global.js +0 -2
  103. package/cjs/interfaces/movie.interface.js +0 -2
  104. package/cjs/interfaces/search.interface.js +0 -2
  105. package/cjs/interfaces/user-ratings.interface.js +0 -2
  106. package/cjs/services/creator.service.js +0 -43
  107. package/cjs/services/movie.service.js +0 -69
  108. package/cjs/services/search.service.js +0 -91
  109. package/cjs/services/user-ratings.service.js +0 -95
  110. package/esm/fetchers/index.js +0 -37
  111. package/esm/helpers/creator.helper.js +0 -73
  112. package/esm/helpers/global.helper.js +0 -56
  113. package/esm/helpers/movie.helper.js +0 -223
  114. package/esm/helpers/search-user.helper.js +0 -15
  115. package/esm/helpers/search.helper.js +0 -49
  116. package/esm/helpers/user-ratings.helper.js +0 -47
  117. package/esm/index.js +0 -46
  118. package/esm/interfaces/creator.interface.js +0 -1
  119. package/esm/interfaces/global.js +0 -1
  120. package/esm/interfaces/movie.interface.js +0 -1
  121. package/esm/interfaces/search.interface.js +0 -1
  122. package/esm/interfaces/user-ratings.interface.js +0 -1
  123. package/esm/services/creator.service.js +0 -39
  124. package/esm/services/movie.service.js +0 -65
  125. package/esm/services/search.service.js +0 -87
  126. package/esm/services/user-ratings.service.js +0 -91
  127. package/esm/vars.js +0 -4
  128. package/types/fetchers/index.d.ts +0 -1
  129. package/types/helpers/creator.helper.d.ts +0 -17
  130. package/types/helpers/global.helper.d.ts +0 -7
  131. package/types/helpers/movie.helper.d.ts +0 -25
  132. package/types/helpers/search-user.helper.d.ts +0 -5
  133. package/types/helpers/search.helper.d.ts +0 -11
  134. package/types/helpers/user-ratings.helper.d.ts +0 -13
  135. package/types/index.d.ts +0 -20
  136. package/types/index.ts +0 -22
  137. package/types/interfaces/creator.interface.d.ts +0 -12
  138. package/types/interfaces/global.d.ts +0 -22
  139. package/types/interfaces/movie.interface.d.ts +0 -66
  140. package/types/interfaces/search.interface.d.ts +0 -27
  141. package/types/interfaces/user-ratings.interface.d.ts +0 -18
  142. package/types/services/creator.service.d.ts +0 -6
  143. package/types/services/movie.service.d.ts +0 -6
  144. package/types/services/search.service.d.ts +0 -5
  145. package/types/services/user-ratings.service.d.ts +0 -7
  146. package/types/vars.d.ts +0 -4
@@ -0,0 +1,23 @@
1
+ import { CSFDFilmTypes, CSFDScreening, CSFDStars } from "./global.mjs";
2
+
3
+ //#region src/dto/user-ratings.d.ts
4
+ interface CSFDUserRatings extends CSFDScreening {
5
+ userRating: CSFDStars;
6
+ userDate: string;
7
+ }
8
+ interface CSFDUserRatingConfig {
9
+ includesOnly?: CSFDFilmTypes[];
10
+ excludes?: CSFDFilmTypes[];
11
+ /**
12
+ * Fetch all ratings. (Warning: Use it wisely. Can be detected and banned. Consider using it together with `allPagesDelay` attribute)
13
+ */
14
+ allPages?: boolean;
15
+ /**
16
+ * Delay on each page request. In milliseconds
17
+ */
18
+ allPagesDelay?: number;
19
+ }
20
+ type Colors = 'lightgrey' | 'blue' | 'red' | 'grey';
21
+ //#endregion
22
+ export { CSFDUserRatingConfig, CSFDUserRatings, Colors };
23
+ //# sourceMappingURL=user-ratings.d.mts.map
@@ -0,0 +1,23 @@
1
+ import { CSFDFilmTypes, CSFDScreening, CSFDStars } from "./global.js";
2
+
3
+ //#region src/dto/user-ratings.d.ts
4
+ interface CSFDUserRatings extends CSFDScreening {
5
+ userRating: CSFDStars;
6
+ userDate: string;
7
+ }
8
+ interface CSFDUserRatingConfig {
9
+ includesOnly?: CSFDFilmTypes[];
10
+ excludes?: CSFDFilmTypes[];
11
+ /**
12
+ * Fetch all ratings. (Warning: Use it wisely. Can be detected and banned. Consider using it together with `allPagesDelay` attribute)
13
+ */
14
+ allPages?: boolean;
15
+ /**
16
+ * Delay on each page request. In milliseconds
17
+ */
18
+ allPagesDelay?: number;
19
+ }
20
+ type Colors = 'lightgrey' | 'blue' | 'red' | 'grey';
21
+ //#endregion
22
+ export { CSFDUserRatingConfig, CSFDUserRatings, Colors };
23
+ //# sourceMappingURL=user-ratings.d.ts.map
@@ -0,0 +1,10 @@
1
+ const require_rolldown_runtime = require('../_virtual/rolldown_runtime.js');
2
+ let cross_fetch = require("cross-fetch");
3
+ cross_fetch = require_rolldown_runtime.__toESM(cross_fetch);
4
+
5
+ //#region src/fetchers/fetch.polyfill.ts
6
+ const fetchSafe = typeof fetch === "function" && fetch || typeof global === "object" && global.fetch || typeof window !== "undefined" && window.fetch || cross_fetch.fetch;
7
+
8
+ //#endregion
9
+ exports.fetchSafe = fetchSafe;
10
+ //# sourceMappingURL=fetch.polyfill.js.map
@@ -0,0 +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"}
@@ -0,0 +1,8 @@
1
+ import { fetch as fetch$1 } from "cross-fetch";
2
+
3
+ //#region src/fetchers/fetch.polyfill.ts
4
+ const fetchSafe = typeof fetch === "function" && fetch || typeof global === "object" && global.fetch || typeof window !== "undefined" && window.fetch || fetch$1;
5
+
6
+ //#endregion
7
+ export { fetchSafe };
8
+ //# sourceMappingURL=fetch.polyfill.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetch.polyfill.mjs","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"}
@@ -0,0 +1,24 @@
1
+ const require_fetch_polyfill = require('./fetch.polyfill.js');
2
+
3
+ //#region src/fetchers/index.ts
4
+ const USER_AGENTS = [
5
+ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36",
6
+ "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",
7
+ "Mozilla/5.0 (Linux; Android 10; SM-A205U) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.101 Mobile Safari/537.36",
8
+ "Mozilla/5.0 (Linux; Android 10) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.101 Mobile Safari/537.36"
9
+ ];
10
+ const headers = { "User-Agent": USER_AGENTS[Math.floor(Math.random() * USER_AGENTS.length)] };
11
+ const fetchPage = async (url) => {
12
+ try {
13
+ const response = await require_fetch_polyfill.fetchSafe(url, { headers });
14
+ if (response.status >= 400 && response.status < 600) throw new Error(`node-csfd-api: Bad response ${response.status} for url: ${url}`);
15
+ return await response.text();
16
+ } catch (e) {
17
+ console.error(e);
18
+ return "Error";
19
+ }
20
+ };
21
+
22
+ //#endregion
23
+ exports.fetchPage = fetchPage;
24
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":["fetchSafe"],"sources":["../../src/fetchers/index.ts"],"sourcesContent":["import { fetchSafe } from './fetch.polyfill';\n\nconst USER_AGENTS = [\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 headers = {\n 'User-Agent': USER_AGENTS[Math.floor(Math.random() * USER_AGENTS.length)]\n};\n\nexport const fetchPage = async (url: string): Promise<string> => {\n try {\n const response = await fetchSafe(url, { headers });\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) {\n console.error(e);\n return 'Error';\n }\n};\n"],"mappings":";;;AAEA,MAAM,cAAc;CAClB;CACA;CACA;CACA;CACD;AAED,MAAM,UAAU,EACd,cAAc,YAAY,KAAK,MAAM,KAAK,QAAQ,GAAG,YAAY,OAAO,GACzE;AAED,MAAa,YAAY,OAAO,QAAiC;AAC/D,KAAI;EACF,MAAM,WAAW,MAAMA,iCAAU,KAAK,EAAE,SAAS,CAAC;AAClD,MAAI,SAAS,UAAU,OAAO,SAAS,SAAS,IAC9C,OAAM,IAAI,MAAM,+BAA+B,SAAS,OAAO,YAAY,MAAM;AAEnF,SAAO,MAAM,SAAS,MAAM;UACrB,GAAG;AACV,UAAQ,MAAM,EAAE;AAChB,SAAO"}
@@ -0,0 +1,24 @@
1
+ import { fetchSafe } from "./fetch.polyfill.mjs";
2
+
3
+ //#region src/fetchers/index.ts
4
+ const USER_AGENTS = [
5
+ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36",
6
+ "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",
7
+ "Mozilla/5.0 (Linux; Android 10; SM-A205U) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.101 Mobile Safari/537.36",
8
+ "Mozilla/5.0 (Linux; Android 10) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.101 Mobile Safari/537.36"
9
+ ];
10
+ const headers = { "User-Agent": USER_AGENTS[Math.floor(Math.random() * USER_AGENTS.length)] };
11
+ const fetchPage = async (url) => {
12
+ try {
13
+ const response = await fetchSafe(url, { headers });
14
+ if (response.status >= 400 && response.status < 600) throw new Error(`node-csfd-api: Bad response ${response.status} for url: ${url}`);
15
+ return await response.text();
16
+ } catch (e) {
17
+ console.error(e);
18
+ return "Error";
19
+ }
20
+ };
21
+
22
+ //#endregion
23
+ export { fetchPage };
24
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../../src/fetchers/index.ts"],"sourcesContent":["import { fetchSafe } from './fetch.polyfill';\n\nconst USER_AGENTS = [\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 headers = {\n 'User-Agent': USER_AGENTS[Math.floor(Math.random() * USER_AGENTS.length)]\n};\n\nexport const fetchPage = async (url: string): Promise<string> => {\n try {\n const response = await fetchSafe(url, { headers });\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) {\n console.error(e);\n return 'Error';\n }\n};\n"],"mappings":";;;AAEA,MAAM,cAAc;CAClB;CACA;CACA;CACA;CACD;AAED,MAAM,UAAU,EACd,cAAc,YAAY,KAAK,MAAM,KAAK,QAAQ,GAAG,YAAY,OAAO,GACzE;AAED,MAAa,YAAY,OAAO,QAAiC;AAC/D,KAAI;EACF,MAAM,WAAW,MAAM,UAAU,KAAK,EAAE,SAAS,CAAC;AAClD,MAAI,SAAS,UAAU,OAAO,SAAS,SAAS,IAC9C,OAAM,IAAI,MAAM,+BAA+B,SAAS,OAAO,YAAY,MAAM;AAEnF,SAAO,MAAM,SAAS,MAAM;UACrB,GAAG;AACV,UAAQ,MAAM,EAAE;AAChB,SAAO"}
@@ -0,0 +1,84 @@
1
+ const require_global_helper = require('./global.helper.js');
2
+
3
+ //#region src/helpers/cinema.helper.ts
4
+ const getCinemaColorRating = (el) => {
5
+ const classes = el?.classNames.split(" ") ?? [];
6
+ const last = classes.length ? classes[classes.length - 1] : void 0;
7
+ return last ? require_global_helper.parseColor(last) : "unknown";
8
+ };
9
+ const getCinemaId = (el) => {
10
+ return +el?.id?.split("-")[1];
11
+ };
12
+ const getCinemaUrlId = (url) => {
13
+ if (!url) return null;
14
+ return require_global_helper.parseIdFromUrl(url);
15
+ };
16
+ const getCinemaCoords = (el) => {
17
+ if (!el) return null;
18
+ const linkMapsEl = el.querySelector("a[href*=\"q=\"]");
19
+ if (!linkMapsEl) return null;
20
+ const [_, latLng] = linkMapsEl.getAttribute("href").split("q=");
21
+ const coords = latLng.split(",");
22
+ if (coords.length !== 2) return null;
23
+ const lat = Number(coords[0]);
24
+ const lng = Number(coords[1]);
25
+ if (Number.isFinite(lat) && Number.isFinite(lng)) return {
26
+ lat,
27
+ lng
28
+ };
29
+ return null;
30
+ };
31
+ const getCinemaUrl = (el) => {
32
+ if (!el) return "";
33
+ return el.querySelector("a[title=\"Přejít na webovou stránku kina\"]")?.attributes.href ?? "";
34
+ };
35
+ const parseCinema = (el) => {
36
+ const [city, name] = el.querySelector(".box-header h2").innerText.trim().split(" - ");
37
+ return {
38
+ city,
39
+ name
40
+ };
41
+ };
42
+ const getGroupedFilmsByDate = (el) => {
43
+ const divs = el.querySelectorAll(":scope > div");
44
+ return divs.map((_, index) => index).filter((index) => index % 2 === 0).map((index) => {
45
+ const [date, films] = divs.slice(index, index + 2);
46
+ return {
47
+ date: date?.firstChild?.textContent?.trim() ?? null,
48
+ films: getCinemaFilms("", films)
49
+ };
50
+ });
51
+ };
52
+ const getCinemaFilms = (date, el) => {
53
+ return el.querySelectorAll(".cinema-table tr").map((filmNode) => {
54
+ const url = filmNode.querySelector("td.name h3 a")?.attributes.href;
55
+ const id = url ? getCinemaUrlId(url) : null;
56
+ const title = filmNode.querySelector(".name h3")?.text.trim();
57
+ const colorRating = getCinemaColorRating(filmNode.querySelector(".name .icon"));
58
+ const showTimes = filmNode.querySelectorAll(".td-time")?.map((x) => x.textContent.trim());
59
+ const meta = filmNode.querySelectorAll(".td-title span")?.map((x) => x.text.trim());
60
+ return {
61
+ id,
62
+ title,
63
+ url,
64
+ colorRating,
65
+ showTimes,
66
+ meta: parseMeta(meta)
67
+ };
68
+ });
69
+ };
70
+ const parseMeta = (meta) => {
71
+ const metaConvert = [];
72
+ for (const element of meta) if (element === "T") metaConvert.push("subtitles");
73
+ else if (element === "D") metaConvert.push("dubbing");
74
+ else metaConvert.push(element);
75
+ return metaConvert;
76
+ };
77
+
78
+ //#endregion
79
+ exports.getCinemaCoords = getCinemaCoords;
80
+ exports.getCinemaId = getCinemaId;
81
+ exports.getCinemaUrl = getCinemaUrl;
82
+ exports.getGroupedFilmsByDate = getGroupedFilmsByDate;
83
+ exports.parseCinema = parseCinema;
84
+ //# sourceMappingURL=cinema.helper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cinema.helper.js","names":["classes: string[]","parseColor","parseIdFromUrl","metaConvert: CSFDCinemaMeta[]"],"sources":["../../src/helpers/cinema.helper.ts"],"sourcesContent":["import { HTMLElement } from 'node-html-parser';\nimport {\n CSFDCinemaGroupedFilmsByDate,\n CSFDCinemaMeta,\n CSFDCinemaMovie\n} from '../dto/cinema';\nimport { CSFDColorRating } from '../dto/global';\nimport { Colors } 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 Colors) : '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\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('a[title=\"Přejít na webovou stránku kina\"]')?.attributes.href ?? '';\n};\n\nexport const parseCinema = (el: HTMLElement | null): { city: string; name: string } => {\n const title = el.querySelector('.box-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":";;;AAUA,MAAa,wBAAwB,OAA4C;CAC/E,MAAMA,UAAoB,IAAI,WAAW,MAAM,IAAI,IAAI,EAAE;CACzD,MAAM,OAAO,QAAQ,SAAS,QAAQ,QAAQ,SAAS,KAAK;AAC5D,QAAO,OAAOC,iCAAW,KAAe,GAAG;;AAG7C,MAAa,eAAe,OAAmC;AAE7D,QAAO,CADI,IAAI,IAAI,MAAM,IAAI,CAAC;;AAIhC,MAAa,kBAAkB,QAAkD;AAC/E,KAAI,CAAC,IAAK,QAAO;AACjB,QAAOC,qCAAe,IAAI;;AAG5B,MAAa,mBAAmB,OAAgE;AAE9F,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,8CAA4C,EAAE,WAAW,QAAQ;;AAG3F,MAAa,eAAe,OAA2D;CAErF,MAAM,CAAC,MAAM,QADC,GAAG,cAAc,iBAAiB,CAAC,UAAU,MAAM,CACtC,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,MAAMC,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,80 @@
1
+ import { parseColor, parseIdFromUrl } from "./global.helper.mjs";
2
+
3
+ //#region src/helpers/cinema.helper.ts
4
+ const getCinemaColorRating = (el) => {
5
+ const classes = el?.classNames.split(" ") ?? [];
6
+ const last = classes.length ? classes[classes.length - 1] : void 0;
7
+ return last ? parseColor(last) : "unknown";
8
+ };
9
+ const getCinemaId = (el) => {
10
+ return +el?.id?.split("-")[1];
11
+ };
12
+ const getCinemaUrlId = (url) => {
13
+ if (!url) return null;
14
+ return parseIdFromUrl(url);
15
+ };
16
+ const getCinemaCoords = (el) => {
17
+ if (!el) return null;
18
+ const linkMapsEl = el.querySelector("a[href*=\"q=\"]");
19
+ if (!linkMapsEl) return null;
20
+ const [_, latLng] = linkMapsEl.getAttribute("href").split("q=");
21
+ const coords = latLng.split(",");
22
+ if (coords.length !== 2) return null;
23
+ const lat = Number(coords[0]);
24
+ const lng = Number(coords[1]);
25
+ if (Number.isFinite(lat) && Number.isFinite(lng)) return {
26
+ lat,
27
+ lng
28
+ };
29
+ return null;
30
+ };
31
+ const getCinemaUrl = (el) => {
32
+ if (!el) return "";
33
+ return el.querySelector("a[title=\"Přejít na webovou stránku kina\"]")?.attributes.href ?? "";
34
+ };
35
+ const parseCinema = (el) => {
36
+ const [city, name] = el.querySelector(".box-header h2").innerText.trim().split(" - ");
37
+ return {
38
+ city,
39
+ name
40
+ };
41
+ };
42
+ const getGroupedFilmsByDate = (el) => {
43
+ const divs = el.querySelectorAll(":scope > div");
44
+ return divs.map((_, index) => index).filter((index) => index % 2 === 0).map((index) => {
45
+ const [date, films] = divs.slice(index, index + 2);
46
+ return {
47
+ date: date?.firstChild?.textContent?.trim() ?? null,
48
+ films: getCinemaFilms("", films)
49
+ };
50
+ });
51
+ };
52
+ const getCinemaFilms = (date, el) => {
53
+ return el.querySelectorAll(".cinema-table tr").map((filmNode) => {
54
+ const url = filmNode.querySelector("td.name h3 a")?.attributes.href;
55
+ const id = url ? getCinemaUrlId(url) : null;
56
+ const title = filmNode.querySelector(".name h3")?.text.trim();
57
+ const colorRating = getCinemaColorRating(filmNode.querySelector(".name .icon"));
58
+ const showTimes = filmNode.querySelectorAll(".td-time")?.map((x) => x.textContent.trim());
59
+ const meta = filmNode.querySelectorAll(".td-title span")?.map((x) => x.text.trim());
60
+ return {
61
+ id,
62
+ title,
63
+ url,
64
+ colorRating,
65
+ showTimes,
66
+ meta: parseMeta(meta)
67
+ };
68
+ });
69
+ };
70
+ const parseMeta = (meta) => {
71
+ const metaConvert = [];
72
+ for (const element of meta) if (element === "T") metaConvert.push("subtitles");
73
+ else if (element === "D") metaConvert.push("dubbing");
74
+ else metaConvert.push(element);
75
+ return metaConvert;
76
+ };
77
+
78
+ //#endregion
79
+ export { getCinemaCoords, getCinemaId, getCinemaUrl, getGroupedFilmsByDate, parseCinema };
80
+ //# sourceMappingURL=cinema.helper.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cinema.helper.mjs","names":["classes: string[]","metaConvert: CSFDCinemaMeta[]"],"sources":["../../src/helpers/cinema.helper.ts"],"sourcesContent":["import { HTMLElement } from 'node-html-parser';\nimport {\n CSFDCinemaGroupedFilmsByDate,\n CSFDCinemaMeta,\n CSFDCinemaMovie\n} from '../dto/cinema';\nimport { CSFDColorRating } from '../dto/global';\nimport { Colors } 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 Colors) : '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\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('a[title=\"Přejít na webovou stránku kina\"]')?.attributes.href ?? '';\n};\n\nexport const parseCinema = (el: HTMLElement | null): { city: string; name: string } => {\n const title = el.querySelector('.box-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":";;;AAUA,MAAa,wBAAwB,OAA4C;CAC/E,MAAMA,UAAoB,IAAI,WAAW,MAAM,IAAI,IAAI,EAAE;CACzD,MAAM,OAAO,QAAQ,SAAS,QAAQ,QAAQ,SAAS,KAAK;AAC5D,QAAO,OAAO,WAAW,KAAe,GAAG;;AAG7C,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;AAE9F,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,8CAA4C,EAAE,WAAW,QAAQ;;AAG3F,MAAa,eAAe,OAA2D;CAErF,MAAM,CAAC,MAAM,QADC,GAAG,cAAc,iBAAiB,CAAC,UAAU,MAAM,CACtC,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,MAAMC,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,73 @@
1
+ const require_global_helper = require('./global.helper.js');
2
+
3
+ //#region src/helpers/creator.helper.ts
4
+ const getCreatorColorRating = (el) => {
5
+ const classes = el?.classNames.split(" ") ?? [];
6
+ const last = classes[classes.length - 1];
7
+ return require_global_helper.parseColor(last);
8
+ };
9
+ const getCreatorId = (url) => {
10
+ return url ? require_global_helper.parseIdFromUrl(url) : null;
11
+ };
12
+ const getCreatorName = (el) => {
13
+ return (el?.querySelector("h1"))?.innerText?.trim() ?? null;
14
+ };
15
+ const getCreatorBirthdayInfo = (el) => {
16
+ const infoBlock = el.querySelector("h1 + p");
17
+ const text = infoBlock?.innerHTML.trim();
18
+ const birthPlaceRow = infoBlock?.querySelector(".info-place")?.innerHTML.trim();
19
+ const ageRow = infoBlock?.querySelector(".info")?.innerHTML.trim();
20
+ let birthday = "";
21
+ if (text) {
22
+ const birthdayRow = text.split("\n").find((x) => x.includes("nar."));
23
+ birthday = birthdayRow ? parseBirthday(birthdayRow) : "";
24
+ }
25
+ const age = ageRow ? +parseAge(ageRow) : null;
26
+ const birthPlace = birthPlaceRow ? parseBirthPlace(birthPlaceRow) : "";
27
+ return {
28
+ birthday,
29
+ age,
30
+ birthPlace
31
+ };
32
+ };
33
+ const getCreatorBio = (el) => {
34
+ return (el?.querySelector(".article-content p"))?.text?.trim().split("\n")[0]?.trim() || null;
35
+ };
36
+ const getCreatorPhoto = (el) => {
37
+ const src = el?.querySelector("img")?.getAttribute("src");
38
+ return src ? require_global_helper.addProtocol(src) : null;
39
+ };
40
+ const parseBirthday = (text) => text.replace(/nar\./g, "").trim();
41
+ const parseAge = (text) => {
42
+ const digits = text.replace(/[^\d]/g, "");
43
+ return digits ? Number(digits) : null;
44
+ };
45
+ const parseBirthPlace = (text) => text.trim().replace(/<br>/g, "").trim();
46
+ const getCreatorFilms = (el) => {
47
+ const filmNodes = el?.querySelectorAll(".box")?.[0]?.querySelectorAll("table tr") ?? [];
48
+ let yearCache = null;
49
+ return filmNodes.map((filmNode) => {
50
+ const id = getCreatorId(filmNode.querySelector("td.name .film-title-name")?.attributes?.href);
51
+ const title = filmNode.querySelector(".name")?.text?.trim();
52
+ const yearText = filmNode.querySelector(".year")?.text?.trim();
53
+ const year = yearText ? +yearText : null;
54
+ const colorRating = getCreatorColorRating(filmNode.querySelector(".name .icon"));
55
+ if (typeof year === "number" && !isNaN(year)) yearCache = +year;
56
+ const finalYear = year ?? yearCache;
57
+ if (id != null && title && finalYear != null) return {
58
+ id,
59
+ title,
60
+ year: finalYear,
61
+ colorRating
62
+ };
63
+ return null;
64
+ }).filter(Boolean);
65
+ };
66
+
67
+ //#endregion
68
+ exports.getCreatorBio = getCreatorBio;
69
+ exports.getCreatorBirthdayInfo = getCreatorBirthdayInfo;
70
+ exports.getCreatorFilms = getCreatorFilms;
71
+ exports.getCreatorName = getCreatorName;
72
+ exports.getCreatorPhoto = getCreatorPhoto;
73
+ //# sourceMappingURL=creator.helper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"creator.helper.js","names":["classes: string[]","parseColor","parseIdFromUrl","birthday: string","addProtocol","yearCache: number | null"],"sources":["../../src/helpers/creator.helper.ts"],"sourcesContent":["import { HTMLElement } from 'node-html-parser';\nimport { CSFDCreatorScreening } from '../dto/creator';\nimport { CSFDColorRating } from '../dto/global';\nimport { Colors } from '../dto/user-ratings';\nimport { addProtocol, parseColor, parseIdFromUrl } from './global.helper';\n\nconst getCreatorColorRating = (el: HTMLElement | null): CSFDColorRating => {\n const classes: string[] = el?.classNames.split(' ') ?? [];\n const last = classes[classes.length - 1] as Colors | undefined;\n return parseColor(last);\n};\n\nexport const getCreatorId = (url: string | null | undefined): number | null => {\n return url ? parseIdFromUrl(url) : null;\n};\n\nexport const getCreatorName = (el: HTMLElement | null): string | null => {\n const h1 = el?.querySelector('h1');\n return h1?.innerText?.trim() ?? null;\n};\n\nexport const getCreatorBirthdayInfo = (\n el: HTMLElement | null\n): { birthday: string; age: number; birthPlace: string } => {\n const infoBlock = el.querySelector('h1 + p');\n const text = infoBlock?.innerHTML.trim();\n\n const birthPlaceRow = infoBlock?.querySelector('.info-place')?.innerHTML.trim();\n const ageRow = infoBlock?.querySelector('.info')?.innerHTML.trim();\n\n let birthday: string = '';\n\n if (text) {\n const parts = text.split('\\n');\n const birthdayRow = parts.find((x) => x.includes('nar.'));\n birthday = birthdayRow ? parseBirthday(birthdayRow) : '';\n }\n\n const age = ageRow ? +parseAge(ageRow) : null;\n const birthPlace = birthPlaceRow ? parseBirthPlace(birthPlaceRow) : '';\n\n return { birthday, age, birthPlace };\n};\n\nexport const getCreatorBio = (el: HTMLElement | null): string | null => {\n const p = el?.querySelector('.article-content p');\n const first = p?.text?.trim().split('\\n')[0]?.trim();\n return first || null;\n};\n\nexport const getCreatorPhoto = (el: HTMLElement | null): string | null => {\n const src = el?.querySelector('img')?.getAttribute('src');\n return src ? addProtocol(src) : null;\n};\n\nconst parseBirthday = (text: string): string => text.replace(/nar\\./g, '').trim();\n\nconst parseAge = (text: string): number | null => {\n const digits = text.replace(/[^\\d]/g, '');\n return digits ? Number(digits) : null;\n};\n\nconst parseBirthPlace = (text: string): string =>\n text.trim().replace(/<br>/g, '').trim();\n\n\nexport const getCreatorFilms = (el: HTMLElement | null): CSFDCreatorScreening[] => {\n const filmNodes = el?.querySelectorAll('.box')?.[0]?.querySelectorAll('table tr') ?? [];\n let yearCache: number | null = null;\n const films = filmNodes.map((filmNode) => {\n const id = getCreatorId(filmNode.querySelector('td.name .film-title-name')?.attributes?.href);\n const title = filmNode.querySelector('.name')?.text?.trim();\n const yearText = filmNode.querySelector('.year')?.text?.trim();\n const year = yearText ? +yearText : null;\n const colorRating = getCreatorColorRating(filmNode.querySelector('.name .icon'));\n\n // Cache year from previous film because there is a gap between movies with same year\n if (typeof year === 'number' && !isNaN(year)) {\n yearCache = +year;\n }\n\n const finalYear = year ?? yearCache;\n if (id != null && title && finalYear != null) {\n return { id, title, year: finalYear, colorRating };\n }\n return null;\n });\n // Remove empty objects\n const filmsUnique = films.filter(Boolean) as CSFDCreatorScreening[];\n return filmsUnique;\n};\n"],"mappings":";;;AAMA,MAAM,yBAAyB,OAA4C;CACzE,MAAMA,UAAoB,IAAI,WAAW,MAAM,IAAI,IAAI,EAAE;CACzD,MAAM,OAAO,QAAQ,QAAQ,SAAS;AACtC,QAAOC,iCAAW,KAAK;;AAGzB,MAAa,gBAAgB,QAAkD;AAC7E,QAAO,MAAMC,qCAAe,IAAI,GAAG;;AAGrC,MAAa,kBAAkB,OAA0C;AAEvE,SADW,IAAI,cAAc,KAAK,GACvB,WAAW,MAAM,IAAI;;AAGlC,MAAa,0BACX,OAC0D;CAC1D,MAAM,YAAY,GAAG,cAAc,SAAS;CAC5C,MAAM,OAAO,WAAW,UAAU,MAAM;CAExC,MAAM,gBAAgB,WAAW,cAAc,cAAc,EAAE,UAAU,MAAM;CAC/E,MAAM,SAAS,WAAW,cAAc,QAAQ,EAAE,UAAU,MAAM;CAElE,IAAIC,WAAmB;AAEvB,KAAI,MAAM;EAER,MAAM,cADQ,KAAK,MAAM,KAAK,CACJ,MAAM,MAAM,EAAE,SAAS,OAAO,CAAC;AACzD,aAAW,cAAc,cAAc,YAAY,GAAG;;CAGxD,MAAM,MAAM,SAAS,CAAC,SAAS,OAAO,GAAG;CACzC,MAAM,aAAa,gBAAgB,gBAAgB,cAAc,GAAG;AAEpE,QAAO;EAAE;EAAU;EAAK;EAAY;;AAGtC,MAAa,iBAAiB,OAA0C;AAGtE,SAFU,IAAI,cAAc,qBAAqB,GAChC,MAAM,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,IACpC;;AAGlB,MAAa,mBAAmB,OAA0C;CACxE,MAAM,MAAM,IAAI,cAAc,MAAM,EAAE,aAAa,MAAM;AACzD,QAAO,MAAMC,kCAAY,IAAI,GAAG;;AAGlC,MAAM,iBAAiB,SAAyB,KAAK,QAAQ,UAAU,GAAG,CAAC,MAAM;AAEjF,MAAM,YAAY,SAAgC;CAChD,MAAM,SAAS,KAAK,QAAQ,UAAU,GAAG;AACzC,QAAO,SAAS,OAAO,OAAO,GAAG;;AAGnC,MAAM,mBAAmB,SACvB,KAAK,MAAM,CAAC,QAAQ,SAAS,GAAG,CAAC,MAAM;AAGzC,MAAa,mBAAmB,OAAmD;CACjF,MAAM,YAAY,IAAI,iBAAiB,OAAO,GAAG,IAAI,iBAAiB,WAAW,IAAI,EAAE;CACvF,IAAIC,YAA2B;AAqB/B,QApBc,UAAU,KAAK,aAAa;EACxC,MAAM,KAAK,aAAa,SAAS,cAAc,2BAA2B,EAAE,YAAY,KAAK;EAC7F,MAAM,QAAQ,SAAS,cAAc,QAAQ,EAAE,MAAM,MAAM;EAC3D,MAAM,WAAW,SAAS,cAAc,QAAQ,EAAE,MAAM,MAAM;EAC9D,MAAM,OAAO,WAAW,CAAC,WAAW;EACpC,MAAM,cAAc,sBAAsB,SAAS,cAAc,cAAc,CAAC;AAGhF,MAAI,OAAO,SAAS,YAAY,CAAC,MAAM,KAAK,CAC1C,aAAY,CAAC;EAGf,MAAM,YAAY,QAAQ;AAC1B,MAAI,MAAM,QAAQ,SAAS,aAAa,KACtC,QAAO;GAAE;GAAI;GAAO,MAAM;GAAW;GAAa;AAEpD,SAAO;GACP,CAEwB,OAAO,QAAQ"}
@@ -0,0 +1,69 @@
1
+ import { addProtocol, parseColor, parseIdFromUrl } from "./global.helper.mjs";
2
+
3
+ //#region src/helpers/creator.helper.ts
4
+ const getCreatorColorRating = (el) => {
5
+ const classes = el?.classNames.split(" ") ?? [];
6
+ const last = classes[classes.length - 1];
7
+ return parseColor(last);
8
+ };
9
+ const getCreatorId = (url) => {
10
+ return url ? parseIdFromUrl(url) : null;
11
+ };
12
+ const getCreatorName = (el) => {
13
+ return (el?.querySelector("h1"))?.innerText?.trim() ?? null;
14
+ };
15
+ const getCreatorBirthdayInfo = (el) => {
16
+ const infoBlock = el.querySelector("h1 + p");
17
+ const text = infoBlock?.innerHTML.trim();
18
+ const birthPlaceRow = infoBlock?.querySelector(".info-place")?.innerHTML.trim();
19
+ const ageRow = infoBlock?.querySelector(".info")?.innerHTML.trim();
20
+ let birthday = "";
21
+ if (text) {
22
+ const birthdayRow = text.split("\n").find((x) => x.includes("nar."));
23
+ birthday = birthdayRow ? parseBirthday(birthdayRow) : "";
24
+ }
25
+ const age = ageRow ? +parseAge(ageRow) : null;
26
+ const birthPlace = birthPlaceRow ? parseBirthPlace(birthPlaceRow) : "";
27
+ return {
28
+ birthday,
29
+ age,
30
+ birthPlace
31
+ };
32
+ };
33
+ const getCreatorBio = (el) => {
34
+ return (el?.querySelector(".article-content p"))?.text?.trim().split("\n")[0]?.trim() || null;
35
+ };
36
+ const getCreatorPhoto = (el) => {
37
+ const src = el?.querySelector("img")?.getAttribute("src");
38
+ return src ? addProtocol(src) : null;
39
+ };
40
+ const parseBirthday = (text) => text.replace(/nar\./g, "").trim();
41
+ const parseAge = (text) => {
42
+ const digits = text.replace(/[^\d]/g, "");
43
+ return digits ? Number(digits) : null;
44
+ };
45
+ const parseBirthPlace = (text) => text.trim().replace(/<br>/g, "").trim();
46
+ const getCreatorFilms = (el) => {
47
+ const filmNodes = el?.querySelectorAll(".box")?.[0]?.querySelectorAll("table tr") ?? [];
48
+ let yearCache = null;
49
+ return filmNodes.map((filmNode) => {
50
+ const id = getCreatorId(filmNode.querySelector("td.name .film-title-name")?.attributes?.href);
51
+ const title = filmNode.querySelector(".name")?.text?.trim();
52
+ const yearText = filmNode.querySelector(".year")?.text?.trim();
53
+ const year = yearText ? +yearText : null;
54
+ const colorRating = getCreatorColorRating(filmNode.querySelector(".name .icon"));
55
+ if (typeof year === "number" && !isNaN(year)) yearCache = +year;
56
+ const finalYear = year ?? yearCache;
57
+ if (id != null && title && finalYear != null) return {
58
+ id,
59
+ title,
60
+ year: finalYear,
61
+ colorRating
62
+ };
63
+ return null;
64
+ }).filter(Boolean);
65
+ };
66
+
67
+ //#endregion
68
+ export { getCreatorBio, getCreatorBirthdayInfo, getCreatorFilms, getCreatorName, getCreatorPhoto };
69
+ //# sourceMappingURL=creator.helper.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"creator.helper.mjs","names":["classes: string[]","birthday: string","yearCache: number | null"],"sources":["../../src/helpers/creator.helper.ts"],"sourcesContent":["import { HTMLElement } from 'node-html-parser';\nimport { CSFDCreatorScreening } from '../dto/creator';\nimport { CSFDColorRating } from '../dto/global';\nimport { Colors } from '../dto/user-ratings';\nimport { addProtocol, parseColor, parseIdFromUrl } from './global.helper';\n\nconst getCreatorColorRating = (el: HTMLElement | null): CSFDColorRating => {\n const classes: string[] = el?.classNames.split(' ') ?? [];\n const last = classes[classes.length - 1] as Colors | undefined;\n return parseColor(last);\n};\n\nexport const getCreatorId = (url: string | null | undefined): number | null => {\n return url ? parseIdFromUrl(url) : null;\n};\n\nexport const getCreatorName = (el: HTMLElement | null): string | null => {\n const h1 = el?.querySelector('h1');\n return h1?.innerText?.trim() ?? null;\n};\n\nexport const getCreatorBirthdayInfo = (\n el: HTMLElement | null\n): { birthday: string; age: number; birthPlace: string } => {\n const infoBlock = el.querySelector('h1 + p');\n const text = infoBlock?.innerHTML.trim();\n\n const birthPlaceRow = infoBlock?.querySelector('.info-place')?.innerHTML.trim();\n const ageRow = infoBlock?.querySelector('.info')?.innerHTML.trim();\n\n let birthday: string = '';\n\n if (text) {\n const parts = text.split('\\n');\n const birthdayRow = parts.find((x) => x.includes('nar.'));\n birthday = birthdayRow ? parseBirthday(birthdayRow) : '';\n }\n\n const age = ageRow ? +parseAge(ageRow) : null;\n const birthPlace = birthPlaceRow ? parseBirthPlace(birthPlaceRow) : '';\n\n return { birthday, age, birthPlace };\n};\n\nexport const getCreatorBio = (el: HTMLElement | null): string | null => {\n const p = el?.querySelector('.article-content p');\n const first = p?.text?.trim().split('\\n')[0]?.trim();\n return first || null;\n};\n\nexport const getCreatorPhoto = (el: HTMLElement | null): string | null => {\n const src = el?.querySelector('img')?.getAttribute('src');\n return src ? addProtocol(src) : null;\n};\n\nconst parseBirthday = (text: string): string => text.replace(/nar\\./g, '').trim();\n\nconst parseAge = (text: string): number | null => {\n const digits = text.replace(/[^\\d]/g, '');\n return digits ? Number(digits) : null;\n};\n\nconst parseBirthPlace = (text: string): string =>\n text.trim().replace(/<br>/g, '').trim();\n\n\nexport const getCreatorFilms = (el: HTMLElement | null): CSFDCreatorScreening[] => {\n const filmNodes = el?.querySelectorAll('.box')?.[0]?.querySelectorAll('table tr') ?? [];\n let yearCache: number | null = null;\n const films = filmNodes.map((filmNode) => {\n const id = getCreatorId(filmNode.querySelector('td.name .film-title-name')?.attributes?.href);\n const title = filmNode.querySelector('.name')?.text?.trim();\n const yearText = filmNode.querySelector('.year')?.text?.trim();\n const year = yearText ? +yearText : null;\n const colorRating = getCreatorColorRating(filmNode.querySelector('.name .icon'));\n\n // Cache year from previous film because there is a gap between movies with same year\n if (typeof year === 'number' && !isNaN(year)) {\n yearCache = +year;\n }\n\n const finalYear = year ?? yearCache;\n if (id != null && title && finalYear != null) {\n return { id, title, year: finalYear, colorRating };\n }\n return null;\n });\n // Remove empty objects\n const filmsUnique = films.filter(Boolean) as CSFDCreatorScreening[];\n return filmsUnique;\n};\n"],"mappings":";;;AAMA,MAAM,yBAAyB,OAA4C;CACzE,MAAMA,UAAoB,IAAI,WAAW,MAAM,IAAI,IAAI,EAAE;CACzD,MAAM,OAAO,QAAQ,QAAQ,SAAS;AACtC,QAAO,WAAW,KAAK;;AAGzB,MAAa,gBAAgB,QAAkD;AAC7E,QAAO,MAAM,eAAe,IAAI,GAAG;;AAGrC,MAAa,kBAAkB,OAA0C;AAEvE,SADW,IAAI,cAAc,KAAK,GACvB,WAAW,MAAM,IAAI;;AAGlC,MAAa,0BACX,OAC0D;CAC1D,MAAM,YAAY,GAAG,cAAc,SAAS;CAC5C,MAAM,OAAO,WAAW,UAAU,MAAM;CAExC,MAAM,gBAAgB,WAAW,cAAc,cAAc,EAAE,UAAU,MAAM;CAC/E,MAAM,SAAS,WAAW,cAAc,QAAQ,EAAE,UAAU,MAAM;CAElE,IAAIC,WAAmB;AAEvB,KAAI,MAAM;EAER,MAAM,cADQ,KAAK,MAAM,KAAK,CACJ,MAAM,MAAM,EAAE,SAAS,OAAO,CAAC;AACzD,aAAW,cAAc,cAAc,YAAY,GAAG;;CAGxD,MAAM,MAAM,SAAS,CAAC,SAAS,OAAO,GAAG;CACzC,MAAM,aAAa,gBAAgB,gBAAgB,cAAc,GAAG;AAEpE,QAAO;EAAE;EAAU;EAAK;EAAY;;AAGtC,MAAa,iBAAiB,OAA0C;AAGtE,SAFU,IAAI,cAAc,qBAAqB,GAChC,MAAM,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,IACpC;;AAGlB,MAAa,mBAAmB,OAA0C;CACxE,MAAM,MAAM,IAAI,cAAc,MAAM,EAAE,aAAa,MAAM;AACzD,QAAO,MAAM,YAAY,IAAI,GAAG;;AAGlC,MAAM,iBAAiB,SAAyB,KAAK,QAAQ,UAAU,GAAG,CAAC,MAAM;AAEjF,MAAM,YAAY,SAAgC;CAChD,MAAM,SAAS,KAAK,QAAQ,UAAU,GAAG;AACzC,QAAO,SAAS,OAAO,OAAO,GAAG;;AAGnC,MAAM,mBAAmB,SACvB,KAAK,MAAM,CAAC,QAAQ,SAAS,GAAG,CAAC,MAAM;AAGzC,MAAa,mBAAmB,OAAmD;CACjF,MAAM,YAAY,IAAI,iBAAiB,OAAO,GAAG,IAAI,iBAAiB,WAAW,IAAI,EAAE;CACvF,IAAIC,YAA2B;AAqB/B,QApBc,UAAU,KAAK,aAAa;EACxC,MAAM,KAAK,aAAa,SAAS,cAAc,2BAA2B,EAAE,YAAY,KAAK;EAC7F,MAAM,QAAQ,SAAS,cAAc,QAAQ,EAAE,MAAM,MAAM;EAC3D,MAAM,WAAW,SAAS,cAAc,QAAQ,EAAE,MAAM,MAAM;EAC9D,MAAM,OAAO,WAAW,CAAC,WAAW;EACpC,MAAM,cAAc,sBAAsB,SAAS,cAAc,cAAc,CAAC;AAGhF,MAAI,OAAO,SAAS,YAAY,CAAC,MAAM,KAAK,CAC1C,aAAY,CAAC;EAGf,MAAM,YAAY,QAAQ;AAC1B,MAAI,MAAM,QAAQ,SAAS,aAAa,KACtC,QAAO;GAAE;GAAI;GAAO,MAAM;GAAW;GAAa;AAEpD,SAAO;GACP,CAEwB,OAAO,QAAQ"}
@@ -0,0 +1,50 @@
1
+
2
+ //#region src/helpers/global.helper.ts
3
+ const parseIdFromUrl = (url) => {
4
+ if (url) return +(url?.split("/")[2])?.split("-")[0] || null;
5
+ else return null;
6
+ };
7
+ const getColor = (cls) => {
8
+ switch (cls) {
9
+ case "page-lightgrey": return "unknown";
10
+ case "page-red": return "good";
11
+ case "page-blue": return "average";
12
+ case "page-grey": return "bad";
13
+ default: return "unknown";
14
+ }
15
+ };
16
+ const parseColor = (quality) => {
17
+ switch (quality) {
18
+ case "lightgrey": return "unknown";
19
+ case "red": return "good";
20
+ case "blue": return "average";
21
+ case "grey": return "bad";
22
+ default: return "unknown";
23
+ }
24
+ };
25
+ const addProtocol = (url) => {
26
+ return url.startsWith("//") ? "https:" + url : url;
27
+ };
28
+ const getDuration = (matches) => {
29
+ return {
30
+ sign: matches[1] === void 0 ? "+" : "-",
31
+ years: matches[2] === void 0 ? 0 : matches[2],
32
+ months: matches[3] === void 0 ? 0 : matches[3],
33
+ weeks: matches[4] === void 0 ? 0 : matches[4],
34
+ days: matches[5] === void 0 ? 0 : matches[5],
35
+ hours: matches[6] === void 0 ? 0 : matches[6],
36
+ minutes: matches[7] === void 0 ? 0 : matches[7],
37
+ seconds: matches[8] === void 0 ? 0 : matches[8]
38
+ };
39
+ };
40
+ const parseISO8601Duration = (iso) => {
41
+ return +getDuration(iso.match(/(-)?P(?:([.,\d]+)Y)?(?:([.,\d]+)M)?(?:([.,\d]+)W)?(?:([.,\d]+)D)?T(?:([.,\d]+)H)?(?:([.,\d]+)M)?(?:([.,\d]+)S)?/)).minutes;
42
+ };
43
+
44
+ //#endregion
45
+ exports.addProtocol = addProtocol;
46
+ exports.getColor = getColor;
47
+ exports.parseColor = parseColor;
48
+ exports.parseISO8601Duration = parseISO8601Duration;
49
+ exports.parseIdFromUrl = parseIdFromUrl;
50
+ //# sourceMappingURL=global.helper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"global.helper.js","names":[],"sources":["../../src/helpers/global.helper.ts"],"sourcesContent":["import { CSFDColorRating } from '../dto/global';\nimport { Colors } from '../dto/user-ratings';\n\nexport const parseIdFromUrl = (url: string): number => {\n if (url) {\n const idSlug = url?.split('/')[2];\n const id = idSlug?.split('-')[0];\n return +id || null;\n } else {\n return null;\n }\n};\n\nexport const getColor = (cls: string): CSFDColorRating => {\n switch (cls) {\n case 'page-lightgrey':\n return 'unknown';\n case 'page-red':\n return 'good';\n case 'page-blue':\n return 'average';\n case 'page-grey':\n return 'bad';\n default:\n return 'unknown';\n }\n};\n\nexport const parseColor = (quality: Colors): CSFDColorRating => {\n switch (quality) {\n case 'lightgrey':\n return 'unknown';\n case 'red':\n return 'good';\n case 'blue':\n return 'average';\n case 'grey':\n return 'bad';\n default:\n return 'unknown';\n }\n};\n\nexport const addProtocol = (url: string): string => {\n return url.startsWith('//') ? 'https:' + url : url;\n};\n\nexport const getDuration = (matches: any[]) => {\n return {\n sign: matches[1] === undefined ? '+' : '-',\n years: matches[2] === undefined ? 0 : matches[2],\n months: matches[3] === undefined ? 0 : matches[3],\n weeks: matches[4] === undefined ? 0 : matches[4],\n days: matches[5] === undefined ? 0 : matches[5],\n hours: matches[6] === undefined ? 0 : matches[6],\n minutes: matches[7] === undefined ? 0 : matches[7],\n seconds: matches[8] === undefined ? 0 : matches[8]\n };\n};\n\nexport const parseISO8601Duration = (iso: string): number => {\n const iso8601DurationRegex =\n /(-)?P(?:([.,\\d]+)Y)?(?:([.,\\d]+)M)?(?:([.,\\d]+)W)?(?:([.,\\d]+)D)?T(?:([.,\\d]+)H)?(?:([.,\\d]+)M)?(?:([.,\\d]+)S)?/;\n\n const matches = iso.match(iso8601DurationRegex);\n\n const duration = getDuration(matches);\n\n return +duration.minutes;\n};\n"],"mappings":";;AAGA,MAAa,kBAAkB,QAAwB;AACrD,KAAI,IAGF,QAAO,EAFQ,KAAK,MAAM,IAAI,CAAC,KACZ,MAAM,IAAI,CAAC,MAChB;KAEd,QAAO;;AAIX,MAAa,YAAY,QAAiC;AACxD,SAAQ,KAAR;EACE,KAAK,iBACH,QAAO;EACT,KAAK,WACH,QAAO;EACT,KAAK,YACH,QAAO;EACT,KAAK,YACH,QAAO;EACT,QACE,QAAO;;;AAIb,MAAa,cAAc,YAAqC;AAC9D,SAAQ,SAAR;EACE,KAAK,YACH,QAAO;EACT,KAAK,MACH,QAAO;EACT,KAAK,OACH,QAAO;EACT,KAAK,OACH,QAAO;EACT,QACE,QAAO;;;AAIb,MAAa,eAAe,QAAwB;AAClD,QAAO,IAAI,WAAW,KAAK,GAAG,WAAW,MAAM;;AAGjD,MAAa,eAAe,YAAmB;AAC7C,QAAO;EACL,MAAM,QAAQ,OAAO,SAAY,MAAM;EACvC,OAAO,QAAQ,OAAO,SAAY,IAAI,QAAQ;EAC9C,QAAQ,QAAQ,OAAO,SAAY,IAAI,QAAQ;EAC/C,OAAO,QAAQ,OAAO,SAAY,IAAI,QAAQ;EAC9C,MAAM,QAAQ,OAAO,SAAY,IAAI,QAAQ;EAC7C,OAAO,QAAQ,OAAO,SAAY,IAAI,QAAQ;EAC9C,SAAS,QAAQ,OAAO,SAAY,IAAI,QAAQ;EAChD,SAAS,QAAQ,OAAO,SAAY,IAAI,QAAQ;EACjD;;AAGH,MAAa,wBAAwB,QAAwB;AAQ3D,QAAO,CAFU,YAFD,IAAI,MAFlB,kHAE6C,CAEV,CAEpB"}
@@ -0,0 +1,45 @@
1
+ //#region src/helpers/global.helper.ts
2
+ const parseIdFromUrl = (url) => {
3
+ if (url) return +(url?.split("/")[2])?.split("-")[0] || null;
4
+ else return null;
5
+ };
6
+ const getColor = (cls) => {
7
+ switch (cls) {
8
+ case "page-lightgrey": return "unknown";
9
+ case "page-red": return "good";
10
+ case "page-blue": return "average";
11
+ case "page-grey": return "bad";
12
+ default: return "unknown";
13
+ }
14
+ };
15
+ const parseColor = (quality) => {
16
+ switch (quality) {
17
+ case "lightgrey": return "unknown";
18
+ case "red": return "good";
19
+ case "blue": return "average";
20
+ case "grey": return "bad";
21
+ default: return "unknown";
22
+ }
23
+ };
24
+ const addProtocol = (url) => {
25
+ return url.startsWith("//") ? "https:" + url : url;
26
+ };
27
+ const getDuration = (matches) => {
28
+ return {
29
+ sign: matches[1] === void 0 ? "+" : "-",
30
+ years: matches[2] === void 0 ? 0 : matches[2],
31
+ months: matches[3] === void 0 ? 0 : matches[3],
32
+ weeks: matches[4] === void 0 ? 0 : matches[4],
33
+ days: matches[5] === void 0 ? 0 : matches[5],
34
+ hours: matches[6] === void 0 ? 0 : matches[6],
35
+ minutes: matches[7] === void 0 ? 0 : matches[7],
36
+ seconds: matches[8] === void 0 ? 0 : matches[8]
37
+ };
38
+ };
39
+ const parseISO8601Duration = (iso) => {
40
+ return +getDuration(iso.match(/(-)?P(?:([.,\d]+)Y)?(?:([.,\d]+)M)?(?:([.,\d]+)W)?(?:([.,\d]+)D)?T(?:([.,\d]+)H)?(?:([.,\d]+)M)?(?:([.,\d]+)S)?/)).minutes;
41
+ };
42
+
43
+ //#endregion
44
+ export { addProtocol, getColor, parseColor, parseISO8601Duration, parseIdFromUrl };
45
+ //# sourceMappingURL=global.helper.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"global.helper.mjs","names":[],"sources":["../../src/helpers/global.helper.ts"],"sourcesContent":["import { CSFDColorRating } from '../dto/global';\nimport { Colors } from '../dto/user-ratings';\n\nexport const parseIdFromUrl = (url: string): number => {\n if (url) {\n const idSlug = url?.split('/')[2];\n const id = idSlug?.split('-')[0];\n return +id || null;\n } else {\n return null;\n }\n};\n\nexport const getColor = (cls: string): CSFDColorRating => {\n switch (cls) {\n case 'page-lightgrey':\n return 'unknown';\n case 'page-red':\n return 'good';\n case 'page-blue':\n return 'average';\n case 'page-grey':\n return 'bad';\n default:\n return 'unknown';\n }\n};\n\nexport const parseColor = (quality: Colors): CSFDColorRating => {\n switch (quality) {\n case 'lightgrey':\n return 'unknown';\n case 'red':\n return 'good';\n case 'blue':\n return 'average';\n case 'grey':\n return 'bad';\n default:\n return 'unknown';\n }\n};\n\nexport const addProtocol = (url: string): string => {\n return url.startsWith('//') ? 'https:' + url : url;\n};\n\nexport const getDuration = (matches: any[]) => {\n return {\n sign: matches[1] === undefined ? '+' : '-',\n years: matches[2] === undefined ? 0 : matches[2],\n months: matches[3] === undefined ? 0 : matches[3],\n weeks: matches[4] === undefined ? 0 : matches[4],\n days: matches[5] === undefined ? 0 : matches[5],\n hours: matches[6] === undefined ? 0 : matches[6],\n minutes: matches[7] === undefined ? 0 : matches[7],\n seconds: matches[8] === undefined ? 0 : matches[8]\n };\n};\n\nexport const parseISO8601Duration = (iso: string): number => {\n const iso8601DurationRegex =\n /(-)?P(?:([.,\\d]+)Y)?(?:([.,\\d]+)M)?(?:([.,\\d]+)W)?(?:([.,\\d]+)D)?T(?:([.,\\d]+)H)?(?:([.,\\d]+)M)?(?:([.,\\d]+)S)?/;\n\n const matches = iso.match(iso8601DurationRegex);\n\n const duration = getDuration(matches);\n\n return +duration.minutes;\n};\n"],"mappings":";AAGA,MAAa,kBAAkB,QAAwB;AACrD,KAAI,IAGF,QAAO,EAFQ,KAAK,MAAM,IAAI,CAAC,KACZ,MAAM,IAAI,CAAC,MAChB;KAEd,QAAO;;AAIX,MAAa,YAAY,QAAiC;AACxD,SAAQ,KAAR;EACE,KAAK,iBACH,QAAO;EACT,KAAK,WACH,QAAO;EACT,KAAK,YACH,QAAO;EACT,KAAK,YACH,QAAO;EACT,QACE,QAAO;;;AAIb,MAAa,cAAc,YAAqC;AAC9D,SAAQ,SAAR;EACE,KAAK,YACH,QAAO;EACT,KAAK,MACH,QAAO;EACT,KAAK,OACH,QAAO;EACT,KAAK,OACH,QAAO;EACT,QACE,QAAO;;;AAIb,MAAa,eAAe,QAAwB;AAClD,QAAO,IAAI,WAAW,KAAK,GAAG,WAAW,MAAM;;AAGjD,MAAa,eAAe,YAAmB;AAC7C,QAAO;EACL,MAAM,QAAQ,OAAO,SAAY,MAAM;EACvC,OAAO,QAAQ,OAAO,SAAY,IAAI,QAAQ;EAC9C,QAAQ,QAAQ,OAAO,SAAY,IAAI,QAAQ;EAC/C,OAAO,QAAQ,OAAO,SAAY,IAAI,QAAQ;EAC9C,MAAM,QAAQ,OAAO,SAAY,IAAI,QAAQ;EAC7C,OAAO,QAAQ,OAAO,SAAY,IAAI,QAAQ;EAC9C,SAAS,QAAQ,OAAO,SAAY,IAAI,QAAQ;EAChD,SAAS,QAAQ,OAAO,SAAY,IAAI,QAAQ;EACjD;;AAGH,MAAa,wBAAwB,QAAwB;AAQ3D,QAAO,CAFU,YAFD,IAAI,MAFlB,kHAE6C,CAEV,CAEpB"}