diff --git a/public/img/logos/pornpros/cockcompetition.png b/public/img/logos/pornpros/cockcompetition.png new file mode 100644 index 00000000..7bae56ae Binary files /dev/null and b/public/img/logos/pornpros/cockcompetition.png differ diff --git a/public/img/logos/pornpros/crueltyparty.png b/public/img/logos/pornpros/crueltyparty.png new file mode 100644 index 00000000..a699d753 Binary files /dev/null and b/public/img/logos/pornpros/crueltyparty.png differ diff --git a/public/img/logos/pornpros/cumshotsurprise.png b/public/img/logos/pornpros/cumshotsurprise.png new file mode 100644 index 00000000..6553f999 Binary files /dev/null and b/public/img/logos/pornpros/cumshotsurprise.png differ diff --git a/public/img/logos/pornpros/deepthroatlove.png b/public/img/logos/pornpros/deepthroatlove.png new file mode 100644 index 00000000..97cf92d2 Binary files /dev/null and b/public/img/logos/pornpros/deepthroatlove.png differ diff --git a/public/img/logos/pornpros/disgracedeighteen.png b/public/img/logos/pornpros/disgracedeighteen.png new file mode 100644 index 00000000..dc48df0f Binary files /dev/null and b/public/img/logos/pornpros/disgracedeighteen.png differ diff --git a/public/img/logos/pornpros/eighteenyearsold.png b/public/img/logos/pornpros/eighteenyearsold.png new file mode 100644 index 00000000..9712045f Binary files /dev/null and b/public/img/logos/pornpros/eighteenyearsold.png differ diff --git a/public/img/logos/pornpros/eurohumpers.png b/public/img/logos/pornpros/eurohumpers.png new file mode 100644 index 00000000..47ddf903 Binary files /dev/null and b/public/img/logos/pornpros/eurohumpers.png differ diff --git a/public/img/logos/pornpros/favicon.png b/public/img/logos/pornpros/favicon.png index 39260066..073d6f03 100644 Binary files a/public/img/logos/pornpros/favicon.png and b/public/img/logos/pornpros/favicon.png differ diff --git a/public/img/logos/pornpros/fortyozbounce.png b/public/img/logos/pornpros/fortyozbounce.png new file mode 100644 index 00000000..e32a910a Binary files /dev/null and b/public/img/logos/pornpros/fortyozbounce.png differ diff --git a/public/img/logos/pornpros/freaksofboobs.png b/public/img/logos/pornpros/freaksofboobs.png new file mode 100644 index 00000000..cc154efe Binary files /dev/null and b/public/img/logos/pornpros/freaksofboobs.png differ diff --git a/public/img/logos/pornpros/freaksofcock.png b/public/img/logos/pornpros/freaksofcock.png new file mode 100644 index 00000000..cba960a5 Binary files /dev/null and b/public/img/logos/pornpros/freaksofcock.png differ diff --git a/public/img/logos/pornpros/jurassiccock.png b/public/img/logos/pornpros/jurassiccock.png new file mode 100644 index 00000000..ac174f7d Binary files /dev/null and b/public/img/logos/pornpros/jurassiccock.png differ diff --git a/public/img/logos/pornpros/massagecreep.png b/public/img/logos/pornpros/massagecreep.png new file mode 100644 index 00000000..49f05b17 Binary files /dev/null and b/public/img/logos/pornpros/massagecreep.png differ diff --git a/public/img/logos/pornpros/network.png b/public/img/logos/pornpros/network.png index ad0574c4..8d269c07 100644 Binary files a/public/img/logos/pornpros/network.png and b/public/img/logos/pornpros/network.png differ diff --git a/public/img/logos/pornpros/pimpparade.png b/public/img/logos/pornpros/pimpparade.png new file mode 100644 index 00000000..01a8c552 Binary files /dev/null and b/public/img/logos/pornpros/pimpparade.png differ diff --git a/public/img/logos/pornpros/realexgirlfriends.png b/public/img/logos/pornpros/realexgirlfriends.png new file mode 100644 index 00000000..ba70661f Binary files /dev/null and b/public/img/logos/pornpros/realexgirlfriends.png differ diff --git a/public/img/logos/pornpros/shadypi.png b/public/img/logos/pornpros/shadypi.png new file mode 100644 index 00000000..3c5d2804 Binary files /dev/null and b/public/img/logos/pornpros/shadypi.png differ diff --git a/public/img/logos/pornpros/teenbff.png b/public/img/logos/pornpros/teenbff.png new file mode 100644 index 00000000..aa802234 Binary files /dev/null and b/public/img/logos/pornpros/teenbff.png differ diff --git a/seeds/01_sites.js b/seeds/01_sites.js index 12d8c329..a44c07cf 100644 --- a/seeds/01_sites.js +++ b/seeds/01_sites.js @@ -2119,6 +2119,103 @@ function getSites(networksMap) { network_id: networksMap.pervcity, parameters: JSON.stringify({ tourId: 9 }), }, + // PORN PROS + { + name: 'Real Ex Girlfriends', + slug: 'realexgirlfriends', + url: 'https://pornpros.com/site/realexgirlfriends', + network_id: networksMap.pornpros, + }, + { + name: '18 Years Old', + slug: 'eighteenyearsold', + url: 'https://pornpros.com/site/18yearsold', + network_id: networksMap.pornpros, + }, + { + name: 'Massage Creep', + slug: 'massagecreep', + url: 'https://pornpros.com/site/massagecreep', + network_id: networksMap.pornpros, + }, + { + name: 'Deep Throat Love', + slug: 'deepthroatlove', + url: 'https://pornpros.com/site/deepthroatlove', + network_id: networksMap.pornpros, + }, + { + name: 'Teen BFF', + slug: 'teenbff', + url: 'https://pornpros.com/site/teenbff', + network_id: networksMap.pornpros, + }, + { + name: 'Shady P.I.', + slug: 'shadypi', + url: 'https://pornpros.com/site/shadypi', + network_id: networksMap.pornpros, + }, + { + name: 'Cruelty Party', + slug: 'crueltyparty', + url: 'https://pornpros.com/site/crueltyparty', + network_id: networksMap.pornpros, + }, + { + name: 'Disgraced 18', + slug: 'disgracedeighteen', + url: 'https://pornpros.com/site/disgraced18', + network_id: networksMap.pornpros, + }, + { + name: 'Cumshot Surprise', + slug: 'cumshotsurprise', + url: 'https://pornpros.com/site/cumshotsurprise', + network_id: networksMap.pornpros, + }, + { + name: '40oz Bounce', + slug: 'fortyozbounce', + url: 'https://pornpros.com/site/40ozbounce', + network_id: networksMap.pornpros, + }, + { + name: 'Jurassic Cock', + slug: 'jurassiccock', + url: 'https://pornpros.com/site/jurassiccock', + network_id: networksMap.pornpros, + }, + { + name: 'Freaks Of Cock', + slug: 'freaksofcock', + url: 'https://pornpros.com/site/freaksofcock', + network_id: networksMap.pornpros, + }, + { + name: 'Euro Humpers', + slug: 'eurohumpers', + url: 'https://pornpros.com/site/eurohumpers', + network_id: networksMap.pornpros, + }, + { + name: 'Freaks Of Boobs', + slug: 'freaksofboobs', + url: 'https://pornpros.com/site/freaksofboobs', + network_id: networksMap.pornpros, + }, + { + name: 'Cock Competition', + slug: 'cockcompetition', + url: 'https://pornpros.com/site/cockcompetition', + network_id: networksMap.pornpros, + }, + { + name: 'Pimp Parade', + slug: 'pimpparade', + url: 'https://pornpros.com/site/pimpparade', + network_id: networksMap.pornpros, + }, // PRIVATE { slug: 'analintroductions', diff --git a/seeds/03_tags.js b/seeds/03_tags.js index 8776e75b..20e04fb1 100644 --- a/seeds/03_tags.js +++ b/seeds/03_tags.js @@ -564,6 +564,11 @@ function getTags(groupsMap) { alias_for: null, group_id: groupsMap.roleplay, }, + { + name: 'massage', + slug: 'massage', + alias_for: null, + }, { name: 'masturbation', slug: 'masturbation', @@ -1573,15 +1578,19 @@ function getTagAliases(tagsMap) { function getSiteTags() { return { - allanal: ['anal', 'mff'], + teenallanal: ['anal', 'mff'], boundgods: ['gay'], buttmachineboys: ['gay'], + deepthroatlove: ['blowjob', 'deepthroat'], divinebitches: ['femdom'], - familystrokes: ['family'], - menonedge: ['gay'], dpparodies: ['parody'], + eighteenyearsold: ['teen'], + familystrokes: ['family'], + massagecreep: ['massage'], + menonedge: ['gay'], submissived: ['bdsm'], swallowed: ['blowjob', 'deepthroat', 'facefucking'], + teenbff: ['mff'], trueanal: ['anal'], tspussyhunters: ['transsexual'], }; diff --git a/src/releases.js b/src/releases.js index 8d9a565b..064f5590 100644 --- a/src/releases.js +++ b/src/releases.js @@ -318,7 +318,8 @@ async function storeReleaseAssets(releases) { const subpath = `${release.site.network.slug}/${release.site.slug}/${release.id}/`; const identifier = `"${release.title}" (${release.id})`; - await createMediaDirectory('releases', subpath); + try { + await createMediaDirectory('releases', subpath); // don't use Promise.all to prevent concurrency issues with duplicate detection if (release.poster) { @@ -345,6 +346,9 @@ async function storeReleaseAssets(releases) { targetId: release.id, subpath, }, identifier); + } catch (error) { + logger.error(error.message); + } }, { concurrency: 10, }); diff --git a/src/scrapers/pornpros.js b/src/scrapers/pornpros.js new file mode 100644 index 00000000..6c957ec4 --- /dev/null +++ b/src/scrapers/pornpros.js @@ -0,0 +1,80 @@ +'use strict'; + +const bhttp = require('bhttp'); +const { JSDOM } = require('jsdom'); +const moment = require('moment'); + +function scrapeLatest(html, site) { + const { document } = new JSDOM(html).window; + + return Array.from(document.querySelectorAll('.site-list .card'), (scene) => { + const release = { site }; + + release.url = `https://pornpros.com${scene.querySelector(':scope > a').href}`; + release.entryId = scene.dataset.videoId; + release.title = scene.querySelector('.card-title').textContent; + release.date = moment.utc(scene.dataset.date, 'MMMM DD, YYYY').toDate(); + release.actors = Array.from(scene.querySelectorAll('.actors a'), el => el.textContent); + + release.poster = `https:${scene.querySelector('.single-image').src}`; + release.photos = Array.from(scene.querySelectorAll('.rollover-thumbs img'), el => `https:${el.dataset.src}`); + + const trailerEl = scene.querySelector('source'); + if (trailerEl) release.trailer = { src: trailerEl.dataset.src }; + + return release; + }); +} + +function scrapeScene(html, site) { + const { document } = new JSDOM(html).window; + const release = { site }; + + const scene = document.querySelector('#t2019-2col'); + + release.title = scene.querySelector('.t2019-stitle').textContent.trim(); + release.description = scene.querySelector('#t2019-description').textContent.trim(); + release.actors = Array.from(scene.querySelectorAll('#t2019-models a'), el => el.textContent); + + const durationEl = scene.querySelector('#t2019-stime'); + if (durationEl) release.duration = Number(durationEl.textContent.match(/\d+/)[0]) * 60; + + release.photos = Array.from(scene.querySelectorAll('#t2019-main .t2019-thumbs img'), el => `https:${el.src}`); + + const posterEl = scene.querySelector('#no-player-image'); + const videoEl = scene.querySelector('video'); + + if (posterEl) release.poster = `https:${posterEl.src}`; + else if (videoEl) release.poster = `https:${videoEl.poster}`; + + const trailerEl = scene.querySelector('#t2019-video source'); + if (trailerEl) release.trailer = { src: trailerEl.src }; + + return release; +} + +async function fetchLatest(site, page = 1) { + const url = `https://pornpros.com/site/${site.slug}?page=${page}`; + const res = await bhttp.get(url); + + if (res.statusCode === 200) { + return scrapeLatest(res.body.toString(), site); + } + + return null; +} + +async function fetchScene(url, site) { + const res = await bhttp.get(url); + + if (res.statusCode === 200) { + return scrapeScene(res.body.toString(), site); + } + + return null; +} + +module.exports = { + fetchLatest, + fetchScene, +}; diff --git a/src/scrapers/scrapers.js b/src/scrapers/scrapers.js index 2de2fe89..9f33979e 100644 --- a/src/scrapers/scrapers.js +++ b/src/scrapers/scrapers.js @@ -15,6 +15,7 @@ const kink = require('./kink'); const mikeadriano = require('./mikeadriano'); const mofos = require('./mofos'); const pervcity = require('./pervcity'); +const pornpros = require('./pornpros'); const privateNetwork = require('./private'); // reserved keyword const naughtyamerica = require('./naughtyamerica'); const realitykings = require('./realitykings'); @@ -56,6 +57,7 @@ module.exports = { mikeadriano, mofos, pervcity, + pornpros, private: privateNetwork, naughtyamerica, realitykings,