UNPKG

node-csfd-api

Version:

ČSFD API in JavaScript. Amazing NPM library for scrapping csfd.cz :)

125 lines (124 loc) 3.89 kB
//#region src/helpers/global.helper.ts const LANG_PREFIX_REGEX = /^[a-z]{2,3}$/; const ISO8601_DURATION_REGEX = /(-)?P(?:([.,\d]+)Y)?(?:([.,\d]+)M)?(?:([.,\d]+)W)?(?:([.,\d]+)D)?T(?:([.,\d]+)H)?(?:([.,\d]+)M)?(?:([.,\d]+)S)?/; const parseIdFromUrl = (url) => { if (!url) return null; const parts = url.split("/"); for (let i = parts.length - 1; i >= 0; i--) { const p = parts[i]; if (/^\d+-/.test(p)) return +p.split("-")[0] || null; } return +parts[LANG_PREFIX_REGEX.test(parts[1]) ? 3 : 2]?.split("-")[0] || null; }; /** * Extracts a numeric ID from a number, string, slug, or full URL. * Designed for Developer Experience (DX) to allow flexible inputs. */ const extractId = (idOrUrl) => { if (typeof idOrUrl === "number") return isNaN(idOrUrl) ? null : idOrUrl; if (typeof idOrUrl === "string") { if (/^\d+$/.test(idOrUrl)) return Number(idOrUrl); if (/^\d+-/.test(idOrUrl)) return +idOrUrl.split("-")[0] || null; return parseIdFromUrl(idOrUrl); } return null; }; const parseLastIdFromUrl = (url) => { if (url) return +(url?.split("/")[3])?.split("-")[0] || null; else return null; }; const PAGE_COLORS = { "page-lightgrey": "unknown", "page-red": "good", "page-blue": "average", "page-grey": "bad" }; const getColor = (cls) => { return PAGE_COLORS[cls] || "unknown"; }; const RATING_COLORS = { lightgrey: "unknown", red: "good", blue: "average", grey: "bad" }; const parseColor = (quality) => { return RATING_COLORS[quality] || "unknown"; }; const FILM_TYPES = { "TV film": "tv-film", pořad: "tv-show", seriál: "series", "divadelní záznam": "theatrical", koncert: "concert", série: "season", "studentský film": "student-film", "amatérský film": "amateur-film", "hudební videoklip": "music-video", epizoda: "episode", "video kompilace": "video-compilation", film: "film" }; const parseFilmType = (type) => { return FILM_TYPES[type] || "film"; }; const addProtocol = (url) => { return url.startsWith("//") ? "https:" + url : url; }; const getDuration = (matches) => { return { sign: matches[1] === void 0 ? "+" : "-", years: matches[2] === void 0 ? 0 : matches[2], months: matches[3] === void 0 ? 0 : matches[3], weeks: matches[4] === void 0 ? 0 : matches[4], days: matches[5] === void 0 ? 0 : matches[5], hours: matches[6] === void 0 ? 0 : matches[6], minutes: matches[7] === void 0 ? 0 : matches[7], seconds: matches[8] === void 0 ? 0 : matches[8] }; }; const parseISO8601Duration = (iso) => { const duration = getDuration(iso.match(ISO8601_DURATION_REGEX)); return +duration.hours * 60 + +duration.minutes; }; /** * Parses a date string into a standardized YYYY-MM-DD format. * Supports: * - D.M.YYYY * - DD.MM.YYYY * - D. M. YYYY * - MM/DD/YYYY * - YYYY */ const parseDate = (date) => { if (!date) return null; const cleanDate = date.trim(); const dateMatch = cleanDate.match(/^(\d{1,2})\.\s*(\d{1,2})\.\s*(\d{4})$/); if (dateMatch) { const day = dateMatch[1].padStart(2, "0"); const month = dateMatch[2].padStart(2, "0"); return `${dateMatch[3]}-${month}-${day}`; } const slashMatch = cleanDate.match(/^(\d{1,2})\/(\d{1,2})\/(\d{4})$/); if (slashMatch) { const month = slashMatch[1].padStart(2, "0"); const day = slashMatch[2].padStart(2, "0"); return `${slashMatch[3]}-${month}-${day}`; } const yearMatch = cleanDate.match(/^(\d{4})$/); if (yearMatch) return `${yearMatch[1]}-01-01`; return null; }; const sleep = (ms) => new Promise((res) => setTimeout(res, ms)); //#endregion exports.addProtocol = addProtocol; exports.extractId = extractId; exports.getColor = getColor; exports.parseColor = parseColor; exports.parseDate = parseDate; exports.parseFilmType = parseFilmType; exports.parseISO8601Duration = parseISO8601Duration; exports.parseIdFromUrl = parseIdFromUrl; exports.parseLastIdFromUrl = parseLastIdFromUrl; exports.sleep = sleep; //# sourceMappingURL=global.helper.cjs.map