'use strict'; const unprint = require('unprint'); function scrapeAll(scenes) { return scenes.map(({ query }) => { if (query.exists('.crowdfunding-post')) { return null; } const release = {}; release.url = query.url('a'); release.entryId = new URL(release.url).pathname.split('/')[1]; release.title = query.content('.allvideostitle p, .allvideostitle h2'); release.actors = query.all('.tagsmodels a').map((actorEl) => ({ name: unprint.query.content(actorEl), url: unprint.query.url(actorEl, null), })); release.poster = query.sourceSet('.vidcont .attachment-thumbnail') || query.sourceSet('.vidcont .attachment-thumbnail', 'nitro-lazy-srcset'); release.teaser = query.video('.vidcont video', { attribute: 'data-src' }); console.log(release); return release; }).filter(Boolean); } async function fetchLatest(channel, page = 1) { const url = new URL(channel.url).pathname.includes('/projects') ? `${channel.url}/page/${page}/` : `${channel.url}/all-videos/page/${page}/`; // const res = await unprint.get(url, { selectAll: '.catposts > div:not(.clearfix):not(.flexcont)' }); const res = await unprint.get(url, { selectAll: '.catposts div[class*="post-id"], .catposts .half' }); if (res.ok) { return scrapeAll(res.context, channel); } return res.status; } function scrapeScene({ query }, { url }) { const release = {}; release.entryId = new URL(url).pathname.split('/')[1]; release.title = query.content('.title-fav h1'); release.description = query.contents('.description #fullstory, .title-fav .cont > p').join(' ') || query.attribute('meta[property="og:description"]', 'content')?.replace('[…]', '').replace(/\s*read more.*/i, '...'); // html description difficult to extract release.date = query.date('.datesingle', 'MMMM D, YYYY') || query.date('meta[property="article:published_time"]', 'YYYY-MM-DDTHH:mm:ss', { attribute: 'content' }); release.duration = query.duration('.cont .duration, .durationandtime .duration'); release.actors = query.all('.cont .tagsmodels:not(.director) a, .title-fav .tagsmodels:not(.director) a').map((actorEl) => ({ name: unprint.query.content(actorEl), url: unprint.query.url(actorEl, null), })); release.directors = query.contents('.cont .director a'); release.tags = query.contents('.post-categories a'); release.poster = [ query.img('.preview .attachment-full'), query.img('meta[property="og:image"]', { attribute: 'content' }), ].filter(Boolean); release.caps = query.all('.gallery a').map((photoEl) => Array.from(new Set([ unprint.query.url(photoEl, null), unprint.query.img(photoEl), ...unprint.query.sourceSet(photoEl, 'img') || [], ...unprint.query.sourceSet(photoEl, 'img', 'nitro-lazy-srcset') || [], ])).filter(Boolean)); const trailer = query.video('.preview video'); if (trailer) { release.trailer = { src: trailer, referer: url, expectType: { 'binary/octet-stream': 'video/mp4', }, }; } console.log(release); return release; } module.exports = { fetchLatest, scrapeScene, };