import { FetchParams, GalleryData } from '@/meta/data'; import axios, { AxiosError } from 'axios'; import * as cheerio from "cheerio"; import { getHeaders } from '@/utils/scrape/common/headers'; import { getXVideosQueryUrl } from './url'; import { Platforms } from '@/meta/settings'; import { getDataFromRedis, storeDataIntoRedis } from '@/redis/client'; import { DEFAULT_XVIDEOS_CONTENT_EXPIRY } from '@/constants/redis'; import { XVIDEOS_BASE_URL } from '@/constants/urls'; export const fetchXVideosGalleryData = async (params?: FetchParams): Promise => { let data: GalleryData[] = []; const reqHeaders = getHeaders(XVIDEOS_BASE_URL) const queryUrl = await getXVideosQueryUrl(params?.query) const cachedData = await getDataFromRedis(queryUrl) if (cachedData) { return cachedData as GalleryData[] } await axios.get(queryUrl, reqHeaders) .then(async response => { const html = response.data; const $ = cheerio.load(html); const thumbs = $(".thumb-block"); thumbs.map((key, thumb) => { const videoUrl = $(thumb).find(".thumb a").attr("href") const imgUrl = $(thumb).find(".thumb img").attr("data-src") const text = $(thumb).find(".thumb-under a").attr("title") videoUrl && imgUrl && text && data.push({ videoUrl, imgUrl, text, platform: Platforms.xvideos }) }) await storeDataIntoRedis(queryUrl, data, DEFAULT_XVIDEOS_CONTENT_EXPIRY); }) .catch((error: AxiosError) => { // handle errors }); return data }