node-csfd-api
Version:
ČSFD API in JavaScript. Amazing NPM library for scrapping csfd.cz :)
1 lines • 5.51 kB
Source Map (JSON)
{"version":3,"file":"cinema.helper.mjs","names":["classes: string[]","metaConvert: CSFDCinemaMeta[]"],"sources":["../../src/helpers/cinema.helper.ts"],"sourcesContent":["import { HTMLElement } from 'node-html-parser';\nimport { 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,MAAMA,UAAoB,IAAI,WAAW,MAAM,IAAI,IAAI,EAAE;CACzD,MAAM,OAAO,QAAQ,SAAS,QAAQ,QAAQ,SAAS,KAAK;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,MAAMC,cAAgC,EAAE;AAExC,MAAK,MAAM,WAAW,KACpB,KAAI,YAAY,IACd,aAAY,KAAK,YAAY;UACpB,YAAY,IACrB,aAAY,KAAK,UAAU;KAE3B,aAAY,KAAK,QAAQ;AAI7B,QAAO"}