forked from DebaucheryLibrarian/traxxx
92 lines
2.6 KiB
JavaScript
92 lines
2.6 KiB
JavaScript
'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,
|
|
};
|