diff --git a/config/default.js b/config/default.js
index 272973b5..7d19a3dc 100644
--- a/config/default.js
+++ b/config/default.js
@@ -42,6 +42,17 @@ module.exports = {
'wicked',
'brazzers',
'milehighmedia',
+ [
+ // Nubiles; use the same scraper, but different results per site
+ 'nubiles',
+ 'nubilesporn',
+ 'deeplush',
+ 'brattysis',
+ 'nfbusty',
+ 'anilos',
+ 'hotcrazymess',
+ 'thatsitcomshow',
+ ],
'21sextury',
'julesjordan',
'naughtyamerica',
diff --git a/public/img/logos/nubiles/anilos.png b/public/img/logos/nubiles/anilos.png
new file mode 100644
index 00000000..ddd319fc
Binary files /dev/null and b/public/img/logos/nubiles/anilos.png differ
diff --git a/public/img/logos/nubiles/badteenspunished.png b/public/img/logos/nubiles/badteenspunished.png
new file mode 100644
index 00000000..91cbbab4
Binary files /dev/null and b/public/img/logos/nubiles/badteenspunished.png differ
diff --git a/public/img/logos/nubiles/bountyhunterporn.png b/public/img/logos/nubiles/bountyhunterporn.png
new file mode 100644
index 00000000..3910ac9c
Binary files /dev/null and b/public/img/logos/nubiles/bountyhunterporn.png differ
diff --git a/public/img/logos/nubiles/brattysis.png b/public/img/logos/nubiles/brattysis.png
new file mode 100644
index 00000000..a90e4be1
Binary files /dev/null and b/public/img/logos/nubiles/brattysis.png differ
diff --git a/public/img/logos/nubiles/daddyslilangel.png b/public/img/logos/nubiles/daddyslilangel.png
new file mode 100644
index 00000000..049aef1a
Binary files /dev/null and b/public/img/logos/nubiles/daddyslilangel.png differ
diff --git a/public/img/logos/nubiles/deeplush.png b/public/img/logos/nubiles/deeplush.png
new file mode 100644
index 00000000..37b55e25
Binary files /dev/null and b/public/img/logos/nubiles/deeplush.png differ
diff --git a/public/img/logos/nubiles/detentiongirls.png b/public/img/logos/nubiles/detentiongirls.png
new file mode 100644
index 00000000..dfa63593
Binary files /dev/null and b/public/img/logos/nubiles/detentiongirls.png differ
diff --git a/public/img/logos/nubiles/driverxxx.png b/public/img/logos/nubiles/driverxxx.png
new file mode 100644
index 00000000..a84b5269
Binary files /dev/null and b/public/img/logos/nubiles/driverxxx.png differ
diff --git a/public/img/logos/nubiles/favicon.png b/public/img/logos/nubiles/favicon.png
index e82d54d3..67e6cb0a 100644
Binary files a/public/img/logos/nubiles/favicon.png and b/public/img/logos/nubiles/favicon.png differ
diff --git a/public/img/logos/nubiles/hotcrazymess.png b/public/img/logos/nubiles/hotcrazymess.png
new file mode 100644
index 00000000..9cde3fa7
Binary files /dev/null and b/public/img/logos/nubiles/hotcrazymess.png differ
diff --git a/public/img/logos/nubiles/misc/anilos_original.png b/public/img/logos/nubiles/misc/anilos_original.png
new file mode 100644
index 00000000..25274ad8
Binary files /dev/null and b/public/img/logos/nubiles/misc/anilos_original.png differ
diff --git a/public/img/logos/nubiles/misc/bad-teens-punished_original.png b/public/img/logos/nubiles/misc/bad-teens-punished_original.png
new file mode 100644
index 00000000..d496679e
Binary files /dev/null and b/public/img/logos/nubiles/misc/bad-teens-punished_original.png differ
diff --git a/public/img/logos/nubiles/misc/deep-lush.png b/public/img/logos/nubiles/misc/deep-lush.png
new file mode 100644
index 00000000..74260f89
Binary files /dev/null and b/public/img/logos/nubiles/misc/deep-lush.png differ
diff --git a/public/img/logos/nubiles/misc/deep-lush.svg b/public/img/logos/nubiles/misc/deep-lush.svg
new file mode 100644
index 00000000..41c88bef
--- /dev/null
+++ b/public/img/logos/nubiles/misc/deep-lush.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/public/img/logos/nubiles/misc/driver-xxx_original.png b/public/img/logos/nubiles/misc/driver-xxx_original.png
new file mode 100644
index 00000000..8e4c4673
Binary files /dev/null and b/public/img/logos/nubiles/misc/driver-xxx_original.png differ
diff --git a/public/img/logos/nubiles/misc/hot-crazy-mess.png b/public/img/logos/nubiles/misc/hot-crazy-mess.png
new file mode 100644
index 00000000..710df91f
Binary files /dev/null and b/public/img/logos/nubiles/misc/hot-crazy-mess.png differ
diff --git a/public/img/logos/nubiles/misc/hot-crazy-mess.svg b/public/img/logos/nubiles/misc/hot-crazy-mess.svg
new file mode 100644
index 00000000..1379b7f2
--- /dev/null
+++ b/public/img/logos/nubiles/misc/hot-crazy-mess.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/public/img/logos/nubiles/misc/moms-teach-sex_original.png b/public/img/logos/nubiles/misc/moms-teach-sex_original.png
new file mode 100644
index 00000000..9d2516fa
Binary files /dev/null and b/public/img/logos/nubiles/misc/moms-teach-sex_original.png differ
diff --git a/public/img/logos/nubiles/misc/nf-busty.png b/public/img/logos/nubiles/misc/nf-busty.png
new file mode 100644
index 00000000..e65a3f29
Binary files /dev/null and b/public/img/logos/nubiles/misc/nf-busty.png differ
diff --git a/public/img/logos/nubiles/misc/nf-busty.svg b/public/img/logos/nubiles/misc/nf-busty.svg
new file mode 100644
index 00000000..d5450670
--- /dev/null
+++ b/public/img/logos/nubiles/misc/nf-busty.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/public/img/logos/nubiles/misc/nubiles-et.png b/public/img/logos/nubiles/misc/nubiles-et.png
new file mode 100644
index 00000000..48a5c038
Binary files /dev/null and b/public/img/logos/nubiles/misc/nubiles-et.png differ
diff --git a/public/img/logos/nubiles/misc/nubiles-et.svg b/public/img/logos/nubiles/misc/nubiles-et.svg
new file mode 100644
index 00000000..79d26b7e
--- /dev/null
+++ b/public/img/logos/nubiles/misc/nubiles-et.svg
@@ -0,0 +1 @@
+
diff --git a/public/img/logos/nubiles/misc/nubiles-et_light.png b/public/img/logos/nubiles/misc/nubiles-et_light.png
new file mode 100644
index 00000000..ae6c9eba
Binary files /dev/null and b/public/img/logos/nubiles/misc/nubiles-et_light.png differ
diff --git a/public/img/logos/nubiles/misc/nubiles-unscripted_original.png b/public/img/logos/nubiles/misc/nubiles-unscripted_original.png
new file mode 100644
index 00000000..2722587b
Binary files /dev/null and b/public/img/logos/nubiles/misc/nubiles-unscripted_original.png differ
diff --git a/public/img/logos/nubiles/misc/nubiles.png b/public/img/logos/nubiles/misc/nubiles.png
new file mode 100644
index 00000000..ebcc7d1f
Binary files /dev/null and b/public/img/logos/nubiles/misc/nubiles.png differ
diff --git a/public/img/logos/nubiles/misc/petite-ballerinas-fucked_original.png b/public/img/logos/nubiles/misc/petite-ballerinas-fucked_original.png
new file mode 100644
index 00000000..57a4f77a
Binary files /dev/null and b/public/img/logos/nubiles/misc/petite-ballerinas-fucked_original.png differ
diff --git a/public/img/logos/nubiles/misc/teacher-fucks-teens_original.png b/public/img/logos/nubiles/misc/teacher-fucks-teens_original.png
new file mode 100644
index 00000000..4550ea05
Binary files /dev/null and b/public/img/logos/nubiles/misc/teacher-fucks-teens_original.png differ
diff --git a/public/img/logos/nubiles/misc/that-sitcom-show.png b/public/img/logos/nubiles/misc/that-sitcom-show.png
new file mode 100644
index 00000000..2b4dfd2d
Binary files /dev/null and b/public/img/logos/nubiles/misc/that-sitcom-show.png differ
diff --git a/public/img/logos/nubiles/misc/that-sitcom-show.svg b/public/img/logos/nubiles/misc/that-sitcom-show.svg
new file mode 100644
index 00000000..43b9d3c3
--- /dev/null
+++ b/public/img/logos/nubiles/misc/that-sitcom-show.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/public/img/logos/nubiles/momsteachsex.png b/public/img/logos/nubiles/momsteachsex.png
new file mode 100644
index 00000000..9f7cf8ed
Binary files /dev/null and b/public/img/logos/nubiles/momsteachsex.png differ
diff --git a/public/img/logos/nubiles/myfamilypies.png b/public/img/logos/nubiles/myfamilypies.png
new file mode 100644
index 00000000..6a1e15db
Binary files /dev/null and b/public/img/logos/nubiles/myfamilypies.png differ
diff --git a/public/img/logos/nubiles/network.png b/public/img/logos/nubiles/network.png
index ebcc7d1f..062d9d5f 100644
Binary files a/public/img/logos/nubiles/network.png and b/public/img/logos/nubiles/network.png differ
diff --git a/public/img/logos/nubiles/nfbusty.png b/public/img/logos/nubiles/nfbusty.png
new file mode 100644
index 00000000..fab093f8
Binary files /dev/null and b/public/img/logos/nubiles/nfbusty.png differ
diff --git a/public/img/logos/nubiles/nubilefilms.png b/public/img/logos/nubiles/nubilefilms.png
new file mode 100644
index 00000000..4f74a649
Binary files /dev/null and b/public/img/logos/nubiles/nubilefilms.png differ
diff --git a/public/img/logos/nubiles/nubiles.png b/public/img/logos/nubiles/nubiles.png
new file mode 100644
index 00000000..c4ba8f93
Binary files /dev/null and b/public/img/logos/nubiles/nubiles.png differ
diff --git a/public/img/logos/nubiles/nubilescasting.png b/public/img/logos/nubiles/nubilescasting.png
new file mode 100644
index 00000000..7a980d62
Binary files /dev/null and b/public/img/logos/nubiles/nubilescasting.png differ
diff --git a/public/img/logos/nubiles/nubileset.png b/public/img/logos/nubiles/nubileset.png
new file mode 100644
index 00000000..c668383e
Binary files /dev/null and b/public/img/logos/nubiles/nubileset.png differ
diff --git a/public/img/logos/nubiles/nubilesunscripted.png b/public/img/logos/nubiles/nubilesunscripted.png
new file mode 100644
index 00000000..861aa93f
Binary files /dev/null and b/public/img/logos/nubiles/nubilesunscripted.png differ
diff --git a/public/img/logos/nubiles/petiteballerinasfucked.png b/public/img/logos/nubiles/petiteballerinasfucked.png
new file mode 100644
index 00000000..14e1e2b2
Binary files /dev/null and b/public/img/logos/nubiles/petiteballerinasfucked.png differ
diff --git a/public/img/logos/nubiles/petitehdporn.png b/public/img/logos/nubiles/petitehdporn.png
new file mode 100644
index 00000000..7914c080
Binary files /dev/null and b/public/img/logos/nubiles/petitehdporn.png differ
diff --git a/public/img/logos/nubiles/princesscum.png b/public/img/logos/nubiles/princesscum.png
new file mode 100644
index 00000000..6f89b5eb
Binary files /dev/null and b/public/img/logos/nubiles/princesscum.png differ
diff --git a/public/img/logos/nubiles/stepsiblingscaught.png b/public/img/logos/nubiles/stepsiblingscaught.png
new file mode 100644
index 00000000..cb178937
Binary files /dev/null and b/public/img/logos/nubiles/stepsiblingscaught.png differ
diff --git a/public/img/logos/nubiles/teacherfucksteens.png b/public/img/logos/nubiles/teacherfucksteens.png
new file mode 100644
index 00000000..6af00877
Binary files /dev/null and b/public/img/logos/nubiles/teacherfucksteens.png differ
diff --git a/public/img/logos/nubiles/thatsitcomshow.png b/public/img/logos/nubiles/thatsitcomshow.png
new file mode 100644
index 00000000..60c37491
Binary files /dev/null and b/public/img/logos/nubiles/thatsitcomshow.png differ
diff --git a/seeds/00_tags.js b/seeds/00_tags.js
index 000d1ef7..2856cd3f 100644
--- a/seeds/00_tags.js
+++ b/seeds/00_tags.js
@@ -252,6 +252,11 @@ function getTags(groupsMap) {
alias_for: null,
group_id: groupsMap.finish,
},
+ {
+ name: 'casting',
+ slug: 'casting',
+ alias_for: null,
+ },
{
name: 'cheerleader',
slug: 'cheerleader',
@@ -846,6 +851,12 @@ function getTags(groupsMap) {
alias_for: null,
group_id: groupsMap.body,
},
+ {
+ name: 'teacher',
+ slug: 'teacher',
+ alias_for: null,
+ group_id: groupsMap.roleplay,
+ },
{
name: 'threesome',
slug: 'threesome',
diff --git a/seeds/01_networks.js b/seeds/01_networks.js
index e3c4eebd..005bddaf 100644
--- a/seeds/01_networks.js
+++ b/seeds/01_networks.js
@@ -184,6 +184,12 @@ const networks = [
url: 'https://www.naughtyamerica.com',
description: 'The best porn movies daily at Naughty America! Experience the most seductive porn stars in stunning virtual reality, 4K and HD porn videos!',
},
+ {
+ slug: 'nubiles',
+ name: 'Nubiles',
+ url: 'https://www.nubiles.com',
+ description: 'Welcome to the teen megasite that started it all! Browse our massive HD collection of fresh legal hotties at Nubiles.net.',
+ },
{
slug: 'perfectgonzo',
name: 'Perfect Gonzo',
diff --git a/seeds/02_sites.js b/seeds/02_sites.js
index a3bb8674..705cf0d7 100644
--- a/seeds/02_sites.js
+++ b/seeds/02_sites.js
@@ -2822,6 +2822,154 @@ const sites = [
url: 'https://www.naughtyamerica.com/site/live-naughty-nurse',
network: 'naughtyamerica',
},
+ // NUBILES
+ {
+ slug: 'anilos',
+ name: 'Anilos',
+ url: 'https://www.anilos.com',
+ network: 'nubiles',
+ },
+ {
+ slug: 'brattysis',
+ name: 'Bratty Sis',
+ url: 'https://www.brattysis.com',
+ tags: ['family'],
+ network: 'nubiles',
+ },
+ {
+ slug: 'deeplush',
+ name: 'Deep Lush',
+ url: 'https://www.deeplush.com',
+ network: 'nubiles',
+ },
+ {
+ slug: 'hotcrazymess',
+ name: 'Hot Crazy Mess',
+ url: 'https://www.hotcrazymess.com',
+ network: 'nubiles',
+ },
+ {
+ slug: 'nfbusty',
+ name: 'NF Busty',
+ url: 'https://www.nfbusty.com',
+ tags: ['big-boobs'],
+ network: 'nubiles',
+ },
+ {
+ slug: 'nubilefilms',
+ name: 'Nubile Films',
+ url: 'https://www.nubilefilms.com',
+ network: 'nubiles',
+ },
+ {
+ slug: 'nubiles',
+ name: 'Nubiles',
+ url: 'https://www.nubiles.net',
+ network: 'nubiles',
+ },
+ {
+ slug: 'nubilescasting',
+ name: 'Nubiles Casting',
+ url: 'https://www.nubiles-casting.com',
+ tags: ['casting'],
+ network: 'nubiles',
+ },
+ {
+ slug: 'momsteachsex',
+ name: 'Moms Teach Sex',
+ url: 'https://www.momsteachsex.com',
+ tags: ['family', 'milf'],
+ network: 'nubiles',
+ },
+ {
+ slug: 'petitehdporn',
+ name: 'Petite HD Porn',
+ url: 'https://www.petitehdporn.com',
+ network: 'nubiles',
+ },
+ {
+ slug: 'driverxxx',
+ name: 'Driver XXX',
+ url: 'https://www.driverxxx.com',
+ network: 'nubiles',
+ },
+ {
+ slug: 'petiteballerinasfucked',
+ name: 'Petite Ballerinas Fucked',
+ url: 'https://www.petiteballerinasfucked.com',
+ network: 'nubiles',
+ },
+ {
+ slug: 'teacherfucksteens',
+ name: 'Teacher Fucks Teens',
+ url: 'https://www.teacherfucksteens.com',
+ tags: ['teacher'],
+ network: 'nubiles',
+ },
+ {
+ slug: 'stepsiblingscaught',
+ name: 'Step Siblings Caught',
+ url: 'https://www.stepsiblingscaught.com',
+ tags: ['family'],
+ network: 'nubiles',
+ },
+ {
+ slug: 'princesscum',
+ name: 'Princess Cum',
+ url: 'https://www.princesscum.com',
+ network: 'nubiles',
+ },
+ {
+ slug: 'badteenspunished',
+ name: 'Bad Teens Punished',
+ url: 'https://www.badteenspunished.com',
+ network: 'nubiles',
+ },
+ {
+ slug: 'nubilesunscripted',
+ name: 'Nubiles Unscripted',
+ url: 'https://www.nubilesunscripted.com',
+ network: 'nubiles',
+ },
+ {
+ slug: 'bountyhunterporn',
+ name: 'Bounty Hunter Porn',
+ url: 'https://www.bountyhunterporn.com',
+ network: 'nubiles',
+ },
+ {
+ slug: 'daddyslilangel',
+ name: 'Daddy\'s Lil Angel',
+ url: 'https://www.daddyslilangel.com',
+ tags: ['family', 'anal'],
+ network: 'nubiles',
+ },
+ {
+ slug: 'myfamilypies',
+ name: 'My Family Pies',
+ url: 'https://www.myfamilypies.com',
+ tags: ['family'],
+ network: 'nubiles',
+ },
+ {
+ slug: 'nubileset',
+ name: 'Nubiles Entertainment',
+ url: 'https://www.nubileset.com',
+ network: 'nubiles',
+ },
+ {
+ slug: 'detentiongirls',
+ name: 'Detention Girls',
+ url: 'https://www.detentiongirls.com',
+ network: 'nubiles',
+ },
+ {
+ slug: 'thatsitcomshow',
+ name: 'That Sitcom Show',
+ url: 'https://www.thatsitcomshow.com',
+ tags: ['parody'],
+ network: 'nubiles',
+ },
// PERFECT GONZO
{
slug: 'allinternal',
diff --git a/src/.eslintrc b/src/.eslintrc
index fb4c0b80..686fcae7 100644
--- a/src/.eslintrc
+++ b/src/.eslintrc
@@ -10,6 +10,7 @@
"no-console": 0,
"no-underscore-dangle": 0,
"indent": "off",
+ "prefer-destructuring": "off",
"template-curly-spacing": "off",
"object-curly-newline": "off",
"max-len": [2, {"code": 300, "tabWidth": 4, "ignoreUrls": true}],
diff --git a/src/scrapers/nubiles.js b/src/scrapers/nubiles.js
new file mode 100644
index 00000000..f73e3157
--- /dev/null
+++ b/src/scrapers/nubiles.js
@@ -0,0 +1,149 @@
+'use strict';
+
+const { get, geta, ctxa } = require('../utils/q');
+const slugify = require('../utils/slugify');
+const { heightToCm } = require('../utils/convert');
+
+const slugUrlMap = {
+ nubiles: 'https://www.nubiles.net',
+ nubilesporn: 'https://www.nubiles-porn.com',
+};
+
+async function getPhotos(albumUrl) {
+ const thumbnails = await geta(albumUrl, '.photo-thumb');
+
+ return thumbnails
+ ? thumbnails.map(({ q }) => q('source').srcset)
+ : [];
+}
+
+function scrapeAll(scenes, site, origin) {
+ return scenes.map(({ q, qa, qu, qd }) => {
+ const release = {};
+
+ release.title = q('.title a', true);
+
+ const url = qu('.title a').split('?')[0];
+ const channelUrl = qu('.site-link');
+
+ if (/^http/.test(url)) {
+ const { pathname } = new URL(url);
+ release.entryId = pathname.split('/')[3];
+
+ if (channelUrl) release.url = `${channelUrl}${pathname}`;
+ else release.url = url;
+ } else {
+ release.entryId = url.split('/')[3];
+
+ if (channelUrl) release.url = `${channelUrl}${url}`;
+ else if (site?.url) release.url = `${site.url}${url}`;
+ else if (origin) release.url = `${origin}${url}`;
+ }
+
+ release.date = qd('.date', 'MMM D, YYYY');
+ release.actors = qa('.models a.model', true);
+
+ const poster = q('img').dataset.original;
+ release.poster = [
+ poster.replace('_640', '_1280'),
+ poster,
+ ];
+
+ release.stars = Number(q('.rating', true));
+ release.likes = Number(q('.likes', true));
+
+ return release;
+ });
+}
+
+async function scrapeScene({ q, qa, qd, qp, qu, qi }, url, site) {
+ const release = {};
+
+ const { origin, pathname } = new URL(url);
+ release.url = `${origin}${pathname}`;
+
+ release.entryId = new URL(url).pathname.split('/')[3];
+ release.title = q('.content-pane-title h2', true);
+ release.description = q('.content-pane-column div', true);
+
+ release.date = qd('.date', 'MMM D, YYYY');
+
+ release.actors = qa('.content-pane-performers .model', true);
+ release.tags = qa('.categories a', true);
+
+ release.poster = qp() || qi('.fake-video-player img');
+ release.trailer = qa('source').map(source => ({
+ src: source.src,
+ quality: Number(source.getAttribute('res')),
+ }));
+
+ release.stars = Number(q('.score', true));
+ release.likes = Number(q('#likecount', true));
+
+ const albumLink = qu('.content-pane-related-links a[href*="gallery"]');
+ if (albumLink) release.photos = await getPhotos(`${site.url}${albumLink}`);
+
+ return release;
+}
+
+function scrapeProfile({ q, qa, qi, qu }, _actorName, origin) {
+ const profile = {};
+
+ const keys = qa('.model-profile h5', true);
+ const values = qa('.model-profile h5 + p', true);
+
+ const bio = keys.reduce((acc, key, index) => ({ ...acc, [slugify(key, { delimiter: '_' })]: values[index] }), {});
+
+ profile.age = Number(bio.age);
+ profile.description = q('.model-bio', true);
+
+ profile.residencePlace = bio.location;
+
+ profile.height = heightToCm(bio.height);
+ [profile.bust, profile.waist, profile.hip] = bio.figure.split('-').map(v => Number(v) || v);
+
+ profile.avatar = qi('.model-profile img');
+
+ const releases = qa('.content-grid-item').filter(el => /video\//.test(qu(el, '.img-wrapper a'))); // filter out photos
+ profile.releases = scrapeAll(ctxa(releases), null, origin);
+
+ return profile;
+}
+
+async function fetchLatest(site, page = 1) {
+ const url = `${site.url}/video/gallery/${(page - 1) * 12}`;
+ const qLatest = await geta(url, '.content-grid-item');
+
+ return qLatest && scrapeAll(qLatest, site);
+}
+
+async function fetchScene(url, site) {
+ const qScene = await get(url);
+
+ return qScene && scrapeScene(qScene, url, site);
+}
+
+async function fetchProfile(actorName, siteSlug) {
+ const firstLetter = actorName.charAt(0).toLowerCase();
+ const origin = slugUrlMap[siteSlug] || `https://www.${siteSlug}.com`;
+
+ const url = `${origin}/model/alpha/${firstLetter}`;
+ const { qa } = await get(url);
+
+ const modelPath = qa('.content-grid-item a.title').find(el => slugify(el.textContent) === slugify(actorName));
+
+ if (modelPath) {
+ const modelUrl = `${origin}${modelPath}`;
+ const qModel = await get(modelUrl);
+
+ if (qModel) return scrapeProfile(qModel, actorName, origin);
+ }
+
+ return null;
+}
+
+module.exports = {
+ fetchLatest,
+ fetchScene,
+ fetchProfile,
+};
diff --git a/src/scrapers/scrapers.js b/src/scrapers/scrapers.js
index 77baf34d..ab8260a5 100644
--- a/src/scrapers/scrapers.js
+++ b/src/scrapers/scrapers.js
@@ -33,6 +33,7 @@ const mindgeek = require('./mindgeek');
const mofos = require('./mofos');
const naturals = require('./21naturals');
const naughtyamerica = require('./naughtyamerica');
+const nubiles = require('./nubiles');
const perfectgonzo = require('./perfectgonzo');
const pervcity = require('./pervcity');
const pornhub = require('./pornhub');
@@ -65,13 +66,12 @@ module.exports = {
blowpass,
brazzers,
ddfnetwork,
- metrohd,
digitalplayground,
dogfart,
dogfartnetwork: dogfart,
- famedigital,
evilangel,
fakehub,
+ famedigital,
fantasymassage,
girlsway,
insex,
@@ -81,16 +81,18 @@ module.exports = {
kink,
legalporno,
men,
+ metrohd,
mikeadriano,
milehighmedia,
mindgeek,
mofos,
+ naughtyamerica,
+ nubiles,
perfectgonzo,
pervcity,
pornpros,
private: privateNetwork,
puretaboo,
- naughtyamerica,
realitykings,
score,
teamskeet,
@@ -102,20 +104,23 @@ module.exports = {
xempire,
},
actors: {
- // ordered by data priority
'21sextury': sextury,
+ anilos: nubiles,
babes,
bangbros,
blowpass,
boobpedia,
+ brattysis: nubiles,
brazzers,
ddfnetwork,
+ deeplush: nubiles,
digitalplayground,
- famedigital,
evilangel,
fakehub,
+ famedigital,
freeones,
freeonesLegacy,
+ hotcrazymess: nubiles,
iconmale,
julesjordan,
kellymadison,
@@ -125,9 +130,14 @@ module.exports = {
milehighmedia,
mofos,
naughtyamerica,
+ nfbusty: nubiles,
+ nubilefilms: nubiles,
+ nubiles,
+ nubilesporn: nubiles,
pornhub,
realitykings,
score,
+ thatsitcomshow: nubiles,
transangels,
twistys,
wicked,
diff --git a/src/scrapers/template.js b/src/scrapers/template.js
index 8a25df99..b92c0fad 100644
--- a/src/scrapers/template.js
+++ b/src/scrapers/template.js
@@ -1,105 +1,50 @@
'use strict';
-/* eslint-disable newline-per-chained-call */
-const bhttp = require('bhttp');
-const { JSDOM } = require('jsdom');
-const moment = require('moment');
+const { get, geta } = require('../utils/q');
-const { matchTags } = require('../tags');
+function scrapeLatest(scenes, site) {
+ return scenes.map(({ q, qa, qu, qd }) => {
+ const release = {};
-function scrapeLatest(html, site) {
- const { document } = new JSDOM(html).window;
- const sceneElements = $('.scenes-latest').toArray();
+ release.title = q('.title a', true);
- return sceneElements.map((element) => {
- const actors = $(element).find('.actors a').map((actorIndex, actorElement) => $(actorElement).text()).toArray();
+ const pathname = qu('.title a');
+ release.entryId = pathname.split('/')[3];
+ release.url = `${site.url}${pathname}`;
- return {
- url,
- entryId,
- title,
- actors,
- date,
- rating: {
- likes,
- dislikes,
- stars,
- },
- site,
- };
+ release.date = qd('.date', 'MMM DD, YYYY');
+ release.actors = qa('.models a.model', true);
+
+ release.poster = q('img').dataset.original;
+
+ release.stars = Number(q('.rating', true));
+ release.likes = Number(q('.likes', true));
+
+ console.log(release);
+ return release;
});
}
-function scrapeUpcoming(html, site) {
- const { document } = new JSDOM(html).window;
- const sceneElements = $('.scenes-upcoming').toArray();
+function scrapeScene(({ q }), _site) {
+ const release = {};
- return sceneElements.map((element) => {
- const actors = $(element).find('.actors a').map((actorIndex, actorElement) => $(actorElement).text()).toArray();
-
- return {
- url,
- entryId,
- title,
- actors,
- date,
- rating: {
- likes,
- dislikes,
- stars,
- },
- site,
- };
- });
-}
-
-async function scrapeScene(html, url, site) {
- const $ = cheerio.load(html, { normalizeWhitespace: true });
-
- const actors = $('.actors a').map((actorIndex, actorElement) => $(actorElement).text()).toArray();
-
- const rawTags = $('.tags a').map((tagIndex, tagElement) => $(tagElement).text()).toArray();
- const tags = await matchTags(rawTags);
-
- return {
- url,
- entryId,
- title,
- description,
- actors,
- director,
- date,
- duration,
- tags,
- rating: {
- likes,
- dislikes,
- stars,
- },
- site,
- };
+ console.log(release);
+ return release;
}
async function fetchLatest(site, page = 1) {
- const res = await bhttp.get(`${site.url}/url`);
+ const url = `${site.url}/${page}`;
+ const qLatest = await geta(url, '.selector');
- return scrapeLatest(res.body.toString(), site);
-}
-
-async function fetchUpcoming(site) {
- const res = await bhttp.get(`${site.url}/url`);
-
- return scrapeUpcoming(res.body.toString(), site);
+ return qLatest && scrapeLatest(qLatest, site);
}
async function fetchScene(url, site) {
- const res = await bhttp.get(url);
+ const qScene = await get(url);
- return scrapeScene(res.body.toString(), url, site);
+ return qScene && scrapeScene(qScene, site);
}
module.exports = {
fetchLatest,
- fetchUpcoming,
- fetchScene,
};
diff --git a/src/utils/q.js b/src/utils/q.js
index c2d641a0..c336d831 100644
--- a/src/utils/q.js
+++ b/src/utils/q.js
@@ -191,6 +191,10 @@ function init(element, window) {
}
function initAll(context, selector, window) {
+ if (Array.isArray(context)) {
+ return context.map(element => init(element, window));
+ }
+
return Array.from(context.querySelectorAll(selector))
.map(element => init(element, window));
}