forked from DebaucheryLibrarian/traxxx
Improved MindGeek actor scraper.
This commit is contained in:
parent
587c111449
commit
85c73bad77
|
@ -22,7 +22,7 @@
|
|||
class="favicon"
|
||||
>
|
||||
<img
|
||||
:src="`/img/logos/${actor.entity.slug}/favicon_dark.png`"
|
||||
:src="`/img/logos/${actor.entity.slug}/favicon_light.png`"
|
||||
class="favicon-icon"
|
||||
>
|
||||
</RouterLink>
|
||||
|
|
|
@ -242,29 +242,22 @@ async function getSession(site, parameters, url) {
|
|||
throw new Error(`Failed to acquire MindGeek session (${res.statusCode})`);
|
||||
}
|
||||
|
||||
function scrapeProfile(data, html, releases = [], networkName) {
|
||||
const { query } = qu.extract(html);
|
||||
|
||||
function scrapeProfile(data, releases = [], networkName) {
|
||||
const profile = {
|
||||
description: data.bio,
|
||||
aliases: data.aliases,
|
||||
aliases: data.aliases.filter(Boolean),
|
||||
};
|
||||
|
||||
profile.gender = data.gender === 'other' ? 'transsexual' : data.gender;
|
||||
profile.measurements = data.measurements;
|
||||
|
||||
if (data.measurements) {
|
||||
const [bust, waist, hip] = data.measurements.split('-');
|
||||
profile.dateOfBirth = qu.parseDate(data.birthday);
|
||||
profile.birthPlace = data.birthPlace;
|
||||
profile.height = inchesToCm(data.height);
|
||||
profile.weight = lbsToKg(data.weight);
|
||||
|
||||
if (profile.gender === 'female') {
|
||||
if (bust) profile.bust = bust.toUpperCase();
|
||||
if (waist) profile.waist = waist;
|
||||
if (hip) profile.hip = hip;
|
||||
}
|
||||
}
|
||||
|
||||
if (data.birthPlace) profile.birthPlace = data.birthPlace;
|
||||
if (data.height) profile.height = inchesToCm(data.height);
|
||||
if (data.weight) profile.weight = lbsToKg(data.weight);
|
||||
profile.hairColor = data.tags.find((tag) => /hair color/i.test(tag.category))?.name;
|
||||
profile.ethnicity = data.tags.find((tag) => /ethnicity/i.test(tag.category))?.name;
|
||||
|
||||
if (data.images.card_main_rect?.[0]) {
|
||||
profile.avatar = data.images.card_main_rect[0].xl?.url
|
||||
|
@ -274,9 +267,6 @@ function scrapeProfile(data, html, releases = [], networkName) {
|
|||
|| data.images.card_main_rect[0].xs?.url;
|
||||
}
|
||||
|
||||
const birthdate = query.all('li').find((el) => /Date of Birth/.test(el.textContent));
|
||||
if (birthdate) profile.birthdate = query.date(birthdate, 'span', 'MMMM Do, YYYY');
|
||||
|
||||
if (data.tags.some((tag) => /boob type/i.test(tag.category) && /natural tits/i.test(tag.name))) {
|
||||
profile.naturalBoobs = true;
|
||||
}
|
||||
|
@ -285,6 +275,14 @@ function scrapeProfile(data, html, releases = [], networkName) {
|
|||
profile.naturalBoobs = false;
|
||||
}
|
||||
|
||||
if (data.tags.some((tag) => /body art/i.test(tag.category) && /tattoo/i.test(tag.name))) {
|
||||
profile.hasTattoos = true;
|
||||
}
|
||||
|
||||
if (data.tags.some((tag) => /body art/i.test(tag.category) && /piercing/i.test(tag.name))) {
|
||||
profile.hasPiercings = true;
|
||||
}
|
||||
|
||||
profile.releases = releases.map((release) => scrapeRelease(release, null, null, networkName));
|
||||
|
||||
return profile;
|
||||
|
@ -377,7 +375,7 @@ async function fetchRelease(url, site, baseScene, options) {
|
|||
return null;
|
||||
}
|
||||
|
||||
async function fetchProfile({ name: actorName, slug: actorSlug }, { entity, parameters }) {
|
||||
async function fetchProfile({ name: actorName }, { entity, parameters }, include) {
|
||||
// const url = `https://www.${networkOrNetworkSlug.slug || networkOrNetworkSlug}.com`;
|
||||
const { session, instanceToken } = await getSession(entity, parameters);
|
||||
|
||||
|
@ -395,31 +393,22 @@ async function fetchProfile({ name: actorName, slug: actorSlug }, { entity, para
|
|||
const actorData = res.body.result.find((actor) => actor.name.toLowerCase() === actorName.toLowerCase());
|
||||
|
||||
if (actorData) {
|
||||
const actorUrl = `https://www.${entity.slug}.com/${entity.parameters?.actorPath || 'model'}/${actorData.id}/${actorSlug}`;
|
||||
const actorReleasesUrl = `https://site-api.project1service.com/v2/releases?actorId=${actorData.id}&limit=100&offset=0&orderBy=-dateReleased&type=scene`;
|
||||
|
||||
const [actorRes, actorReleasesRes] = await Promise.all([
|
||||
http.get(actorUrl, {
|
||||
interval: parameters.interval,
|
||||
concurrency: parameters.concurrency,
|
||||
}),
|
||||
http.get(actorReleasesUrl, {
|
||||
session,
|
||||
interval: parameters.interval,
|
||||
concurrency: parameters.concurrency,
|
||||
headers: {
|
||||
Instance: instanceToken,
|
||||
},
|
||||
}),
|
||||
]);
|
||||
const actorReleasesRes = include.includeActorScenes && await http.get(actorReleasesUrl, {
|
||||
session,
|
||||
interval: parameters.interval,
|
||||
concurrency: parameters.concurrency,
|
||||
headers: {
|
||||
Instance: instanceToken,
|
||||
},
|
||||
});
|
||||
|
||||
if (actorRes.statusCode === 200 && actorReleasesRes.statusCode === 200 && actorReleasesRes.body.result) {
|
||||
return scrapeProfile(actorData, actorRes.body.toString(), actorReleasesRes.body.result, entity.slug);
|
||||
if (actorReleasesRes.statusCode === 200 && actorReleasesRes.body.result) {
|
||||
return scrapeProfile(actorData, actorReleasesRes.body.result, entity.slug);
|
||||
}
|
||||
|
||||
if (actorRes.statusCode === 200) {
|
||||
return scrapeProfile(actorData, actorRes.body.toString(), null, entity.slug);
|
||||
}
|
||||
return scrapeProfile(actorData, [], entity.slug);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue