diff --git a/seeds/01_networks.js b/seeds/01_networks.js index 6ebf9ab1..88c8f2bb 100755 --- a/seeds/01_networks.js +++ b/seeds/01_networks.js @@ -617,6 +617,15 @@ const networks = [ description: 'Watch the best HD exclusive movies and videos on Porn Pros. All the hottest new Pornstar and amateur girls in High Definition updated daily.', parent: 'whalemember', }, + { + slug: 'pornplus', + name: 'Porn+', + url: 'https://pornplus.com', + parent: 'whalemember', + parameters: { + layout: 'plus', + }, + }, { slug: 'private', name: 'Private', diff --git a/seeds/02_sites.js b/seeds/02_sites.js index cc11798f..151e5117 100755 --- a/seeds/02_sites.js +++ b/seeds/02_sites.js @@ -13788,6 +13788,7 @@ const sites = [ id: 'shag-street', }, }, + /* { slug: 'stayhomemilf', name: 'StayHomeMilf', @@ -13797,6 +13798,7 @@ const sites = [ id: 'stay-home-milf', }, }, + */ // MYLF cross-over { slug: 'mylfxadultprime', @@ -15859,6 +15861,164 @@ const sites = [ parent: 'pornpros', hasLogo: false, }, + // PORN PLUS PORN+ + { + name: 'Passion Fuck', + slug: 'passionfuck', + url: 'https://pornplus.com/series/passion-fuck', + parent: 'pornplus', + }, + { + name: 'Creepy Pa', + slug: 'creepypa', + url: 'https://pornplus.com/series/creepy-pa', + parent: 'pornplus', + }, + { + name: 'Property Exploits', + slug: 'propertyexploits', + url: 'https://pornplus.com/series/property-exploits', + parent: 'pornplus', + }, + { + name: 'Asians Exploited', + slug: 'asiansexploited', + url: 'https://pornplus.com/series/asians-exploited', + parent: 'pornplus', + }, + { + name: 'Shower 4K', + slug: 'shower4k', + url: 'https://pornplus.com/series/shower-4k', + parent: 'pornplus', + }, + { + name: 'Squirt Bomb', + slug: 'squirtbomb', + url: 'https://pornplus.com/series/squirt-bomb', + parent: 'pornplus', + }, + { + name: 'Kinky Sluts 4K', + slug: 'kinkysluts4k', + url: 'https://pornplus.com/series/kinky-sluts-4k', + parent: 'pornplus', + }, + { + name: 'School of Cock', + slug: 'schoolofcock', + url: 'https://pornplus.com/series/school-of-cock', + parent: 'pornplus', + }, + { + name: 'Facials Galore', + slug: 'facialsgalore', + url: 'https://pornplus.com/series/facials-galore', + parent: 'pornplus', + }, + { + name: 'Game On', + slug: 'gameon', + url: 'https://pornplus.com/series/game-on', + parent: 'pornplus', + }, + { + name: 'Waxxxed', + slug: 'waxxxed', + url: 'https://pornplus.com/series/waxxxed', + parent: 'pornplus', + }, + { + name: 'Double Trouble', + slug: 'doubletrouble', + url: 'https://pornplus.com/series/double-trouble', + parent: 'pornplus', + }, + { + name: 'Boobs 4K', + slug: 'boobs4k', + url: 'https://pornplus.com/series/boobs4k', + parent: 'pornplus', + }, + { + name: 'BBC POVD', + slug: 'bbcpovd', + url: 'https://pornplus.com/series/bbc-povd', + parent: 'pornplus', + }, + { + name: 'Sexercise', + slug: 'sexercise', + url: 'https://pornplus.com/series/sexercise', + parent: 'pornplus', + }, + { + name: 'Strip Club Tryouts', + slug: 'stripclubtryouts', + url: 'https://pornplus.com/series/strip-club-tryouts', + parent: 'pornplus', + }, + { + name: 'Pornstars in Cars', + slug: 'pornstarsincars', + url: 'https://pornplus.com/series/pornstars-in-cars', + parent: 'pornplus', + }, + { + name: 'RV Adventures', + slug: 'rvadventures', + url: 'https://pornplus.com/series/rv-adventures', + parent: 'pornplus', + }, + { + name: 'Bikini Smash', + slug: 'bikinismash', + alias: ['bikini splash'], + url: 'https://pornplus.com/series/bikini-splash', + parent: 'pornplus', + }, + { + name: 'Momcum', + slug: 'momcum', + url: 'https://pornplus.com/series/momcum', + parent: 'pornplus', + }, + { + name: 'Caged Sex', + slug: 'cagedsex', + url: 'https://pornplus.com/series/caged-sex', + parent: 'pornplus', + }, + { + name: 'Glory Hole 4K', + slug: 'gloryhole4k', + url: 'https://pornplus.com/series/glory-hole-4k', + parent: 'pornplus', + }, + { + name: 'Facials4K', + slug: 'facials4kpro', + url: 'https://pornplus.com/series/facials4k', + parent: 'pornplus', + }, + { + name: 'My Very First Time', + slug: 'myveryfirsttimepro', + url: 'https://pornplus.com/series/my-very-first-time', + parent: 'pornplus', + }, + { + name: 'Mom 4K', + slug: 'mom4k', + url: 'https://pornplus.com/series/mom-4k', + parent: 'pornplus', + }, + { + name: 'Nanny Spy', + slug: 'nannyspypro', + url: 'https://pornplus.com/series/nannyspy', + parent: 'pornplus', + }, // PRIVATE { slug: 'analintroductions', @@ -21020,7 +21180,6 @@ const sites = [ }, ]; -/* sites.reduce((acc, site) => { if (acc.has(site.slug)) { console.log('DUPLICATE!', site.slug); @@ -21030,7 +21189,6 @@ sites.reduce((acc, site) => { return acc; }, new Set()); -*/ /* eslint-disable max-len */ exports.seed = (knex) => Promise.resolve() diff --git a/src/scrapers/scrapers.js b/src/scrapers/scrapers.js index 5ecc9c82..77f9d261 100755 --- a/src/scrapers/scrapers.js +++ b/src/scrapers/scrapers.js @@ -160,6 +160,7 @@ const scrapers = { pinkyxxx, porncz, pornpros: whalemember, + pornplus: whalemember, private: privateNetwork, purgatoryx, radical, diff --git a/src/scrapers/whalemember.js b/src/scrapers/whalemember.js index 33186a02..93305ee8 100755 --- a/src/scrapers/whalemember.js +++ b/src/scrapers/whalemember.js @@ -44,6 +44,40 @@ function scrapeLatest(scenes, channel) { }); } +function scrapeLatestPlus(scenes, channel) { + return scenes.map(({ query, _element }) => { + const release = {}; + + release.title = query.content('.title'); + release.date = query.date('.video-thumbnail-footer', 'MM/DD/YYYY'); + + const slug = slugify(release.title); + + release.url = `${new URL(channel.url).origin}/video/${slug}`; + release.entryId = slug; + + release.actors = query.all('.actor-list a').map((actorEl) => ({ + name: unprint.query.content(actorEl), + url: unprint.query.url(actorEl, null, { origin: channel.url }), + })); + + const poster = query.poster() || query.img('a[data-video-thumbnail-single-image-target] img'); + + if (poster) { + release.poster = [ + stripQuery(poster), + poster, + ]; + } + + release.teaser = query.video('source', { attribute: 'data-src' }); + + release.channel = slugify(query.attribute('.series-link img', 'alt'), ''); + + return release; + }); +} + function scrapeScene({ query }, { url, entity }) { const release = {}; @@ -70,6 +104,8 @@ function scrapeScene({ query }, { url, entity }) { release.teaser = query.video('#player-wrapper source'); release.qualities = query.contents('#trailer_player .resolution').map((resolution) => Number(resolution.split('x')[1])).filter(Boolean); + console.log(release); + return release; } @@ -84,7 +120,22 @@ async function fetchLatest(channel, page = 1) { return res.status; } +async function fetchLatestPlus(channel, page = 1) { + const url = `${channel.url}?page=${page}`; + const res = await unprint.get(url, { selectAll: '.video-thumbnail' }); + + if (res.status === 200) { + return scrapeLatestPlus(res.context, channel); + } + + return res.status; +} + module.exports = { fetchLatest, scrapeScene, + plus: { + fetchLatest: fetchLatestPlus, + scrapeScene, + }, };