Added Rave Bunnys and Hot and Tatted to Hussie Pass, improved scraper. Only looking for one valid avatar URL in profile tests.
This commit is contained in:
@@ -963,6 +963,11 @@ const tags = [
|
|||||||
slug: 'pyjamas',
|
slug: 'pyjamas',
|
||||||
group: 'clothing',
|
group: 'clothing',
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: 'rave',
|
||||||
|
slug: 'rave',
|
||||||
|
group: 'clothing',
|
||||||
|
},
|
||||||
{
|
{
|
||||||
name: 'redhead',
|
name: 'redhead',
|
||||||
slug: 'redhead',
|
slug: 'redhead',
|
||||||
|
|||||||
@@ -5580,6 +5580,20 @@ const sites = [
|
|||||||
profile: 'https://www.povpornstars.com/tour/models/{actor}.html',
|
profile: 'https://www.povpornstars.com/tour/models/{actor}.html',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
slug: 'ravebunnys',
|
||||||
|
name: 'Rave Bunnys',
|
||||||
|
url: 'https://ravebunnys.com',
|
||||||
|
tags: ['rave'],
|
||||||
|
parent: 'hussiepass',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
slug: 'hotandtatted',
|
||||||
|
name: 'Hot and Tatted',
|
||||||
|
url: 'https://hotandtatted.com',
|
||||||
|
tags: ['tattoos'],
|
||||||
|
parent: 'hussiepass',
|
||||||
|
},
|
||||||
// HUSH PASS
|
// HUSH PASS
|
||||||
{
|
{
|
||||||
slug: 'shotherfirst',
|
slug: 'shotherfirst',
|
||||||
|
|||||||
@@ -148,6 +148,8 @@ module.exports = {
|
|||||||
interracialpovs: hush,
|
interracialpovs: hush,
|
||||||
povpornstars: hush,
|
povpornstars: hush,
|
||||||
seehimfuck: hush,
|
seehimfuck: hush,
|
||||||
|
ravebunnys: hush,
|
||||||
|
hotandtatted: hush,
|
||||||
// wankzvr
|
// wankzvr
|
||||||
wankzvr,
|
wankzvr,
|
||||||
tranzvr: wankzvr,
|
tranzvr: wankzvr,
|
||||||
|
|||||||
@@ -145,7 +145,10 @@ function scrapeScene({ html, query }, channel, url) {
|
|||||||
release.date = query.date('.videoInfo p', ['MM/DD/YYYY', 'YYYY-MM-DD']);
|
release.date = query.date('.videoInfo p', ['MM/DD/YYYY', 'YYYY-MM-DD']);
|
||||||
release.duration = Number(query.content('.videoInfo p:nth-of-type(2)')?.match(/(\d+) min/i)?.[1]) * 60;
|
release.duration = Number(query.content('.videoInfo p:nth-of-type(2)')?.match(/(\d+) min/i)?.[1]) * 60;
|
||||||
|
|
||||||
release.actors = query.contents('.update_models a');
|
release.actors = query.all('.update_models a').map((actorEl) => ({
|
||||||
|
name: unprint.query.content(actorEl),
|
||||||
|
url: unprint.query.url(actorEl, null, { origin: channel.origin }),
|
||||||
|
}));
|
||||||
|
|
||||||
const posterPath = html.match(/poster="([\w-/.]+)"/)?.[1];
|
const posterPath = html.match(/poster="([\w-/.]+)"/)?.[1];
|
||||||
const poster = unprint.prefixUrl(posterPath, channel.url) || query.img('.update_thumb', 'src0_1x', { origin: channel.url }); // latter used when trailer requires signup
|
const poster = unprint.prefixUrl(posterPath, channel.url) || query.img('.update_thumb', 'src0_1x', { origin: channel.url }); // latter used when trailer requires signup
|
||||||
@@ -182,6 +185,7 @@ function scrapeSceneT1({ html, query }, site, url, baseRelease) {
|
|||||||
|
|
||||||
release.actors = query.all('.models-list-thumbs a').map((el) => ({
|
release.actors = query.all('.models-list-thumbs a').map((el) => ({
|
||||||
name: unprint.query.content(el, 'span'),
|
name: unprint.query.content(el, 'span'),
|
||||||
|
url: unprint.query.url(el, null),
|
||||||
avatar: getImageWithFallbacks(query, 'img', site, el),
|
avatar: getImageWithFallbacks(query, 'img', site, el),
|
||||||
}));
|
}));
|
||||||
|
|
||||||
@@ -264,9 +268,9 @@ async function scrapeProfile({ query }, url, channel, options) {
|
|||||||
|
|
||||||
if (bio.ethnicity) profile.ethnicity = bio.ethnicity;
|
if (bio.ethnicity) profile.ethnicity = bio.ethnicity;
|
||||||
|
|
||||||
if (bio.height) profile.height = Number(bio.height.match(/^\d{2,3}/)?.[0]);
|
if (bio.height) profile.height = convert(bio.height, 'cm');
|
||||||
if (bio.weight) profile.weight = Number(bio.weight.match(/^\d{2,3}/)?.[0]);
|
if (bio.weight) profile.weight = convert(bio.weight.match(/(\d+)\s*lb/i)?.[1], 'lb', 'kg');
|
||||||
if (bio.shoe_size) profile.foot = Number(bio.shoe_size);
|
if (bio.shoe_size && !/unknown/i.test(bio.shoe_size)) profile.foot = unprint.extractNumber(bio.shoe_size);
|
||||||
|
|
||||||
profile.measurements = bio.measurements;
|
profile.measurements = bio.measurements;
|
||||||
|
|
||||||
@@ -283,7 +287,7 @@ async function scrapeProfile({ query }, url, channel, options) {
|
|||||||
if (bio.piercings && /(yes)|(some)|(many)/i.test(bio.piercings)) profile.hasPiercings = true;
|
if (bio.piercings && /(yes)|(some)|(many)/i.test(bio.piercings)) profile.hasPiercings = true;
|
||||||
if (bio.piercings && /no/i.test(bio.piercings)) profile.hasPiercings = false;
|
if (bio.piercings && /no/i.test(bio.piercings)) profile.hasPiercings = false;
|
||||||
|
|
||||||
if (bio.aliases) profile.aliases = bio.aliases.split(',').map((alias) => alias.trim());
|
if (bio.aliases) profile.aliases = bio.aliases.split(',').map((alias) => alias.trim()).filter((alias) => !/known/i.test(alias)); // filter out "No known aliases"
|
||||||
|
|
||||||
profile.socials = [bio.onlyfans, bio.twitter, bio.instagram, bio.domain].filter(Boolean);
|
profile.socials = [bio.onlyfans, bio.twitter, bio.instagram, bio.domain].filter(Boolean);
|
||||||
|
|
||||||
@@ -338,21 +342,22 @@ function scrapeProfileT1({ query }, url, site) {
|
|||||||
return profile;
|
return profile;
|
||||||
}
|
}
|
||||||
|
|
||||||
async function fetchProfile({ name: actorName }, { channel }, options) {
|
async function fetchProfile({ name: actorName, url: actorUrl }, { channel }, options) {
|
||||||
const actorSlugA = slugify(actorName, '', { lower: false });
|
const actorSlugA = slugify(actorName, '', { lower: false });
|
||||||
const actorSlugB = slugify(actorName);
|
const actorSlugB = slugify(actorName);
|
||||||
|
|
||||||
const t1 = channel.parameters?.t1 ? 't1/' : '';
|
const t1 = channel.parameters?.t1 ? 't1/' : '';
|
||||||
|
|
||||||
const { res, url } = channel.parameters?.profile
|
const { res, url } = await tryUrls([
|
||||||
? await tryUrls([
|
actorUrl,
|
||||||
|
...channel.parameters?.profile ? [
|
||||||
format(channel.parameters.profile, { actor: actorSlugA }),
|
format(channel.parameters.profile, { actor: actorSlugA }),
|
||||||
format(channel.parameters.profile, { actor: actorSlugB }),
|
format(channel.parameters.profile, { actor: actorSlugB }),
|
||||||
], { followRedirects: false })
|
] : [
|
||||||
: await tryUrls([
|
|
||||||
`${channel.url}/${t1}models/${actorSlugA}.html`,
|
`${channel.url}/${t1}models/${actorSlugA}.html`,
|
||||||
`${channel.url}/${t1}models/${actorSlugB}.html`,
|
`${channel.url}/${t1}models/${actorSlugB}.html`,
|
||||||
], { followRedirects: false });
|
],
|
||||||
|
], { followRedirects: false });
|
||||||
|
|
||||||
if (!res.ok) {
|
if (!res.ok) {
|
||||||
return res.status;
|
return res.status;
|
||||||
|
|||||||
@@ -76,6 +76,8 @@ const actors = [
|
|||||||
{ entity: 'seehimfuck', name: 'Sheem The Dream', fields: ['avatar', 'description', 'dateOfBirth', 'birthPlace', 'ethnicity', 'height', 'weight', 'hasTattoos', 'hasPiercings', 'penisLength', 'isCircumcised', 'socials'] },
|
{ entity: 'seehimfuck', name: 'Sheem The Dream', fields: ['avatar', 'description', 'dateOfBirth', 'birthPlace', 'ethnicity', 'height', 'weight', 'hasTattoos', 'hasPiercings', 'penisLength', 'isCircumcised', 'socials'] },
|
||||||
{ entity: 'hushpass', name: 'Dylan Ryder', fields: ['avatar'] },
|
{ entity: 'hushpass', name: 'Dylan Ryder', fields: ['avatar'] },
|
||||||
{ entity: 'interracialpass', name: 'Aidra Fox', fields: ['avatar', 'height', 'measurements'] },
|
{ entity: 'interracialpass', name: 'Aidra Fox', fields: ['avatar', 'height', 'measurements'] },
|
||||||
|
{ entity: 'ravebunnys', name: 'Lacey Jayne', fields: ['avatar', 'height', 'measurements', 'dateOfBirth', 'birthPlace', 'description', 'ethnicity', 'weight', 'naturalBoobs'] },
|
||||||
|
{ entity: 'hotandtatted', name: 'Valerica Steele', url: 'https://hotandtatted.com/models/tattooed-pornstar-val-steele.html', fields: ['avatar', 'measurements', 'dateOfBirth', 'birthPlace', 'description', 'ethnicity', 'weight', 'foot', 'naturalBoobs', 'hasPiercings'] },
|
||||||
// kelly madison / 8K
|
// kelly madison / 8K
|
||||||
{ entity: 'kellymadison', name: 'Ava Addams', fields: ['avatar', 'description', 'age', 'height', 'measurements', 'birthPlace', 'dateOfBirth', 'ethnicity'] },
|
{ entity: 'kellymadison', name: 'Ava Addams', fields: ['avatar', 'description', 'age', 'height', 'measurements', 'birthPlace', 'dateOfBirth', 'ethnicity'] },
|
||||||
{ entity: '8kmembers', name: 'Angie Lynx', fields: ['age', 'height', 'measurements', 'birthPlace', 'dateOfBirth', 'ethnicity'] },
|
{ entity: '8kmembers', name: 'Angie Lynx', fields: ['age', 'height', 'measurements', 'birthPlace', 'dateOfBirth', 'ethnicity'] },
|
||||||
@@ -308,9 +310,10 @@ const validators = {
|
|||||||
hasTattoos: (value) => typeof value === 'boolean',
|
hasTattoos: (value) => typeof value === 'boolean',
|
||||||
hasPiercings: (value) => typeof value === 'boolean',
|
hasPiercings: (value) => typeof value === 'boolean',
|
||||||
avatar: async (value) => [].concat(value).reduce(async (chain, url) => {
|
avatar: async (value) => [].concat(value).reduce(async (chain, url) => {
|
||||||
|
// testing all avatar fallbacks is too time-consuming, just ensure one is valid
|
||||||
const acc = await chain;
|
const acc = await chain;
|
||||||
|
|
||||||
if (!acc) {
|
if (acc) {
|
||||||
return acc;
|
return acc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user