Adapted Karups scraper for BoyFun.

This commit is contained in:
DebaucheryLibrarian 2026-02-01 03:28:17 +01:00
parent 2f7ddd277d
commit 82c436f663
4 changed files with 34 additions and 12 deletions

View File

@ -6120,29 +6120,37 @@ const sites = [
}, },
// KARUPS // KARUPS
{ {
slug: 'karupsprivatecollection',
name: 'Private Collection', name: 'Private Collection',
slug: 'privatecollection',
rename: 'karupsprivatecollection',
alias: ['kpc'], alias: ['kpc'],
url: 'https://www.karups.com/site/kpc', url: 'https://www.karups.com/site/kpc',
hasLogo: false,
parent: 'karups', parent: 'karups',
}, },
{ {
slug: 'karupshometownamateurs',
name: 'Hometown Amateurs', name: 'Hometown Amateurs',
slug: 'hometownamateurs',
rename: 'karupshometownamateurs',
alias: ['kha'], alias: ['kha'],
url: 'https://www.karups.com/site/kha', url: 'https://www.karups.com/site/kha',
hasLogo: false,
parent: 'karups', parent: 'karups',
}, },
{ {
slug: 'karupsolderwomen',
name: 'Older Women', name: 'Older Women',
slug: 'olderwomen',
rename: 'karupsolderwomen',
alias: ['kow'], alias: ['kow'],
url: 'https://www.karups.com/site/kow', url: 'https://www.karups.com/site/kow',
hasLogo: false,
parent: 'karups', parent: 'karups',
}, },
{
name: 'BoyFun',
slug: 'boyfun',
url: 'https://www.boyfun.com',
parent: 'karups',
independent: true,
tags: ['gay'],
},
// KELLY MADISON MEDIA / 5K / 8K // KELLY MADISON MEDIA / 5K / 8K
{ {
slug: 'teenfidelity', slug: 'teenfidelity',

View File

@ -220,6 +220,7 @@ module.exports = {
inthecrack, inthecrack,
jerkaoke: modelmedia, jerkaoke: modelmedia,
karups, karups,
boyfun: karups,
kellymadison, kellymadison,
'8kmembers': kellymadison, '8kmembers': kellymadison,
// analvids, // analvids,

View File

@ -18,7 +18,7 @@ function scrapeAll(scenes) {
release.entryId = new URL(release.url).pathname.match(/(\d+)\.html/)?.[1]; release.entryId = new URL(release.url).pathname.match(/(\d+)\.html/)?.[1];
release.title = query.content('.title'); release.title = query.content('.title');
release.date = query.date('.date', 'MMM Do, YYYY'); release.date = query.date('.date', ['MMM Do, YYYY', 'DD MMM YYYY'], { match: null });
release.channel = channelSlugs[query.content('.site')]; release.channel = channelSlugs[query.content('.site')];
@ -84,7 +84,19 @@ function scrapeScene({ query }, { url }) {
function scrapeProfile({ query }, entity) { function scrapeProfile({ query }, entity) {
const profile = {}; const profile = {};
profile.gender = 'female'; const bio = Object.fromEntries(query.all('.model-table .item').map((bioEl) => [
slugify(unprint.query.content(bioEl, '.label'), '_'),
unprint.query.content(bioEl, '.value'),
]));
profile.age = unprint.extractNumber(bio.date_of_birth); // seemingly only used on Boyfun and always age
profile.height = unprint.extractNumber(bio.height);
profile.weight = unprint.extractNumber(bio.height);
profile.penisLength = unprint.extractNumber(bio.dick_size);
if (bio.cut_uncut?.toLowerCase() === 'cut') profile.isCircumcised = true;
if (bio.cut_uncut?.toLowerCase() === 'uncut') profile.isCircumcised = false;
profile.avatar = query.img('.model-thumb img[src*=".jpg"]'); profile.avatar = query.img('.model-thumb img[src*=".jpg"]');
profile.scenes = scrapeAll(unprint.initAll(query.all('.listing-videos .item')), entity); profile.scenes = scrapeAll(unprint.initAll(query.all('.listing-videos .item')), entity);
@ -92,12 +104,12 @@ function scrapeProfile({ query }, entity) {
return profile; return profile;
} }
async function getActorUrl(actor) { async function getActorUrl(actor, entity) {
if (actor.url) { if (actor.url) {
return actor.url; return actor.url;
} }
const res = await unprint.get(`https://www.karups.com/models/search/${actor.slug}/`, { const res = await unprint.get(`${entity.origin}/models/search/${actor.slug}/`, {
selectAll: '.listing-models .item', selectAll: '.listing-models .item',
cookies: { cookies: {
warningHidden: 'hide', warningHidden: 'hide',
@ -114,7 +126,7 @@ async function getActorUrl(actor) {
} }
async function fetchProfile(actor, entity) { async function fetchProfile(actor, entity) {
const actorUrl = await getActorUrl(actor); const actorUrl = await getActorUrl(actor, entity);
if (!actorUrl) { if (!actorUrl) {
return null; return null;

View File

@ -227,7 +227,8 @@ const actors = [
{ entity: 'pornhub', name: 'Lexi Luna', fields: ['avatar', 'gender', 'ethnicity', 'description', 'birthPlace', 'measurements', 'naturalBoobs', 'height', 'weight', 'hairColor', 'hasPiercings', 'hasTattoos'] }, { entity: 'pornhub', name: 'Lexi Luna', fields: ['avatar', 'gender', 'ethnicity', 'description', 'birthPlace', 'measurements', 'naturalBoobs', 'height', 'weight', 'hairColor', 'hasPiercings', 'hasTattoos'] },
{ entity: 'fullpornnetwork', name: 'Kenzie Reeves', fields: ['avatar', 'description'] }, { entity: 'fullpornnetwork', name: 'Kenzie Reeves', fields: ['avatar', 'description'] },
{ entity: 'meidenvanholland', name: 'Izzy Bizzy Bang Bang', fields: ['avatar', 'description'] }, { entity: 'meidenvanholland', name: 'Izzy Bizzy Bang Bang', fields: ['avatar', 'description'] },
{ entity: 'karups', name: 'Peach Lollypop', fields: ['avatar', 'gender'] }, { entity: 'karups', name: 'Peach Lollypop', fields: ['avatar'] },
{ entity: 'boyfun', name: 'Amahd Passer', fields: ['avatar', 'age', 'height', 'weight', 'penisLength', 'isCircumcised'] },
]; ];
const actorScrapers = scrapers.actors; const actorScrapers = scrapers.actors;