'use strict'; const unprint = require('unprint'); const slugify = require('../utils/slugify'); function scrapeAll(scenes) { return scenes.map(({ query }) => { const release = {}; release.url = query.url('.photo-thumb_body > a'); release.entryId = new URL(release.url).pathname.match(/\/trailers\/([\w-]+).html/)[1].toLowerCase(); release.title = query.content('.thumb-title'); release.actors = query.all('.model-name a').map((actorEl) => ({ name: unprint.query.content(actorEl), url: unprint.query.url(actorEl, null), })); release.poster = Array.from({ length: 4 }, (item, index) => query.img('img.mainThumb', { attribute: `src0_${4 - index}x` })); return release; }); } function scrapeScene({ query, html }, { url, entity }) { const release = {}; release.entryId = new URL(url).pathname.match(/\/trailers\/([\w-]+).html/)[1].toLowerCase(); release.title = query.content('.raiting-section__title'); release.description = query.contents('p.text, p.text ~ p').map((p) => p.trim()).join('\n\n'); release.date = query.date('.dvd-scenes__data', 'MM/DD/YYYY'); release.duration = query.duration('.dvd-scenes__data'); release.actors = query.all('.dvd-scenes__data a[href*="/models"]').map((actorEl) => ({ name: unprint.query.content(actorEl), url: unprint.query.url(actorEl, null), })); release.tags = query.contents('.dvd-scenes__data a[href*="/categories"]'); release.poster = Array.from({ length: 4 }, (item, index) => query.img('img.update_thumb', { attribute: `src0_${4 - index}x` })); release.trailer = unprint.prefixUrl(html.match(/src="(\/trailers\/\w+\.mp4)"/)?.[1], entity.url); return release; } function scrapeProfile({ query }) { const profile = {}; profile.description = query.contents('p.text, p.text ~ p')?.map((p) => p.trim()).join('\n\n'); profile.avatar = Array.from({ length: 3 }, (item, index) => query.img('.bio-img img', { attribute: `src0_${3 - index}x` })); return profile; } async function fetchLatest(channel, page = 1) { const url = `${channel.url}/tour/categories/movies_${page}_d.html`; const res = await unprint.get(url, { selectAll: '.tab-content .video-thumb' }); if (res.ok) { return scrapeAll(res.context, channel); } return res.status; } async function fetchProfile({ name }, entity) { const res = await unprint.get(`${entity.url}/tour/models/${name.replace(/\s+/, '')}.html`); if (res.ok) { return scrapeProfile(res.context, entity); } const slugRes = await unprint.get(`${entity.url}/tour/models/${slugify(name, '-')}.html`); if (slugRes.ok) { return scrapeProfile(slugRes.context, entity); } return slugRes.status; } module.exports = { fetchLatest, fetchProfile, scrapeScene, };