diff --git a/package-lock.json b/package-lock.json index e17afedc..d63c7e55 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,7 +1,7 @@ { "name": "traxxx", - "version": "1.172.1", - "lockfileVersion": 2, + "version": "1.172.3", + "lockfileVersion": 1, "requires": true, "packages": { "": { diff --git a/package.json b/package.json index e7b86ec2..7da4a707 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "traxxx", - "version": "1.172.1", + "version": "1.172.3", "description": "All the latest porn releases in one place", "main": "src/app.js", "scripts": { diff --git a/public/img/tags/nurse/2.jpeg b/public/img/tags/nurse/2.jpeg new file mode 100644 index 00000000..44bd5822 Binary files /dev/null and b/public/img/tags/nurse/2.jpeg differ diff --git a/public/img/tags/nurse/2a.jpeg b/public/img/tags/nurse/2a.jpeg new file mode 100644 index 00000000..75e06160 Binary files /dev/null and b/public/img/tags/nurse/2a.jpeg differ diff --git a/public/img/tags/nurse/lazy/2.jpeg b/public/img/tags/nurse/lazy/2.jpeg new file mode 100644 index 00000000..caf86931 Binary files /dev/null and b/public/img/tags/nurse/lazy/2.jpeg differ diff --git a/public/img/tags/nurse/lazy/2a.jpeg b/public/img/tags/nurse/lazy/2a.jpeg new file mode 100644 index 00000000..70701682 Binary files /dev/null and b/public/img/tags/nurse/lazy/2a.jpeg differ diff --git a/public/img/tags/nurse/originals/2.jpeg b/public/img/tags/nurse/originals/2.jpeg new file mode 100644 index 00000000..d83d9aa6 Binary files /dev/null and b/public/img/tags/nurse/originals/2.jpeg differ diff --git a/public/img/tags/nurse/originals/2a.jpeg b/public/img/tags/nurse/originals/2a.jpeg new file mode 100644 index 00000000..dd23eeab Binary files /dev/null and b/public/img/tags/nurse/originals/2a.jpeg differ diff --git a/public/img/tags/nurse/thumbs/2.jpeg b/public/img/tags/nurse/thumbs/2.jpeg new file mode 100644 index 00000000..92361ce7 Binary files /dev/null and b/public/img/tags/nurse/thumbs/2.jpeg differ diff --git a/public/img/tags/nurse/thumbs/2a.jpeg b/public/img/tags/nurse/thumbs/2a.jpeg new file mode 100644 index 00000000..e6fe1237 Binary files /dev/null and b/public/img/tags/nurse/thumbs/2a.jpeg differ diff --git a/seeds/04_media.js b/seeds/04_media.js index 665fd8df..4f36fe07 100644 --- a/seeds/04_media.js +++ b/seeds/04_media.js @@ -645,7 +645,7 @@ const tagPosters = [ ['mff', 1, 'Anikka Albrite, Kelsi Monroe and Mick Blue for HardX'], ['mfm', 0, 'Vina Sky in "Jules Jordan\'s Three Ways" for Jules Jordan'], ['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'], ['oil', 2, 'Jade Kush for Passion HD'], ['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', 3, 'Higurashi Rin in "Naughty Nun" for All Gravure'], ['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', 3, 'Vina Sky for Lubed'], ['oil', 0, 'Jada Stevens in "Jada Stevens Anal Ass Oiled Up For James Deen\'s Cock" for Jules Jordan'], diff --git a/src/media.js b/src/media.js index 0b5de790..e3646f88 100644 --- a/src/media.js +++ b/src/media.js @@ -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) { @@ -698,9 +703,6 @@ async function storeMedias(baseMedias, options) { const newMediaEntries = newMediaWithEntries.filter(media => media.newEntry).map(media => media.entry); 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); return [...newMediaWithEntries, ...existingHashMedias]; diff --git a/src/scrapers/assylum.js b/src/scrapers/assylum.js index e0754333..81f22c04 100644 --- a/src/scrapers/assylum.js +++ b/src/scrapers/assylum.js @@ -4,10 +4,10 @@ const { get, geta, ctxa } = require('../utils/q'); function extractActors(actorString) { return actorString - ?.replace(/.*:|\(.*\)|\d+(-|\s)year(-|\s)old|nurses?|tangled/ig, '') // remove Patient:, (date) and other nonsense - .split(/\band\b|\bvs\b|\/|,|&/ig) - .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)) + ?.replace(/.*:|\(.*\)|\d+(-|\s)year(-|\s)old|nurses?|tangled/ig, '') // remove Patient:, (date) and other nonsense + .split(/\band\b|\bvs\b|\/|,|&/ig) + .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)) || []; } diff --git a/src/scrapers/boobpedia.js b/src/scrapers/boobpedia.js index 32e48cdd..23d2d272 100644 --- a/src/scrapers/boobpedia.js +++ b/src/scrapers/boobpedia.js @@ -28,8 +28,8 @@ function scrapeProfile(html) { if (bio.Measurements) { const measurements = bio.Measurements .match(/\d+(\w+)?-\d+-\d+/g) - ?.slice(-1)[0] // allow for both '34C-25-36' and '86-64-94 cm / 34-25-37 in' - .split('-'); + ?.slice(-1)[0] // allow for both '34C-25-36' and '86-64-94 cm / 34-25-37 in' + .split('-'); // account for measuemrents being just e.g. '32EE' if (measurements) { diff --git a/src/scrapers/famedigital.js b/src/scrapers/famedigital.js index 1db24b72..f830d2a8 100644 --- a/src/scrapers/famedigital.js +++ b/src/scrapers/famedigital.js @@ -77,7 +77,7 @@ async function fetchClassicProfile(actorName, { site }) { const actorPath = pornstarsRes.item.qa('option[value*="/pornstar"]') .find(el => slugify(el.textContent) === actorSlug) - ?.value; + ?.value; if (actorPath) { const actorUrl = `${site.url}${actorPath}`; diff --git a/src/scrapers/gamma.js b/src/scrapers/gamma.js index 6dd47066..336b6528 100644 --- a/src/scrapers/gamma.js +++ b/src/scrapers/gamma.js @@ -200,6 +200,8 @@ function scrapeAll(html, site, networkUrl, hasTeaser = true) { ]; } + console.log(release); + return release; }); } @@ -252,7 +254,10 @@ async function scrapeScene(html, url, site, baseRelease, mobileHtml, options) { const channel = data?.productionCompany?.name || $('.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', ''); if (channel) release.channel = slugify(channel, ''); diff --git a/src/scrapers/julesjordan.js b/src/scrapers/julesjordan.js index a16cbe26..e64f12b9 100644 --- a/src/scrapers/julesjordan.js +++ b/src/scrapers/julesjordan.js @@ -305,8 +305,8 @@ function scrapeMovie({ el, query }, url, site) { const scenes = scrapeAll(sceneQus, site); const curatedScenes = scenes - ?.map(scene => ({ ...scene, movie })) - .sort((sceneA, sceneB) => sceneA.date - sceneB.date); + ?.map(scene => ({ ...scene, movie })) + .sort((sceneA, sceneB) => sceneA.date - sceneB.date); movie.date = curatedScenes?.[0].date; diff --git a/src/scrapers/nubiles.js b/src/scrapers/nubiles.js index 7d08ad30..a871dfcf 100644 --- a/src/scrapers/nubiles.js +++ b/src/scrapers/nubiles.js @@ -72,7 +72,7 @@ async function scrapeScene({ query }, url, site) { release.title = query.q('.content-pane-title h2', 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.tags = query.all('.categories a', true); @@ -134,12 +134,6 @@ async function fetchUpcoming(site) { 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 }) { const firstLetter = actorName.charAt(0).toLowerCase(); const origin = slugUrlMap[site.slug] || site.url; @@ -164,6 +158,6 @@ async function fetchProfile({ name: actorName }, { site }) { module.exports = { fetchLatest, fetchUpcoming, - fetchScene, fetchProfile, + scrapeScene, }; diff --git a/src/scrapers/traxxx.js b/src/scrapers/traxxx.js index 3016f1ac..187f123b 100644 --- a/src/scrapers/traxxx.js +++ b/src/scrapers/traxxx.js @@ -251,6 +251,8 @@ async function fetchLatest(entity, page, options) { .orderByRaw('random()') .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.photos = photos.map(photo => `http://${config.web.host}:${config.web.port}/img/${photo}?id=${nanoid()}`); }