Compare commits

...

4 Commits

53 changed files with 55 additions and 31 deletions

2
package-lock.json generated
View File

@ -1,6 +1,6 @@
{ {
"name": "traxxx", "name": "traxxx",
"version": "1.79.1", "version": "1.79.3",
"lockfileVersion": 1, "lockfileVersion": 1,
"requires": true, "requires": true,
"dependencies": { "dependencies": {

View File

@ -1,6 +1,6 @@
{ {
"name": "traxxx", "name": "traxxx",
"version": "1.79.1", "version": "1.79.3",
"description": "All the latest porn releases in one place", "description": "All the latest porn releases in one place",
"main": "src/app.js", "main": "src/app.js",
"scripts": { "scripts": {

Binary file not shown.

Before

Width:  |  Height:  |  Size: 58 KiB

After

Width:  |  Height:  |  Size: 81 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 57 KiB

After

Width:  |  Height:  |  Size: 65 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 39 KiB

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 33 KiB

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 9.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 42 KiB

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.5 KiB

After

Width:  |  Height:  |  Size: 5.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 77 KiB

After

Width:  |  Height:  |  Size: 73 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 KiB

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 73 KiB

After

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 38 KiB

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 56 KiB

After

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 102 KiB

After

Width:  |  Height:  |  Size: 102 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 8.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.3 KiB

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.6 KiB

After

Width:  |  Height:  |  Size: 84 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 841 KiB

After

Width:  |  Height:  |  Size: 852 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 137 KiB

After

Width:  |  Height:  |  Size: 133 KiB

View File

@ -1905,7 +1905,7 @@ const sites = [
// NAUGHTY AMERICA // NAUGHTY AMERICA
{ {
slug: 'myfriendshotmom', slug: 'myfriendshotmom',
name: "My Friend's Hot Mom", name: 'My Friend\'s Hot Mom',
url: 'https://www.naughtyamerica.com/site/my-friend-s-hot-mom', url: 'https://www.naughtyamerica.com/site/my-friend-s-hot-mom',
network: 'naughtyamerica', network: 'naughtyamerica',
}, },
@ -1981,6 +1981,12 @@ const sites = [
url: 'https://www.naughtyamerica.com/site/seduced-by-a-cougar', url: 'https://www.naughtyamerica.com/site/seduced-by-a-cougar',
network: 'naughtyamerica', network: 'naughtyamerica',
}, },
{
slug: 'showmybf',
name: 'Show My BF',
url: 'https://www.naughtyamerica.com/site/show-my-bf',
network: 'naughtyamerica',
},
{ {
slug: 'mydaughtershotfriend', slug: 'mydaughtershotfriend',
name: "My Daughter's Hot Friend", name: "My Daughter's Hot Friend",

View File

@ -275,6 +275,10 @@ async function updateActor(actor, scraped = false, scrapeSuccess = false) {
} }
async function mergeProfiles(profiles, actor) { async function mergeProfiles(profiles, actor) {
if (profiles.filter(Boolean).length === 0) {
return null;
}
const mergedProfile = profiles.reduce((prevProfile, profile) => { const mergedProfile = profiles.reduce((prevProfile, profile) => {
if (profile === null) { if (profile === null) {
return prevProfile; return prevProfile;
@ -379,8 +383,8 @@ async function scrapeActors(actorNames) {
if (profile === null) { if (profile === null) {
logger.warn(`Could not find profile for actor '${actorName}'`); logger.warn(`Could not find profile for actor '${actorName}'`);
if (argv.save) { if (argv.save && !actorEntry) {
await updateActor(profile, true, false); await storeActor({ name: actorName }, false, false);
} }
return null; return null;
@ -452,7 +456,8 @@ async function associateActors(mappedActors, releases) {
const actorEntry = existingActorEntries.find(actor => actor.slug === actorMap[actorName]) const actorEntry = existingActorEntries.find(actor => actor.slug === actorMap[actorName])
|| await storeActor({ name: actorName }); || await storeActor({ name: actorName });
return releaseIds // if a scene
return Array.from(releaseIds)
.map(releaseId => ({ .map(releaseId => ({
release_id: releaseId, release_id: releaseId,
actor_id: actorEntry.id, actor_id: actorEntry.id,

View File

@ -292,8 +292,8 @@ function accumulateActors(releases) {
release.actors.forEach((actor) => { release.actors.forEach((actor) => {
const actorName = actor.name ? actor.name.trim() : actor.trim(); const actorName = actor.name ? actor.name.trim() : actor.trim();
if (!acc[actorName]) acc[actorName] = []; if (!acc[actorName]) acc[actorName] = new Set();
acc[actorName].push(release.id); acc[actorName].add(release.id);
}); });
return acc; return acc;
@ -372,10 +372,11 @@ async function storeRelease(release) {
site_id: release.site.id, site_id: release.site.id,
}) })
.first(); .first();
const curatedRelease = await curateReleaseEntry(release); const curatedRelease = await curateReleaseEntry(release);
if (existingRelease && !argv.redownload) { if (existingRelease && !argv.redownload) {
return existingRelease.id; return existingRelease;
} }
if (existingRelease && argv.redownload) { if (existingRelease && argv.redownload) {
@ -394,7 +395,7 @@ async function storeRelease(release) {
await associateTags(release, existingRelease.id); await associateTags(release, existingRelease.id);
return existingRelease.id; return existingRelease;
} }
const [releaseEntry] = await knex('releases') const [releaseEntry] = await knex('releases')

View File

@ -90,7 +90,7 @@ async function scrapeScene(html, url, site) {
const poster = videoData.picPreview; const poster = videoData.picPreview;
const trailer = `${videoData.playerOptions.host}${videoData.url}`; const trailer = `${videoData.playerOptions.host}${videoData.url}`;
const photos = await getPhotos($('.picturesItem a').attr('href'), '21sextury.com', site); const photos = await getPhotos($('.picturesItem a').attr('href'), site);
const tags = data.keywords.split(', '); const tags = data.keywords.split(', ');
const siteName = data.productionCompany ? data.productionCompany.name : $('#logoLink a').attr('title'); const siteName = data.productionCompany ? data.productionCompany.name : $('#logoLink a').attr('title');

View File

@ -69,7 +69,7 @@ async function scrapeScene(html, url, site) {
src: `${videoData.playerOptions.host}${videoData.url}`, src: `${videoData.playerOptions.host}${videoData.url}`,
}; };
release.photos = await getPhotos(q('.picturesItem a').href, 'puretaboo.com', site); release.photos = await getPhotos(q('.picturesItem a').href, site);
return release; return release;
} }

View File

@ -2,7 +2,7 @@
const bhttp = require('bhttp'); const bhttp = require('bhttp');
const { ex, exa } = require('../utils/q'); const { ex, exa, get } = require('../utils/q');
const slugify = require('../utils/slugify'); const slugify = require('../utils/slugify');
const { heightToCm, lbsToKg } = require('../utils/convert'); const { heightToCm, lbsToKg } = require('../utils/convert');
@ -45,7 +45,7 @@ function scrapeAll(html, site) {
release.date = qd('.i-date', 'MMM DD', /\w+ \d{1,2}$/) release.date = qd('.i-date', 'MMM DD', /\w+ \d{1,2}$/)
|| qd('.dt-box', 'MMM.DD YYYY'); || qd('.dt-box', 'MMM.DD YYYY');
release.actors = site.parameters?.actors || qa('.model, .i-model', true); release.actors = site?.parameters?.actors || qa('.model, .i-model', true);
release.duration = ql('.i-amount, .amount'); release.duration = ql('.i-amount, .amount');
const posterEl = q('.item-img img'); const posterEl = q('.item-img img');
@ -71,7 +71,7 @@ async function scrapeScene(html, url, site) {
[release.entryId] = new URL(url).pathname.split('/').slice(-2); [release.entryId] = new URL(url).pathname.split('/').slice(-2);
release.title = q('h2.text-uppercase, h2.title, #breadcrumb-top + h1', true) release.title = q('h2.text-uppercase, h2.title, #breadcrumb-top + h1', true)
|| q('h1.m-title', true)?.split('»').slice(-1)[0].trim(); || q('h1.m-title', true)?.split(/»|\//).slice(-1)[0].trim();
release.description = qtext('.p-desc, .desc'); release.description = qtext('.p-desc, .desc');
release.actors = qa('.value a[href*=models], .value a[href*=performer], .value a[href*=teen-babes]', true); release.actors = qa('.value a[href*=models], .value a[href*=performer], .value a[href*=teen-babes]', true);
@ -80,17 +80,10 @@ async function scrapeScene(html, url, site) {
const actorEl = qa('.stat').find(stat => /Featuring/.test(stat.textContent)); const actorEl = qa('.stat').find(stat => /Featuring/.test(stat.textContent));
const actorString = qtext(actorEl); const actorString = qtext(actorEl);
console.log(actorString); release.actors = actorString?.split(/, and |, /g) || [];
/*
?.split(/, and|,/g)
.map(actor => actor.trim())
|| [];
*/
} }
console.log(release.actors); if (release.actors.length === 0 && site.parameters?.actors) release.actors = site.parameters.actors;
if (release.actors.length === 0) release.actors = site.parameters?.actors;
release.tags = qa('a[href*=tag]', true); release.tags = qa('a[href*=tag]', true);
@ -129,8 +122,6 @@ async function scrapeScene(html, url, site) {
const stars = q('.rate-box').dataset.score; const stars = q('.rate-box').dataset.score;
if (stars) release.rating = { stars }; if (stars) release.rating = { stars };
console.log(release);
return release; return release;
} }
@ -141,7 +132,24 @@ function scrapeModels(html, actorName) {
return model?.href || null; return model?.href || null;
} }
function scrapeProfile(html) { async function fetchActorReleases(url, accReleases = []) {
const { document, qu } = await get(url);
if (document) {
const releases = accReleases.concat(scrapeAll(document.body.outerHTML));
const nextPage = qu('.next-pg');
if (nextPage && new URL(nextPage).searchParams.has('page')) {
return fetchActorReleases(nextPage, releases);
}
return releases;
}
return null;
}
async function scrapeProfile(html) {
const { q, qa, qi } = ex(html, '#model-page'); const { q, qa, qi } = ex(html, '#model-page');
const profile = { gender: 'female' }; const profile = { gender: 'female' };
@ -179,8 +187,10 @@ function scrapeProfile(html) {
const avatar = qi('img'); const avatar = qi('img');
if (avatar) profile.avatar = avatar; if (avatar) profile.avatar = avatar;
const releases = ex(html, '#model-page + .container, #model-page + .container-fluid'); const { qu } = ex(html, '#model-page + .container, #model-page + .container-fluid');
if (releases) profile.releases = scrapeAll(releases.document.outerHTML); const releasesPage = qu('.next-pg');
if (releasesPage) profile.releases = await fetchActorReleases(releasesPage);
return profile; return profile;
} }

View File

@ -161,8 +161,10 @@ function init(element, window) {
return { return {
element, element,
document: element, ...(window && {
...(window && { window }), window,
document: window.document,
}),
...contextFuncs, ...contextFuncs,
}; };
} }