import { RT_URL } from '~/globals/rt-urls'; import { RtElTarget } from '~/models/rt-el-target'; import type { Media, MediaSet } from '@rt_lite/common/models'; export const extractBodyFromPage = (page: string): string => { const start = ']*>/u, ''); }; // eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types export const extractMediaFromFrontPageListItem = (item: HTMLLIElement): Media | null => { const titleSpan = item.querySelector(RtElTarget.TITLE); if (!titleSpan) return null; // eslint-disable-next-line @typescript-eslint/no-non-null-assertion const title = titleSpan.textContent!; const urlLink = item.querySelector('a'); if (!urlLink) return null; const href = urlLink.getAttribute('href'); if (href === null) return null; const url = new URL(href, RT_URL); const movie: Media = { title, url }; const scoreSpan = item.querySelector(RtElTarget.SCORE); if (!scoreSpan) return movie; const score = Number(scoreSpan.textContent?.replace('%', '')); if (isNaN(score)) return movie; return { ...movie, score }; }; // eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types export const extractMediaSetFromFrontPageList = (list: HTMLUListElement): MediaSet | null => { const heading = list.querySelector(RtElTarget.LIST_TITLE); if (!heading) return null; const mediaListItems = [...list.querySelectorAll(RtElTarget.LIST_ITEM)]; if (mediaListItems.length < 1) return null; const { textContent: title } = heading; if (title === null || title.length < 1) return null; const media = mediaListItems // eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types .map(listItem => extractMediaFromFrontPageListItem(listItem)) // eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types .filter(mediaItem => mediaItem !== null) as Media[]; return { title, media }; }; // eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types export const extractMediaFromDynamicListItem = (listItem: HTMLDivElement): Media | null => { const titleEl = listItem.querySelector(RtElTarget.DYNAMIC_LIST_ITEM_TITLE); if (!titleEl) return null; const link = listItem.querySelector(RtElTarget.DYNAMIC_LIST_ITEM_LINK); if (!link) return null; const { textContent: title } = titleEl; if (title === null || title === '') return null; const href = link.getAttribute('href'); if (href === null) return null; const url = new URL(href, RT_URL); const movie: Media = { title, url }; const scoreEl = listItem.querySelector(RtElTarget.DYNAMIC_LIST_ITEM_SCORE); if (!scoreEl) return movie; const scoreString = scoreEl.getAttribute('criticsscore'); if (scoreString === null || scoreString.length === 0) return movie; const score = Number(scoreString); if (isNaN(score)) return movie; return { ...movie, score }; }; // eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types export const extractMediaSetFromDynamicList = (list: HTMLDivElement): MediaSet | null => { const heading = list.querySelector(RtElTarget.DYNAMIC_LIST_TITLE); if (!heading) return null; const mediaListItems = [...list.querySelectorAll(RtElTarget.DYNAMIC_LIST_ITEM)]; if (mediaListItems.length < 1) return null; const { textContent: title } = heading; if (title === null || title.length <= 0) return null; const media = mediaListItems // eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types .map(listItem => extractMediaFromDynamicListItem(listItem)) // eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types .filter(mediaItem => mediaItem !== null) as Media[]; return { title, media }; }; // eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types export const extractMediaSetsFromFrontPageBody = (body: HTMLBodyElement): MediaSet[] => { const frontPageDynamicMovieSets = [...body.querySelectorAll(RtElTarget.FRONT_PAGE_DYNAMIC_LIST)] // eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types .map(list => extractMediaSetFromDynamicList(list)); const frontPageListMovieSets = [...body.querySelectorAll(RtElTarget.FRONT_PAGE_MOVIE_LIST)] // eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types .map(list => extractMediaSetFromFrontPageList(list)); return [...frontPageDynamicMovieSets, ...frontPageListMovieSets] // eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types .filter(movieSet => movieSet !== null) as MediaSet[]; };