node-csfd-api 5.4.0 → 5.5.0-next.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/{export-ratings.mjs → export-ratings.js} +1 -1
- package/bin/{mcp-server.mjs → mcp-server.js} +2 -2
- package/bin/{server.mjs → server.js} +2 -2
- package/{cli.mjs → cli.js} +3 -3
- package/dto/{cinema.d.mts → cinema.d.cts} +2 -2
- package/dto/{creator.d.mts → creator.d.cts} +2 -2
- package/dto/{global.d.mts → global.d.cts} +1 -1
- package/dto/{movie.d.mts → movie.d.cts} +2 -2
- package/dto/{options.d.mts → options.d.cts} +1 -1
- package/dto/{search.d.mts → search.d.cts} +3 -3
- package/dto/{user-ratings.d.mts → user-ratings.d.cts} +2 -2
- package/dto/{user-reviews.d.mts → user-reviews.d.cts} +2 -2
- package/fetchers/{fetch.polyfill.mjs → fetch.polyfill.cjs} +3 -4
- package/fetchers/fetch.polyfill.cjs.map +1 -0
- package/fetchers/fetch.polyfill.js +2 -3
- package/fetchers/fetch.polyfill.js.map +1 -1
- package/fetchers/{index.mjs → index.cjs} +4 -4
- package/fetchers/index.cjs.map +1 -0
- package/fetchers/index.js +3 -3
- package/fetchers/index.js.map +1 -1
- package/helpers/{cinema.helper.mjs → cinema.helper.cjs} +9 -5
- package/helpers/cinema.helper.cjs.map +1 -0
- package/helpers/cinema.helper.js +4 -8
- package/helpers/cinema.helper.js.map +1 -1
- package/helpers/{creator.helper.mjs → creator.helper.cjs} +11 -7
- package/helpers/creator.helper.cjs.map +1 -0
- package/helpers/creator.helper.js +6 -10
- package/helpers/creator.helper.js.map +1 -1
- package/helpers/{global.helper.mjs → global.helper.cjs} +10 -2
- package/helpers/{global.helper.mjs.map → global.helper.cjs.map} +1 -1
- package/helpers/global.helper.js +1 -9
- package/helpers/{movie.helper.mjs → movie.helper.cjs} +36 -13
- package/helpers/movie.helper.cjs.map +1 -0
- package/helpers/movie.helper.js +12 -35
- package/helpers/movie.helper.js.map +1 -1
- package/helpers/{search-creator.helper.mjs → search-creator.helper.cjs} +6 -4
- package/helpers/search-creator.helper.cjs.map +1 -0
- package/helpers/search-creator.helper.js +3 -5
- package/helpers/search-creator.helper.js.map +1 -1
- package/helpers/{search-user.helper.mjs → search-user.helper.cjs} +9 -6
- package/helpers/search-user.helper.cjs.map +1 -0
- package/helpers/search-user.helper.js +5 -8
- package/helpers/search-user.helper.js.map +1 -1
- package/helpers/{search.helper.mjs → search.helper.cjs} +14 -7
- package/helpers/search.helper.cjs.map +1 -0
- package/helpers/search.helper.js +6 -13
- package/helpers/search.helper.js.map +1 -1
- package/helpers/{user-ratings.helper.mjs → user-ratings.helper.cjs} +14 -7
- package/helpers/user-ratings.helper.cjs.map +1 -0
- package/helpers/user-ratings.helper.js +6 -13
- package/helpers/user-ratings.helper.js.map +1 -1
- package/helpers/{user-reviews.helper.mjs → user-reviews.helper.cjs} +16 -7
- package/helpers/user-reviews.helper.cjs.map +1 -0
- package/helpers/user-reviews.helper.js +6 -15
- package/helpers/user-reviews.helper.js.map +1 -1
- package/{index.mjs → index.cjs} +16 -13
- package/index.cjs.map +1 -0
- package/{index.d.mts → index.d.cts} +15 -15
- package/index.js +13 -14
- package/index.js.map +1 -1
- package/{package.mjs → package.js} +1 -1
- package/package.json +13 -7
- package/services/cinema.service.cjs +31 -0
- package/services/cinema.service.cjs.map +1 -0
- package/services/{cinema.service.d.mts → cinema.service.d.cts} +3 -3
- package/services/cinema.service.js +11 -11
- package/services/cinema.service.js.map +1 -1
- package/services/creator.service.cjs +32 -0
- package/services/creator.service.cjs.map +1 -0
- package/services/{creator.service.d.mts → creator.service.d.cts} +3 -3
- package/services/creator.service.js +11 -11
- package/services/creator.service.js.map +1 -1
- package/services/movie.service.cjs +61 -0
- package/services/movie.service.cjs.map +1 -0
- package/services/{movie.service.d.mts → movie.service.d.cts} +3 -3
- package/services/movie.service.js +33 -33
- package/services/movie.service.js.map +1 -1
- package/services/search.service.cjs +75 -0
- package/services/search.service.cjs.map +1 -0
- package/services/{search.service.d.mts → search.service.d.cts} +3 -3
- package/services/search.service.js +29 -29
- package/services/search.service.js.map +1 -1
- package/services/{user-ratings.service.mjs → user-ratings.service.cjs} +19 -19
- package/services/user-ratings.service.cjs.map +1 -0
- package/services/{user-ratings.service.d.mts → user-ratings.service.d.cts} +3 -3
- package/services/user-ratings.service.js +18 -18
- package/services/user-ratings.service.js.map +1 -1
- package/services/{user-reviews.service.mjs → user-reviews.service.cjs} +21 -21
- package/services/user-reviews.service.cjs.map +1 -0
- package/services/{user-reviews.service.d.mts → user-reviews.service.d.cts} +3 -3
- package/services/user-reviews.service.js +20 -20
- package/services/user-reviews.service.js.map +1 -1
- package/src/fetchers/{fetch.polyfill.mjs → fetch.polyfill.js} +1 -3
- package/src/fetchers/{index.mjs → index.js} +1 -1
- package/src/helpers/{cinema.helper.mjs → cinema.helper.js} +1 -1
- package/src/helpers/{creator.helper.mjs → creator.helper.js} +1 -1
- package/src/helpers/{movie.helper.mjs → movie.helper.js} +1 -1
- package/src/helpers/{search-creator.helper.mjs → search-creator.helper.js} +1 -1
- package/src/helpers/{search-user.helper.mjs → search-user.helper.js} +1 -1
- package/src/helpers/{search.helper.mjs → search.helper.js} +1 -1
- package/src/helpers/{user-ratings.helper.mjs → user-ratings.helper.js} +1 -1
- package/src/helpers/{user-reviews.helper.mjs → user-reviews.helper.js} +1 -1
- package/src/{index.mjs → index.js} +7 -6
- package/src/services/{cinema.service.mjs → cinema.service.js} +3 -3
- package/src/services/{creator.service.mjs → creator.service.js} +3 -3
- package/src/services/{movie.service.mjs → movie.service.js} +3 -3
- package/src/services/{search.service.mjs → search.service.js} +6 -6
- package/src/services/{user-ratings.service.mjs → user-ratings.service.js} +4 -4
- package/src/services/{user-reviews.service.mjs → user-reviews.service.js} +4 -4
- package/{vars.mjs → vars.cjs} +8 -2
- package/{vars.mjs.map → vars.cjs.map} +1 -1
- package/vars.js +1 -7
- package/fetchers/fetch.polyfill.mjs.map +0 -1
- package/fetchers/index.mjs.map +0 -1
- package/helpers/cinema.helper.mjs.map +0 -1
- package/helpers/creator.helper.mjs.map +0 -1
- package/helpers/movie.helper.mjs.map +0 -1
- package/helpers/search-creator.helper.mjs.map +0 -1
- package/helpers/search-user.helper.mjs.map +0 -1
- package/helpers/search.helper.mjs.map +0 -1
- package/helpers/user-ratings.helper.mjs.map +0 -1
- package/helpers/user-reviews.helper.mjs.map +0 -1
- package/index.mjs.map +0 -1
- package/services/cinema.service.mjs +0 -31
- package/services/cinema.service.mjs.map +0 -1
- package/services/creator.service.mjs +0 -32
- package/services/creator.service.mjs.map +0 -1
- package/services/movie.service.mjs +0 -61
- package/services/movie.service.mjs.map +0 -1
- package/services/search.service.mjs +0 -75
- package/services/search.service.mjs.map +0 -1
- package/services/user-ratings.service.mjs.map +0 -1
- package/services/user-reviews.service.mjs.map +0 -1
- /package/src/helpers/{global.helper.mjs → global.helper.js} +0 -0
- /package/src/{vars.mjs → vars.js} +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { csfd } from "../src/index.
|
|
3
|
-
import { name, version } from "../package.
|
|
2
|
+
import { csfd } from "../src/index.js";
|
|
3
|
+
import { name, version } from "../package.js";
|
|
4
4
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
5
5
|
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
6
6
|
import { z } from "zod";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { csfd } from "../src/index.
|
|
3
|
-
import { homepage, name, version } from "../package.
|
|
2
|
+
import { csfd } from "../src/index.js";
|
|
3
|
+
import { homepage, name, version } from "../package.js";
|
|
4
4
|
import "dotenv/config";
|
|
5
5
|
import express from "express";
|
|
6
6
|
|
package/{cli.mjs → cli.js}
RENAMED
|
@@ -9,7 +9,7 @@ async function main() {
|
|
|
9
9
|
case "server":
|
|
10
10
|
case "api":
|
|
11
11
|
try {
|
|
12
|
-
await import("./bin/server.
|
|
12
|
+
await import("./bin/server.js");
|
|
13
13
|
} catch (error) {
|
|
14
14
|
console.error("Failed to start server:", error);
|
|
15
15
|
process.exit(1);
|
|
@@ -17,7 +17,7 @@ async function main() {
|
|
|
17
17
|
break;
|
|
18
18
|
case "mcp":
|
|
19
19
|
try {
|
|
20
|
-
await import("./bin/mcp-server.
|
|
20
|
+
await import("./bin/mcp-server.js");
|
|
21
21
|
} catch (error) {
|
|
22
22
|
console.error("Failed to start MCP server:", error);
|
|
23
23
|
process.exit(1);
|
|
@@ -40,7 +40,7 @@ async function main() {
|
|
|
40
40
|
else if (isJson) format = "json";
|
|
41
41
|
else if (isCsv) format = "csv";
|
|
42
42
|
try {
|
|
43
|
-
const { runRatingsExport } = await import("./bin/export-ratings.
|
|
43
|
+
const { runRatingsExport } = await import("./bin/export-ratings.js");
|
|
44
44
|
await runRatingsExport(userId, {
|
|
45
45
|
format,
|
|
46
46
|
userRatingsOptions: {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { CSFDMovieListItem } from "./movie.
|
|
1
|
+
import { CSFDMovieListItem } from "./movie.cjs";
|
|
2
2
|
|
|
3
3
|
//#region src/dto/cinema.d.ts
|
|
4
4
|
interface CSFDCinema {
|
|
@@ -25,4 +25,4 @@ type CSFDCinemaMeta = 'dubbing' | '3D' | 'subtitles' | string;
|
|
|
25
25
|
type CSFDCinemaPeriod = 'today' | 'weekend' | 'week' | 'tomorrow' | 'month';
|
|
26
26
|
//#endregion
|
|
27
27
|
export { CSFDCinema, CSFDCinemaGroupedFilmsByDate, CSFDCinemaMeta, CSFDCinemaMovie, CSFDCinemaPeriod };
|
|
28
|
-
//# sourceMappingURL=cinema.d.
|
|
28
|
+
//# sourceMappingURL=cinema.d.cts.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { CSFDScreening } from "./global.
|
|
1
|
+
import { CSFDScreening } from "./global.cjs";
|
|
2
2
|
|
|
3
3
|
//#region src/dto/creator.d.ts
|
|
4
4
|
interface CSFDCreator {
|
|
@@ -14,4 +14,4 @@ interface CSFDCreator {
|
|
|
14
14
|
type CSFDCreatorScreening = Omit<CSFDScreening, 'url' | 'type'>;
|
|
15
15
|
//#endregion
|
|
16
16
|
export { CSFDCreator, CSFDCreatorScreening };
|
|
17
|
-
//# sourceMappingURL=creator.d.
|
|
17
|
+
//# sourceMappingURL=creator.d.cts.map
|
|
@@ -23,4 +23,4 @@ type CSFDStars = 0 | 1 | 2 | 3 | 4 | 5;
|
|
|
23
23
|
type CSFDFilmTypes = 'film' | 'tv-film' | 'tv-show' | 'series' | 'theatrical' | 'concert' | 'season' | 'student-film' | 'amateur-film' | 'music-video' | 'episode' | 'video-compilation';
|
|
24
24
|
//#endregion
|
|
25
25
|
export { CSFDColorRating, CSFDFilmTypes, CSFDScreening, CSFDStars };
|
|
26
|
-
//# sourceMappingURL=global.d.
|
|
26
|
+
//# sourceMappingURL=global.d.cts.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { CSFDScreening } from "./global.
|
|
1
|
+
import { CSFDScreening } from "./global.cjs";
|
|
2
2
|
|
|
3
3
|
//#region src/dto/movie.d.ts
|
|
4
4
|
interface CSFDMovie extends CSFDScreening {
|
|
@@ -96,4 +96,4 @@ interface CSFDSeriesChild {
|
|
|
96
96
|
}
|
|
97
97
|
//#endregion
|
|
98
98
|
export { CSFDBoxContent, CSFDCreatorGroups, CSFDCreatorGroupsEnglish, CSFDCreatorGroupsSlovak, CSFDCreators, CSFDGenres, CSFDMovie, CSFDMovieCreator, CSFDMovieListItem, CSFDParent, CSFDPremiere, CSFDSeriesChild, CSFDTitlesOther, CSFDVod, CSFDVodService, MovieJsonLd };
|
|
99
|
-
//# sourceMappingURL=movie.d.
|
|
99
|
+
//# sourceMappingURL=movie.d.cts.map
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { CSFDScreening } from "./global.
|
|
2
|
-
import { CSFDMovieCreator } from "./movie.
|
|
1
|
+
import { CSFDScreening } from "./global.cjs";
|
|
2
|
+
import { CSFDMovieCreator } from "./movie.cjs";
|
|
3
3
|
|
|
4
4
|
//#region src/dto/search.d.ts
|
|
5
5
|
interface CSFDSearch {
|
|
@@ -29,4 +29,4 @@ interface CSFDSearchCreators {
|
|
|
29
29
|
}
|
|
30
30
|
//#endregion
|
|
31
31
|
export { CSFDSearch, CSFDSearchCreator, CSFDSearchCreators, CSFDSearchMovie, CSFDSearchUser };
|
|
32
|
-
//# sourceMappingURL=search.d.
|
|
32
|
+
//# sourceMappingURL=search.d.cts.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { CSFDFilmTypes, CSFDScreening, CSFDStars } from "./global.
|
|
1
|
+
import { CSFDFilmTypes, CSFDScreening, CSFDStars } from "./global.cjs";
|
|
2
2
|
|
|
3
3
|
//#region src/dto/user-ratings.d.ts
|
|
4
4
|
interface CSFDUserRatings extends CSFDScreening {
|
|
@@ -24,4 +24,4 @@ interface CSFDUserRatingConfig {
|
|
|
24
24
|
type CSFDColors = 'lightgrey' | 'blue' | 'red' | 'grey';
|
|
25
25
|
//#endregion
|
|
26
26
|
export { CSFDColors, CSFDUserRatingConfig, CSFDUserRatings };
|
|
27
|
-
//# sourceMappingURL=user-ratings.d.
|
|
27
|
+
//# sourceMappingURL=user-ratings.d.cts.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { CSFDFilmTypes, CSFDScreening, CSFDStars } from "./global.
|
|
1
|
+
import { CSFDFilmTypes, CSFDScreening, CSFDStars } from "./global.cjs";
|
|
2
2
|
|
|
3
3
|
//#region src/dto/user-reviews.d.ts
|
|
4
4
|
interface CSFDUserReviews extends CSFDScreening {
|
|
@@ -25,4 +25,4 @@ interface CSFDUserReviewsConfig {
|
|
|
25
25
|
}
|
|
26
26
|
//#endregion
|
|
27
27
|
export { CSFDUserReviews, CSFDUserReviewsConfig };
|
|
28
|
-
//# sourceMappingURL=user-reviews.d.
|
|
28
|
+
//# sourceMappingURL=user-reviews.d.cts.map
|
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
import { fetch as fetch$1 } from "cross-fetch";
|
|
2
1
|
//#region src/fetchers/fetch.polyfill.ts
|
|
3
|
-
const fetchSafe = typeof fetch === "function" && fetch || typeof global === "object" && global.fetch || typeof window !== "undefined" && window.fetch
|
|
2
|
+
const fetchSafe = typeof fetch === "function" && fetch || typeof global === "object" && global.fetch || typeof window !== "undefined" && window.fetch;
|
|
4
3
|
//#endregion
|
|
5
|
-
|
|
4
|
+
exports.fetchSafe = fetchSafe;
|
|
6
5
|
|
|
7
|
-
//# sourceMappingURL=fetch.polyfill.
|
|
6
|
+
//# sourceMappingURL=fetch.polyfill.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetch.polyfill.cjs","names":[],"sources":["../../src/fetchers/fetch.polyfill.ts"],"sourcesContent":["// Check if `fetch` is available in global scope (nodejs 18+) or in window (browser).\nexport const fetchSafe =\n (typeof fetch === 'function' && fetch) || // ServiceWorker fetch (Cloud Functions + Chrome extension)\n (typeof global === 'object' && global.fetch) || // Node.js 18+ fetch\n (typeof window !== 'undefined' && window.fetch); // Browser fetch\n"],"mappings":";AACA,MAAa,YACV,OAAO,UAAU,cAAc,SAC/B,OAAO,WAAW,YAAY,OAAO,SACrC,OAAO,WAAW,eAAe,OAAO"}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
let cross_fetch = require("cross-fetch");
|
|
2
1
|
//#region src/fetchers/fetch.polyfill.ts
|
|
3
|
-
const fetchSafe = typeof fetch === "function" && fetch || typeof global === "object" && global.fetch || typeof window !== "undefined" && window.fetch
|
|
2
|
+
const fetchSafe = typeof fetch === "function" && fetch || typeof global === "object" && global.fetch || typeof window !== "undefined" && window.fetch;
|
|
4
3
|
//#endregion
|
|
5
|
-
|
|
4
|
+
export { fetchSafe };
|
|
6
5
|
|
|
7
6
|
//# sourceMappingURL=fetch.polyfill.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetch.polyfill.js","names":[
|
|
1
|
+
{"version":3,"file":"fetch.polyfill.js","names":[],"sources":["../../src/fetchers/fetch.polyfill.ts"],"sourcesContent":["// Check if `fetch` is available in global scope (nodejs 18+) or in window (browser).\nexport const fetchSafe =\n (typeof fetch === 'function' && fetch) || // ServiceWorker fetch (Cloud Functions + Chrome extension)\n (typeof global === 'object' && global.fetch) || // Node.js 18+ fetch\n (typeof window !== 'undefined' && window.fetch); // Browser fetch\n"],"mappings":";AACA,MAAa,YACV,OAAO,UAAU,cAAc,SAC/B,OAAO,WAAW,YAAY,OAAO,SACrC,OAAO,WAAW,eAAe,OAAO"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
const require_fetch_polyfill = require("./fetch.polyfill.cjs");
|
|
2
2
|
//#region src/fetchers/index.ts
|
|
3
3
|
const browserProfiles = [
|
|
4
4
|
{
|
|
@@ -54,7 +54,7 @@ const fetchPage = async (url, optionsRequest) => {
|
|
|
54
54
|
});
|
|
55
55
|
if (optionsRequest?.headers) new Headers(optionsRequest.headers).forEach((value, key) => mergedHeaders.set(key, value));
|
|
56
56
|
const { headers: _, ...restOptions } = optionsRequest || {};
|
|
57
|
-
const response = await fetchSafe(url, {
|
|
57
|
+
const response = await require_fetch_polyfill.fetchSafe(url, {
|
|
58
58
|
credentials: "omit",
|
|
59
59
|
...restOptions,
|
|
60
60
|
headers: mergedHeaders
|
|
@@ -70,6 +70,6 @@ const fetchPage = async (url, optionsRequest) => {
|
|
|
70
70
|
}
|
|
71
71
|
};
|
|
72
72
|
//#endregion
|
|
73
|
-
|
|
73
|
+
exports.fetchPage = fetchPage;
|
|
74
74
|
|
|
75
|
-
//# sourceMappingURL=index.
|
|
75
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs","names":["fetchSafe"],"sources":["../../src/fetchers/index.ts"],"sourcesContent":["import { fetchSafe } from './fetch.polyfill';\n\ninterface BrowserProfile {\n 'User-Agent': string;\n 'Sec-Ch-Ua': string;\n 'Sec-Ch-Ua-Platform': string;\n}\n\nconst browserProfiles: BrowserProfile[] = [\n // Chrome 131 / Windows\n {\n 'User-Agent':\n 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36',\n 'Sec-Ch-Ua': '\"Google Chrome\";v=\"131\", \"Chromium\";v=\"131\", \"Not_A Brand\";v=\"24\"',\n 'Sec-Ch-Ua-Platform': '\"Windows\"'\n },\n // Chrome 130 / Windows\n {\n 'User-Agent':\n 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36',\n 'Sec-Ch-Ua': '\"Google Chrome\";v=\"130\", \"Chromium\";v=\"130\", \"Not_A Brand\";v=\"24\"',\n 'Sec-Ch-Ua-Platform': '\"Windows\"'\n },\n // Chrome 131 / macOS\n {\n 'User-Agent':\n 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36',\n 'Sec-Ch-Ua': '\"Google Chrome\";v=\"131\", \"Chromium\";v=\"131\", \"Not_A Brand\";v=\"24\"',\n 'Sec-Ch-Ua-Platform': '\"macOS\"'\n },\n // Chrome 130 / macOS\n {\n 'User-Agent':\n 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36',\n 'Sec-Ch-Ua': '\"Google Chrome\";v=\"130\", \"Chromium\";v=\"130\", \"Not_A Brand\";v=\"24\"',\n 'Sec-Ch-Ua-Platform': '\"macOS\"'\n },\n // Edge 131 / Windows\n {\n 'User-Agent':\n 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0',\n 'Sec-Ch-Ua': '\"Microsoft Edge\";v=\"131\", \"Chromium\";v=\"131\", \"Not_A Brand\";v=\"24\"',\n 'Sec-Ch-Ua-Platform': '\"Windows\"'\n },\n // Edge 130 / Windows\n {\n 'User-Agent':\n 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36 Edg/130.0.0.0',\n 'Sec-Ch-Ua': '\"Microsoft Edge\";v=\"130\", \"Chromium\";v=\"130\", \"Not_A Brand\";v=\"24\"',\n 'Sec-Ch-Ua-Platform': '\"Windows\"'\n }\n];\n\nconst randomProfile = (): BrowserProfile =>\n browserProfiles[Math.floor(Math.random() * browserProfiles.length)];\n\nconst baseHeaders = {\n Accept:\n 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',\n 'Accept-Language': 'cs-CZ,cs;q=0.9,en-US;q=0.8,en;q=0.7',\n 'Accept-Encoding': 'gzip, deflate, br',\n 'Cache-Control': 'max-age=0',\n Connection: 'keep-alive',\n 'Sec-Ch-Ua-Mobile': '?0',\n 'Sec-Fetch-Dest': 'document',\n 'Sec-Fetch-Mode': 'navigate',\n 'Sec-Fetch-Site': 'none',\n 'Sec-Fetch-User': '?1',\n 'Upgrade-Insecure-Requests': '1'\n};\n\nexport const fetchPage = async (url: string, optionsRequest?: RequestInit): Promise<string> => {\n try {\n const mergedHeaders = new Headers({ ...baseHeaders, ...randomProfile() });\n\n // Merge any custom headers provided in the function arguments\n if (optionsRequest?.headers) {\n const reqHeaders = new Headers(optionsRequest.headers);\n reqHeaders.forEach((value, key) => mergedHeaders.set(key, value));\n }\n\n const { headers: _, ...restOptions } = optionsRequest || {};\n\n const response = await fetchSafe(url, {\n credentials: 'omit',\n ...restOptions,\n headers: mergedHeaders\n });\n\n if (!response.ok) {\n throw new Error(`node-csfd-api: Bad response ${response.status} for url: ${url}`);\n }\n\n const html = await response.text();\n\n // Quickly check if we hit the trap\n if (html.includes(\"Making sure you're not a bot!\")) {\n console.warn('node-csfd-api: Trap detected.');\n }\n\n return html;\n } catch (e: unknown) {\n if (e instanceof Error) {\n console.error(e.message);\n } else {\n console.error(String(e));\n }\n return 'Error';\n }\n};\n"],"mappings":";;AAQA,MAAM,kBAAoC;CAExC;EACE,cACE;EACF,aAAa;EACb,sBAAsB;EACvB;CAED;EACE,cACE;EACF,aAAa;EACb,sBAAsB;EACvB;CAED;EACE,cACE;EACF,aAAa;EACb,sBAAsB;EACvB;CAED;EACE,cACE;EACF,aAAa;EACb,sBAAsB;EACvB;CAED;EACE,cACE;EACF,aAAa;EACb,sBAAsB;EACvB;CAED;EACE,cACE;EACF,aAAa;EACb,sBAAsB;EACvB;CACF;AAED,MAAM,sBACJ,gBAAgB,KAAK,MAAM,KAAK,QAAQ,GAAG,gBAAgB,OAAO;AAEpE,MAAM,cAAc;CAClB,QACE;CACF,mBAAmB;CACnB,mBAAmB;CACnB,iBAAiB;CACjB,YAAY;CACZ,oBAAoB;CACpB,kBAAkB;CAClB,kBAAkB;CAClB,kBAAkB;CAClB,kBAAkB;CAClB,6BAA6B;CAC9B;AAED,MAAa,YAAY,OAAO,KAAa,mBAAkD;AAC7F,KAAI;EACF,MAAM,gBAAgB,IAAI,QAAQ;GAAE,GAAG;GAAa,GAAG,eAAe;GAAE,CAAC;AAGzE,MAAI,gBAAgB,QACC,KAAI,QAAQ,eAAe,QAAQ,CAC3C,SAAS,OAAO,QAAQ,cAAc,IAAI,KAAK,MAAM,CAAC;EAGnE,MAAM,EAAE,SAAS,GAAG,GAAG,gBAAgB,kBAAkB,EAAE;EAE3D,MAAM,WAAW,MAAMA,uBAAAA,UAAU,KAAK;GACpC,aAAa;GACb,GAAG;GACH,SAAS;GACV,CAAC;AAEF,MAAI,CAAC,SAAS,GACZ,OAAM,IAAI,MAAM,+BAA+B,SAAS,OAAO,YAAY,MAAM;EAGnF,MAAM,OAAO,MAAM,SAAS,MAAM;AAGlC,MAAI,KAAK,SAAS,gCAAgC,CAChD,SAAQ,KAAK,gCAAgC;AAG/C,SAAO;UACA,GAAY;AACnB,MAAI,aAAa,MACf,SAAQ,MAAM,EAAE,QAAQ;MAExB,SAAQ,MAAM,OAAO,EAAE,CAAC;AAE1B,SAAO"}
|
package/fetchers/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
import { fetchSafe } from "./fetch.polyfill.js";
|
|
2
2
|
//#region src/fetchers/index.ts
|
|
3
3
|
const browserProfiles = [
|
|
4
4
|
{
|
|
@@ -54,7 +54,7 @@ const fetchPage = async (url, optionsRequest) => {
|
|
|
54
54
|
});
|
|
55
55
|
if (optionsRequest?.headers) new Headers(optionsRequest.headers).forEach((value, key) => mergedHeaders.set(key, value));
|
|
56
56
|
const { headers: _, ...restOptions } = optionsRequest || {};
|
|
57
|
-
const response = await
|
|
57
|
+
const response = await fetchSafe(url, {
|
|
58
58
|
credentials: "omit",
|
|
59
59
|
...restOptions,
|
|
60
60
|
headers: mergedHeaders
|
|
@@ -70,6 +70,6 @@ const fetchPage = async (url, optionsRequest) => {
|
|
|
70
70
|
}
|
|
71
71
|
};
|
|
72
72
|
//#endregion
|
|
73
|
-
|
|
73
|
+
export { fetchPage };
|
|
74
74
|
|
|
75
75
|
//# sourceMappingURL=index.js.map
|
package/fetchers/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../src/fetchers/index.ts"],"sourcesContent":["import { fetchSafe } from './fetch.polyfill';\n\ninterface BrowserProfile {\n 'User-Agent': string;\n 'Sec-Ch-Ua': string;\n 'Sec-Ch-Ua-Platform': string;\n}\n\nconst browserProfiles: BrowserProfile[] = [\n // Chrome 131 / Windows\n {\n 'User-Agent':\n 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36',\n 'Sec-Ch-Ua': '\"Google Chrome\";v=\"131\", \"Chromium\";v=\"131\", \"Not_A Brand\";v=\"24\"',\n 'Sec-Ch-Ua-Platform': '\"Windows\"'\n },\n // Chrome 130 / Windows\n {\n 'User-Agent':\n 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36',\n 'Sec-Ch-Ua': '\"Google Chrome\";v=\"130\", \"Chromium\";v=\"130\", \"Not_A Brand\";v=\"24\"',\n 'Sec-Ch-Ua-Platform': '\"Windows\"'\n },\n // Chrome 131 / macOS\n {\n 'User-Agent':\n 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36',\n 'Sec-Ch-Ua': '\"Google Chrome\";v=\"131\", \"Chromium\";v=\"131\", \"Not_A Brand\";v=\"24\"',\n 'Sec-Ch-Ua-Platform': '\"macOS\"'\n },\n // Chrome 130 / macOS\n {\n 'User-Agent':\n 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36',\n 'Sec-Ch-Ua': '\"Google Chrome\";v=\"130\", \"Chromium\";v=\"130\", \"Not_A Brand\";v=\"24\"',\n 'Sec-Ch-Ua-Platform': '\"macOS\"'\n },\n // Edge 131 / Windows\n {\n 'User-Agent':\n 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0',\n 'Sec-Ch-Ua': '\"Microsoft Edge\";v=\"131\", \"Chromium\";v=\"131\", \"Not_A Brand\";v=\"24\"',\n 'Sec-Ch-Ua-Platform': '\"Windows\"'\n },\n // Edge 130 / Windows\n {\n 'User-Agent':\n 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36 Edg/130.0.0.0',\n 'Sec-Ch-Ua': '\"Microsoft Edge\";v=\"130\", \"Chromium\";v=\"130\", \"Not_A Brand\";v=\"24\"',\n 'Sec-Ch-Ua-Platform': '\"Windows\"'\n }\n];\n\nconst randomProfile = (): BrowserProfile =>\n browserProfiles[Math.floor(Math.random() * browserProfiles.length)];\n\nconst baseHeaders = {\n Accept:\n 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',\n 'Accept-Language': 'cs-CZ,cs;q=0.9,en-US;q=0.8,en;q=0.7',\n 'Accept-Encoding': 'gzip, deflate, br',\n 'Cache-Control': 'max-age=0',\n Connection: 'keep-alive',\n 'Sec-Ch-Ua-Mobile': '?0',\n 'Sec-Fetch-Dest': 'document',\n 'Sec-Fetch-Mode': 'navigate',\n 'Sec-Fetch-Site': 'none',\n 'Sec-Fetch-User': '?1',\n 'Upgrade-Insecure-Requests': '1'\n};\n\nexport const fetchPage = async (url: string, optionsRequest?: RequestInit): Promise<string> => {\n try {\n const mergedHeaders = new Headers({ ...baseHeaders, ...randomProfile() });\n\n // Merge any custom headers provided in the function arguments\n if (optionsRequest?.headers) {\n const reqHeaders = new Headers(optionsRequest.headers);\n reqHeaders.forEach((value, key) => mergedHeaders.set(key, value));\n }\n\n const { headers: _, ...restOptions } = optionsRequest || {};\n\n const response = await fetchSafe(url, {\n credentials: 'omit',\n ...restOptions,\n headers: mergedHeaders\n });\n\n if (!response.ok) {\n throw new Error(`node-csfd-api: Bad response ${response.status} for url: ${url}`);\n }\n\n const html = await response.text();\n\n // Quickly check if we hit the trap\n if (html.includes(\"Making sure you're not a bot!\")) {\n console.warn('node-csfd-api: Trap detected.');\n }\n\n return html;\n } catch (e: unknown) {\n if (e instanceof Error) {\n console.error(e.message);\n } else {\n console.error(String(e));\n }\n return 'Error';\n }\n};\n"],"mappings":";;AAQA,MAAM,kBAAoC;CAExC;EACE,cACE;EACF,aAAa;EACb,sBAAsB;EACvB;CAED;EACE,cACE;EACF,aAAa;EACb,sBAAsB;EACvB;CAED;EACE,cACE;EACF,aAAa;EACb,sBAAsB;EACvB;CAED;EACE,cACE;EACF,aAAa;EACb,sBAAsB;EACvB;CAED;EACE,cACE;EACF,aAAa;EACb,sBAAsB;EACvB;CAED;EACE,cACE;EACF,aAAa;EACb,sBAAsB;EACvB;CACF;AAED,MAAM,sBACJ,gBAAgB,KAAK,MAAM,KAAK,QAAQ,GAAG,gBAAgB,OAAO;AAEpE,MAAM,cAAc;CAClB,QACE;CACF,mBAAmB;CACnB,mBAAmB;CACnB,iBAAiB;CACjB,YAAY;CACZ,oBAAoB;CACpB,kBAAkB;CAClB,kBAAkB;CAClB,kBAAkB;CAClB,kBAAkB;CAClB,6BAA6B;CAC9B;AAED,MAAa,YAAY,OAAO,KAAa,mBAAkD;AAC7F,KAAI;EACF,MAAM,gBAAgB,IAAI,QAAQ;GAAE,GAAG;GAAa,GAAG,eAAe;GAAE,CAAC;AAGzE,MAAI,gBAAgB,QACC,KAAI,QAAQ,eAAe,QAAQ,CAC3C,SAAS,OAAO,QAAQ,cAAc,IAAI,KAAK,MAAM,CAAC;EAGnE,MAAM,EAAE,SAAS,GAAG,GAAG,gBAAgB,kBAAkB,EAAE;EAE3D,MAAM,WAAW,MAAM,UAAU,KAAK;GACpC,aAAa;GACb,GAAG;GACH,SAAS;GACV,CAAC;AAEF,MAAI,CAAC,SAAS,GACZ,OAAM,IAAI,MAAM,+BAA+B,SAAS,OAAO,YAAY,MAAM;EAGnF,MAAM,OAAO,MAAM,SAAS,MAAM;AAGlC,MAAI,KAAK,SAAS,gCAAgC,CAChD,SAAQ,KAAK,gCAAgC;AAG/C,SAAO;UACA,GAAY;AACnB,MAAI,aAAa,MACf,SAAQ,MAAM,EAAE,QAAQ;MAExB,SAAQ,MAAM,OAAO,EAAE,CAAC;AAE1B,SAAO"}
|
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
|
|
1
|
+
const require_global_helper = require("./global.helper.cjs");
|
|
2
2
|
//#region src/helpers/cinema.helper.ts
|
|
3
3
|
const getCinemaColorRating = (el) => {
|
|
4
4
|
const classes = el?.classNames.split(" ") ?? [];
|
|
5
5
|
const last = classes.length ? classes[classes.length - 1] : void 0;
|
|
6
|
-
return last ? parseColor(last) : "unknown";
|
|
6
|
+
return last ? require_global_helper.parseColor(last) : "unknown";
|
|
7
7
|
};
|
|
8
8
|
const getCinemaId = (el) => {
|
|
9
9
|
return +el?.id?.split("-")[1];
|
|
10
10
|
};
|
|
11
11
|
const getCinemaUrlId = (url) => {
|
|
12
12
|
if (!url) return null;
|
|
13
|
-
return parseIdFromUrl(url);
|
|
13
|
+
return require_global_helper.parseIdFromUrl(url);
|
|
14
14
|
};
|
|
15
15
|
const getCinemaCoords = (el) => {
|
|
16
16
|
if (!el) return null;
|
|
@@ -74,6 +74,10 @@ const parseMeta = (meta) => {
|
|
|
74
74
|
return metaConvert;
|
|
75
75
|
};
|
|
76
76
|
//#endregion
|
|
77
|
-
|
|
77
|
+
exports.getCinemaCoords = getCinemaCoords;
|
|
78
|
+
exports.getCinemaId = getCinemaId;
|
|
79
|
+
exports.getCinemaUrl = getCinemaUrl;
|
|
80
|
+
exports.getGroupedFilmsByDate = getGroupedFilmsByDate;
|
|
81
|
+
exports.parseCinema = parseCinema;
|
|
78
82
|
|
|
79
|
-
//# sourceMappingURL=cinema.helper.
|
|
83
|
+
//# sourceMappingURL=cinema.helper.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cinema.helper.cjs","names":["parseColor","parseIdFromUrl"],"sources":["../../src/helpers/cinema.helper.ts"],"sourcesContent":["import { HTMLElement } from 'node-html-parser';\nimport { CSFDCinemaGroupedFilmsByDate, CSFDCinemaMeta, CSFDCinemaMovie } from '../dto/cinema';\nimport { CSFDColorRating } from '../dto/global';\nimport { CSFDColors } from '../dto/user-ratings';\nimport { parseColor, parseIdFromUrl } from './global.helper';\n\nexport const getCinemaColorRating = (el: HTMLElement | null): CSFDColorRating => {\n const classes: string[] = el?.classNames.split(' ') ?? [];\n const last = classes.length ? classes[classes.length - 1] : undefined;\n return last ? parseColor(last as CSFDColors) : 'unknown';\n};\n\nexport const getCinemaId = (el: HTMLElement | null): number => {\n const id = el?.id?.split('-')[1];\n return +id;\n};\n\nexport const getCinemaUrlId = (url: string | null | undefined): number | null => {\n if (!url) return null;\n return parseIdFromUrl(url);\n};\n\nexport const getCinemaCoords = (el: HTMLElement | null): { lat: number; lng: number } | null => {\n if (!el) return null;\n const linkMapsEl = el.querySelector('a[href*=\"q=\"]');\n if (!linkMapsEl) return null;\n\n const linkMaps = linkMapsEl.getAttribute('href');\n const [_, latLng] = linkMaps.split('q=');\n\n const coords = latLng.split(',');\n if (coords.length !== 2) return null;\n\n const lat = Number(coords[0]);\n const lng = Number(coords[1]);\n if (Number.isFinite(lat) && Number.isFinite(lng)) {\n return { lat, lng };\n }\n return null;\n};\n\nexport const getCinemaUrl = (el: HTMLElement | null): string => {\n if (!el) return '';\n return el.querySelector('.cinema-logo a')?.attributes.href ?? '';\n};\n\nexport const parseCinema = (el: HTMLElement | null): { city: string; name: string } => {\n const title = el.querySelector('header h2').innerText.trim();\n const [city, name] = title.split(' - ');\n return { city, name };\n};\n\nexport const getGroupedFilmsByDate = (el: HTMLElement | null): CSFDCinemaGroupedFilmsByDate[] => {\n const divs = el.querySelectorAll(':scope > div');\n const getDatesAndFilms = divs\n .map((_, index) => index)\n .filter((index) => index % 2 === 0)\n .map((index) => {\n const [date, films] = divs.slice(index, index + 2);\n const dateText = date?.firstChild?.textContent?.trim() ?? null;\n return { date: dateText, films: getCinemaFilms('', films) };\n });\n\n return getDatesAndFilms;\n};\n\nexport const getCinemaFilms = (date: string, el: HTMLElement | null): CSFDCinemaMovie[] => {\n const filmNodes = el.querySelectorAll('.cinema-table tr');\n\n const films = filmNodes.map((filmNode) => {\n const url = filmNode.querySelector('td.name h3 a')?.attributes.href;\n const id = url ? getCinemaUrlId(url) : null;\n const title = filmNode.querySelector('.name h3')?.text.trim();\n const colorRating = getCinemaColorRating(filmNode.querySelector('.name .icon'));\n const showTimes = filmNode.querySelectorAll('.td-time')?.map((x) => x.textContent.trim());\n const meta = filmNode.querySelectorAll('.td-title span')?.map((x) => x.text.trim());\n\n return {\n id,\n title,\n url,\n colorRating,\n showTimes,\n meta: parseMeta(meta)\n };\n });\n return films;\n};\n\nexport const parseMeta = (meta: string[]): CSFDCinemaMeta[] => {\n const metaConvert: CSFDCinemaMeta[] = [];\n\n for (const element of meta) {\n if (element === 'T') {\n metaConvert.push('subtitles');\n } else if (element === 'D') {\n metaConvert.push('dubbing');\n } else {\n metaConvert.push(element);\n }\n }\n\n return metaConvert;\n};\n"],"mappings":";;AAMA,MAAa,wBAAwB,OAA4C;CAC/E,MAAM,UAAoB,IAAI,WAAW,MAAM,IAAI,IAAI,EAAE;CACzD,MAAM,OAAO,QAAQ,SAAS,QAAQ,QAAQ,SAAS,KAAK,KAAA;AAC5D,QAAO,OAAOA,sBAAAA,WAAW,KAAmB,GAAG;;AAGjD,MAAa,eAAe,OAAmC;AAE7D,QAAO,CADI,IAAI,IAAI,MAAM,IAAI,CAAC;;AAIhC,MAAa,kBAAkB,QAAkD;AAC/E,KAAI,CAAC,IAAK,QAAO;AACjB,QAAOC,sBAAAA,eAAe,IAAI;;AAG5B,MAAa,mBAAmB,OAAgE;AAC9F,KAAI,CAAC,GAAI,QAAO;CAChB,MAAM,aAAa,GAAG,cAAc,kBAAgB;AACpD,KAAI,CAAC,WAAY,QAAO;CAGxB,MAAM,CAAC,GAAG,UADO,WAAW,aAAa,OAAO,CACnB,MAAM,KAAK;CAExC,MAAM,SAAS,OAAO,MAAM,IAAI;AAChC,KAAI,OAAO,WAAW,EAAG,QAAO;CAEhC,MAAM,MAAM,OAAO,OAAO,GAAG;CAC7B,MAAM,MAAM,OAAO,OAAO,GAAG;AAC7B,KAAI,OAAO,SAAS,IAAI,IAAI,OAAO,SAAS,IAAI,CAC9C,QAAO;EAAE;EAAK;EAAK;AAErB,QAAO;;AAGT,MAAa,gBAAgB,OAAmC;AAC9D,KAAI,CAAC,GAAI,QAAO;AAChB,QAAO,GAAG,cAAc,iBAAiB,EAAE,WAAW,QAAQ;;AAGhE,MAAa,eAAe,OAA2D;CAErF,MAAM,CAAC,MAAM,QADC,GAAG,cAAc,YAAY,CAAC,UAAU,MAAM,CACjC,MAAM,MAAM;AACvC,QAAO;EAAE;EAAM;EAAM;;AAGvB,MAAa,yBAAyB,OAA2D;CAC/F,MAAM,OAAO,GAAG,iBAAiB,eAAe;AAUhD,QATyB,KACtB,KAAK,GAAG,UAAU,MAAM,CACxB,QAAQ,UAAU,QAAQ,MAAM,EAAE,CAClC,KAAK,UAAU;EACd,MAAM,CAAC,MAAM,SAAS,KAAK,MAAM,OAAO,QAAQ,EAAE;AAElD,SAAO;GAAE,MADQ,MAAM,YAAY,aAAa,MAAM,IAAI;GACjC,OAAO,eAAe,IAAI,MAAM;GAAE;GAC3D;;AAKN,MAAa,kBAAkB,MAAc,OAA8C;AAoBzF,QAnBkB,GAAG,iBAAiB,mBAAmB,CAEjC,KAAK,aAAa;EACxC,MAAM,MAAM,SAAS,cAAc,eAAe,EAAE,WAAW;EAC/D,MAAM,KAAK,MAAM,eAAe,IAAI,GAAG;EACvC,MAAM,QAAQ,SAAS,cAAc,WAAW,EAAE,KAAK,MAAM;EAC7D,MAAM,cAAc,qBAAqB,SAAS,cAAc,cAAc,CAAC;EAC/E,MAAM,YAAY,SAAS,iBAAiB,WAAW,EAAE,KAAK,MAAM,EAAE,YAAY,MAAM,CAAC;EACzF,MAAM,OAAO,SAAS,iBAAiB,iBAAiB,EAAE,KAAK,MAAM,EAAE,KAAK,MAAM,CAAC;AAEnF,SAAO;GACL;GACA;GACA;GACA;GACA;GACA,MAAM,UAAU,KAAK;GACtB;GACD;;AAIJ,MAAa,aAAa,SAAqC;CAC7D,MAAM,cAAgC,EAAE;AAExC,MAAK,MAAM,WAAW,KACpB,KAAI,YAAY,IACd,aAAY,KAAK,YAAY;UACpB,YAAY,IACrB,aAAY,KAAK,UAAU;KAE3B,aAAY,KAAK,QAAQ;AAI7B,QAAO"}
|
package/helpers/cinema.helper.js
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
|
|
1
|
+
import { parseColor, parseIdFromUrl } from "./global.helper.js";
|
|
2
2
|
//#region src/helpers/cinema.helper.ts
|
|
3
3
|
const getCinemaColorRating = (el) => {
|
|
4
4
|
const classes = el?.classNames.split(" ") ?? [];
|
|
5
5
|
const last = classes.length ? classes[classes.length - 1] : void 0;
|
|
6
|
-
return last ?
|
|
6
|
+
return last ? parseColor(last) : "unknown";
|
|
7
7
|
};
|
|
8
8
|
const getCinemaId = (el) => {
|
|
9
9
|
return +el?.id?.split("-")[1];
|
|
10
10
|
};
|
|
11
11
|
const getCinemaUrlId = (url) => {
|
|
12
12
|
if (!url) return null;
|
|
13
|
-
return
|
|
13
|
+
return parseIdFromUrl(url);
|
|
14
14
|
};
|
|
15
15
|
const getCinemaCoords = (el) => {
|
|
16
16
|
if (!el) return null;
|
|
@@ -74,10 +74,6 @@ const parseMeta = (meta) => {
|
|
|
74
74
|
return metaConvert;
|
|
75
75
|
};
|
|
76
76
|
//#endregion
|
|
77
|
-
|
|
78
|
-
exports.getCinemaId = getCinemaId;
|
|
79
|
-
exports.getCinemaUrl = getCinemaUrl;
|
|
80
|
-
exports.getGroupedFilmsByDate = getGroupedFilmsByDate;
|
|
81
|
-
exports.parseCinema = parseCinema;
|
|
77
|
+
export { getCinemaCoords, getCinemaId, getCinemaUrl, getGroupedFilmsByDate, parseCinema };
|
|
82
78
|
|
|
83
79
|
//# sourceMappingURL=cinema.helper.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cinema.helper.js","names":[
|
|
1
|
+
{"version":3,"file":"cinema.helper.js","names":[],"sources":["../../src/helpers/cinema.helper.ts"],"sourcesContent":["import { HTMLElement } from 'node-html-parser';\nimport { CSFDCinemaGroupedFilmsByDate, CSFDCinemaMeta, CSFDCinemaMovie } from '../dto/cinema';\nimport { CSFDColorRating } from '../dto/global';\nimport { CSFDColors } from '../dto/user-ratings';\nimport { parseColor, parseIdFromUrl } from './global.helper';\n\nexport const getCinemaColorRating = (el: HTMLElement | null): CSFDColorRating => {\n const classes: string[] = el?.classNames.split(' ') ?? [];\n const last = classes.length ? classes[classes.length - 1] : undefined;\n return last ? parseColor(last as CSFDColors) : 'unknown';\n};\n\nexport const getCinemaId = (el: HTMLElement | null): number => {\n const id = el?.id?.split('-')[1];\n return +id;\n};\n\nexport const getCinemaUrlId = (url: string | null | undefined): number | null => {\n if (!url) return null;\n return parseIdFromUrl(url);\n};\n\nexport const getCinemaCoords = (el: HTMLElement | null): { lat: number; lng: number } | null => {\n if (!el) return null;\n const linkMapsEl = el.querySelector('a[href*=\"q=\"]');\n if (!linkMapsEl) return null;\n\n const linkMaps = linkMapsEl.getAttribute('href');\n const [_, latLng] = linkMaps.split('q=');\n\n const coords = latLng.split(',');\n if (coords.length !== 2) return null;\n\n const lat = Number(coords[0]);\n const lng = Number(coords[1]);\n if (Number.isFinite(lat) && Number.isFinite(lng)) {\n return { lat, lng };\n }\n return null;\n};\n\nexport const getCinemaUrl = (el: HTMLElement | null): string => {\n if (!el) return '';\n return el.querySelector('.cinema-logo a')?.attributes.href ?? '';\n};\n\nexport const parseCinema = (el: HTMLElement | null): { city: string; name: string } => {\n const title = el.querySelector('header h2').innerText.trim();\n const [city, name] = title.split(' - ');\n return { city, name };\n};\n\nexport const getGroupedFilmsByDate = (el: HTMLElement | null): CSFDCinemaGroupedFilmsByDate[] => {\n const divs = el.querySelectorAll(':scope > div');\n const getDatesAndFilms = divs\n .map((_, index) => index)\n .filter((index) => index % 2 === 0)\n .map((index) => {\n const [date, films] = divs.slice(index, index + 2);\n const dateText = date?.firstChild?.textContent?.trim() ?? null;\n return { date: dateText, films: getCinemaFilms('', films) };\n });\n\n return getDatesAndFilms;\n};\n\nexport const getCinemaFilms = (date: string, el: HTMLElement | null): CSFDCinemaMovie[] => {\n const filmNodes = el.querySelectorAll('.cinema-table tr');\n\n const films = filmNodes.map((filmNode) => {\n const url = filmNode.querySelector('td.name h3 a')?.attributes.href;\n const id = url ? getCinemaUrlId(url) : null;\n const title = filmNode.querySelector('.name h3')?.text.trim();\n const colorRating = getCinemaColorRating(filmNode.querySelector('.name .icon'));\n const showTimes = filmNode.querySelectorAll('.td-time')?.map((x) => x.textContent.trim());\n const meta = filmNode.querySelectorAll('.td-title span')?.map((x) => x.text.trim());\n\n return {\n id,\n title,\n url,\n colorRating,\n showTimes,\n meta: parseMeta(meta)\n };\n });\n return films;\n};\n\nexport const parseMeta = (meta: string[]): CSFDCinemaMeta[] => {\n const metaConvert: CSFDCinemaMeta[] = [];\n\n for (const element of meta) {\n if (element === 'T') {\n metaConvert.push('subtitles');\n } else if (element === 'D') {\n metaConvert.push('dubbing');\n } else {\n metaConvert.push(element);\n }\n }\n\n return metaConvert;\n};\n"],"mappings":";;AAMA,MAAa,wBAAwB,OAA4C;CAC/E,MAAM,UAAoB,IAAI,WAAW,MAAM,IAAI,IAAI,EAAE;CACzD,MAAM,OAAO,QAAQ,SAAS,QAAQ,QAAQ,SAAS,KAAK,KAAA;AAC5D,QAAO,OAAO,WAAW,KAAmB,GAAG;;AAGjD,MAAa,eAAe,OAAmC;AAE7D,QAAO,CADI,IAAI,IAAI,MAAM,IAAI,CAAC;;AAIhC,MAAa,kBAAkB,QAAkD;AAC/E,KAAI,CAAC,IAAK,QAAO;AACjB,QAAO,eAAe,IAAI;;AAG5B,MAAa,mBAAmB,OAAgE;AAC9F,KAAI,CAAC,GAAI,QAAO;CAChB,MAAM,aAAa,GAAG,cAAc,kBAAgB;AACpD,KAAI,CAAC,WAAY,QAAO;CAGxB,MAAM,CAAC,GAAG,UADO,WAAW,aAAa,OAAO,CACnB,MAAM,KAAK;CAExC,MAAM,SAAS,OAAO,MAAM,IAAI;AAChC,KAAI,OAAO,WAAW,EAAG,QAAO;CAEhC,MAAM,MAAM,OAAO,OAAO,GAAG;CAC7B,MAAM,MAAM,OAAO,OAAO,GAAG;AAC7B,KAAI,OAAO,SAAS,IAAI,IAAI,OAAO,SAAS,IAAI,CAC9C,QAAO;EAAE;EAAK;EAAK;AAErB,QAAO;;AAGT,MAAa,gBAAgB,OAAmC;AAC9D,KAAI,CAAC,GAAI,QAAO;AAChB,QAAO,GAAG,cAAc,iBAAiB,EAAE,WAAW,QAAQ;;AAGhE,MAAa,eAAe,OAA2D;CAErF,MAAM,CAAC,MAAM,QADC,GAAG,cAAc,YAAY,CAAC,UAAU,MAAM,CACjC,MAAM,MAAM;AACvC,QAAO;EAAE;EAAM;EAAM;;AAGvB,MAAa,yBAAyB,OAA2D;CAC/F,MAAM,OAAO,GAAG,iBAAiB,eAAe;AAUhD,QATyB,KACtB,KAAK,GAAG,UAAU,MAAM,CACxB,QAAQ,UAAU,QAAQ,MAAM,EAAE,CAClC,KAAK,UAAU;EACd,MAAM,CAAC,MAAM,SAAS,KAAK,MAAM,OAAO,QAAQ,EAAE;AAElD,SAAO;GAAE,MADQ,MAAM,YAAY,aAAa,MAAM,IAAI;GACjC,OAAO,eAAe,IAAI,MAAM;GAAE;GAC3D;;AAKN,MAAa,kBAAkB,MAAc,OAA8C;AAoBzF,QAnBkB,GAAG,iBAAiB,mBAAmB,CAEjC,KAAK,aAAa;EACxC,MAAM,MAAM,SAAS,cAAc,eAAe,EAAE,WAAW;EAC/D,MAAM,KAAK,MAAM,eAAe,IAAI,GAAG;EACvC,MAAM,QAAQ,SAAS,cAAc,WAAW,EAAE,KAAK,MAAM;EAC7D,MAAM,cAAc,qBAAqB,SAAS,cAAc,cAAc,CAAC;EAC/E,MAAM,YAAY,SAAS,iBAAiB,WAAW,EAAE,KAAK,MAAM,EAAE,YAAY,MAAM,CAAC;EACzF,MAAM,OAAO,SAAS,iBAAiB,iBAAiB,EAAE,KAAK,MAAM,EAAE,KAAK,MAAM,CAAC;AAEnF,SAAO;GACL;GACA;GACA;GACA;GACA;GACA,MAAM,UAAU,KAAK;GACtB;GACD;;AAIJ,MAAa,aAAa,SAAqC;CAC7D,MAAM,cAAgC,EAAE;AAExC,MAAK,MAAM,WAAW,KACpB,KAAI,YAAY,IACd,aAAY,KAAK,YAAY;UACpB,YAAY,IACrB,aAAY,KAAK,UAAU;KAE3B,aAAY,KAAK,QAAQ;AAI7B,QAAO"}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
|
|
1
|
+
const require_global_helper = require("./global.helper.cjs");
|
|
2
2
|
//#region src/helpers/creator.helper.ts
|
|
3
3
|
const getCreatorColorRating = (el) => {
|
|
4
4
|
const classes = el?.classNames.split(" ") ?? [];
|
|
5
5
|
const last = classes[classes.length - 1];
|
|
6
|
-
return parseColor(last);
|
|
6
|
+
return require_global_helper.parseColor(last);
|
|
7
7
|
};
|
|
8
8
|
const getCreatorId = (url) => {
|
|
9
|
-
return url ? parseIdFromUrl(url) : null;
|
|
9
|
+
return url ? require_global_helper.parseIdFromUrl(url) : null;
|
|
10
10
|
};
|
|
11
11
|
const getCreatorName = (el) => {
|
|
12
12
|
return (el?.querySelector("h1"))?.innerText?.trim() ?? null;
|
|
@@ -19,7 +19,7 @@ const getCreatorBirthdayInfo = (el) => {
|
|
|
19
19
|
let birthday = null;
|
|
20
20
|
if (text) {
|
|
21
21
|
const birthdayRow = text.split("\n").find((x) => x.includes("nar."));
|
|
22
|
-
birthday = birthdayRow ? parseDate(parseBirthday(birthdayRow)) : null;
|
|
22
|
+
birthday = birthdayRow ? require_global_helper.parseDate(parseBirthday(birthdayRow)) : null;
|
|
23
23
|
}
|
|
24
24
|
const age = ageRow ? +parseAge(ageRow) : null;
|
|
25
25
|
const birthPlace = birthPlaceRow ? parseBirthPlace(birthPlaceRow) : "";
|
|
@@ -34,7 +34,7 @@ const getCreatorBio = (el) => {
|
|
|
34
34
|
};
|
|
35
35
|
const getCreatorPhoto = (el) => {
|
|
36
36
|
const src = el?.querySelector("img")?.getAttribute("src");
|
|
37
|
-
return src ? addProtocol(src) : null;
|
|
37
|
+
return src ? require_global_helper.addProtocol(src) : null;
|
|
38
38
|
};
|
|
39
39
|
const parseBirthday = (text) => text.replace(/nar\./g, "").trim();
|
|
40
40
|
const parseAge = (text) => {
|
|
@@ -63,6 +63,10 @@ const getCreatorFilms = (el) => {
|
|
|
63
63
|
}).filter(Boolean);
|
|
64
64
|
};
|
|
65
65
|
//#endregion
|
|
66
|
-
|
|
66
|
+
exports.getCreatorBio = getCreatorBio;
|
|
67
|
+
exports.getCreatorBirthdayInfo = getCreatorBirthdayInfo;
|
|
68
|
+
exports.getCreatorFilms = getCreatorFilms;
|
|
69
|
+
exports.getCreatorName = getCreatorName;
|
|
70
|
+
exports.getCreatorPhoto = getCreatorPhoto;
|
|
67
71
|
|
|
68
|
-
//# sourceMappingURL=creator.helper.
|
|
72
|
+
//# sourceMappingURL=creator.helper.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"creator.helper.cjs","names":["parseColor","parseIdFromUrl","parseDate","addProtocol"],"sources":["../../src/helpers/creator.helper.ts"],"sourcesContent":["import { HTMLElement } from 'node-html-parser';\nimport { CSFDCreatorScreening } from '../dto/creator';\nimport { CSFDColorRating } from '../dto/global';\nimport { CSFDColors } from '../dto/user-ratings';\nimport { addProtocol, parseColor, parseDate, 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 CSFDColors | 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 | null; age: number; birthPlace: string } => {\n const infoBlock = el?.querySelector('.creator-profile-details p');\n const text = infoBlock?.innerHTML.trim();\n const birthPlaceRow = infoBlock?.querySelector('.info-place')?.innerText.trim();\n const ageRow = infoBlock?.querySelector('.info')?.innerText.trim();\n\n let birthday: string | null = null;\n\n if (text) {\n const parts = text.split('\\n');\n const birthdayRow = parts.find((x) => x.includes('nar.'));\n birthday = birthdayRow ? parseDate(parseBirthday(birthdayRow)) : null;\n }\n\n const age = ageRow ? +parseAge(ageRow) : null;\n const birthPlace = birthPlaceRow ? parseBirthPlace(birthPlaceRow) : '';\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 => text.trim().replace(/<br>/g, '').trim();\n\nexport const getCreatorFilms = (el: HTMLElement | null): CSFDCreatorScreening[] => {\n const filmNodes = el?.querySelectorAll('.updated-box')?.[0]?.querySelectorAll('table tr') ?? [];\n let yearCache: number | null = null;\n\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,MAAM,UAAoB,IAAI,WAAW,MAAM,IAAI,IAAI,EAAE;CACzD,MAAM,OAAO,QAAQ,QAAQ,SAAS;AACtC,QAAOA,sBAAAA,WAAW,KAAK;;AAGzB,MAAa,gBAAgB,QAAkD;AAC7E,QAAO,MAAMC,sBAAAA,eAAe,IAAI,GAAG;;AAGrC,MAAa,kBAAkB,OAA0C;AAEvE,SADW,IAAI,cAAc,KAAK,GACvB,WAAW,MAAM,IAAI;;AAGlC,MAAa,0BACX,OACiE;CACjE,MAAM,YAAY,IAAI,cAAc,6BAA6B;CACjE,MAAM,OAAO,WAAW,UAAU,MAAM;CACxC,MAAM,gBAAgB,WAAW,cAAc,cAAc,EAAE,UAAU,MAAM;CAC/E,MAAM,SAAS,WAAW,cAAc,QAAQ,EAAE,UAAU,MAAM;CAElE,IAAI,WAA0B;AAE9B,KAAI,MAAM;EAER,MAAM,cADQ,KAAK,MAAM,KAAK,CACJ,MAAM,MAAM,EAAE,SAAS,OAAO,CAAC;AACzD,aAAW,cAAcC,sBAAAA,UAAU,cAAc,YAAY,CAAC,GAAG;;CAGnE,MAAM,MAAM,SAAS,CAAC,SAAS,OAAO,GAAG;CACzC,MAAM,aAAa,gBAAgB,gBAAgB,cAAc,GAAG;AACpE,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,sBAAAA,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,SAAyB,KAAK,MAAM,CAAC,QAAQ,SAAS,GAAG,CAAC,MAAM;AAEzF,MAAa,mBAAmB,OAAmD;CACjF,MAAM,YAAY,IAAI,iBAAiB,eAAe,GAAG,IAAI,iBAAiB,WAAW,IAAI,EAAE;CAC/F,IAAI,YAA2B;AAsB/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"}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
|
|
1
|
+
import { addProtocol, parseColor, parseDate, parseIdFromUrl } from "./global.helper.js";
|
|
2
2
|
//#region src/helpers/creator.helper.ts
|
|
3
3
|
const getCreatorColorRating = (el) => {
|
|
4
4
|
const classes = el?.classNames.split(" ") ?? [];
|
|
5
5
|
const last = classes[classes.length - 1];
|
|
6
|
-
return
|
|
6
|
+
return parseColor(last);
|
|
7
7
|
};
|
|
8
8
|
const getCreatorId = (url) => {
|
|
9
|
-
return url ?
|
|
9
|
+
return url ? parseIdFromUrl(url) : null;
|
|
10
10
|
};
|
|
11
11
|
const getCreatorName = (el) => {
|
|
12
12
|
return (el?.querySelector("h1"))?.innerText?.trim() ?? null;
|
|
@@ -19,7 +19,7 @@ const getCreatorBirthdayInfo = (el) => {
|
|
|
19
19
|
let birthday = null;
|
|
20
20
|
if (text) {
|
|
21
21
|
const birthdayRow = text.split("\n").find((x) => x.includes("nar."));
|
|
22
|
-
birthday = birthdayRow ?
|
|
22
|
+
birthday = birthdayRow ? parseDate(parseBirthday(birthdayRow)) : null;
|
|
23
23
|
}
|
|
24
24
|
const age = ageRow ? +parseAge(ageRow) : null;
|
|
25
25
|
const birthPlace = birthPlaceRow ? parseBirthPlace(birthPlaceRow) : "";
|
|
@@ -34,7 +34,7 @@ const getCreatorBio = (el) => {
|
|
|
34
34
|
};
|
|
35
35
|
const getCreatorPhoto = (el) => {
|
|
36
36
|
const src = el?.querySelector("img")?.getAttribute("src");
|
|
37
|
-
return src ?
|
|
37
|
+
return src ? addProtocol(src) : null;
|
|
38
38
|
};
|
|
39
39
|
const parseBirthday = (text) => text.replace(/nar\./g, "").trim();
|
|
40
40
|
const parseAge = (text) => {
|
|
@@ -63,10 +63,6 @@ const getCreatorFilms = (el) => {
|
|
|
63
63
|
}).filter(Boolean);
|
|
64
64
|
};
|
|
65
65
|
//#endregion
|
|
66
|
-
|
|
67
|
-
exports.getCreatorBirthdayInfo = getCreatorBirthdayInfo;
|
|
68
|
-
exports.getCreatorFilms = getCreatorFilms;
|
|
69
|
-
exports.getCreatorName = getCreatorName;
|
|
70
|
-
exports.getCreatorPhoto = getCreatorPhoto;
|
|
66
|
+
export { getCreatorBio, getCreatorBirthdayInfo, getCreatorFilms, getCreatorName, getCreatorPhoto };
|
|
71
67
|
|
|
72
68
|
//# sourceMappingURL=creator.helper.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"creator.helper.js","names":[
|
|
1
|
+
{"version":3,"file":"creator.helper.js","names":[],"sources":["../../src/helpers/creator.helper.ts"],"sourcesContent":["import { HTMLElement } from 'node-html-parser';\nimport { CSFDCreatorScreening } from '../dto/creator';\nimport { CSFDColorRating } from '../dto/global';\nimport { CSFDColors } from '../dto/user-ratings';\nimport { addProtocol, parseColor, parseDate, 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 CSFDColors | 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 | null; age: number; birthPlace: string } => {\n const infoBlock = el?.querySelector('.creator-profile-details p');\n const text = infoBlock?.innerHTML.trim();\n const birthPlaceRow = infoBlock?.querySelector('.info-place')?.innerText.trim();\n const ageRow = infoBlock?.querySelector('.info')?.innerText.trim();\n\n let birthday: string | null = null;\n\n if (text) {\n const parts = text.split('\\n');\n const birthdayRow = parts.find((x) => x.includes('nar.'));\n birthday = birthdayRow ? parseDate(parseBirthday(birthdayRow)) : null;\n }\n\n const age = ageRow ? +parseAge(ageRow) : null;\n const birthPlace = birthPlaceRow ? parseBirthPlace(birthPlaceRow) : '';\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 => text.trim().replace(/<br>/g, '').trim();\n\nexport const getCreatorFilms = (el: HTMLElement | null): CSFDCreatorScreening[] => {\n const filmNodes = el?.querySelectorAll('.updated-box')?.[0]?.querySelectorAll('table tr') ?? [];\n let yearCache: number | null = null;\n\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,MAAM,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,OACiE;CACjE,MAAM,YAAY,IAAI,cAAc,6BAA6B;CACjE,MAAM,OAAO,WAAW,UAAU,MAAM;CACxC,MAAM,gBAAgB,WAAW,cAAc,cAAc,EAAE,UAAU,MAAM;CAC/E,MAAM,SAAS,WAAW,cAAc,QAAQ,EAAE,UAAU,MAAM;CAElE,IAAI,WAA0B;AAE9B,KAAI,MAAM;EAER,MAAM,cADQ,KAAK,MAAM,KAAK,CACJ,MAAM,MAAM,EAAE,SAAS,OAAO,CAAC;AACzD,aAAW,cAAc,UAAU,cAAc,YAAY,CAAC,GAAG;;CAGnE,MAAM,MAAM,SAAS,CAAC,SAAS,OAAO,GAAG;CACzC,MAAM,aAAa,gBAAgB,gBAAgB,cAAc,GAAG;AACpE,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,SAAyB,KAAK,MAAM,CAAC,QAAQ,SAAS,GAAG,CAAC,MAAM;AAEzF,MAAa,mBAAmB,OAAmD;CACjF,MAAM,YAAY,IAAI,iBAAiB,eAAe,GAAG,IAAI,iBAAiB,WAAW,IAAI,EAAE;CAC/F,IAAI,YAA2B;AAsB/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"}
|
|
@@ -96,6 +96,14 @@ const parseDate = (date) => {
|
|
|
96
96
|
};
|
|
97
97
|
const sleep = (ms) => new Promise((res) => setTimeout(res, ms));
|
|
98
98
|
//#endregion
|
|
99
|
-
|
|
99
|
+
exports.addProtocol = addProtocol;
|
|
100
|
+
exports.getColor = getColor;
|
|
101
|
+
exports.parseColor = parseColor;
|
|
102
|
+
exports.parseDate = parseDate;
|
|
103
|
+
exports.parseFilmType = parseFilmType;
|
|
104
|
+
exports.parseISO8601Duration = parseISO8601Duration;
|
|
105
|
+
exports.parseIdFromUrl = parseIdFromUrl;
|
|
106
|
+
exports.parseLastIdFromUrl = parseLastIdFromUrl;
|
|
107
|
+
exports.sleep = sleep;
|
|
100
108
|
|
|
101
|
-
//# sourceMappingURL=global.helper.
|
|
109
|
+
//# sourceMappingURL=global.helper.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"global.helper.
|
|
1
|
+
{"version":3,"file":"global.helper.cjs","names":[],"sources":["../../src/helpers/global.helper.ts"],"sourcesContent":["import { CSFDColorRating, CSFDFilmTypes } from '../dto/global';\nimport { CSFDColors } from '../dto/user-ratings';\n\nconst LANG_PREFIX_REGEX = /^[a-z]{2,3}$/;\nconst ISO8601_DURATION_REGEX =\n /(-)?P(?:([.,\\d]+)Y)?(?:([.,\\d]+)M)?(?:([.,\\d]+)W)?(?:([.,\\d]+)D)?T(?:([.,\\d]+)H)?(?:([.,\\d]+)M)?(?:([.,\\d]+)S)?/;\n\nexport const parseIdFromUrl = (url: string): number => {\n if (!url) return null;\n\n const parts = url.split('/');\n const idParts = parts.filter((p) => /^\\d+-/.test(p));\n if (idParts.length > 0) {\n const idSlug = idParts[idParts.length - 1];\n return +idSlug.split('-')[0] || null;\n }\n\n // Fallback\n const hasLangPrefix = LANG_PREFIX_REGEX.test(parts[1]);\n const idSlug = parts[hasLangPrefix ? 3 : 2];\n const id = idSlug?.split('-')[0];\n return +id || null;\n};\n\nexport const parseLastIdFromUrl = (url: string): number => {\n if (url) {\n const idSlug = url?.split('/')[3];\n const id = idSlug?.split('-')[0];\n return +id || null;\n } else {\n return null;\n }\n};\n\nconst PAGE_COLORS: Record<string, CSFDColorRating> = {\n 'page-lightgrey': 'unknown',\n 'page-red': 'good',\n 'page-blue': 'average',\n 'page-grey': 'bad'\n};\n\nexport const getColor = (cls: string): CSFDColorRating => {\n return PAGE_COLORS[cls] || 'unknown';\n};\n\nconst RATING_COLORS: Record<CSFDColors, CSFDColorRating> = {\n lightgrey: 'unknown',\n red: 'good',\n blue: 'average',\n grey: 'bad'\n};\n\nexport const parseColor = (quality: CSFDColors): CSFDColorRating => {\n return RATING_COLORS[quality] || 'unknown';\n};\n\nconst FILM_TYPES: Record<string, CSFDFilmTypes> = {\n 'TV film': 'tv-film',\n pořad: 'tv-show',\n seriál: 'series',\n 'divadelní záznam': 'theatrical',\n koncert: 'concert',\n série: 'season',\n 'studentský film': 'student-film',\n 'amatérský film': 'amateur-film',\n 'hudební videoklip': 'music-video',\n epizoda: 'episode',\n 'video kompilace': 'video-compilation',\n film: 'film'\n};\n\nexport const parseFilmType = (type: string): CSFDFilmTypes => {\n return FILM_TYPES[type] || 'film';\n};\n\nexport const addProtocol = (url: string): string => {\n return url.startsWith('//') ? 'https:' + url : url;\n};\n\nexport const getDuration = (matches: RegExpMatchArray) => {\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 matches = iso.match(ISO8601_DURATION_REGEX);\n\n const duration = getDuration(matches);\n\n return +duration.hours * 60 + +duration.minutes;\n};\n\n/**\n * Parses a date string into a standardized YYYY-MM-DD format.\n * Supports:\n * - D.M.YYYY\n * - DD.MM.YYYY\n * - D. M. YYYY\n * - MM/DD/YYYY\n * - YYYY\n */\nexport const parseDate = (date: string): string | null => {\n if (!date) return null;\n\n // Clean the input\n const cleanDate = date.trim();\n\n // Try parsing DD.MM.YYYY or D.M.YYYY with optional spaces\n const dateMatch = cleanDate.match(/^(\\d{1,2})\\.\\s*(\\d{1,2})\\.\\s*(\\d{4})$/);\n if (dateMatch) {\n const day = dateMatch[1].padStart(2, '0');\n const month = dateMatch[2].padStart(2, '0');\n const year = dateMatch[3];\n return `${year}-${month}-${day}`;\n }\n\n // Try parsing MM/DD/YYYY\n const slashMatch = cleanDate.match(/^(\\d{1,2})\\/(\\d{1,2})\\/(\\d{4})$/);\n if (slashMatch) {\n const month = slashMatch[1].padStart(2, '0');\n const day = slashMatch[2].padStart(2, '0');\n const year = slashMatch[3];\n return `${year}-${month}-${day}`;\n }\n\n // Try parsing YYYY\n const yearMatch = cleanDate.match(/^(\\d{4})$/);\n if (yearMatch) {\n return `${yearMatch[1]}-01-01`;\n }\n\n return null;\n};\n\n// Sleep in loop\nexport const sleep = (ms: number) => new Promise((res) => setTimeout(res, ms));\n"],"mappings":";AAGA,MAAM,oBAAoB;AAC1B,MAAM,yBACJ;AAEF,MAAa,kBAAkB,QAAwB;AACrD,KAAI,CAAC,IAAK,QAAO;CAEjB,MAAM,QAAQ,IAAI,MAAM,IAAI;CAC5B,MAAM,UAAU,MAAM,QAAQ,MAAM,QAAQ,KAAK,EAAE,CAAC;AACpD,KAAI,QAAQ,SAAS,EAEnB,QAAO,CADQ,QAAQ,QAAQ,SAAS,GACzB,MAAM,IAAI,CAAC,MAAM;AAOlC,QAAO,CAFQ,MADO,kBAAkB,KAAK,MAAM,GAAG,GACjB,IAAI,IACtB,MAAM,IAAI,CAAC,MAChB;;AAGhB,MAAa,sBAAsB,QAAwB;AACzD,KAAI,IAGF,QAAO,EAFQ,KAAK,MAAM,IAAI,CAAC,KACZ,MAAM,IAAI,CAAC,MAChB;KAEd,QAAO;;AAIX,MAAM,cAA+C;CACnD,kBAAkB;CAClB,YAAY;CACZ,aAAa;CACb,aAAa;CACd;AAED,MAAa,YAAY,QAAiC;AACxD,QAAO,YAAY,QAAQ;;AAG7B,MAAM,gBAAqD;CACzD,WAAW;CACX,KAAK;CACL,MAAM;CACN,MAAM;CACP;AAED,MAAa,cAAc,YAAyC;AAClE,QAAO,cAAc,YAAY;;AAGnC,MAAM,aAA4C;CAChD,WAAW;CACX,OAAO;CACP,QAAQ;CACR,oBAAoB;CACpB,SAAS;CACT,OAAO;CACP,mBAAmB;CACnB,kBAAkB;CAClB,qBAAqB;CACrB,SAAS;CACT,mBAAmB;CACnB,MAAM;CACP;AAED,MAAa,iBAAiB,SAAgC;AAC5D,QAAO,WAAW,SAAS;;AAG7B,MAAa,eAAe,QAAwB;AAClD,QAAO,IAAI,WAAW,KAAK,GAAG,WAAW,MAAM;;AAGjD,MAAa,eAAe,YAA8B;AACxD,QAAO;EACL,MAAM,QAAQ,OAAO,KAAA,IAAY,MAAM;EACvC,OAAO,QAAQ,OAAO,KAAA,IAAY,IAAI,QAAQ;EAC9C,QAAQ,QAAQ,OAAO,KAAA,IAAY,IAAI,QAAQ;EAC/C,OAAO,QAAQ,OAAO,KAAA,IAAY,IAAI,QAAQ;EAC9C,MAAM,QAAQ,OAAO,KAAA,IAAY,IAAI,QAAQ;EAC7C,OAAO,QAAQ,OAAO,KAAA,IAAY,IAAI,QAAQ;EAC9C,SAAS,QAAQ,OAAO,KAAA,IAAY,IAAI,QAAQ;EAChD,SAAS,QAAQ,OAAO,KAAA,IAAY,IAAI,QAAQ;EACjD;;AAGH,MAAa,wBAAwB,QAAwB;CAG3D,MAAM,WAAW,YAFD,IAAI,MAAM,uBAAuB,CAEZ;AAErC,QAAO,CAAC,SAAS,QAAQ,KAAK,CAAC,SAAS;;;;;;;;;;;AAY1C,MAAa,aAAa,SAAgC;AACxD,KAAI,CAAC,KAAM,QAAO;CAGlB,MAAM,YAAY,KAAK,MAAM;CAG7B,MAAM,YAAY,UAAU,MAAM,wCAAwC;AAC1E,KAAI,WAAW;EACb,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,IAAI;EACzC,MAAM,QAAQ,UAAU,GAAG,SAAS,GAAG,IAAI;AAE3C,SAAO,GADM,UAAU,GACR,GAAG,MAAM,GAAG;;CAI7B,MAAM,aAAa,UAAU,MAAM,kCAAkC;AACrE,KAAI,YAAY;EACd,MAAM,QAAQ,WAAW,GAAG,SAAS,GAAG,IAAI;EAC5C,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,IAAI;AAE1C,SAAO,GADM,WAAW,GACT,GAAG,MAAM,GAAG;;CAI7B,MAAM,YAAY,UAAU,MAAM,YAAY;AAC9C,KAAI,UACF,QAAO,GAAG,UAAU,GAAG;AAGzB,QAAO;;AAIT,MAAa,SAAS,OAAe,IAAI,SAAS,QAAQ,WAAW,KAAK,GAAG,CAAC"}
|
package/helpers/global.helper.js
CHANGED
|
@@ -96,14 +96,6 @@ const parseDate = (date) => {
|
|
|
96
96
|
};
|
|
97
97
|
const sleep = (ms) => new Promise((res) => setTimeout(res, ms));
|
|
98
98
|
//#endregion
|
|
99
|
-
|
|
100
|
-
exports.getColor = getColor;
|
|
101
|
-
exports.parseColor = parseColor;
|
|
102
|
-
exports.parseDate = parseDate;
|
|
103
|
-
exports.parseFilmType = parseFilmType;
|
|
104
|
-
exports.parseISO8601Duration = parseISO8601Duration;
|
|
105
|
-
exports.parseIdFromUrl = parseIdFromUrl;
|
|
106
|
-
exports.parseLastIdFromUrl = parseLastIdFromUrl;
|
|
107
|
-
exports.sleep = sleep;
|
|
99
|
+
export { addProtocol, getColor, parseColor, parseDate, parseFilmType, parseISO8601Duration, parseIdFromUrl, parseLastIdFromUrl, sleep };
|
|
108
100
|
|
|
109
101
|
//# sourceMappingURL=global.helper.js.map
|