Compare commits

..

No commits in common. "1c26da447a6f07f2d90ba77b9706056bfed3220b" and "c581bea18539cd7eb332ff6dc0fa24f5ed57f06c" have entirely different histories.

5 changed files with 23 additions and 40 deletions

4
package-lock.json generated
View File

@ -1,12 +1,12 @@
{ {
"name": "traxxx", "name": "traxxx",
"version": "1.238.2", "version": "1.238.1",
"lockfileVersion": 3, "lockfileVersion": 3,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "traxxx", "name": "traxxx",
"version": "1.238.2", "version": "1.238.1",
"license": "ISC", "license": "ISC",
"dependencies": { "dependencies": {
"@aws-sdk/client-s3": "^3.458.0", "@aws-sdk/client-s3": "^3.458.0",

View File

@ -1,6 +1,6 @@
{ {
"name": "traxxx", "name": "traxxx",
"version": "1.238.2", "version": "1.238.1",
"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": {

View File

@ -7237,12 +7237,8 @@ const sites = [
slug: 'tonightsgirlfriend', slug: 'tonightsgirlfriend',
alias: ['togc', 'tog'], alias: ['togc', 'tog'],
name: "Tonight's Girlfriend", name: "Tonight's Girlfriend",
url: 'https://www.tonightsgirlfriend.com', url: 'https://www.naughtyamerica.com/site/tonight-s-girlfriend',
parent: 'naughtyamerica', parent: 'naughtyamerica',
parameters: {
scenes: '/scenes',
useActorUrl: false,
},
}, },
{ {
slug: 'wivesonvacation', slug: 'wivesonvacation',

View File

@ -4,8 +4,7 @@ const unprint = require('unprint');
const slugify = require('../utils/slugify'); const slugify = require('../utils/slugify');
// Naughty America network function scrapeLatest(scenes) {
function scrapeLatest(scenes, channel) {
return scenes.map(({ query }) => { return scenes.map(({ query }) => {
const release = {}; const release = {};
const url = query.url('a'); const url = query.url('a');
@ -13,26 +12,23 @@ function scrapeLatest(scenes, channel) {
release.url = url; release.url = url;
release.entryId = query.attribute('a', 'data-scene-id') || (url && new URL(url).pathname.match(/-(\d+)$/)?.[1]) || null; release.entryId = query.attribute('a', 'data-scene-id') || (url && new URL(url).pathname.match(/-(\d+)$/)?.[1]) || null;
release.date = query.date('.entry-date, .scene-date', 'MMM D, YYYY'); release.date = query.date('.entry-date', 'MMM D, YYYY');
release.duration = query.duration('.scene-runtime'); release.duration = query.duration('.scene-runtime');
release.actors = query.all('.contain-actors a, .scene-actors a').map((actorEl) => ({ release.actors = query.all('.contain-actors a').map((actorEl) => ({
name: unprint.query.content(actorEl), name: unprint.query.content(actorEl),
url: channel.parameters?.useActorUrl === false url: unprint.query.url(actorEl, null),
? null // actor URL is scene link in native layout
: unprint.query.url(actorEl, null),
})); }));
release.poster = [ release.poster = [
...(query.sourceSet('source[data-srcset*="scenes/"][type="image/jpeg"]', 'data-srcset') || []), ...(query.sourceSet('source[data-srcset*="scenes/"][type="image/jpeg"]', 'data-srcset') || []),
query.img('.main-scene-img', { attribute: 'data-srcset' }), query.img('.main-scene-img', { attribute: 'data-srcset' }),
query.img('.scene-thumb'),
]; ];
release.tags = query.contents('.flag-bg'); release.tags = query.contents('.flag-bg');
release.qualities = [ release.qualities = [
query.exists('//a[contains(@class, "label-four-k") and contains(text(), "4K")] | //span[contains(@class, "bug-4k")]') && 2160, // label-four-k is also used for non-4K tags query.exists('//a[contains(@class, "label-four-k") and contains(text(), "4K")]') && 2160, // label-four-k is also used for non-4K tags
query.exists('//a[contains(@class, "label-hd") and contains(text(), "HD")]') && 720, query.exists('//a[contains(@class, "label-hd") and contains(text(), "HD")]') && 720,
].filter(Boolean); ].filter(Boolean);
@ -46,24 +42,20 @@ function scrapeScene({ query }, { url }) {
const release = {}; const release = {};
release.entryId = new URL(url).pathname.match(/-(\d+)$/)?.[1]; release.entryId = new URL(url).pathname.match(/-(\d+)$/)?.[1];
release.title = query.content('.scene-title, .grey-title'); release.title = query.content('.scene-title');
release.description = query.text('.synopsis, .scene-description'); release.description = query.text('.synopsis');
release.date = query.date('.entry-date, .released-date', ['MMM D, YYYY', 'MM/DD/YY']); release.date = query.date('.entry-date', 'MMM D, YYYY');
release.duration = query.duration('.duration'); release.duration = query.duration('.duration');
release.actors = query.exists('.performer-list') release.actors = query.all('.performer-list a').map((actorEl) => ({
? query.all('.performer-list a, .grey-performers a').map((actorEl) => ({
name: unprint.query.content(actorEl), name: unprint.query.content(actorEl),
url: unprint.query.url(actorEl, null), url: unprint.query.url(actorEl, null),
})) }));
: query.content('.grey-performers')?.split(',').map((actorName) => actorName.trim());
release.poster = [ release.poster = [
...(query.sourceSet('.play-trailer source[data-srcset*="scenes/"][type="image/jpeg"]', 'data-srcset') || []), ...(query.sourceSet('source[data-srcset*="scenes/"][type="image/jpeg"]', 'data-srcset') || []),
...(query.sourceSet('.scenepage-video source[srcset*="scenes/"][type="image/jpeg"]', 'srcset') || []),
query.img('.play-trailer img[data-srcset*="scenes/"]', { attribute: 'data-srcset' }), query.img('.play-trailer img[data-srcset*="scenes/"]', { attribute: 'data-srcset' }),
query.img('.scenepage-video .playcard'),
]; ];
release.photos = query.els('.contain-scene-images.desktop-only .scene-image').map((imgEl) => [ release.photos = query.els('.contain-scene-images.desktop-only .scene-image').map((imgEl) => [
@ -85,7 +77,7 @@ function scrapeScene({ query }, { url }) {
release.channel = slugify(query.content('.site-title'), ''); release.channel = slugify(query.content('.site-title'), '');
release.tags = query.contents('.categories a, .category a'); release.tags = query.contents('.categories a');
release.qualities = [ release.qualities = [
query.exists('//a[contains(@class, "label-four-k") and contains(text(), "4K")]') && 2160, // label-four-k is also used for non-4K tags query.exists('//a[contains(@class, "label-four-k") and contains(text(), "4K")]') && 2160, // label-four-k is also used for non-4K tags
@ -100,23 +92,19 @@ async function scrapeProfile({ query }) {
const profile = {}; const profile = {};
profile.description = query.content('.bio_about_text'); profile.description = query.content('.bio_about_text');
profile.avatar = query.img('img.performer-pic, img.performer-img, img.peformer-img'); // sic peformer profile.avatar = query.img('img.performer-pic');
return profile; return profile;
} }
async function fetchLatest(site, page = 1) { async function fetchLatest(site, page = 1) {
const res = await unprint.get(`${site.url}${site.parameters?.scenes || ''}?page=${page}`, { selectAll: '.site-list .scene-item, .panel-body' }); const res = await unprint.get(`${site.url}?page=${page}`, { selectAll: '.site-list .scene-item' });
if (res.ok) {
return scrapeLatest(res.context, site); return scrapeLatest(res.context, site);
} }
return res.status; async function fetchProfile({ slug }) {
} const res = await unprint.get(`https://www.naughtyamerica.com/pornstar/${slug}`, { select: '.bio-info' });
async function fetchProfile({ slug }, { channel }) {
const res = await unprint.get(`${channel.url}/pornstar/${slug}`, { select: '.bio-info, .performer-details' });
if (res.ok) { if (res.ok) {
return scrapeProfile(res.context); return scrapeProfile(res.context);

View File

@ -266,7 +266,6 @@ const scrapers = {
mylf: teamskeet, mylf: teamskeet,
mugfucked: fullpornnetwork, mugfucked: fullpornnetwork,
naughtyamerica, naughtyamerica,
tonightsgirlfriend: naughtyamerica,
nebraskacoeds: elevatedx, nebraskacoeds: elevatedx,
nfbusty: nubiles, nfbusty: nubiles,
nubilefilms: nubiles, nubilefilms: nubiles,