Fixed slugify behavior.

This commit is contained in:
DebaucheryLibrarian 2026-01-10 04:33:15 +01:00
parent e84beacca1
commit 19dbd624ca
8 changed files with 77 additions and 41 deletions

View File

@ -73,6 +73,9 @@ module.exports = {
}, },
exclude: { exclude: {
channels: [ channels: [
// aylo
'pornhub',
'spicevids',
// 21sextreme, no longer updated // 21sextreme, no longer updated
'mightymistress', 'mightymistress',
'dominatedgirls', 'dominatedgirls',
@ -125,8 +128,6 @@ module.exports = {
'ncversocinema', 'ncversocinema',
'pussybabes', 'pussybabes',
'uksinners', 'uksinners',
// mindgeek
'pornhub',
// insex // insex
'paintoy', 'paintoy',
'aganmedon', 'aganmedon',

View File

@ -557,10 +557,11 @@ const networks = [
url: 'https://www.mikeadriano.com', url: 'https://www.mikeadriano.com',
}, },
{ {
slug: 'milehighmedia', slug: 'adultmobile',
name: 'Mile High Media', rename: 'milehighmedia',
url: 'https://www.milehighmedia.com', name: 'Adult Mobile',
description: 'MileHighMedia.com is the only niche porn network you need! Watch lesbian sex, hardcore fucking and family porn stories with the hottest teens & MILFs!', alias: ['mile high media', 'mile high'],
url: 'https://www.adultmobile.com',
parent: 'aylo', parent: 'aylo',
parameters: { parameters: {
forceDeep: true, // Mile High Media has movie and series information not available in the latest updates API forceDeep: true, // Mile High Media has movie and series information not available in the latest updates API

View File

@ -6903,9 +6903,10 @@ const sites = [
parent: 'aylo', parent: 'aylo',
}, },
{ {
slug: 'tube8vip', slug: 'spicevids',
name: 'Tube8Vip', rename: 'tube8vip',
url: 'https://www.tube8vip.com', name: 'Spicevids',
url: 'https://www.spicevids.com',
description: '', description: '',
parameters: { native: true }, parameters: { native: true },
parent: 'aylo', parent: 'aylo',
@ -6996,23 +6997,24 @@ const sites = [
parent: 'milehighmedia', parent: 'milehighmedia',
}, },
{ {
slug: 'milehighmedia', slug: 'adultmobile',
name: 'Mile High Media', rename: 'milehighmedia',
name: 'Adult Mobile',
url: 'https://www.milehighmedia.com/scenes?site=323', url: 'https://www.milehighmedia.com/scenes?site=323',
alias: ['mhm'], alias: ['mhm', 'mile high media', 'mile high'],
parameters: { siteId: 323 }, parameters: { siteId: 323 },
parent: 'milehighmedia', parent: 'adultmobile',
}, },
{ {
slug: 'realityjunkies', slug: 'realityjunkies',
name: 'Reality Junkies', name: 'Reality Junkies',
url: 'https://www.realityjunkies.com', url: 'https://www.adultmobile.com/scenes?site=324',
alias: ['rj'], alias: ['rj'],
parameters: { parameters: {
siteId: 324, siteId: 324,
native: true, native: true,
}, },
parent: 'milehighmedia', parent: 'adultmobile',
}, },
{ {
slug: 'sweetheartvideo', slug: 'sweetheartvideo',
@ -7023,7 +7025,7 @@ const sites = [
siteId: 325, siteId: 325,
native: true, native: true,
}, },
parent: 'milehighmedia', parent: 'adultmobile',
}, },
{ {
slug: 'sweetsinner', slug: 'sweetsinner',
@ -7034,7 +7036,7 @@ const sites = [
siteId: 326, siteId: 326,
native: true, native: true,
}, },
parent: 'milehighmedia', parent: 'adultmobile',
}, },
{ {
slug: 'familysinners', slug: 'familysinners',
@ -7046,7 +7048,7 @@ const sites = [
siteId: 317, siteId: 317,
native: true, native: true,
}, },
parent: 'milehighmedia', parent: 'adultmobile',
}, },
{ {
slug: 'iconmale', slug: 'iconmale',
@ -7058,7 +7060,7 @@ const sites = [
siteId: 328, siteId: 328,
native: true, native: true,
}, },
parent: 'milehighmedia', parent: 'adultmobile',
}, },
// MISSA X // MISSA X
{ {

View File

@ -363,7 +363,7 @@ function scrapeProfile(data, networkName, _releases = []) {
profile.gender = data.gender === 'other' ? 'transsexual' : data.gender; profile.gender = data.gender === 'other' ? 'transsexual' : data.gender;
if (profile.gender === 'male') { if (profile.gender === 'male') {
profile.penisLength = Number(data.measurements); profile.penisLength = Number(data.measurements) || null;
} else { } else {
profile.measurements = data.measurements; profile.measurements = data.measurements;
} }

View File

@ -81,6 +81,8 @@ function scrapeAll(scenes, site, entryIdFromTitle) {
|| query.element('.rating_box')?.dataset.id || query.element('.rating_box')?.dataset.id
|| query.attribute('a img', 'id')?.match(/set-target-(\d+)/)?.[1]; || query.attribute('a img', 'id')?.match(/set-target-(\d+)/)?.[1];
console.log(release.entryId);
return release; return release;
}); });
} }

View File

@ -194,6 +194,33 @@ const scrapers = {
// xempire, // xempire,
}, },
actors: { actors: {
// aylo
adultmobile: aylo,
babes: aylo,
bangbros: aylo,
brazzers: aylo,
digitalplayground: aylo,
doghousedigital: aylo,
fakehub: aylo,
familysinners: aylo,
gaywire: aylo,
iconmale: aylo,
letsdoeit: aylo,
men: aylo,
metrohd: aylo,
mofos: aylo,
propertysex: aylo,
realityjunkies: aylo,
realitykings: aylo,
sexyhub: aylo,
spicevids: aylo,
squirted: aylo,
sweetheartvideo: aylo,
sweetsinner: aylo,
transangels: aylo,
trueamateurs: aylo,
twistys: aylo,
// etc
'18vr': badoink, '18vr': badoink,
'21sextury': gamma, '21sextury': gamma,
adultempire, adultempire,
@ -212,13 +239,11 @@ const scrapers = {
aziani, aziani,
'2poles1hole': aziani, '2poles1hole': aziani,
creampiled: aziani, creampiled: aziani,
babes: aylo,
babevr: badoink, babevr: badoink,
baddaddypov: fullpornnetwork, baddaddypov: fullpornnetwork,
badoinkvr: badoink, badoinkvr: badoink,
bamvisions, bamvisions,
bang, bang,
bangbros: aylo,
bjraw: radical, bjraw: radical,
bluedonkeymedia, bluedonkeymedia,
delphine: modelmedia, delphine: modelmedia,
@ -227,13 +252,11 @@ const scrapers = {
boobpedia, boobpedia,
bradmontana, bradmontana,
brattysis: nubiles, brattysis: nubiles,
brazzers: aylo,
burningangel: gamma, burningangel: gamma,
cherrypimps, cherrypimps,
cumlouder, cumlouder,
deeplush: nubiles, deeplush: nubiles,
devilsfilm: famedigital, devilsfilm: famedigital,
digitalplayground: aylo,
dirtyauditions: mikeadriano, dirtyauditions: mikeadriano,
dogfartnetwork: gamma, dogfartnetwork: gamma,
dorcelclub: dorcel, dorcelclub: dorcel,
@ -242,12 +265,10 @@ const scrapers = {
evilangel: gamma, evilangel: gamma,
exploitedx, // only from known URL that will specify site exploitedx, // only from known URL that will specify site
eyeontheguy: hush, eyeontheguy: hush,
fakehub: aylo,
firstanalquest, firstanalquest,
forbondage: porndoe, forbondage: porndoe,
freeones, freeones,
gangbangcreampie: gamma, gangbangcreampie: gamma,
gaywire: aylo,
girlfaction: fullpornnetwork, girlfaction: fullpornnetwork,
gloryholesecrets: gamma, gloryholesecrets: gamma,
gotfilled: radical, gotfilled: radical,
@ -258,7 +279,6 @@ const scrapers = {
hotcrazymess: nubiles, hotcrazymess: nubiles,
hushpass: hush, hushpass: hush,
hussiepass: hush, hussiepass: hush,
iconmale: aylo,
inserted: radical, inserted: radical,
interracialpass: hush, interracialpass: hush,
interracialpovs: hush, interracialpovs: hush,
@ -273,7 +293,6 @@ const scrapers = {
kink, kink,
kinkmen: kink, kinkmen: kink,
kinkvr: kink, kinkvr: kink,
letsdoeit: aylo,
loveherfilms, loveherfilms,
loveherfeet: loveherfilms, loveherfeet: loveherfilms,
shelovesblack: loveherfilms, shelovesblack: loveherfilms,
@ -281,13 +300,9 @@ const scrapers = {
analvids: pornbox, analvids: pornbox,
littlecapricedreams, littlecapricedreams,
mamacitaz: porndoe, mamacitaz: porndoe,
men: aylo,
mariskax, mariskax,
metrohd: aylo,
milehighmedia: aylo,
milfvr: wankzvr, milfvr: wankzvr,
missax, missax,
mofos: aylo,
mylf: teamskeet, mylf: teamskeet,
mugfucked: fullpornnetwork, mugfucked: fullpornnetwork,
naughtyamerica, naughtyamerica,
@ -311,7 +326,6 @@ const scrapers = {
povpornstars: hush, povpornstars: hush,
private: privateNetwork, private: privateNetwork,
purgatoryx, purgatoryx,
realitykings: aylo,
realvr: badoink, realvr: badoink,
rickysroom, rickysroom,
roccosiffredi: famedigital, roccosiffredi: famedigital,
@ -319,7 +333,6 @@ const scrapers = {
score, score,
seehimfuck: hush, seehimfuck: hush,
sexlikereal, sexlikereal,
sexyhub: aylo,
silverstonedvd: famedigital, silverstonedvd: famedigital,
silviasaint: famedigital, silviasaint: famedigital,
spermmania: snowvalley, spermmania: snowvalley,
@ -345,11 +358,9 @@ const scrapers = {
testedefudelidade, testedefudelidade,
thatsitcomshow: nubiles, thatsitcomshow: nubiles,
tokyohot, tokyohot,
transangels: aylo,
transbella: porndoe, transbella: porndoe,
tranzvr: wankzvr, tranzvr: wankzvr,
trueanal: mikeadriano, trueanal: mikeadriano,
twistys: aylo,
vipsexvault: porndoe, vipsexvault: porndoe,
virtualtaboo, virtualtaboo,
darkroomvr: virtualtaboo, darkroomvr: virtualtaboo,

View File

@ -42,7 +42,7 @@ const accentMap = {
}; };
const plainCharRegex = /[a-zA-Z0-9]/; const plainCharRegex = /[a-zA-Z0-9]/;
const defaultPunctuationRegex = /[.,?!:;&'"“”…()[]{}<>\/*—]/; const defaultPunctuationRegex = /[.,?!:;&'"“”…()[\]{}<>/*—]/;
const defaultSymbolRegex = /[@$€£#%^+=\\~]/; const defaultSymbolRegex = /[@$€£#%^+=\\~]/;
function slugify(strings, delimiter = '-', { function slugify(strings, delimiter = '-', {
@ -50,7 +50,7 @@ function slugify(strings, delimiter = '-', {
lower = true, lower = true,
encode = false, encode = false,
accents: keepAccents = false, accents: keepAccents = false,
punctuation: keepPunctuation = false, punctuation: keepPunctuation = 'split',
punctuationRegex = defaultPunctuationRegex, punctuationRegex = defaultPunctuationRegex,
symbols: keepSymbols = false, symbols: keepSymbols = false,
symbolRegex = defaultSymbolRegex, symbolRegex = defaultSymbolRegex,

View File

@ -62,6 +62,25 @@ const actors = [
{ entity: 'babes', name: 'Alina Lopez', fields: ['avatar', 'description', 'gender', 'height', 'measurements', 'birthPlace', 'dateOfBirth', 'weight', 'hairColor', 'ethnicity', 'hasTattoos', 'hasPiercings'] }, { entity: 'babes', name: 'Alina Lopez', fields: ['avatar', 'description', 'gender', 'height', 'measurements', 'birthPlace', 'dateOfBirth', 'weight', 'hairColor', 'ethnicity', 'hasTattoos', 'hasPiercings'] },
{ entity: 'letsdoeit', name: 'Nicole Doshi', fields: ['avatar', 'description', 'gender', 'height', 'measurements', 'birthPlace', 'dateOfBirth'] }, { entity: 'letsdoeit', name: 'Nicole Doshi', fields: ['avatar', 'description', 'gender', 'height', 'measurements', 'birthPlace', 'dateOfBirth'] },
{ entity: 'men', name: 'Cade Maddox', fields: ['avatar', 'description', 'gender', 'height', 'ethnicity', 'penisLength', 'dateOfBirth', 'weight', 'hairColor', 'hasTattoos'] }, { entity: 'men', name: 'Cade Maddox', fields: ['avatar', 'description', 'gender', 'height', 'ethnicity', 'penisLength', 'dateOfBirth', 'weight', 'hairColor', 'hasTattoos'] },
{ entity: 'metrohd', name: 'April Olsen', fields: ['avatar', 'description', 'gender', 'birthPlace', 'height', 'measurements', 'dateOfBirth', 'weight'] },
{ entity: 'mofos', name: 'Ariana Starr', fields: ['avatar', 'description', 'gender', 'birthPlace', 'height', 'measurements', 'dateOfBirth'] },
{ entity: 'propertysex', name: 'Desiree Dulce', fields: ['avatar', 'description', 'gender', 'birthPlace', 'height', 'measurements', 'dateOfBirth', 'weight', 'hairColor', 'ethnicity', 'hasPiercings'] },
{ entity: 'sexyhub', name: 'Angie Lynx', fields: ['avatar', 'description', 'gender', 'birthPlace', 'height', 'measurements', 'dateOfBirth'] },
{ entity: 'squirted', name: 'Nicole Doshi', fields: ['avatar', 'description', 'gender', 'birthPlace', 'height', 'measurements', 'dateOfBirth'] },
{ entity: 'transangels', name: 'Aubrey Kate', fields: ['avatar', 'description', 'gender', 'birthPlace', 'height', 'measurements', 'dateOfBirth', 'weight', 'hairColor', 'ethnicity', 'hasTattoos'] },
{ entity: 'trueamateurs', name: 'Natalie FLowers', fields: ['avatar', 'gender'] },
{ entity: 'spicevids', name: 'Remy LaCroix', fields: ['avatar', 'gender', 'description', 'height', 'measurements', 'dateOfBirth', 'weight'] },
{ entity: 'twistys', name: 'Remy LaCroix', fields: ['avatar', 'gender', 'description', 'height', 'measurements', 'dateOfBirth', 'weight', 'birthPlace', 'hairColor', 'ethnicity', 'naturalBoobs', 'hasPiercings'] },
// aylo > adult mobile
{ entity: 'adultmobile', name: 'Scarlett Alexis', fields: ['avatar', 'gender'] },
{ entity: 'doghousedigital', name: 'Scarlett Alexis', fields: ['avatar', 'gender'] },
{ entity: 'familysinners', name: 'Scarlett Alexis', fields: ['avatar', 'gender'] },
{ entity: 'iconmale', name: 'Troy Accola', fields: ['avatar', 'gender', 'hairColor', 'ethnicity', 'hasTattoos', 'hasPiercings'] },
{ entity: 'realityjunkies', name: 'Scarlett Alexis', fields: ['avatar', 'gender'] },
{ entity: 'sweetheartvideo', name: 'Lexi Lore', fields: ['avatar', 'gender', 'hairColor', 'ethnicity', 'hasTattoos', 'hasPiercings'] },
{ entity: 'sweetsinner', name: 'Anna Claire Clouds', fields: ['avatar', 'gender'] },
// bangros
{ entity: 'bangbros', name: 'Kira Perez', fields: ['avatar', 'gender', 'ethnicity', 'hairColor'] },
]; ];
const actorScrapers = scrapers.actors; const actorScrapers = scrapers.actors;
@ -90,9 +109,9 @@ async function validateUrl(url, mime = 'image/') {
const validators = { const validators = {
age: (value) => !!Number(value), age: (value) => !!Number(value),
gender: (value) => value && ['female', 'male', 'transsexual'].includes(value.toLowerCase()), gender: (value) => value && ['female', 'male', 'transsexual', 'trans'].includes(value.toLowerCase()),
description: (value) => typeof value === 'string' && value.length > 3, description: (value) => typeof value === 'string' && value.length > 3,
birthPlace: (value) => typeof value === 'string' && value.length > 3, birthPlace: (value) => typeof value === 'string' && value.length > 1, // may return US or USA
birthCountry: (value) => typeof value === 'string' && value.length > 1, birthCountry: (value) => typeof value === 'string' && value.length > 1,
nationality: (value) => typeof value === 'string' && value.length > 3, nationality: (value) => typeof value === 'string' && value.length > 3,
height: (value) => !!Number(value) || /\d'\d{1,2}"/.test(value), height: (value) => !!Number(value) || /\d'\d{1,2}"/.test(value),
@ -164,7 +183,7 @@ async function init() {
}, include); }, include);
console.log(profile); console.log(profile);
console.log('Untested fields', Object.keys(profile).filter((field) => !actor.fields.includes(field)).join(', ')); console.log('Untested fields', Object.entries(profile).filter(([field, value]) => !actor.fields.includes(field) && typeof value !== 'undefined' && value !== null).map(([field]) => field).join(', '));
if (!profile) { if (!profile) {
assert.fail('profile not found'); assert.fail('profile not found');