node-csfd-api 3.0.0-next.9 → 3.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (136) 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 -28
  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/services/creator.service.js +0 -43
  102. package/cjs/services/movie.service.js +0 -69
  103. package/cjs/services/search.service.js +0 -91
  104. package/cjs/services/user-ratings.service.js +0 -95
  105. package/esm/fetchers/index.js +0 -37
  106. package/esm/helpers/creator.helper.js +0 -73
  107. package/esm/helpers/global.helper.js +0 -56
  108. package/esm/helpers/movie.helper.js +0 -223
  109. package/esm/helpers/search-user.helper.js +0 -15
  110. package/esm/helpers/search.helper.js +0 -49
  111. package/esm/helpers/user-ratings.helper.js +0 -47
  112. package/esm/index.js +0 -46
  113. package/esm/services/creator.service.js +0 -39
  114. package/esm/services/movie.service.js +0 -65
  115. package/esm/services/search.service.js +0 -87
  116. package/esm/services/user-ratings.service.js +0 -91
  117. package/esm/vars.js +0 -4
  118. package/types/fetchers/index.d.ts +0 -1
  119. package/types/helpers/creator.helper.d.ts +0 -17
  120. package/types/helpers/global.helper.d.ts +0 -7
  121. package/types/helpers/movie.helper.d.ts +0 -25
  122. package/types/helpers/search-user.helper.d.ts +0 -5
  123. package/types/helpers/search.helper.d.ts +0 -11
  124. package/types/helpers/user-ratings.helper.d.ts +0 -13
  125. package/types/index.d.ts +0 -20
  126. package/types/index.ts +0 -22
  127. package/types/interfaces/creator.interface.d.ts +0 -12
  128. package/types/interfaces/global.d.ts +0 -22
  129. package/types/interfaces/movie.interface.d.ts +0 -66
  130. package/types/interfaces/search.interface.d.ts +0 -27
  131. package/types/interfaces/user-ratings.interface.d.ts +0 -18
  132. package/types/services/creator.service.d.ts +0 -6
  133. package/types/services/movie.service.d.ts +0 -6
  134. package/types/services/search.service.d.ts +0 -5
  135. package/types/services/user-ratings.service.d.ts +0 -7
  136. package/types/vars.d.ts +0 -4
@@ -0,0 +1,162 @@
1
+ const require_global_helper = require('./global.helper.js');
2
+
3
+ //#region src/helpers/movie.helper.ts
4
+ const getMovieTitle = (el) => {
5
+ return el.querySelector("h1").innerText.split(`(`)[0].trim();
6
+ };
7
+ const getMovieGenres = (el) => {
8
+ return el.querySelector(".genres").textContent.split(" / ");
9
+ };
10
+ const getMovieOrigins = (el) => {
11
+ return el.querySelector(".origin").textContent.split(",")[0].split(" / ");
12
+ };
13
+ const getMovieColorRating = (bodyClasses) => {
14
+ return require_global_helper.getColor(bodyClasses[1]);
15
+ };
16
+ const getMovieRating = (el) => {
17
+ const rating = el.querySelector(".film-rating-average").textContent?.replace(/%/g, "").trim();
18
+ const ratingInt = parseInt(rating);
19
+ if (Number.isInteger(ratingInt)) return ratingInt;
20
+ else return null;
21
+ };
22
+ const getMovieRatingCount = (el) => {
23
+ const ratingCount = +(el.querySelector(".box-rating-container .counter")?.textContent)?.replace(/[(\s)]/g, "");
24
+ if (Number.isInteger(ratingCount)) return ratingCount;
25
+ else return null;
26
+ };
27
+ const getMovieYear = (el) => {
28
+ try {
29
+ return +JSON.parse(el).dateCreated;
30
+ } catch (error) {
31
+ console.error("node-csfd-api: Error parsing JSON-LD", error);
32
+ return null;
33
+ }
34
+ };
35
+ const getMovieDuration = (jsonLdRaw, el) => {
36
+ let duration = null;
37
+ try {
38
+ duration = JSON.parse(jsonLdRaw).duration;
39
+ return require_global_helper.parseISO8601Duration(duration);
40
+ } catch (error) {
41
+ const timeString = el.querySelector(".origin").innerText.split(",");
42
+ if (timeString.length > 2) {
43
+ const hoursMins = timeString.pop().trim().split("(")[0].trim().split("min")[0].split("h");
44
+ duration = hoursMins.length > 1 ? +hoursMins[0] * 60 + +hoursMins[1] : +hoursMins[0];
45
+ return duration;
46
+ } else return null;
47
+ }
48
+ };
49
+ const getMovieTitlesOther = (el) => {
50
+ const namesNode = el.querySelectorAll(".film-names li");
51
+ if (!namesNode.length) return [];
52
+ return namesNode.map((el$1) => {
53
+ const country = el$1.querySelector("img.flag").attributes.alt;
54
+ const title = el$1.textContent.trim().split("\n")[0];
55
+ if (country && title) return {
56
+ country,
57
+ title
58
+ };
59
+ else return null;
60
+ }).filter((x) => x);
61
+ };
62
+ const getMoviePoster = (el) => {
63
+ const poster = el.querySelector(".film-posters img");
64
+ if (poster) if (poster.classNames?.includes("empty-image")) return null;
65
+ else return require_global_helper.addProtocol(poster.attributes.src.split("?")[0].replace(/\/w140\//, "/w1080/"));
66
+ else return null;
67
+ };
68
+ const getMovieRandomPhoto = (el) => {
69
+ const image = el.querySelector(".gallery-item picture img")?.attributes?.src;
70
+ if (image) return image.replace(/\/w663\//, "/w1326/");
71
+ else return null;
72
+ };
73
+ const getMovieTrivia = (el) => {
74
+ const triviaNodes = el.querySelectorAll(".article-trivia ul li");
75
+ if (triviaNodes?.length) return triviaNodes.map((node) => node.textContent.trim().replace(/(\r\n|\n|\r|\t)/gm, ""));
76
+ else return null;
77
+ };
78
+ const getMovieDescriptions = (el) => {
79
+ return el.querySelectorAll(".body--plots .plot-full p, .body--plots .plots .plots-item p").map((movie) => movie.textContent?.trim().replace(/(\r\n|\n|\r|\t)/gm, ""));
80
+ };
81
+ const parseMoviePeople = (el) => {
82
+ return el.querySelectorAll("a").filter((x) => x.classNames.length === 0).map((person) => {
83
+ return {
84
+ id: require_global_helper.parseIdFromUrl(person.attributes.href),
85
+ name: person.innerText.trim(),
86
+ url: `https://www.csfd.cz${person.attributes.href}`
87
+ };
88
+ });
89
+ };
90
+ const getMovieGroup = (el, group) => {
91
+ const element = el.querySelectorAll(".creators h4").filter((elem) => elem.textContent.trim().includes(group))[0];
92
+ if (element?.parentNode) return parseMoviePeople(element.parentNode);
93
+ else return [];
94
+ };
95
+ const getMovieType = (el) => {
96
+ return el.querySelector(".film-header-name .type")?.innerText?.replace(/[{()}]/g, "") || "film";
97
+ };
98
+ const getMovieVods = (el) => {
99
+ let vods = [];
100
+ if (el) vods = el.querySelectorAll(".box-buttons .button").filter((x) => !x.classNames.includes("button-social")).map((btn) => {
101
+ return {
102
+ title: btn.textContent.trim(),
103
+ url: btn.attributes.href
104
+ };
105
+ });
106
+ return vods.length ? vods : [];
107
+ };
108
+ const getBoxContent = (el, box) => {
109
+ return el.querySelectorAll("section.box .box-header").find((header) => header.querySelector("h3").textContent.trim().includes(box))?.parentNode;
110
+ };
111
+ const getMovieBoxMovies = (el, boxName) => {
112
+ const movieListItem = [];
113
+ const movieTitleNodes = getBoxContent(el, boxName)?.querySelectorAll(".article-header .film-title-name");
114
+ if (movieTitleNodes?.length) for (const item of movieTitleNodes) movieListItem.push({
115
+ id: require_global_helper.parseIdFromUrl(item.attributes.href),
116
+ title: item.textContent.trim(),
117
+ url: `https://www.csfd.cz${item.attributes.href}`
118
+ });
119
+ return movieListItem;
120
+ };
121
+ const getMoviePremieres = (el) => {
122
+ const premiereNodes = el.querySelectorAll(".box-premieres li");
123
+ const premiere = [];
124
+ for (const premiereNode of premiereNodes) {
125
+ const title = premiereNode.querySelector("p + span").attributes.title;
126
+ if (title) {
127
+ const [date, ...company] = title?.split(" ");
128
+ premiere.push({
129
+ country: premiereNode.querySelector(".flag")?.attributes.title || null,
130
+ format: premiereNode.querySelector("p").textContent.trim()?.split(" od")[0],
131
+ date,
132
+ company: company.join(" ")
133
+ });
134
+ }
135
+ }
136
+ return premiere;
137
+ };
138
+ const getMovieTags = (el) => {
139
+ return el.querySelectorAll(".box-content a[href*=\"/tag/\"]").map((tag) => tag.textContent);
140
+ };
141
+
142
+ //#endregion
143
+ exports.getMovieBoxMovies = getMovieBoxMovies;
144
+ exports.getMovieColorRating = getMovieColorRating;
145
+ exports.getMovieDescriptions = getMovieDescriptions;
146
+ exports.getMovieDuration = getMovieDuration;
147
+ exports.getMovieGenres = getMovieGenres;
148
+ exports.getMovieGroup = getMovieGroup;
149
+ exports.getMovieOrigins = getMovieOrigins;
150
+ exports.getMoviePoster = getMoviePoster;
151
+ exports.getMoviePremieres = getMoviePremieres;
152
+ exports.getMovieRandomPhoto = getMovieRandomPhoto;
153
+ exports.getMovieRating = getMovieRating;
154
+ exports.getMovieRatingCount = getMovieRatingCount;
155
+ exports.getMovieTags = getMovieTags;
156
+ exports.getMovieTitle = getMovieTitle;
157
+ exports.getMovieTitlesOther = getMovieTitlesOther;
158
+ exports.getMovieTrivia = getMovieTrivia;
159
+ exports.getMovieType = getMovieType;
160
+ exports.getMovieVods = getMovieVods;
161
+ exports.getMovieYear = getMovieYear;
162
+ //# sourceMappingURL=movie.helper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"movie.helper.js","names":["getColor","parseISO8601Duration","el","addProtocol","parseIdFromUrl","vods: CSFDVod[]","movieListItem: CSFDMovieListItem[]","premiere: CSFDPremiere[]"],"sources":["../../src/helpers/movie.helper.ts"],"sourcesContent":["import { HTMLElement } from 'node-html-parser';\nimport { CSFDColorRating } from '../dto/global';\nimport {\n CSFDBoxContent,\n CSFDCreatorGroups,\n CSFDGenres,\n CSFDMovieCreator,\n CSFDMovieListItem,\n CSFDPremiere,\n CSFDTitlesOther,\n CSFDVod,\n CSFDVodService\n} from '../dto/movie';\nimport { addProtocol, getColor, parseISO8601Duration, parseIdFromUrl } from './global.helper';\n\nexport const getMovieId = (el: HTMLElement): number => {\n const url = el.querySelector('.tabs .tab-nav-list a').attributes.href;\n return parseIdFromUrl(url);\n};\n\nexport const getMovieTitle = (el: HTMLElement): string => {\n return el.querySelector('h1').innerText.split(`(`)[0].trim();\n};\n\nexport const getMovieGenres = (el: HTMLElement): CSFDGenres[] => {\n const genresRaw = el.querySelector('.genres').textContent;\n return genresRaw.split(' / ') as CSFDGenres[];\n};\n\nexport const getMovieOrigins = (el: HTMLElement): string[] => {\n const originsRaw = el.querySelector('.origin').textContent;\n const origins = originsRaw.split(',')[0];\n return origins.split(' / ');\n};\n\nexport const getMovieColorRating = (bodyClasses: string[]): CSFDColorRating => {\n return getColor(bodyClasses[1]);\n};\n\nexport const getMovieRating = (el: HTMLElement): number => {\n const ratingRaw = el.querySelector('.film-rating-average').textContent;\n const rating = ratingRaw?.replace(/%/g, '').trim();\n const ratingInt = parseInt(rating);\n\n if (Number.isInteger(ratingInt)) {\n return ratingInt;\n } else {\n return null;\n }\n};\n\nexport const getMovieRatingCount = (el: HTMLElement): number => {\n const ratingCountRaw = el.querySelector('.box-rating-container .counter')?.textContent;\n const ratingCount = +ratingCountRaw?.replace(/[(\\s)]/g, '');\n if (Number.isInteger(ratingCount)) {\n return ratingCount;\n } else {\n return null;\n }\n};\n\nexport const getMovieYear = (el: string): number => {\n try {\n const jsonLd = JSON.parse(el);\n return +jsonLd.dateCreated;\n } catch (error) {\n console.error('node-csfd-api: Error parsing JSON-LD', error);\n return null;\n }\n};\n\nexport const getMovieDuration = (jsonLdRaw: string, el: HTMLElement): number => {\n let duration = null;\n try {\n const jsonLd = JSON.parse(jsonLdRaw);\n duration = jsonLd.duration;\n return parseISO8601Duration(duration);\n } catch (error) {\n const origin = el.querySelector('.origin').innerText;\n const timeString = origin.split(',');\n if (timeString.length > 2) {\n // Get last time elelment\n const timeString2 = timeString.pop().trim();\n // Clean it\n const timeRaw = timeString2.split('(')[0].trim();\n // Split by minutes and hours\n const hoursMinsRaw = timeRaw.split('min')[0];\n const hoursMins = hoursMinsRaw.split('h');\n // Resolve hours + minutes format\n duration = hoursMins.length > 1 ? +hoursMins[0] * 60 + +hoursMins[1] : +hoursMins[0];\n return duration;\n } else {\n return null;\n }\n }\n};\n\nexport const getMovieTitlesOther = (el: HTMLElement): CSFDTitlesOther[] => {\n const namesNode = el.querySelectorAll('.film-names li');\n\n if (!namesNode.length) {\n return [];\n }\n\n const titlesOther = namesNode.map((el) => {\n const country = el.querySelector('img.flag').attributes.alt;\n const title = el.textContent.trim().split('\\n')[0];\n\n if (country && title) {\n return {\n country,\n title\n };\n } else {\n return null;\n }\n });\n\n return titlesOther.filter((x) => x);\n};\n\nexport const getMoviePoster = (el: HTMLElement | null): string => {\n const poster = el.querySelector('.film-posters img');\n // Resolve empty image\n if (poster) {\n if (poster.classNames?.includes('empty-image')) {\n return null;\n } else {\n // Full sized image (not thumb)\n const imageThumb = poster.attributes.src.split('?')[0];\n const image = imageThumb.replace(/\\/w140\\//, '/w1080/');\n return addProtocol(image);\n }\n } else {\n return null;\n }\n};\n\nexport const getMovieRandomPhoto = (el: HTMLElement | null): string => {\n const imageNode = el.querySelector('.gallery-item picture img');\n const image = imageNode?.attributes?.src;\n if (image) {\n return image.replace(/\\/w663\\//, '/w1326/');\n } else {\n return null;\n }\n};\n\nexport const getMovieTrivia = (el: HTMLElement | null): string[] => {\n const triviaNodes = el.querySelectorAll('.article-trivia ul li');\n if (triviaNodes?.length) {\n return triviaNodes.map((node) => node.textContent.trim().replace(/(\\r\\n|\\n|\\r|\\t)/gm, ''));\n } else {\n return null;\n }\n};\n\nexport const getMovieDescriptions = (el: HTMLElement): string[] => {\n return el\n .querySelectorAll('.body--plots .plot-full p, .body--plots .plots .plots-item p')\n .map((movie) => movie.textContent?.trim().replace(/(\\r\\n|\\n|\\r|\\t)/gm, ''));\n};\n\nconst parseMoviePeople = (el: HTMLElement): CSFDMovieCreator[] => {\n const people = el.querySelectorAll('a');\n return (\n people\n // Filter out \"more\" links\n .filter((x) => x.classNames.length === 0)\n .map((person) => {\n return {\n id: parseIdFromUrl(person.attributes.href),\n name: person.innerText.trim(),\n url: `https://www.csfd.cz${person.attributes.href}`\n };\n })\n );\n};\n\nexport const getMovieGroup = (el: HTMLElement, group: CSFDCreatorGroups): CSFDMovieCreator[] => {\n const creators = el.querySelectorAll('.creators h4');\n const element = creators.filter((elem) => elem.textContent.trim().includes(group))[0];\n if (element?.parentNode) {\n return parseMoviePeople(element.parentNode as HTMLElement);\n } else {\n return [];\n }\n};\n\nexport const getMovieType = (el: HTMLElement): string => {\n const type = el.querySelector('.film-header-name .type');\n return type?.innerText?.replace(/[{()}]/g, '') || 'film';\n};\n\nexport const getMovieVods = (el: HTMLElement | null): CSFDVod[] => {\n let vods: CSFDVod[] = [];\n if (el) {\n const buttons = el.querySelectorAll('.box-buttons .button');\n const buttonsVod = buttons.filter((x) => !x.classNames.includes('button-social'));\n vods = buttonsVod.map((btn) => {\n return {\n title: btn.textContent.trim() as CSFDVodService,\n url: btn.attributes.href\n };\n });\n }\n return vods.length ? vods : [];\n};\n\n// Get box content\nconst getBoxContent = (el: HTMLElement, box: string): HTMLElement => {\n const headers = el.querySelectorAll('section.box .box-header');\n return headers.find((header) => header.querySelector('h3').textContent.trim().includes(box))\n ?.parentNode;\n};\n\nexport const getMovieBoxMovies = (el: HTMLElement, boxName: CSFDBoxContent): CSFDMovieListItem[] => {\n const movieListItem: CSFDMovieListItem[] = [];\n const box = getBoxContent(el, boxName);\n const movieTitleNodes = box?.querySelectorAll('.article-header .film-title-name');\n if (movieTitleNodes?.length) {\n for (const item of movieTitleNodes) {\n movieListItem.push({\n id: parseIdFromUrl(item.attributes.href),\n title: item.textContent.trim(),\n url: `https://www.csfd.cz${item.attributes.href}`\n });\n }\n }\n return movieListItem;\n};\n\nexport const getMoviePremieres = (el: HTMLElement): CSFDPremiere[] => {\n const premiereNodes = el.querySelectorAll('.box-premieres li');\n const premiere: CSFDPremiere[] = [];\n for (const premiereNode of premiereNodes) {\n const title = premiereNode.querySelector('p + span').attributes.title;\n\n if (title) {\n const [date, ...company] = title?.split(' ');\n\n premiere.push({\n country: premiereNode.querySelector('.flag')?.attributes.title || null,\n format: premiereNode.querySelector('p').textContent.trim()?.split(' od')[0],\n date,\n company: company.join(' ')\n });\n }\n }\n return premiere;\n};\n\nexport const getMovieTags = (el: HTMLElement): string[] => {\n const tagsRaw = el.querySelectorAll('.box-content a[href*=\"/tag/\"]');\n return tagsRaw.map((tag) => tag.textContent);\n};\n"],"mappings":"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"}
@@ -0,0 +1,144 @@
1
+ import { addProtocol, getColor, parseISO8601Duration, parseIdFromUrl } from "./global.helper.mjs";
2
+
3
+ //#region src/helpers/movie.helper.ts
4
+ const getMovieTitle = (el) => {
5
+ return el.querySelector("h1").innerText.split(`(`)[0].trim();
6
+ };
7
+ const getMovieGenres = (el) => {
8
+ return el.querySelector(".genres").textContent.split(" / ");
9
+ };
10
+ const getMovieOrigins = (el) => {
11
+ return el.querySelector(".origin").textContent.split(",")[0].split(" / ");
12
+ };
13
+ const getMovieColorRating = (bodyClasses) => {
14
+ return getColor(bodyClasses[1]);
15
+ };
16
+ const getMovieRating = (el) => {
17
+ const rating = el.querySelector(".film-rating-average").textContent?.replace(/%/g, "").trim();
18
+ const ratingInt = parseInt(rating);
19
+ if (Number.isInteger(ratingInt)) return ratingInt;
20
+ else return null;
21
+ };
22
+ const getMovieRatingCount = (el) => {
23
+ const ratingCount = +(el.querySelector(".box-rating-container .counter")?.textContent)?.replace(/[(\s)]/g, "");
24
+ if (Number.isInteger(ratingCount)) return ratingCount;
25
+ else return null;
26
+ };
27
+ const getMovieYear = (el) => {
28
+ try {
29
+ return +JSON.parse(el).dateCreated;
30
+ } catch (error) {
31
+ console.error("node-csfd-api: Error parsing JSON-LD", error);
32
+ return null;
33
+ }
34
+ };
35
+ const getMovieDuration = (jsonLdRaw, el) => {
36
+ let duration = null;
37
+ try {
38
+ duration = JSON.parse(jsonLdRaw).duration;
39
+ return parseISO8601Duration(duration);
40
+ } catch (error) {
41
+ const timeString = el.querySelector(".origin").innerText.split(",");
42
+ if (timeString.length > 2) {
43
+ const hoursMins = timeString.pop().trim().split("(")[0].trim().split("min")[0].split("h");
44
+ duration = hoursMins.length > 1 ? +hoursMins[0] * 60 + +hoursMins[1] : +hoursMins[0];
45
+ return duration;
46
+ } else return null;
47
+ }
48
+ };
49
+ const getMovieTitlesOther = (el) => {
50
+ const namesNode = el.querySelectorAll(".film-names li");
51
+ if (!namesNode.length) return [];
52
+ return namesNode.map((el$1) => {
53
+ const country = el$1.querySelector("img.flag").attributes.alt;
54
+ const title = el$1.textContent.trim().split("\n")[0];
55
+ if (country && title) return {
56
+ country,
57
+ title
58
+ };
59
+ else return null;
60
+ }).filter((x) => x);
61
+ };
62
+ const getMoviePoster = (el) => {
63
+ const poster = el.querySelector(".film-posters img");
64
+ if (poster) if (poster.classNames?.includes("empty-image")) return null;
65
+ else return addProtocol(poster.attributes.src.split("?")[0].replace(/\/w140\//, "/w1080/"));
66
+ else return null;
67
+ };
68
+ const getMovieRandomPhoto = (el) => {
69
+ const image = el.querySelector(".gallery-item picture img")?.attributes?.src;
70
+ if (image) return image.replace(/\/w663\//, "/w1326/");
71
+ else return null;
72
+ };
73
+ const getMovieTrivia = (el) => {
74
+ const triviaNodes = el.querySelectorAll(".article-trivia ul li");
75
+ if (triviaNodes?.length) return triviaNodes.map((node) => node.textContent.trim().replace(/(\r\n|\n|\r|\t)/gm, ""));
76
+ else return null;
77
+ };
78
+ const getMovieDescriptions = (el) => {
79
+ return el.querySelectorAll(".body--plots .plot-full p, .body--plots .plots .plots-item p").map((movie) => movie.textContent?.trim().replace(/(\r\n|\n|\r|\t)/gm, ""));
80
+ };
81
+ const parseMoviePeople = (el) => {
82
+ return el.querySelectorAll("a").filter((x) => x.classNames.length === 0).map((person) => {
83
+ return {
84
+ id: parseIdFromUrl(person.attributes.href),
85
+ name: person.innerText.trim(),
86
+ url: `https://www.csfd.cz${person.attributes.href}`
87
+ };
88
+ });
89
+ };
90
+ const getMovieGroup = (el, group) => {
91
+ const element = el.querySelectorAll(".creators h4").filter((elem) => elem.textContent.trim().includes(group))[0];
92
+ if (element?.parentNode) return parseMoviePeople(element.parentNode);
93
+ else return [];
94
+ };
95
+ const getMovieType = (el) => {
96
+ return el.querySelector(".film-header-name .type")?.innerText?.replace(/[{()}]/g, "") || "film";
97
+ };
98
+ const getMovieVods = (el) => {
99
+ let vods = [];
100
+ if (el) vods = el.querySelectorAll(".box-buttons .button").filter((x) => !x.classNames.includes("button-social")).map((btn) => {
101
+ return {
102
+ title: btn.textContent.trim(),
103
+ url: btn.attributes.href
104
+ };
105
+ });
106
+ return vods.length ? vods : [];
107
+ };
108
+ const getBoxContent = (el, box) => {
109
+ return el.querySelectorAll("section.box .box-header").find((header) => header.querySelector("h3").textContent.trim().includes(box))?.parentNode;
110
+ };
111
+ const getMovieBoxMovies = (el, boxName) => {
112
+ const movieListItem = [];
113
+ const movieTitleNodes = getBoxContent(el, boxName)?.querySelectorAll(".article-header .film-title-name");
114
+ if (movieTitleNodes?.length) for (const item of movieTitleNodes) movieListItem.push({
115
+ id: parseIdFromUrl(item.attributes.href),
116
+ title: item.textContent.trim(),
117
+ url: `https://www.csfd.cz${item.attributes.href}`
118
+ });
119
+ return movieListItem;
120
+ };
121
+ const getMoviePremieres = (el) => {
122
+ const premiereNodes = el.querySelectorAll(".box-premieres li");
123
+ const premiere = [];
124
+ for (const premiereNode of premiereNodes) {
125
+ const title = premiereNode.querySelector("p + span").attributes.title;
126
+ if (title) {
127
+ const [date, ...company] = title?.split(" ");
128
+ premiere.push({
129
+ country: premiereNode.querySelector(".flag")?.attributes.title || null,
130
+ format: premiereNode.querySelector("p").textContent.trim()?.split(" od")[0],
131
+ date,
132
+ company: company.join(" ")
133
+ });
134
+ }
135
+ }
136
+ return premiere;
137
+ };
138
+ const getMovieTags = (el) => {
139
+ return el.querySelectorAll(".box-content a[href*=\"/tag/\"]").map((tag) => tag.textContent);
140
+ };
141
+
142
+ //#endregion
143
+ export { getMovieBoxMovies, getMovieColorRating, getMovieDescriptions, getMovieDuration, getMovieGenres, getMovieGroup, getMovieOrigins, getMoviePoster, getMoviePremieres, getMovieRandomPhoto, getMovieRating, getMovieRatingCount, getMovieTags, getMovieTitle, getMovieTitlesOther, getMovieTrivia, getMovieType, getMovieVods, getMovieYear };
144
+ //# sourceMappingURL=movie.helper.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"movie.helper.mjs","names":["el","vods: CSFDVod[]","movieListItem: CSFDMovieListItem[]","premiere: CSFDPremiere[]"],"sources":["../../src/helpers/movie.helper.ts"],"sourcesContent":["import { HTMLElement } from 'node-html-parser';\nimport { CSFDColorRating } from '../dto/global';\nimport {\n CSFDBoxContent,\n CSFDCreatorGroups,\n CSFDGenres,\n CSFDMovieCreator,\n CSFDMovieListItem,\n CSFDPremiere,\n CSFDTitlesOther,\n CSFDVod,\n CSFDVodService\n} from '../dto/movie';\nimport { addProtocol, getColor, parseISO8601Duration, parseIdFromUrl } from './global.helper';\n\nexport const getMovieId = (el: HTMLElement): number => {\n const url = el.querySelector('.tabs .tab-nav-list a').attributes.href;\n return parseIdFromUrl(url);\n};\n\nexport const getMovieTitle = (el: HTMLElement): string => {\n return el.querySelector('h1').innerText.split(`(`)[0].trim();\n};\n\nexport const getMovieGenres = (el: HTMLElement): CSFDGenres[] => {\n const genresRaw = el.querySelector('.genres').textContent;\n return genresRaw.split(' / ') as CSFDGenres[];\n};\n\nexport const getMovieOrigins = (el: HTMLElement): string[] => {\n const originsRaw = el.querySelector('.origin').textContent;\n const origins = originsRaw.split(',')[0];\n return origins.split(' / ');\n};\n\nexport const getMovieColorRating = (bodyClasses: string[]): CSFDColorRating => {\n return getColor(bodyClasses[1]);\n};\n\nexport const getMovieRating = (el: HTMLElement): number => {\n const ratingRaw = el.querySelector('.film-rating-average').textContent;\n const rating = ratingRaw?.replace(/%/g, '').trim();\n const ratingInt = parseInt(rating);\n\n if (Number.isInteger(ratingInt)) {\n return ratingInt;\n } else {\n return null;\n }\n};\n\nexport const getMovieRatingCount = (el: HTMLElement): number => {\n const ratingCountRaw = el.querySelector('.box-rating-container .counter')?.textContent;\n const ratingCount = +ratingCountRaw?.replace(/[(\\s)]/g, '');\n if (Number.isInteger(ratingCount)) {\n return ratingCount;\n } else {\n return null;\n }\n};\n\nexport const getMovieYear = (el: string): number => {\n try {\n const jsonLd = JSON.parse(el);\n return +jsonLd.dateCreated;\n } catch (error) {\n console.error('node-csfd-api: Error parsing JSON-LD', error);\n return null;\n }\n};\n\nexport const getMovieDuration = (jsonLdRaw: string, el: HTMLElement): number => {\n let duration = null;\n try {\n const jsonLd = JSON.parse(jsonLdRaw);\n duration = jsonLd.duration;\n return parseISO8601Duration(duration);\n } catch (error) {\n const origin = el.querySelector('.origin').innerText;\n const timeString = origin.split(',');\n if (timeString.length > 2) {\n // Get last time elelment\n const timeString2 = timeString.pop().trim();\n // Clean it\n const timeRaw = timeString2.split('(')[0].trim();\n // Split by minutes and hours\n const hoursMinsRaw = timeRaw.split('min')[0];\n const hoursMins = hoursMinsRaw.split('h');\n // Resolve hours + minutes format\n duration = hoursMins.length > 1 ? +hoursMins[0] * 60 + +hoursMins[1] : +hoursMins[0];\n return duration;\n } else {\n return null;\n }\n }\n};\n\nexport const getMovieTitlesOther = (el: HTMLElement): CSFDTitlesOther[] => {\n const namesNode = el.querySelectorAll('.film-names li');\n\n if (!namesNode.length) {\n return [];\n }\n\n const titlesOther = namesNode.map((el) => {\n const country = el.querySelector('img.flag').attributes.alt;\n const title = el.textContent.trim().split('\\n')[0];\n\n if (country && title) {\n return {\n country,\n title\n };\n } else {\n return null;\n }\n });\n\n return titlesOther.filter((x) => x);\n};\n\nexport const getMoviePoster = (el: HTMLElement | null): string => {\n const poster = el.querySelector('.film-posters img');\n // Resolve empty image\n if (poster) {\n if (poster.classNames?.includes('empty-image')) {\n return null;\n } else {\n // Full sized image (not thumb)\n const imageThumb = poster.attributes.src.split('?')[0];\n const image = imageThumb.replace(/\\/w140\\//, '/w1080/');\n return addProtocol(image);\n }\n } else {\n return null;\n }\n};\n\nexport const getMovieRandomPhoto = (el: HTMLElement | null): string => {\n const imageNode = el.querySelector('.gallery-item picture img');\n const image = imageNode?.attributes?.src;\n if (image) {\n return image.replace(/\\/w663\\//, '/w1326/');\n } else {\n return null;\n }\n};\n\nexport const getMovieTrivia = (el: HTMLElement | null): string[] => {\n const triviaNodes = el.querySelectorAll('.article-trivia ul li');\n if (triviaNodes?.length) {\n return triviaNodes.map((node) => node.textContent.trim().replace(/(\\r\\n|\\n|\\r|\\t)/gm, ''));\n } else {\n return null;\n }\n};\n\nexport const getMovieDescriptions = (el: HTMLElement): string[] => {\n return el\n .querySelectorAll('.body--plots .plot-full p, .body--plots .plots .plots-item p')\n .map((movie) => movie.textContent?.trim().replace(/(\\r\\n|\\n|\\r|\\t)/gm, ''));\n};\n\nconst parseMoviePeople = (el: HTMLElement): CSFDMovieCreator[] => {\n const people = el.querySelectorAll('a');\n return (\n people\n // Filter out \"more\" links\n .filter((x) => x.classNames.length === 0)\n .map((person) => {\n return {\n id: parseIdFromUrl(person.attributes.href),\n name: person.innerText.trim(),\n url: `https://www.csfd.cz${person.attributes.href}`\n };\n })\n );\n};\n\nexport const getMovieGroup = (el: HTMLElement, group: CSFDCreatorGroups): CSFDMovieCreator[] => {\n const creators = el.querySelectorAll('.creators h4');\n const element = creators.filter((elem) => elem.textContent.trim().includes(group))[0];\n if (element?.parentNode) {\n return parseMoviePeople(element.parentNode as HTMLElement);\n } else {\n return [];\n }\n};\n\nexport const getMovieType = (el: HTMLElement): string => {\n const type = el.querySelector('.film-header-name .type');\n return type?.innerText?.replace(/[{()}]/g, '') || 'film';\n};\n\nexport const getMovieVods = (el: HTMLElement | null): CSFDVod[] => {\n let vods: CSFDVod[] = [];\n if (el) {\n const buttons = el.querySelectorAll('.box-buttons .button');\n const buttonsVod = buttons.filter((x) => !x.classNames.includes('button-social'));\n vods = buttonsVod.map((btn) => {\n return {\n title: btn.textContent.trim() as CSFDVodService,\n url: btn.attributes.href\n };\n });\n }\n return vods.length ? vods : [];\n};\n\n// Get box content\nconst getBoxContent = (el: HTMLElement, box: string): HTMLElement => {\n const headers = el.querySelectorAll('section.box .box-header');\n return headers.find((header) => header.querySelector('h3').textContent.trim().includes(box))\n ?.parentNode;\n};\n\nexport const getMovieBoxMovies = (el: HTMLElement, boxName: CSFDBoxContent): CSFDMovieListItem[] => {\n const movieListItem: CSFDMovieListItem[] = [];\n const box = getBoxContent(el, boxName);\n const movieTitleNodes = box?.querySelectorAll('.article-header .film-title-name');\n if (movieTitleNodes?.length) {\n for (const item of movieTitleNodes) {\n movieListItem.push({\n id: parseIdFromUrl(item.attributes.href),\n title: item.textContent.trim(),\n url: `https://www.csfd.cz${item.attributes.href}`\n });\n }\n }\n return movieListItem;\n};\n\nexport const getMoviePremieres = (el: HTMLElement): CSFDPremiere[] => {\n const premiereNodes = el.querySelectorAll('.box-premieres li');\n const premiere: CSFDPremiere[] = [];\n for (const premiereNode of premiereNodes) {\n const title = premiereNode.querySelector('p + span').attributes.title;\n\n if (title) {\n const [date, ...company] = title?.split(' ');\n\n premiere.push({\n country: premiereNode.querySelector('.flag')?.attributes.title || null,\n format: premiereNode.querySelector('p').textContent.trim()?.split(' od')[0],\n date,\n company: company.join(' ')\n });\n }\n }\n return premiere;\n};\n\nexport const getMovieTags = (el: HTMLElement): string[] => {\n const tagsRaw = el.querySelectorAll('.box-content a[href*=\"/tag/\"]');\n return tagsRaw.map((tag) => tag.textContent);\n};\n"],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ const require_rolldown_runtime = require('../_virtual/rolldown_runtime.js');
2
+ const require_global_helper = require('./global.helper.js');
3
+ let node_html_parser = require("node-html-parser");
4
+ node_html_parser = require_rolldown_runtime.__toESM(node_html_parser);
5
+
6
+ //#region src/helpers/search-user.helper.ts
7
+ const getUser = (el) => {
8
+ return el.querySelector(".user-title-name").text;
9
+ };
10
+ const getUserRealName = (el) => {
11
+ const p = el.querySelector(".article-content p");
12
+ if (!p) return null;
13
+ const textNodes = p.childNodes.filter((n) => n.nodeType === node_html_parser.NodeType.TEXT_NODE && n.rawText.trim() !== "");
14
+ return textNodes.length ? textNodes[0].rawText.trim() : null;
15
+ };
16
+ const getAvatar = (el) => {
17
+ const image = el.querySelector(".article-img img").attributes.src;
18
+ return require_global_helper.addProtocol(image);
19
+ };
20
+ const getUserUrl = (el) => {
21
+ return el.querySelector(".user-title-name").attributes.href;
22
+ };
23
+
24
+ //#endregion
25
+ exports.getAvatar = getAvatar;
26
+ exports.getUser = getUser;
27
+ exports.getUserRealName = getUserRealName;
28
+ exports.getUserUrl = getUserUrl;
29
+ //# sourceMappingURL=search-user.helper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-user.helper.js","names":["NodeType","addProtocol"],"sources":["../../src/helpers/search-user.helper.ts"],"sourcesContent":["import { HTMLElement, NodeType } from 'node-html-parser';\nimport { addProtocol } from './global.helper';\n\nexport const getUser = (el: HTMLElement): string => {\n return el.querySelector('.user-title-name').text;\n};\n\nexport const getUserRealName = (el: HTMLElement): string => {\n const p = el.querySelector('.article-content p');\n if (!p) return null;\n\n const textNodes = p.childNodes.filter(n => n.nodeType === NodeType.TEXT_NODE && n.rawText.trim() !== '');\n const name = textNodes.length ? textNodes[0].rawText.trim() : null;\n\n return name;\n};\n\nexport const getAvatar = (el: HTMLElement): string => {\n const image = el.querySelector('.article-img img').attributes.src;\n return addProtocol(image);\n};\n\nexport const getUserUrl = (el: HTMLElement): string => {\n return el.querySelector('.user-title-name').attributes.href;\n};\n"],"mappings":";;;;;;AAGA,MAAa,WAAW,OAA4B;AAClD,QAAO,GAAG,cAAc,mBAAmB,CAAC;;AAG9C,MAAa,mBAAmB,OAA4B;CAC1D,MAAM,IAAI,GAAG,cAAc,qBAAqB;AAChD,KAAI,CAAC,EAAG,QAAO;CAEf,MAAM,YAAY,EAAE,WAAW,QAAO,MAAK,EAAE,aAAaA,0BAAS,aAAa,EAAE,QAAQ,MAAM,KAAK,GAAG;AAGxG,QAFa,UAAU,SAAS,UAAU,GAAG,QAAQ,MAAM,GAAG;;AAKhE,MAAa,aAAa,OAA4B;CACpD,MAAM,QAAQ,GAAG,cAAc,mBAAmB,CAAC,WAAW;AAC9D,QAAOC,kCAAY,MAAM;;AAG3B,MAAa,cAAc,OAA4B;AACrD,QAAO,GAAG,cAAc,mBAAmB,CAAC,WAAW"}
@@ -0,0 +1,24 @@
1
+ import { addProtocol } from "./global.helper.mjs";
2
+ import { NodeType } from "node-html-parser";
3
+
4
+ //#region src/helpers/search-user.helper.ts
5
+ const getUser = (el) => {
6
+ return el.querySelector(".user-title-name").text;
7
+ };
8
+ const getUserRealName = (el) => {
9
+ const p = el.querySelector(".article-content p");
10
+ if (!p) return null;
11
+ const textNodes = p.childNodes.filter((n) => n.nodeType === NodeType.TEXT_NODE && n.rawText.trim() !== "");
12
+ return textNodes.length ? textNodes[0].rawText.trim() : null;
13
+ };
14
+ const getAvatar = (el) => {
15
+ const image = el.querySelector(".article-img img").attributes.src;
16
+ return addProtocol(image);
17
+ };
18
+ const getUserUrl = (el) => {
19
+ return el.querySelector(".user-title-name").attributes.href;
20
+ };
21
+
22
+ //#endregion
23
+ export { getAvatar, getUser, getUserRealName, getUserUrl };
24
+ //# sourceMappingURL=search-user.helper.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-user.helper.mjs","names":[],"sources":["../../src/helpers/search-user.helper.ts"],"sourcesContent":["import { HTMLElement, NodeType } from 'node-html-parser';\nimport { addProtocol } from './global.helper';\n\nexport const getUser = (el: HTMLElement): string => {\n return el.querySelector('.user-title-name').text;\n};\n\nexport const getUserRealName = (el: HTMLElement): string => {\n const p = el.querySelector('.article-content p');\n if (!p) return null;\n\n const textNodes = p.childNodes.filter(n => n.nodeType === NodeType.TEXT_NODE && n.rawText.trim() !== '');\n const name = textNodes.length ? textNodes[0].rawText.trim() : null;\n\n return name;\n};\n\nexport const getAvatar = (el: HTMLElement): string => {\n const image = el.querySelector('.article-img img').attributes.src;\n return addProtocol(image);\n};\n\nexport const getUserUrl = (el: HTMLElement): string => {\n return el.querySelector('.user-title-name').attributes.href;\n};\n"],"mappings":";;;;AAGA,MAAa,WAAW,OAA4B;AAClD,QAAO,GAAG,cAAc,mBAAmB,CAAC;;AAG9C,MAAa,mBAAmB,OAA4B;CAC1D,MAAM,IAAI,GAAG,cAAc,qBAAqB;AAChD,KAAI,CAAC,EAAG,QAAO;CAEf,MAAM,YAAY,EAAE,WAAW,QAAO,MAAK,EAAE,aAAa,SAAS,aAAa,EAAE,QAAQ,MAAM,KAAK,GAAG;AAGxG,QAFa,UAAU,SAAS,UAAU,GAAG,QAAQ,MAAM,GAAG;;AAKhE,MAAa,aAAa,OAA4B;CACpD,MAAM,QAAQ,GAAG,cAAc,mBAAmB,CAAC,WAAW;AAC9D,QAAO,YAAY,MAAM;;AAG3B,MAAa,cAAc,OAA4B;AACrD,QAAO,GAAG,cAAc,mBAAmB,CAAC,WAAW"}
@@ -0,0 +1,52 @@
1
+ const require_global_helper = require('./global.helper.js');
2
+
3
+ //#region src/helpers/search.helper.ts
4
+ const getSearchType = (el) => {
5
+ return el.querySelectorAll(".film-title-info .info")[1]?.innerText?.replace(/[{()}]/g, "")?.trim() || "film";
6
+ };
7
+ const getSearchTitle = (el) => {
8
+ return el.querySelector(".film-title-name").text;
9
+ };
10
+ const getSearchYear = (el) => {
11
+ return +el.querySelectorAll(".film-title-info .info")[0]?.innerText.replace(/[{()}]/g, "");
12
+ };
13
+ const getSearchUrl = (el) => {
14
+ return el.querySelector(".film-title-name").attributes.href;
15
+ };
16
+ const getSearchColorRating = (el) => {
17
+ return require_global_helper.parseColor(el.querySelector(".article-header i.icon").classNames.split(" ").pop());
18
+ };
19
+ const getSearchPoster = (el) => {
20
+ const image = el.querySelector("img").attributes.src;
21
+ return require_global_helper.addProtocol(image);
22
+ };
23
+ const getSearchOrigins = (el) => {
24
+ const originsRaw = el.querySelector(".article-content p .info")?.text;
25
+ if (!originsRaw) return [];
26
+ return (originsRaw?.split(", ")?.[0])?.split("/").map((country) => country.trim());
27
+ };
28
+ const parseSearchPeople = (el, type) => {
29
+ let who;
30
+ if (type === "directors") who = "Režie:";
31
+ if (type === "actors") who = "Hrají:";
32
+ const peopleNode = Array.from(el && el.querySelectorAll(".article-content p")).find((el$1) => el$1.textContent.includes(who));
33
+ if (peopleNode) return Array.from(peopleNode.querySelectorAll("a")).map((person) => {
34
+ return {
35
+ id: require_global_helper.parseIdFromUrl(person.attributes.href),
36
+ name: person.innerText.trim(),
37
+ url: `https://www.csfd.cz${person.attributes.href}`
38
+ };
39
+ });
40
+ else return [];
41
+ };
42
+
43
+ //#endregion
44
+ exports.getSearchColorRating = getSearchColorRating;
45
+ exports.getSearchOrigins = getSearchOrigins;
46
+ exports.getSearchPoster = getSearchPoster;
47
+ exports.getSearchTitle = getSearchTitle;
48
+ exports.getSearchType = getSearchType;
49
+ exports.getSearchUrl = getSearchUrl;
50
+ exports.getSearchYear = getSearchYear;
51
+ exports.parseSearchPeople = parseSearchPeople;
52
+ //# sourceMappingURL=search.helper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.helper.js","names":["parseColor","addProtocol","who: Creator","el","parseIdFromUrl"],"sources":["../../src/helpers/search.helper.ts"],"sourcesContent":["import { HTMLElement } from 'node-html-parser';\nimport { CSFDColorRating, CSFDFilmTypes } from '../dto/global';\nimport { CSFDMovieCreator } from '../dto/movie';\nimport { Colors } from '../dto/user-ratings';\nimport { addProtocol, parseColor, parseIdFromUrl } from './global.helper';\n\ntype Creator = 'Režie:' | 'Hrají:';\n\nexport const getSearchType = (el: HTMLElement): CSFDFilmTypes => {\n const type = el.querySelectorAll('.film-title-info .info')[1];\n return (type?.innerText?.replace(/[{()}]/g, '')?.trim() || 'film') as CSFDFilmTypes;\n};\n\nexport const getSearchTitle = (el: HTMLElement): string => {\n return el.querySelector('.film-title-name').text;\n};\n\nexport const getSearchYear = (el: HTMLElement): number => {\n return +el.querySelectorAll('.film-title-info .info')[0]?.innerText.replace(/[{()}]/g, '');\n};\n\nexport const getSearchUrl = (el: HTMLElement): string => {\n return el.querySelector('.film-title-name').attributes.href;\n};\n\nexport const getSearchColorRating = (el: HTMLElement): CSFDColorRating => {\n return parseColor(\n el.querySelector('.article-header i.icon').classNames.split(' ').pop() as Colors\n );\n};\n\nexport const getSearchPoster = (el: HTMLElement): string => {\n const image = el.querySelector('img').attributes.src;\n return addProtocol(image);\n};\n\nexport const getSearchOrigins = (el: HTMLElement): string[] => {\n const originsRaw = el.querySelector('.article-content p .info')?.text;\n if (!originsRaw) return [];\n const originsAll = originsRaw?.split(', ')?.[0];\n return originsAll?.split('/').map((country) => country.trim());\n};\n\nexport const parseSearchPeople = (el: HTMLElement, type: 'directors' | 'actors'): CSFDMovieCreator[] => {\n let who: Creator;\n if (type === 'directors') who = 'Režie:';\n if (type === 'actors') who = 'Hrají:';\n\n const peopleNode = Array.from(el && el.querySelectorAll('.article-content p')).find((el) =>\n el.textContent.includes(who)\n );\n\n if (peopleNode) {\n const people = Array.from(peopleNode.querySelectorAll('a')) as unknown as HTMLElement[];\n\n return people.map((person) => {\n return {\n id: parseIdFromUrl(person.attributes.href),\n name: person.innerText.trim(),\n url: `https://www.csfd.cz${person.attributes.href}`\n };\n });\n } else {\n return [];\n }\n};\n"],"mappings":";;;AAQA,MAAa,iBAAiB,OAAmC;AAE/D,QADa,GAAG,iBAAiB,yBAAyB,CAAC,IAC7C,WAAW,QAAQ,WAAW,GAAG,EAAE,MAAM,IAAI;;AAG7D,MAAa,kBAAkB,OAA4B;AACzD,QAAO,GAAG,cAAc,mBAAmB,CAAC;;AAG9C,MAAa,iBAAiB,OAA4B;AACxD,QAAO,CAAC,GAAG,iBAAiB,yBAAyB,CAAC,IAAI,UAAU,QAAQ,WAAW,GAAG;;AAG5F,MAAa,gBAAgB,OAA4B;AACvD,QAAO,GAAG,cAAc,mBAAmB,CAAC,WAAW;;AAGzD,MAAa,wBAAwB,OAAqC;AACxE,QAAOA,iCACL,GAAG,cAAc,yBAAyB,CAAC,WAAW,MAAM,IAAI,CAAC,KAAK,CACvE;;AAGH,MAAa,mBAAmB,OAA4B;CAC1D,MAAM,QAAQ,GAAG,cAAc,MAAM,CAAC,WAAW;AACjD,QAAOC,kCAAY,MAAM;;AAG3B,MAAa,oBAAoB,OAA8B;CAC7D,MAAM,aAAa,GAAG,cAAc,2BAA2B,EAAE;AACjE,KAAI,CAAC,WAAY,QAAO,EAAE;AAE1B,SADmB,YAAY,MAAM,KAAK,GAAG,KAC1B,MAAM,IAAI,CAAC,KAAK,YAAY,QAAQ,MAAM,CAAC;;AAGhE,MAAa,qBAAqB,IAAiB,SAAqD;CACtG,IAAIC;AACJ,KAAI,SAAS,YAAa,OAAM;AAChC,KAAI,SAAS,SAAU,OAAM;CAE7B,MAAM,aAAa,MAAM,KAAK,MAAM,GAAG,iBAAiB,qBAAqB,CAAC,CAAC,MAAM,SACnFC,KAAG,YAAY,SAAS,IAAI,CAC7B;AAED,KAAI,WAGF,QAFe,MAAM,KAAK,WAAW,iBAAiB,IAAI,CAAC,CAE7C,KAAK,WAAW;AAC5B,SAAO;GACL,IAAIC,qCAAe,OAAO,WAAW,KAAK;GAC1C,MAAM,OAAO,UAAU,MAAM;GAC7B,KAAK,sBAAsB,OAAO,WAAW;GAC9C;GACD;KAEF,QAAO,EAAE"}
@@ -0,0 +1,45 @@
1
+ import { addProtocol, parseColor, parseIdFromUrl } from "./global.helper.mjs";
2
+
3
+ //#region src/helpers/search.helper.ts
4
+ const getSearchType = (el) => {
5
+ return el.querySelectorAll(".film-title-info .info")[1]?.innerText?.replace(/[{()}]/g, "")?.trim() || "film";
6
+ };
7
+ const getSearchTitle = (el) => {
8
+ return el.querySelector(".film-title-name").text;
9
+ };
10
+ const getSearchYear = (el) => {
11
+ return +el.querySelectorAll(".film-title-info .info")[0]?.innerText.replace(/[{()}]/g, "");
12
+ };
13
+ const getSearchUrl = (el) => {
14
+ return el.querySelector(".film-title-name").attributes.href;
15
+ };
16
+ const getSearchColorRating = (el) => {
17
+ return parseColor(el.querySelector(".article-header i.icon").classNames.split(" ").pop());
18
+ };
19
+ const getSearchPoster = (el) => {
20
+ const image = el.querySelector("img").attributes.src;
21
+ return addProtocol(image);
22
+ };
23
+ const getSearchOrigins = (el) => {
24
+ const originsRaw = el.querySelector(".article-content p .info")?.text;
25
+ if (!originsRaw) return [];
26
+ return (originsRaw?.split(", ")?.[0])?.split("/").map((country) => country.trim());
27
+ };
28
+ const parseSearchPeople = (el, type) => {
29
+ let who;
30
+ if (type === "directors") who = "Režie:";
31
+ if (type === "actors") who = "Hrají:";
32
+ const peopleNode = Array.from(el && el.querySelectorAll(".article-content p")).find((el$1) => el$1.textContent.includes(who));
33
+ if (peopleNode) return Array.from(peopleNode.querySelectorAll("a")).map((person) => {
34
+ return {
35
+ id: parseIdFromUrl(person.attributes.href),
36
+ name: person.innerText.trim(),
37
+ url: `https://www.csfd.cz${person.attributes.href}`
38
+ };
39
+ });
40
+ else return [];
41
+ };
42
+
43
+ //#endregion
44
+ export { getSearchColorRating, getSearchOrigins, getSearchPoster, getSearchTitle, getSearchType, getSearchUrl, getSearchYear, parseSearchPeople };
45
+ //# sourceMappingURL=search.helper.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.helper.mjs","names":["who: Creator","el"],"sources":["../../src/helpers/search.helper.ts"],"sourcesContent":["import { HTMLElement } from 'node-html-parser';\nimport { CSFDColorRating, CSFDFilmTypes } from '../dto/global';\nimport { CSFDMovieCreator } from '../dto/movie';\nimport { Colors } from '../dto/user-ratings';\nimport { addProtocol, parseColor, parseIdFromUrl } from './global.helper';\n\ntype Creator = 'Režie:' | 'Hrají:';\n\nexport const getSearchType = (el: HTMLElement): CSFDFilmTypes => {\n const type = el.querySelectorAll('.film-title-info .info')[1];\n return (type?.innerText?.replace(/[{()}]/g, '')?.trim() || 'film') as CSFDFilmTypes;\n};\n\nexport const getSearchTitle = (el: HTMLElement): string => {\n return el.querySelector('.film-title-name').text;\n};\n\nexport const getSearchYear = (el: HTMLElement): number => {\n return +el.querySelectorAll('.film-title-info .info')[0]?.innerText.replace(/[{()}]/g, '');\n};\n\nexport const getSearchUrl = (el: HTMLElement): string => {\n return el.querySelector('.film-title-name').attributes.href;\n};\n\nexport const getSearchColorRating = (el: HTMLElement): CSFDColorRating => {\n return parseColor(\n el.querySelector('.article-header i.icon').classNames.split(' ').pop() as Colors\n );\n};\n\nexport const getSearchPoster = (el: HTMLElement): string => {\n const image = el.querySelector('img').attributes.src;\n return addProtocol(image);\n};\n\nexport const getSearchOrigins = (el: HTMLElement): string[] => {\n const originsRaw = el.querySelector('.article-content p .info')?.text;\n if (!originsRaw) return [];\n const originsAll = originsRaw?.split(', ')?.[0];\n return originsAll?.split('/').map((country) => country.trim());\n};\n\nexport const parseSearchPeople = (el: HTMLElement, type: 'directors' | 'actors'): CSFDMovieCreator[] => {\n let who: Creator;\n if (type === 'directors') who = 'Režie:';\n if (type === 'actors') who = 'Hrají:';\n\n const peopleNode = Array.from(el && el.querySelectorAll('.article-content p')).find((el) =>\n el.textContent.includes(who)\n );\n\n if (peopleNode) {\n const people = Array.from(peopleNode.querySelectorAll('a')) as unknown as HTMLElement[];\n\n return people.map((person) => {\n return {\n id: parseIdFromUrl(person.attributes.href),\n name: person.innerText.trim(),\n url: `https://www.csfd.cz${person.attributes.href}`\n };\n });\n } else {\n return [];\n }\n};\n"],"mappings":";;;AAQA,MAAa,iBAAiB,OAAmC;AAE/D,QADa,GAAG,iBAAiB,yBAAyB,CAAC,IAC7C,WAAW,QAAQ,WAAW,GAAG,EAAE,MAAM,IAAI;;AAG7D,MAAa,kBAAkB,OAA4B;AACzD,QAAO,GAAG,cAAc,mBAAmB,CAAC;;AAG9C,MAAa,iBAAiB,OAA4B;AACxD,QAAO,CAAC,GAAG,iBAAiB,yBAAyB,CAAC,IAAI,UAAU,QAAQ,WAAW,GAAG;;AAG5F,MAAa,gBAAgB,OAA4B;AACvD,QAAO,GAAG,cAAc,mBAAmB,CAAC,WAAW;;AAGzD,MAAa,wBAAwB,OAAqC;AACxE,QAAO,WACL,GAAG,cAAc,yBAAyB,CAAC,WAAW,MAAM,IAAI,CAAC,KAAK,CACvE;;AAGH,MAAa,mBAAmB,OAA4B;CAC1D,MAAM,QAAQ,GAAG,cAAc,MAAM,CAAC,WAAW;AACjD,QAAO,YAAY,MAAM;;AAG3B,MAAa,oBAAoB,OAA8B;CAC7D,MAAM,aAAa,GAAG,cAAc,2BAA2B,EAAE;AACjE,KAAI,CAAC,WAAY,QAAO,EAAE;AAE1B,SADmB,YAAY,MAAM,KAAK,GAAG,KAC1B,MAAM,IAAI,CAAC,KAAK,YAAY,QAAQ,MAAM,CAAC;;AAGhE,MAAa,qBAAqB,IAAiB,SAAqD;CACtG,IAAIA;AACJ,KAAI,SAAS,YAAa,OAAM;AAChC,KAAI,SAAS,SAAU,OAAM;CAE7B,MAAM,aAAa,MAAM,KAAK,MAAM,GAAG,iBAAiB,qBAAqB,CAAC,CAAC,MAAM,SACnFC,KAAG,YAAY,SAAS,IAAI,CAC7B;AAED,KAAI,WAGF,QAFe,MAAM,KAAK,WAAW,iBAAiB,IAAI,CAAC,CAE7C,KAAK,WAAW;AAC5B,SAAO;GACL,IAAI,eAAe,OAAO,WAAW,KAAK;GAC1C,MAAM,OAAO,UAAU,MAAM;GAC7B,KAAK,sBAAsB,OAAO,WAAW;GAC9C;GACD;KAEF,QAAO,EAAE"}
@@ -0,0 +1,52 @@
1
+ const require_global_helper = require('./global.helper.js');
2
+
3
+ //#region src/helpers/user-ratings.helper.ts
4
+ const getUserRatingId = (el) => {
5
+ const url = el.querySelector("td.name .film-title-name").attributes.href;
6
+ return require_global_helper.parseIdFromUrl(url);
7
+ };
8
+ const getUserRating = (el) => {
9
+ const ratingText = el.querySelector("td.star-rating-only .stars").classNames.split(" ").pop();
10
+ return ratingText.includes("stars-") ? +ratingText.split("-").pop() : 0;
11
+ };
12
+ const getUserRatingType = (el) => {
13
+ const typeText = el.querySelectorAll("td.name .film-title-info .info");
14
+ return typeText.length > 1 ? typeText[1].text.slice(1, -1) : "film";
15
+ };
16
+ const getUserRatingTitle = (el) => {
17
+ return el.querySelector("td.name .film-title-name").text;
18
+ };
19
+ const getUserRatingYear = (el) => {
20
+ return +el.querySelectorAll("td.name .film-title-info .info")[0]?.text.slice(1, -1) || null;
21
+ };
22
+ const getUserRatingColorRating = (el) => {
23
+ return parseColor(el.querySelector("td.name .icon").classNames.split(" ").pop());
24
+ };
25
+ const getUserRatingDate = (el) => {
26
+ return el.querySelector("td.date-only").text.trim();
27
+ };
28
+ const getUserRatingUrl = (el) => {
29
+ return `https://www.csfd.cz${el.querySelector("td.name .film-title-name").attributes.href}`;
30
+ };
31
+ const parseColor = (quality) => {
32
+ switch (quality) {
33
+ case "lightgrey": return "unknown";
34
+ case "red": return "good";
35
+ case "blue": return "average";
36
+ case "grey": return "bad";
37
+ default: return "unknown";
38
+ }
39
+ };
40
+ const sleep = (ms) => new Promise((res) => setTimeout(res, ms));
41
+
42
+ //#endregion
43
+ exports.getUserRating = getUserRating;
44
+ exports.getUserRatingColorRating = getUserRatingColorRating;
45
+ exports.getUserRatingDate = getUserRatingDate;
46
+ exports.getUserRatingId = getUserRatingId;
47
+ exports.getUserRatingTitle = getUserRatingTitle;
48
+ exports.getUserRatingType = getUserRatingType;
49
+ exports.getUserRatingUrl = getUserRatingUrl;
50
+ exports.getUserRatingYear = getUserRatingYear;
51
+ exports.sleep = sleep;
52
+ //# sourceMappingURL=user-ratings.helper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user-ratings.helper.js","names":["parseIdFromUrl"],"sources":["../../src/helpers/user-ratings.helper.ts"],"sourcesContent":["import { HTMLElement } from 'node-html-parser';\nimport { CSFDColorRating, CSFDFilmTypes, CSFDStars } from '../dto/global';\nimport { Colors } from '../dto/user-ratings';\nimport { parseIdFromUrl } from './global.helper';\n\nexport const getUserRatingId = (el: HTMLElement): number => {\n const url = el.querySelector('td.name .film-title-name').attributes.href;\n return parseIdFromUrl(url);\n};\n\nexport const getUserRating = (el: HTMLElement): CSFDStars => {\n const ratingText = el.querySelector('td.star-rating-only .stars').classNames.split(' ').pop();\n\n const rating = ratingText.includes('stars-') ? +ratingText.split('-').pop() : 0;\n return rating as CSFDStars;\n};\n\nexport const getUserRatingType = (el: HTMLElement): CSFDFilmTypes => {\n const typeText = el.querySelectorAll('td.name .film-title-info .info');\n\n return (typeText.length > 1 ? typeText[1].text.slice(1, -1) : 'film') as CSFDFilmTypes;\n};\n\nexport const getUserRatingTitle = (el: HTMLElement): string => {\n return el.querySelector('td.name .film-title-name').text;\n};\n\nexport const getUserRatingYear = (el: HTMLElement): number => {\n return +el.querySelectorAll('td.name .film-title-info .info')[0]?.text.slice(1, -1) || null;\n};\n\nexport const getUserRatingColorRating = (el: HTMLElement): CSFDColorRating => {\n const color = parseColor(el.querySelector('td.name .icon').classNames.split(' ').pop() as Colors);\n return color;\n};\n\nexport const getUserRatingDate = (el: HTMLElement): string => {\n return el.querySelector('td.date-only').text.trim();\n};\n\nexport const getUserRatingUrl = (el: HTMLElement): string => {\n const url = el.querySelector('td.name .film-title-name').attributes.href;\n return `https://www.csfd.cz${url}`;\n};\n\nconst 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\n// Sleep in loop\nexport const sleep = (ms: number) => new Promise((res) => setTimeout(res, ms));\n"],"mappings":";;;AAKA,MAAa,mBAAmB,OAA4B;CAC1D,MAAM,MAAM,GAAG,cAAc,2BAA2B,CAAC,WAAW;AACpE,QAAOA,qCAAe,IAAI;;AAG5B,MAAa,iBAAiB,OAA+B;CAC3D,MAAM,aAAa,GAAG,cAAc,6BAA6B,CAAC,WAAW,MAAM,IAAI,CAAC,KAAK;AAG7F,QADe,WAAW,SAAS,SAAS,GAAG,CAAC,WAAW,MAAM,IAAI,CAAC,KAAK,GAAG;;AAIhF,MAAa,qBAAqB,OAAmC;CACnE,MAAM,WAAW,GAAG,iBAAiB,iCAAiC;AAEtE,QAAQ,SAAS,SAAS,IAAI,SAAS,GAAG,KAAK,MAAM,GAAG,GAAG,GAAG;;AAGhE,MAAa,sBAAsB,OAA4B;AAC7D,QAAO,GAAG,cAAc,2BAA2B,CAAC;;AAGtD,MAAa,qBAAqB,OAA4B;AAC5D,QAAO,CAAC,GAAG,iBAAiB,iCAAiC,CAAC,IAAI,KAAK,MAAM,GAAG,GAAG,IAAI;;AAGzF,MAAa,4BAA4B,OAAqC;AAE5E,QADc,WAAW,GAAG,cAAc,gBAAgB,CAAC,WAAW,MAAM,IAAI,CAAC,KAAK,CAAW;;AAInG,MAAa,qBAAqB,OAA4B;AAC5D,QAAO,GAAG,cAAc,eAAe,CAAC,KAAK,MAAM;;AAGrD,MAAa,oBAAoB,OAA4B;AAE3D,QAAO,sBADK,GAAG,cAAc,2BAA2B,CAAC,WAAW;;AAItE,MAAM,cAAc,YAAqC;AACvD,SAAQ,SAAR;EACE,KAAK,YACH,QAAO;EACT,KAAK,MACH,QAAO;EACT,KAAK,OACH,QAAO;EACT,KAAK,OACH,QAAO;EACT,QACE,QAAO;;;AAKb,MAAa,SAAS,OAAe,IAAI,SAAS,QAAQ,WAAW,KAAK,GAAG,CAAC"}