'use strict'; const { get, initAll } = require('../utils/qu'); function scrapeLatest(scenes, dates, site) { return scenes.map(({ qu }, index) => { const release = {}; const path = qu.url('a[href*="videos/"]'); if (path) { if (/\.wmv$/.test(path)) { release.trailer = `${site.url}/visitors/${path}`; } else { release.url = `${site.url}/visitors/${path}`; } } if (dates && dates[index]) { release.date = dates[index].qu.date(null, 'MM/DD/YYYY'); } // release.entryId = release.date ? `${formatDate(release.date, 'YYYY-MM-DD')}-${entryId}` : entryId; release.entryId = path?.match(/videos\/([a-zA-Z0-9]+)(?:_hd)?_trailer/)?.[1] || qu.img('img[src*="graphics/fft"]')?.match(/fft_(\w+).gif/)?.[1]; release.description = qu.q('tbody tr:nth-child(3) font', true); const infoLine = qu.q('font[color="#663366"]', true); if (infoLine) { release.duration = Number(infoLine.match(/(\d+) min/i)?.[1] || infoLine.match(/video: (\d+)/i)?.[1]) * 60 || null; } const poster = qu.img('img[src*="photos/"][width="400"]'); release.poster = `${site.url}/visitors/${poster}`; release.photos = qu.imgs('img[src*="photos/"]:not([width="400"])').map((source) => `${site.url}/visitors/${source}`); return release; }); } function scrapeScene({ qu }, url, site) { const release = { url }; const { pathname } = new URL(url); release.entryId = pathname?.match(/videos\/([a-zA-Z0-9]+)(?:_hd)?_trailer/)?.[1]; if (/\.wmv$/.test(pathname)) { release.trailer = url; return release; } const actor = qu.q('font[color="#990033"] strong', true); release.actors = [actor]; const hdTrailer = qu.url('a[href*="hd_trailer.mp4"]'); const sdTrailer = qu.url('a[href*="hd_trailer_mobile.mp4"]'); release.trailer = [ { src: `${site.url}/visitors/videos/${hdTrailer}`, quality: 1080, }, { src: `${site.url}/visitors/videos/${sdTrailer}`, quality: 270, }, ]; return release; } async function fetchLatest(site, page = 1) { const url = `https://jesseloadsmonsterfacials.com/visitors/tour_${page.toString().padStart(2, '0')}.html`; const res = await get(url); if (!res.ok) { return res.status; } const { el } = res.item; const scenes = initAll(el, 'table[width="880"]'); const dates = initAll(el, 'font[color="#000000"] strong:not(:empty)'); return scrapeLatest(scenes, dates, site); } async function fetchScene(url, site) { const res = await get(url); if (res.ok) { return scrapeScene(res.item, url, site); } return res.status; } module.exports = { fetchLatest, fetchScene, };