Merge branch 'master' into wasabi

This commit is contained in:
DebaucheryLibrarian 2021-02-21 23:00:00 +01:00
commit 9a65d8c0eb
19 changed files with 31 additions and 27 deletions

4
package-lock.json generated
View File

@ -1,7 +1,7 @@
{ {
"name": "traxxx", "name": "traxxx",
"version": "1.172.1", "version": "1.172.3",
"lockfileVersion": 2, "lockfileVersion": 1,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {

View File

@ -1,6 +1,6 @@
{ {
"name": "traxxx", "name": "traxxx",
"version": "1.172.1", "version": "1.172.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.

After

Width:  |  Height:  |  Size: 840 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 729 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 324 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 350 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

View File

@ -645,7 +645,7 @@ const tagPosters = [
['mff', 1, 'Anikka Albrite, Kelsi Monroe and Mick Blue for HardX'], ['mff', 1, 'Anikka Albrite, Kelsi Monroe and Mick Blue for HardX'],
['mfm', 0, 'Vina Sky in "Jules Jordan\'s Three Ways" for Jules Jordan'], ['mfm', 0, 'Vina Sky in "Jules Jordan\'s Three Ways" for Jules Jordan'],
['natural-boobs', 1, 'Nia Nacci for First Class POV'], ['natural-boobs', 1, 'Nia Nacci for First Class POV'],
['nurse', 1, 'Mia Malkova in "Always Think Happy Thoughts" for Brazzers'], ['nurse', 0, 'Sarah Vandella in "Cum For Nurse Sarah" for Brazzers'],
['nun', 0, 'Lady Zee in LegalPorno NF053'], ['nun', 0, 'Lady Zee in LegalPorno NF053'],
['oil', 2, 'Jade Kush for Passion HD'], ['oil', 2, 'Jade Kush for Passion HD'],
['oral-creampie', 1, 'Valentina Nappi for Her Limit'], ['oral-creampie', 1, 'Valentina Nappi for Her Limit'],
@ -872,7 +872,8 @@ const tagPhotos = [
['nun', 1, 'Penny Pax and Darcie Dolce in "Confessions Of A Sinful Nun" for Sweetheart Video'], ['nun', 1, 'Penny Pax and Darcie Dolce in "Confessions Of A Sinful Nun" for Sweetheart Video'],
['nun', 3, 'Higurashi Rin in "Naughty Nun" for All Gravure'], ['nun', 3, 'Higurashi Rin in "Naughty Nun" for All Gravure'],
['nun', 2, 'Lea Lexis in "Confessions Of A Sinful Nun" for Sweetheart Video'], ['nun', 2, 'Lea Lexis in "Confessions Of A Sinful Nun" for Sweetheart Video'],
['nurse', 0, 'Sarah Vandella in "Cum For Nurse Sarah" for Brazzers'], ['nurse', 2, 'Evelina Dellai in "Horny Nurses" for Private'],
['nurse', 1, 'Mia Malkova in "Always Think Happy Thoughts" for Brazzers'],
['oil', 1, 'Kissa Sins in "Oil Overload 14" for JulesJordan'], ['oil', 1, 'Kissa Sins in "Oil Overload 14" for JulesJordan'],
['oil', 3, 'Vina Sky for Lubed'], ['oil', 3, 'Vina Sky for Lubed'],
['oil', 0, 'Jada Stevens in "Jada Stevens Anal Ass Oiled Up For James Deen\'s Cock" for Jules Jordan'], ['oil', 0, 'Jada Stevens in "Jada Stevens Anal Ass Oiled Up For James Deen\'s Cock" for Jules Jordan'],

View File

@ -605,7 +605,12 @@ async function trySource(baseSource, existingMedias, baseMedia) {
}; };
} }
return fetchSource(extractedSource, baseMedia); const source = await fetchSource(extractedSource, baseMedia);
return {
...source,
entry: extractedSource.entry || existingSourceMedia,
};
} }
async function fetchMedia(baseMedia, existingMedias) { async function fetchMedia(baseMedia, existingMedias) {
@ -698,9 +703,6 @@ async function storeMedias(baseMedias, options) {
const newMediaEntries = newMediaWithEntries.filter(media => media.newEntry).map(media => media.entry); const newMediaEntries = newMediaWithEntries.filter(media => media.newEntry).map(media => media.entry);
try { try {
// TODO: path duplicates disappear in DO NOTHING query, causing association error. source duplicate detection not working? use scene generator
// UPDATE: cannot replicate when using the same poster and photo source in scene generator
// await bulkInsert('media', newMediaEntries, false);
await bulkInsert('media', newMediaEntries); await bulkInsert('media', newMediaEntries);
return [...newMediaWithEntries, ...existingHashMedias]; return [...newMediaWithEntries, ...existingHashMedias];

View File

@ -4,10 +4,10 @@ const { get, geta, ctxa } = require('../utils/q');
function extractActors(actorString) { function extractActors(actorString) {
return actorString return actorString
?.replace(/.*:|\(.*\)|\d+(-|\s)year(-|\s)old|nurses?|tangled/ig, '') // remove Patient:, (date) and other nonsense ?.replace(/.*:|\(.*\)|\d+(-|\s)year(-|\s)old|nurses?|tangled/ig, '') // remove Patient:, (date) and other nonsense
.split(/\band\b|\bvs\b|\/|,|&/ig) .split(/\band\b|\bvs\b|\/|,|&/ig)
.map(actor => actor.trim()) .map(actor => actor.trim())
.filter(actor => !!actor && !/\banal\b|\bschool\b|\bgamer\b|\breturn\b|\bfor\b|\bare\b|\bpart\b|realdoll|bimbo|p\d+/ig.test(actor)) .filter(actor => !!actor && !/\banal\b|\bschool\b|\bgamer\b|\breturn\b|\bfor\b|\bare\b|\bpart\b|realdoll|bimbo|p\d+/ig.test(actor))
|| []; || [];
} }

View File

@ -28,8 +28,8 @@ function scrapeProfile(html) {
if (bio.Measurements) { if (bio.Measurements) {
const measurements = bio.Measurements const measurements = bio.Measurements
.match(/\d+(\w+)?-\d+-\d+/g) .match(/\d+(\w+)?-\d+-\d+/g)
?.slice(-1)[0] // allow for both '34C-25-36' and '86-64-94 cm / 34-25-37 in' ?.slice(-1)[0] // allow for both '34C-25-36' and '86-64-94 cm / 34-25-37 in'
.split('-'); .split('-');
// account for measuemrents being just e.g. '32EE' // account for measuemrents being just e.g. '32EE'
if (measurements) { if (measurements) {

View File

@ -77,7 +77,7 @@ async function fetchClassicProfile(actorName, { site }) {
const actorPath = pornstarsRes.item.qa('option[value*="/pornstar"]') const actorPath = pornstarsRes.item.qa('option[value*="/pornstar"]')
.find(el => slugify(el.textContent) === actorSlug) .find(el => slugify(el.textContent) === actorSlug)
?.value; ?.value;
if (actorPath) { if (actorPath) {
const actorUrl = `${site.url}${actorPath}`; const actorUrl = `${site.url}${actorPath}`;

View File

@ -200,6 +200,8 @@ function scrapeAll(html, site, networkUrl, hasTeaser = true) {
]; ];
} }
console.log(release);
return release; return release;
}); });
} }
@ -252,7 +254,10 @@ async function scrapeScene(html, url, site, baseRelease, mobileHtml, options) {
const channel = data?.productionCompany?.name const channel = data?.productionCompany?.name
|| $('.studioLink a, .siteLink a').attr('title')?.trim() || $('.studioLink a, .siteLink a').attr('title')?.trim()
|| $('.siteNameSpan').text()?.trim().toLowerCase().replace('.com', '') || $('.siteNameSpan').text()
?.trim()
.toLowerCase()
.replace('.com', '')
|| $('meta[name="twitter:domain"]').attr('content')?.replace('.com', ''); || $('meta[name="twitter:domain"]').attr('content')?.replace('.com', '');
if (channel) release.channel = slugify(channel, ''); if (channel) release.channel = slugify(channel, '');

View File

@ -305,8 +305,8 @@ function scrapeMovie({ el, query }, url, site) {
const scenes = scrapeAll(sceneQus, site); const scenes = scrapeAll(sceneQus, site);
const curatedScenes = scenes const curatedScenes = scenes
?.map(scene => ({ ...scene, movie })) ?.map(scene => ({ ...scene, movie }))
.sort((sceneA, sceneB) => sceneA.date - sceneB.date); .sort((sceneA, sceneB) => sceneA.date - sceneB.date);
movie.date = curatedScenes?.[0].date; movie.date = curatedScenes?.[0].date;

View File

@ -72,7 +72,7 @@ async function scrapeScene({ query }, url, site) {
release.title = query.q('.content-pane-title h2', true); release.title = query.q('.content-pane-title h2', true);
release.description = query.q('.content-pane-column div', true); release.description = query.q('.content-pane-column div', true);
release.date = query.q('.date', 'MMM D, YYYY'); release.date = query.date('.date', 'MMM D, YYYY');
release.actors = query.all('.content-pane-performers .model', true); release.actors = query.all('.content-pane-performers .model', true);
release.tags = query.all('.categories a', true); release.tags = query.all('.categories a', true);
@ -134,12 +134,6 @@ async function fetchUpcoming(site) {
return []; return [];
} }
async function fetchScene(url, site) {
const res = await qu.get(url);
return res.ok ? scrapeScene(res.item, url, site) : res.status;
}
async function fetchProfile({ name: actorName }, { site }) { async function fetchProfile({ name: actorName }, { site }) {
const firstLetter = actorName.charAt(0).toLowerCase(); const firstLetter = actorName.charAt(0).toLowerCase();
const origin = slugUrlMap[site.slug] || site.url; const origin = slugUrlMap[site.slug] || site.url;
@ -164,6 +158,6 @@ async function fetchProfile({ name: actorName }, { site }) {
module.exports = { module.exports = {
fetchLatest, fetchLatest,
fetchUpcoming, fetchUpcoming,
fetchScene,
fetchProfile, fetchProfile,
scrapeScene,
}; };

View File

@ -251,6 +251,8 @@ async function fetchLatest(entity, page, options) {
.orderByRaw('random()') .orderByRaw('random()')
.limit(Math.floor(Math.random() * 10) + 1); .limit(Math.floor(Math.random() * 10) + 1);
// const poster = 'sfw/kittens/thumbs/iNEXVlX-RLs.jpeg';
release.poster = `http://${config.web.host}:${config.web.port}/img/${poster}?id=${nanoid()}`; // ensure source is unique release.poster = `http://${config.web.host}:${config.web.port}/img/${poster}?id=${nanoid()}`; // ensure source is unique
release.photos = photos.map(photo => `http://${config.web.host}:${config.web.port}/img/${photo}?id=${nanoid()}`); release.photos = photos.map(photo => `http://${config.web.host}:${config.web.port}/img/${photo}?id=${nanoid()}`);
} }