{"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  // Optimization: Use querySelector instead of querySelectorAll(...)[0]\n  const filmNodes = el?.querySelector('.updated-box')?.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,GAAG,KAAK,CAAC;CACxD,MAAM,OAAO,QAAQ,QAAQ,SAAS;CACtC,OAAOA,sBAAAA,WAAW,IAAI;AACxB;AAEA,MAAa,gBAAgB,QAAkD;CAC7E,OAAO,MAAMC,sBAAAA,eAAe,GAAG,IAAI;AACrC;AAEA,MAAa,kBAAkB,OAA0C;CAEvE,QADW,IAAI,cAAc,IAAI,CAAC,GACvB,WAAW,KAAK,KAAK;AAClC;AAEA,MAAa,0BACX,OACiE;CACjE,MAAM,YAAY,IAAI,cAAc,4BAA4B;CAChE,MAAM,OAAO,WAAW,UAAU,KAAK;CACvC,MAAM,gBAAgB,WAAW,cAAc,aAAa,CAAC,EAAE,UAAU,KAAK;CAC9E,MAAM,SAAS,WAAW,cAAc,OAAO,CAAC,EAAE,UAAU,KAAK;CAEjE,IAAI,WAA0B;CAE9B,IAAI,MAAM;EAER,MAAM,cADQ,KAAK,MAAM,IACD,CAAC,CAAC,MAAM,MAAM,EAAE,SAAS,MAAM,CAAC;EACxD,WAAW,cAAcC,sBAAAA,UAAU,cAAc,WAAW,CAAC,IAAI;CACnE;CAEA,MAAM,MAAM,SAAS,CAAC,SAAS,MAAM,IAAI;CACzC,MAAM,aAAa,gBAAgB,gBAAgB,aAAa,IAAI;CACpE,OAAO;EAAE;EAAU;EAAK;CAAW;AACrC;AAEA,MAAa,iBAAiB,OAA0C;CAGtE,QAFU,IAAI,cAAc,oBAAoB,CAAC,GAChC,MAAM,KAAK,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,EAAE,EAAE,KAAK,KACnC;AAClB;AAEA,MAAa,mBAAmB,OAA0C;CACxE,MAAM,MAAM,IAAI,cAAc,KAAK,CAAC,EAAE,aAAa,KAAK;CACxD,OAAO,MAAMC,sBAAAA,YAAY,GAAG,IAAI;AAClC;AAEA,MAAM,iBAAiB,SAAyB,KAAK,QAAQ,UAAU,EAAE,CAAC,CAAC,KAAK;AAEhF,MAAM,YAAY,SAAgC;CAChD,MAAM,SAAS,KAAK,QAAQ,UAAU,EAAE;CACxC,OAAO,SAAS,OAAO,MAAM,IAAI;AACnC;AAEA,MAAM,mBAAmB,SAAyB,KAAK,KAAK,CAAC,CAAC,QAAQ,SAAS,EAAE,CAAC,CAAC,KAAK;AAExF,MAAa,mBAAmB,OAAmD;CAEjF,MAAM,YAAY,IAAI,cAAc,cAAc,CAAC,EAAE,iBAAiB,UAAU,KAAK,CAAC;CACtF,IAAI,YAA2B;CAsB/B,OApBc,UAAU,KAAK,aAAa;EACxC,MAAM,KAAK,aAAa,SAAS,cAAc,0BAA0B,CAAC,EAAE,YAAY,IAAI;EAC5F,MAAM,QAAQ,SAAS,cAAc,OAAO,CAAC,EAAE,MAAM,KAAK;EAC1D,MAAM,WAAW,SAAS,cAAc,OAAO,CAAC,EAAE,MAAM,KAAK;EAC7D,MAAM,OAAO,WAAW,CAAC,WAAW;EACpC,MAAM,cAAc,sBAAsB,SAAS,cAAc,aAAa,CAAC;EAG/E,IAAI,OAAO,SAAS,YAAY,CAAC,MAAM,IAAI,GACzC,YAAY,CAAC;EAGf,MAAM,YAAY,QAAQ;EAC1B,IAAI,MAAM,QAAQ,SAAS,aAAa,MACtC,OAAO;GAAE;GAAI;GAAO,MAAM;GAAW;EAAY;EAEnD,OAAO;CACT,CAEwB,CAAC,CAAC,OAAO,OAChB;AACnB"}