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[];
};