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",
"version": "1.79.1",
"version": "1.79.3",
"lockfileVersion": 1,
"requires": true,
"dependencies": {

View File

@ -1,6 +1,6 @@
{
"name": "traxxx",
"version": "1.79.1",
"version": "1.79.3",
"description": "All the latest porn releases in one place",
"main": "src/app.js",
"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
{
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',
network: 'naughtyamerica',
},
@ -1981,6 +1981,12 @@ const sites = [
url: 'https://www.naughtyamerica.com/site/seduced-by-a-cougar',
network: 'naughtyamerica',
},
{
slug: 'showmybf',
name: 'Show My BF',
url: 'https://www.naughtyamerica.com/site/show-my-bf',
network: 'naughtyamerica',
},
{
slug: 'mydaughtershotfriend',
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) {
if (profiles.filter(Boolean).length === 0) {
return null;
}
const mergedProfile = profiles.reduce((prevProfile, profile) => {
if (profile === null) {
return prevProfile;
@ -379,8 +383,8 @@ async function scrapeActors(actorNames) {
if (profile === null) {
logger.warn(`Could not find profile for actor '${actorName}'`);
if (argv.save) {
await updateActor(profile, true, false);
if (argv.save && !actorEntry) {
await storeActor({ name: actorName }, false, false);
}
return null;
@ -452,7 +456,8 @@ async function associateActors(mappedActors, releases) {
const actorEntry = existingActorEntries.find(actor => actor.slug === actorMap[actorName])
|| await storeActor({ name: actorName });
return releaseIds
// if a scene
return Array.from(releaseIds)
.map(releaseId => ({
release_id: releaseId,
actor_id: actorEntry.id,

View File

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

View File

@ -90,7 +90,7 @@ async function scrapeScene(html, url, site) {
const poster = videoData.picPreview;
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 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}`,
};
release.photos = await getPhotos(q('.picturesItem a').href, 'puretaboo.com', site);
release.photos = await getPhotos(q('.picturesItem a').href, site);
return release;
}

View File

@ -2,7 +2,7 @@
const bhttp = require('bhttp');
const { ex, exa } = require('../utils/q');
const { ex, exa, get } = require('../utils/q');
const slugify = require('../utils/slugify');
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}$/)
|| 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');
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.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.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 actorString = qtext(actorEl);
console.log(actorString);
/*
?.split(/, and|,/g)
.map(actor => actor.trim())
|| [];
*/
release.actors = actorString?.split(/, and |, /g) || [];
}
console.log(release.actors);
if (release.actors.length === 0) release.actors = site.parameters?.actors;
if (release.actors.length === 0 && site.parameters?.actors) release.actors = site.parameters.actors;
release.tags = qa('a[href*=tag]', true);
@ -129,8 +122,6 @@ async function scrapeScene(html, url, site) {
const stars = q('.rate-box').dataset.score;
if (stars) release.rating = { stars };
console.log(release);
return release;
}
@ -141,7 +132,24 @@ function scrapeModels(html, actorName) {
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 profile = { gender: 'female' };
@ -179,8 +187,10 @@ function scrapeProfile(html) {
const avatar = qi('img');
if (avatar) profile.avatar = avatar;
const releases = ex(html, '#model-page + .container, #model-page + .container-fluid');
if (releases) profile.releases = scrapeAll(releases.document.outerHTML);
const { qu } = ex(html, '#model-page + .container, #model-page + .container-fluid');
const releasesPage = qu('.next-pg');
if (releasesPage) profile.releases = await fetchActorReleases(releasesPage);
return profile;
}

View File

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