forked from DebaucheryLibrarian/traxxx
97 lines
2.5 KiB
JavaScript
97 lines
2.5 KiB
JavaScript
'use strict';
|
|
|
|
const { JSDOM } = require('jsdom');
|
|
const moment = require('moment');
|
|
|
|
const http = require('../utils/http');
|
|
|
|
function scrapeProfile(html, actorName) {
|
|
const { document } = new JSDOM(html).window;
|
|
const profile = { name: actorName };
|
|
|
|
const bio = Array.from(document.querySelectorAll('a[href^="/babes"]'), el => decodeURI(el.href)).reduce((acc, item) => {
|
|
const keyMatch = item.match(/\[\w+\]/);
|
|
|
|
if (keyMatch) {
|
|
const key = keyMatch[0].slice(1, -1);
|
|
const [, value] = item.split('=');
|
|
|
|
// both hip and waist link to 'waist', assume biggest value is hip
|
|
if (key === 'waist' && acc.waist) {
|
|
if (acc.waist > value) {
|
|
acc.hip = acc.waist;
|
|
acc.waist = value;
|
|
|
|
return acc;
|
|
}
|
|
|
|
acc.hip = value;
|
|
|
|
return acc;
|
|
}
|
|
|
|
acc[key] = value;
|
|
}
|
|
|
|
return acc;
|
|
}, {});
|
|
|
|
if (bio.dateOfBirth) profile.birthdate = moment.utc(bio.dateOfBirth, 'YYYY-MM-DD').toDate();
|
|
|
|
if (profile.placeOfBirth && bio.country) profile.birthPlace = `${bio.placeOfBirth}, ${bio.country}`;
|
|
else if (bio.country) profile.birthPlace = bio.country;
|
|
|
|
profile.eyes = bio.eyeColor;
|
|
profile.hair = bio.hairColor;
|
|
profile.ethnicity = bio.ethnicity;
|
|
|
|
profile.bust = bio.bra;
|
|
if (bio.waist) profile.waist = Number(bio.waist.split(',')[0]);
|
|
if (bio.hip) profile.hip = Number(bio.hip.split(',')[0]);
|
|
|
|
if (bio.height) profile.height = Number(bio.height.split(',')[0]);
|
|
if (bio.weight) profile.weight = Number(bio.weight.split(',')[0]);
|
|
|
|
profile.social = Array.from(document.querySelectorAll('.profile-meta-item a.social-icons'), el => el.href);
|
|
|
|
const avatar = document.querySelector('.profile-image-large img').src;
|
|
if (!avatar.match('placeholder')) profile.avatar = { src: avatar, credit: null };
|
|
|
|
return profile;
|
|
}
|
|
|
|
function scrapeSearch(html) {
|
|
const { document } = new JSDOM(html).window;
|
|
|
|
return document.querySelector('a.image-link')?.href || null;
|
|
}
|
|
|
|
async function fetchProfile({ name: actorName }) {
|
|
const actorSlug = actorName.toLowerCase().replace(/\s+/g, '-');
|
|
|
|
const res = await http.get(`https://freeones.nl/${actorSlug}/profile`);
|
|
|
|
if (res.statusCode === 200) {
|
|
return scrapeProfile(res.body.toString(), actorName);
|
|
}
|
|
|
|
const searchRes = await http.get(`https://freeones.nl/babes?q=${actorName}`);
|
|
const actorPath = scrapeSearch(searchRes.body.toString());
|
|
|
|
if (actorPath) {
|
|
const actorRes = await http.get(`https://freeones.nl${actorPath}/profile`);
|
|
|
|
if (actorRes.statusCode === 200) {
|
|
return scrapeProfile(actorRes.body.toString(), actorName);
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
module.exports = {
|
|
fetchProfile,
|
|
};
|