Compare commits
4 Commits
aa7dca65d1
...
ed1bc6c73f
Author | SHA1 | Date |
---|---|---|
|
ed1bc6c73f | |
|
d4801bb240 | |
|
75dbe2548a | |
|
38bab672d4 |
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"name": "traxxx",
|
||||
"version": "1.79.1",
|
||||
"version": "1.79.3",
|
||||
"lockfileVersion": 1,
|
||||
"requires": true,
|
||||
"dependencies": {
|
||||
|
|
|
@ -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": {
|
||||
|
|
Before Width: | Height: | Size: 58 KiB After Width: | Height: | Size: 81 KiB |
Before Width: | Height: | Size: 31 KiB After Width: | Height: | Size: 25 KiB |
Before Width: | Height: | Size: 21 KiB After Width: | Height: | Size: 20 KiB |
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 11 KiB |
Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 11 KiB |
Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 17 KiB |
Before Width: | Height: | Size: 57 KiB After Width: | Height: | Size: 65 KiB |
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 14 KiB |
Before Width: | Height: | Size: 39 KiB After Width: | Height: | Size: 35 KiB |
Before Width: | Height: | Size: 25 KiB After Width: | Height: | Size: 25 KiB |
Before Width: | Height: | Size: 33 KiB After Width: | Height: | Size: 33 KiB |
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 14 KiB |
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 9.8 KiB |
Before Width: | Height: | Size: 30 KiB After Width: | Height: | Size: 28 KiB |
Before Width: | Height: | Size: 42 KiB After Width: | Height: | Size: 33 KiB |
Before Width: | Height: | Size: 5.5 KiB After Width: | Height: | Size: 5.6 KiB |
Before Width: | Height: | Size: 77 KiB After Width: | Height: | Size: 73 KiB |
Before Width: | Height: | Size: 20 KiB After Width: | Height: | Size: 21 KiB |
Before Width: | Height: | Size: 36 KiB After Width: | Height: | Size: 37 KiB |
Before Width: | Height: | Size: 73 KiB After Width: | Height: | Size: 54 KiB |
Before Width: | Height: | Size: 38 KiB After Width: | Height: | Size: 36 KiB |
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 12 KiB |
Before Width: | Height: | Size: 56 KiB After Width: | Height: | Size: 56 KiB |
Before Width: | Height: | Size: 31 KiB After Width: | Height: | Size: 30 KiB |
Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 12 KiB |
Before Width: | Height: | Size: 29 KiB After Width: | Height: | Size: 27 KiB |
Before Width: | Height: | Size: 102 KiB After Width: | Height: | Size: 102 KiB |
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 12 KiB |
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 12 KiB |
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 11 KiB |
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 16 KiB |
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 12 KiB |
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 8.5 KiB |
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 14 KiB |
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 12 KiB |
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 11 KiB |
Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 22 KiB |
After Width: | Height: | Size: 82 KiB |
After Width: | Height: | Size: 6.3 KiB |
Before Width: | Height: | Size: 6.3 KiB After Width: | Height: | Size: 22 KiB |
Before Width: | Height: | Size: 9.6 KiB After Width: | Height: | Size: 84 KiB |
After Width: | Height: | Size: 9.6 KiB |
Before Width: | Height: | Size: 841 KiB After Width: | Height: | Size: 852 KiB |
Before Width: | Height: | Size: 137 KiB After Width: | Height: | Size: 133 KiB |
|
@ -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",
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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')
|
||||
|
|
|
@ -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');
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -161,8 +161,10 @@ function init(element, window) {
|
|||
|
||||
return {
|
||||
element,
|
||||
document: element,
|
||||
...(window && { window }),
|
||||
...(window && {
|
||||
window,
|
||||
document: window.document,
|
||||
}),
|
||||
...contextFuncs,
|
||||
};
|
||||
}
|
||||
|
|