node-csfd-api
Version:
ČSFD API in JavaScript. Amazing NPM library for scrapping csfd.cz :)
1 lines • 7.39 kB
Source Map (JSON)
{"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\n // Reverse loop to find the ID slug efficiently without allocating intermediate arrays\n for (let i = parts.length - 1; i >= 0; i--) {\n const p = parts[i];\n if (/^\\d+-/.test(p)) {\n return +p.split('-')[0] || null;\n }\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\n/**\n * Extracts a numeric ID from a number, string, slug, or full URL.\n * Designed for Developer Experience (DX) to allow flexible inputs.\n */\nexport const extractId = (idOrUrl: number | string): number | null => {\n if (typeof idOrUrl === 'number') {\n return isNaN(idOrUrl) ? null : idOrUrl;\n }\n\n if (typeof idOrUrl === 'string') {\n // Pure number string\n if (/^\\d+$/.test(idOrUrl)) {\n return Number(idOrUrl);\n }\n // Direct slug with ID prefix (e.g. \"228329-avatar\")\n if (/^\\d+-/.test(idOrUrl)) {\n return +idOrUrl.split('-')[0] || null;\n }\n // Fallback to URL parsing\n return parseIdFromUrl(idOrUrl);\n }\n\n return 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;CACrD,IAAI,CAAC,KAAK,OAAO;CAEjB,MAAM,QAAQ,IAAI,MAAM,GAAG;CAG3B,KAAK,IAAI,IAAI,MAAM,SAAS,GAAG,KAAK,GAAG,KAAK;EAC1C,MAAM,IAAI,MAAM;EAChB,IAAI,QAAQ,KAAK,CAAC,GAChB,OAAO,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,MAAM;CAE/B;CAMA,OAAO,CAFQ,MADO,kBAAkB,KAAK,MAAM,EAClB,IAAI,IAAI,EACxB,EAAE,MAAM,GAAG,CAAC,CAAC,MAChB;AAChB;;;;;AAMA,MAAa,aAAa,YAA4C;CACpE,IAAI,OAAO,YAAY,UACrB,OAAO,MAAM,OAAO,IAAI,OAAO;CAGjC,IAAI,OAAO,YAAY,UAAU;EAE/B,IAAI,QAAQ,KAAK,OAAO,GACtB,OAAO,OAAO,OAAO;EAGvB,IAAI,QAAQ,KAAK,OAAO,GACtB,OAAO,CAAC,QAAQ,MAAM,GAAG,CAAC,CAAC,MAAM;EAGnC,OAAO,eAAe,OAAO;CAC/B;CAEA,OAAO;AACT;AAEA,MAAa,sBAAsB,QAAwB;CACzD,IAAI,KAGF,OAAO,EAFQ,KAAK,MAAM,GAAG,CAAC,CAAC,EAAE,GACd,MAAM,GAAG,CAAC,CAAC,MAChB;MAEd,OAAO;AAEX;AAEA,MAAM,cAA+C;CACnD,kBAAkB;CAClB,YAAY;CACZ,aAAa;CACb,aAAa;AACf;AAEA,MAAa,YAAY,QAAiC;CACxD,OAAO,YAAY,QAAQ;AAC7B;AAEA,MAAM,gBAAqD;CACzD,WAAW;CACX,KAAK;CACL,MAAM;CACN,MAAM;AACR;AAEA,MAAa,cAAc,YAAyC;CAClE,OAAO,cAAc,YAAY;AACnC;AAEA,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;AACR;AAEA,MAAa,iBAAiB,SAAgC;CAC5D,OAAO,WAAW,SAAS;AAC7B;AAEA,MAAa,eAAe,QAAwB;CAClD,OAAO,IAAI,WAAW,IAAI,IAAI,WAAW,MAAM;AACjD;AAEA,MAAa,eAAe,YAA8B;CACxD,OAAO;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;CAClD;AACF;AAEA,MAAa,wBAAwB,QAAwB;CAG3D,MAAM,WAAW,YAFD,IAAI,MAAM,sBAES,CAAC;CAEpC,OAAO,CAAC,SAAS,QAAQ,KAAK,CAAC,SAAS;AAC1C;;;;;;;;;;AAWA,MAAa,aAAa,SAAgC;CACxD,IAAI,CAAC,MAAM,OAAO;CAGlB,MAAM,YAAY,KAAK,KAAK;CAG5B,MAAM,YAAY,UAAU,MAAM,uCAAuC;CACzE,IAAI,WAAW;EACb,MAAM,MAAM,UAAU,EAAE,CAAC,SAAS,GAAG,GAAG;EACxC,MAAM,QAAQ,UAAU,EAAE,CAAC,SAAS,GAAG,GAAG;EAE1C,OAAO,GADM,UAAU,GACR,GAAG,MAAM,GAAG;CAC7B;CAGA,MAAM,aAAa,UAAU,MAAM,iCAAiC;CACpE,IAAI,YAAY;EACd,MAAM,QAAQ,WAAW,EAAE,CAAC,SAAS,GAAG,GAAG;EAC3C,MAAM,MAAM,WAAW,EAAE,CAAC,SAAS,GAAG,GAAG;EAEzC,OAAO,GADM,WAAW,GACT,GAAG,MAAM,GAAG;CAC7B;CAGA,MAAM,YAAY,UAAU,MAAM,WAAW;CAC7C,IAAI,WACF,OAAO,GAAG,UAAU,GAAG;CAGzB,OAAO;AACT;AAGA,MAAa,SAAS,OAAe,IAAI,SAAS,QAAQ,WAAW,KAAK,EAAE,CAAC"}