Added Kink scraper with elaborate site specification.

This commit is contained in:
ThePendulum 2019-03-24 05:28:18 +01:00
parent e85a0f45f9
commit 845f46e9ad
16 changed files with 590 additions and 143 deletions

View File

@ -1,135 +0,0 @@
'use strict';
/* eslint-disable max-len */
module.exports = {
julesjordan: {
name: 'Jules Jordan',
url: 'https://www.julesjordan.com',
sites: {
julesjordan: {
name: 'Jules Jordan',
label: 'julesj',
url: 'https://www.julesjordan.com',
description: 'Jules Jordan\'s Official Membership Site',
},
/* also listed on main site
manuel: {
name: 'Manuel Ferrara',
label: 'manuel',
url: 'http://www.manuelferrara.com/trial',
description: 'Manuel Ferrara\'s Official Site',
},
*/
/* no listed date
theassfactory: {
name: 'The Ass Factory',
label: 'assfac',
url: 'https://www.theassfactory.com/trial',
},
*/
/* no updates since 2016
spermswallowers: {
name: 'Sperm Swallowers',
label: 'sperms',
url: 'https://www.spermswallowers.com/trial',
},
*/
},
},
xempire: {
name: 'XEmpire',
url: 'https://www.xempire.com',
description: 'XEmpire.com brings you today\'s top pornstars in beautifully shot, HD sex scenes across 4 unique porn sites of gonzo porn, interracial, lesbian & erotica!',
sites: {
hardx: {
name: 'HardX',
label: 'HardX',
url: 'https://www.hardx.com',
description: 'Welcome to HardX.com, home of exclusive hardcore gonzo porn and first time anal scenes, DP, blowbangs and gangbangs from today\'s hottest porn stars!',
},
eroticax: {
name: 'EroticaX',
label: 'EroX',
url: 'https://www.eroticax.com',
description: 'EroticaX.com features intimate scenes of passionate, erotic sex. Watch the sensual side of hardcore porn as your favorite pornstars have real, intense orgasms.',
},
darkx: {
name: 'DarkX',
label: 'DarkX',
url: 'https://www.darkx.com',
description: 'Watch interracial BBC porn videos on DarkX.com, featuring the best pornstars taking big black cock in exclusive scenes. The best black on white porn inside!',
},
lesbianx: {
name: 'LesbianX',
label: 'LesX',
url: 'https://www.lesbianx.com',
description: 'LesbianX.com features today\'s top pornstars in hardcore lesbian porn. Watch passionate & intense girl on girl sex videos, from erotic kissing to pussy licking.',
},
},
},
legalporno: {
name: 'LegalPorno',
url: 'https://www.legalporno.com',
description: 'The Best HD Porn For You!',
sites: {
legalporno: {
name: 'LegalPorno',
label: 'legalp',
url: 'https://www.legalporno.com',
description: 'The Best HD Porn For You!',
},
},
},
pervcity: {
name: 'Perv City',
url: 'https://www.pervcity.com',
description: '',
sites: {
analoverdose: {
name: 'Anal Overdose',
label: 'AnalOD',
url: 'http://www.analoverdose.com',
description: 'Before proceeding, use caution: the stunning pornstars of Anal Overdose are so fiery that they cause heavy breathing, throbbing cocks and volcanic loads of cum. If you think you can handle the heat of smoking tits, sweltering pussy and red hot ass.',
parameters: {
tourId: 3,
},
},
bangingbeauties: {
name: 'Banging Beauties',
label: 'BBeaus',
url: 'http://www.bangingbeauties.com',
description: 'Banging Beauties isn\'t just a porn site; it\'s the gateway to all your pussy-obsessed fantasies! Our members\' area is flowing with beautiful pornstars anticipating big dick throbbing in their syrupy pink slits. These experienced babes love brutal vaginal pounding! Similarly, they\'re eager for anal switch-hitting to shake things up. However, it\'s not only about gorgeous sexperts filling their hungry holes. Sometimes, it\'s all about innocent rookies earning their pornstar status in first time threesomes and premier interracial scenes.',
parameters: {
tourId: 7,
},
},
oraloverdose: {
name: 'Oral Overdose',
label: 'OralOD',
url: 'http://www.oraloverdose.com',
description: 'Oral Overdose is the only site you need to live out every saliva soaked blowjob of your dreams in HD POV! We\'ve got the most stunning cocksuckers in the world going to town on big dick. These babes not only love cock, they can\'t get enough of it! In fact, there is no prick too huge for our hungry girls\' throats. You\'ll find gorgeous, big tits pornstars exercising their gag reflex in intense balls deep facefuck scenes. We also feature fresh, young newbies taking on the gagging deepthroat challenge.',
parameters: {
tourId: 4,
},
},
chocolatebjs: {
name: 'Chocolate BJs',
label: 'ChocBJ',
url: 'http://www.chocolatebjs.com',
description: 'You\'ve just won the golden ticket to the best Chocolate BJs on the planet! We\'ve sought far and wide to bring you the most beautiful black and ethnic pornstars. And they\'re in our members\' area now! They can\'t wait to suck your white lollipop and lick the thick cream shooting from your big dick. Of course, no matter how sweet the booty or juicy the big tits, these brown foxes aren\'t all sugar and spice. In fact, when it comes to giving head, these big ass ebony babes know what they want: huge white cocks filling their throats!',
parameters: {
tourId: 6,
},
},
upherasshole: {
name: 'Up Her Asshole',
label: 'UpHerA',
url: 'http://www.upherasshole.com',
description: 'You don\'t need to travel the globe in search of the anal wonders of the world, because you get your own private tour right here on Up Her Asshole! Our stunning pornstars and rookie starlets welcome all ass fetish and anal sex fans, with their twerking bubble butts and winking assholes. However, big booty worship is just a slice of the fun. Combined with juicy tits (big and small), wet pussy (hairy and bald), these girls deliver a spectacular sensory experience in HD POV. Not only are you in danger of busting a nut before the going gets good, but also when the good turns remarkable with rimming, fingering and butt toys!',
parameters: {
tourId: 9,
},
},
},
},
};

View File

@ -3,7 +3,7 @@
const config = require('config');
const moment = require('moment');
const networks = require('../networks.js');
const networks = require('./networks');
const scrapers = require('./scrapers');
function accumulateIncludedSites() {

View File

@ -3,7 +3,7 @@
const config = require('config');
const moment = require('moment');
const networks = require('../networks.js');
const networks = require('./networks');
const scrapers = require('./scrapers');
function findSite(url) {

15
src/networks/index.js Normal file
View File

@ -0,0 +1,15 @@
'use strict';
const julesjordan = require('./julesjordan');
const kink = require('./kink');
const legalporno = require('./legalporno');
const pervcity = require('./pervcity');
const xempire = require('./xempire');
module.exports = {
julesjordan,
kink,
legalporno,
pervcity,
xempire,
};

View File

@ -0,0 +1,36 @@
'use strict';
module.exports = {
name: 'Jules Jordan',
url: 'https://www.julesjordan.com',
sites: {
julesjordan: {
name: 'Jules Jordan',
label: 'julesj',
url: 'https://www.julesjordan.com',
description: 'Jules Jordan\'s Official Membership Site',
},
/* also listed on main site
manuel: {
name: 'Manuel Ferrara',
label: 'manuel',
url: 'http://www.manuelferrara.com/trial',
description: 'Manuel Ferrara\'s Official Site',
},
*/
/* no listed date
theassfactory: {
name: 'The Ass Factory',
label: 'assfac',
url: 'https://www.theassfactory.com/trial',
},
*/
/* no updates since 2016
spermswallowers: {
name: 'Sperm Swallowers',
label: 'sperms',
url: 'https://www.spermswallowers.com/trial',
},
*/
},
};

237
src/networks/kink.js Normal file
View File

@ -0,0 +1,237 @@
'use strict';
/* eslint-disable max-len */
module.exports = {
name: 'Kink',
url: 'https://www.kink.com',
description: 'Authentic Bondage & Real BDSM Porn Videos. Demystifying and celebrating alternative sexuality by providing the most authentic kinky videos. Experience the other side of porn.',
sites: {
// some sites discontinued and for scene fetching purposes only
kink: {
name: 'Kink',
label: 'kink',
url: 'https://www.kink.com',
description: 'Authentic Bondage & Real BDSM Porn Videos. Demystifying and celebrating alternative sexuality by providing the most authentic kinky videos. Experience the other side of porn.',
tags: ['bdsm'],
},
thirtyminutesoftorment: {
name: '30 Minutes of Torment',
label: '30mtor',
url: 'https://www.kink.com/channel/30minutesoftorment',
description: 'Thick-Muscled Men Endure 30 Minutes Of BDSM Torment By A Pain-Inducing Dom. Can they take 30 Minutes of Torment? Watch as top gay pornstars take on the challenge of a lifetime. Bondage, BDSM, punishment, huge insertions, & more!',
tags: ['bdsm', 'gay'],
},
boundgangbangs: {
name: 'Bound Gangbangs',
label: 'boundg',
url: 'https://www.kink.com/channel/boundgangbangs',
description: 'Poweless whores tied in bondage and stuffed with a cock in every hole. At BoundGangbangs women get surprise extreme gangbangs, blindfolds, deepthroat blowjobs, sex punishment, bondage, double penetration and interracial sex.',
tags: ['bdsm'],
},
boundgods: {
name: 'Bound Gods',
label: 'bngods',
url: 'https://www.kink.com/channel/boundgods',
description: 'Muscle Studs Are Bound, Gagged & Spread For A Deep Cock Pounding. Not even the most rock hard muscled studs can escape punishment & submission on BoundGods.com Watch the hottest studs get tied down, fucked & submitted.',
tags: ['bdsm', 'gay'],
},
boundinpublic: {
name: 'Bound in Public',
label: 'boundp',
url: 'https://www.kink.com/channel/boundinpublic',
description: 'Cum Starved Sluts Humiliated And Fucked Hard In Public By Hung Studs.',
tags: ['bdsm', 'gay'],
},
brutalsessions: {
name: 'Brutal Sessions',
label: 'brutal',
url: 'https://www.kink.com/channel/brutalsessions',
description: 'Hardcore BDSM jam packed with XXX fucking in bondage! We\'re taking dungeon sex beyond the castle!',
tags: ['bdsm'],
},
buttmachineboys: {
name: 'Butt Machine Boys',
label: 'bmboys',
url: 'https://www.kink.com/channel/buttmachineboys',
description: 'Powerful Fucking Machines Pound Hot Men Hard & Deep.',
tags: ['bdsm', 'gay'],
},
devicebondage: {
name: 'Device Bondage',
label: 'dvbond',
url: 'https://www.kink.com/channel/devicebondage',
description: 'The Domination Of Sluts In Barbaric Metal Devices. Device Bondage takes BDSM porn to new levels with extreme restraints & unique devices with beautiful pornstars to huge, forced squirting orgasms.',
tags: ['bdsm'],
},
devinebitches: {
name: 'Devine Bitches',
label: 'dbitch',
url: 'https://www.kink.com/channel/divinebitches',
description: 'Beautiful Women Dominate Submissive Men With Pain, Humiliation And Strap-On Fucking. The best in femdom and bondage. Men on Divine Bitches respond with obedience, ass worship, cunt worship, oral servitude, pantyhose worship, and foot worship.',
tags: ['bdsm', 'femdom'],
},
electrosluts: {
name: 'Electrosluts',
label: 'esluts',
url: 'https://www.kink.com/channel/electrosluts',
description: 'Lezdoms Take Submissive Sluts To Their Limits, Shocking & Tormenting Their Wet Hot Pussies. Pornstars live out their electric bondage fantasies while dominatrixes use electrodes, paddles, caddle prods, & more to bring them to intense orgasms!',
tags: ['bdsm', 'lesbian'],
},
everythingbutt: {
name: 'Everything Butt',
label: 'evbutt',
url: 'https://www.kink.com/channel/everythingbutt',
description: 'Gaping Anal Holes Are Stuffed & Stretched To The Max. Anal Fisting, Enemas & Rimming Has Never Tasted So Good. EverythingButt.com explores the extreme limits of FemDom lesbian anal. Watch asses get destroyed by brutal fistings, huge insertions, double anal & more!',
tags: ['bdsm', 'lesbian'],
},
familiestied: {
name: 'Families Tied',
label: 'famtie',
url: 'https://www.kink.com/channel/familiestied',
description: 'Intense BDSM family role play threesomes & more.',
tags: ['bdsm'],
},
footworship: {
name: 'Foot Worship',
label: 'footws',
url: 'https://www.kink.com/channel/footworship',
description: 'Satisfy Your Foot Fetish With The Kinkiest Foot Action. Enjoy Trampling, Foot Jobs, High Heels, And Pantyhose.',
tags: ['bdsm'],
},
fuckedandbound: {
name: 'Fucked and Bound',
label: 'fbound',
url: 'https://www.kink.com/channel/fuckedandbound',
description: 'Extreme Anal, Rope Bondage, & Brutal Face Fucking.',
tags: ['bdsm'],
},
fuckingmachines: {
name: 'Fucking Machines',
label: 'fmachi',
url: 'https://www.kink.com/channel/fuckingmachines',
description: 'Machines Fucking Squirting Pussies With Extreme Insertions. Fucking Machines is the ultimate hardcore sex toy porn. Huge dildos strapped to sex machines relentlessly fucking pornstars to real squirting oragsms!',
tags: ['bdsm'],
},
hardcoregangbang: {
// discontinued
name: 'Hardcore Gangbang',
label: 'hardgb',
url: 'https://www.kink.com/channel/hardcoregangbang',
description: 'Where all women\'s hardcore gangbang fantasies come true. Watch extreme, brutal gangbangs with pornstars, models, & MILFs that crave cock in every hole. HardcoreGangbang.com has the best creampie gang bangs online.',
tags: ['bdsm'],
},
hogtied: {
name: 'Hogtied',
label: 'hogtie',
url: 'https://www.kink.com/channel/hogtied',
description: 'Your favorite girls restrained with rope, punished & trained. Hogtied is the original extreme bondage porn website. Watch top pornstars and pain sluts in brutal bondage, getting tormented, and forced to orgasm!',
tags: ['bdsm'],
},
kinkuniversity: {
name: 'Kink University',
label: 'kinkun',
url: 'https://www.kink.com/channel/kinkuniversity',
description: 'Learn BDSM Technical Skills & Theories From Respected Teachers In The Kink Community. Learn BDSM skills and improve your sex techniques. Video tutorials feature top sex ed experts and hardcore demos on topics from bondage to relationships.',
tags: ['bdsm'],
},
meninpain: {
name: 'Men In Pain',
label: 'meninp',
url: 'https://www.kink.com/channel/meninpain',
description: 'Submissive Men Violated With Verbal Humiliation And Harsh Punishment By Beautiful Dominatrices.',
tags: ['bdsm', 'femdom'],
},
menonedge: {
name: 'Men on Edge',
label: 'moedge',
url: 'https://www.kink.com/channel/menonedge',
description: 'Hot Guys Begging To Cum Are Brought To The Edge Of Complete Submission And Allowed To Blow Their Loads. Men on Edge has perfected the art of gay BDSM & edging porn. Watch straight men bound up & edged by dominant gay pornstars until they can\'t help but cum!',
tags: ['bdsm', 'gay'],
},
nakedkombat: {
name: 'Naked Kombat',
label: 'kombat',
url: 'https://www.kink.com/channel/nakedkombat',
description: 'Fight Fit Studs Go Head To Head In A Battle For Dominance. The Loser Gets Pinned And Punish Fucked Without Mercy',
tags: ['bdsm', 'gay'],
},
publicdisgrace: {
name: 'Public Disgrace',
label: 'pubdis',
url: 'https://www.kink.com/channel/publicdisgrace',
description: 'Women Bound Stripped And Punished In Public Get Hardcore Fucked Where Everyone Can See. Unscripted public humiliation & punishment of submissive slaves in real life locations. PublicDisgrace features the best outdoor BDSM & voyeur porn!',
tags: ['bdsm'],
},
sadisticrope: {
name: 'Sadistic Rope',
label: 'sadisr',
url: 'https://www.kink.com/channel/sadisticrope',
description: 'Innocence Taken By Extreme Rope Bondage, Hardcore BDSM And Pussy-Destroying Orgasms.',
tags: ['bdsm'],
},
sexandsubmission: {
name: 'Sex and Submission',
label: 'sexsub',
url: 'https://www.kink.com/channel/sexandsubmission',
description: 'Submissive Sluts Are Dominated With Rough Sex And Bondage. Real pornstars, hardcore bondage, master & slave roles are what SexAndSubmission.com is all about. Watch submissive sluts give in to total domination!',
tags: ['bdsm'],
},
thetrainingofo: {
// discontinued
name: 'The Training of O',
label: 'traino',
url: 'https://www.kink.com/channel/thetrainingofo',
description: 'Slaves Are Trained And Rewarded With Hardcore Bondage And Sex. Watch real pornstars undergo extreme slave training through hardcore bondage & BDSM porn. The Training of O is the ultimate slave / master experience!',
tags: ['bdsm'],
},
theupperfloor: {
name: 'The Upper Floor',
label: 'upperf',
url: 'https://www.kink.com/channel/theupperfloor',
description: 'Trained slaves serve the house and their master in intense BDSM and kinky threesomes. The Upper Floor is a voyeuristic look into BDSM and fetish porn shoots with real submissive pornstars living out their kinky fantasies live on cam.',
tags: ['bdsm'],
},
tspussyhunts: {
name: 'TS Pussy Hunters',
label: 'tspuss',
url: 'https://www.kink.com/channel/tspussyhunters',
description: 'Hot TS cocks prey on the wet pussies of submissive ladies who are fucked hard till they cum. Dominant TS femme fatales with the hardest dicks, the softest tits, and the worst intentions dominate, bind, and punish bitches on the ultimate transfucking porn site.',
tags: ['bdsm', 'transsexual'],
},
tsseduction: {
name: 'TS Seduction',
label: 'tseduc',
url: 'https://www.kink.com/channel/tsseduction',
description: 'Sexy TS Women With Huge Cocks Dominate The Holes Of Straight Boys. Real TS women who are drop-dead gorgeous from their pretty faces to their big tits to their hard TS cocks. TS Seduction is the ultimate in transsexual bondage porn.',
tags: ['bdsm', 'transsexual'],
},
ultimatesurrender: {
name: 'Ultimate Surrender',
label: 'ultsur',
url: 'https://www.kink.com/channel/ultimatesurrender',
description: 'Competitive Female Wrestling Where The Loser Gets Strap-On Punish Fucked. Ultimate Surrender features hardcore naked female wrestling porn videos where the winner gets to dominate the loser with some kinky lesbian FemDom!',
tags: ['bdsm', 'lesbian'],
},
waterbondage: {
name: 'Water Bondage',
label: 'waterb',
url: 'https://www.kink.com/channel/waterbondage',
description: 'Helpless Bound Beauties Sprayed, Dunked And Tormented Until They Cum Hard & Wet.',
tags: ['bdsm'],
},
whippedass: {
name: 'Whipped Ass',
label: 'whippd',
url: 'https://www.kink.com/channel/whippedass',
description: 'Beautiful Submissive Sluts Take A Hard Fucking From Powerful Dominant Women. Watch brutal lesbian dominatrixes push submissive sluts to their orgasmic breaking points on WhippedAss! Hardcore fisting, huge strapons & face sitting!',
tags: ['bdsm', 'lesbian'],
},
wiredpussy: {
name: 'Wired Pussy',
label: 'wiredp',
url: 'https://www.kink.com/channel/wiredpussy',
description: 'Gorgeous Women Submit To Electricity, Are Zapped, Shocked & Prodded To Orgasm.',
tags: ['bdsm', 'lesbian'],
},
},
};

View File

@ -0,0 +1,16 @@
'use stric';
module.exports = {
name: 'LegalPorno',
url: 'https://www.legalporno.com',
description: 'The Best HD Porn For You!',
sites: {
legalporno: {
name: 'LegalPorno',
label: 'legalp',
url: 'https://www.legalporno.com',
description: 'The Best HD Porn For You!',
tags: ['gangbang'],
},
},
};

59
src/networks/pervcity.js Normal file
View File

@ -0,0 +1,59 @@
'use strict';
/* eslint-disable max-len */
module.exports = {
name: 'Perv City',
url: 'https://www.pervcity.com',
description: '',
sites: {
analoverdose: {
name: 'Anal Overdose',
label: 'AnalOD',
url: 'http://www.analoverdose.com',
description: 'Before proceeding, use caution: the stunning pornstars of Anal Overdose are so fiery that they cause heavy breathing, throbbing cocks and volcanic loads of cum. If you think you can handle the heat of smoking tits, sweltering pussy and red hot ass.',
tags: ['anal'],
parameters: {
tourId: 3,
},
},
bangingbeauties: {
name: 'Banging Beauties',
label: 'BBeaus',
url: 'http://www.bangingbeauties.com',
description: 'Banging Beauties isn\'t just a porn site; it\'s the gateway to all your pussy-obsessed fantasies! Our members\' area is flowing with beautiful pornstars anticipating big dick throbbing in their syrupy pink slits. These experienced babes love brutal vaginal pounding! Similarly, they\'re eager for anal switch-hitting to shake things up. However, it\'s not only about gorgeous sexperts filling their hungry holes. Sometimes, it\'s all about innocent rookies earning their pornstar status in first time threesomes and premier interracial scenes.',
parameters: {
tourId: 7,
},
},
oraloverdose: {
name: 'Oral Overdose',
label: 'OralOD',
url: 'http://www.oraloverdose.com',
description: 'Oral Overdose is the only site you need to live out every saliva soaked blowjob of your dreams in HD POV! We\'ve got the most stunning cocksuckers in the world going to town on big dick. These babes not only love cock, they can\'t get enough of it! In fact, there is no prick too huge for our hungry girls\' throats. You\'ll find gorgeous, big tits pornstars exercising their gag reflex in intense balls deep facefuck scenes. We also feature fresh, young newbies taking on the gagging deepthroat challenge.',
tags: ['blowjob'],
parameters: {
tourId: 4,
},
},
chocolatebjs: {
name: 'Chocolate BJs',
label: 'ChocBJ',
url: 'http://www.chocolatebjs.com',
description: 'You\'ve just won the golden ticket to the best Chocolate BJs on the planet! We\'ve sought far and wide to bring you the most beautiful black and ethnic pornstars. And they\'re in our members\' area now! They can\'t wait to suck your white lollipop and lick the thick cream shooting from your big dick. Of course, no matter how sweet the booty or juicy the big tits, these brown foxes aren\'t all sugar and spice. In fact, when it comes to giving head, these big ass ebony babes know what they want: huge white cocks filling their throats!',
tags: ['blowjob', 'interracial'],
parameters: {
tourId: 6,
},
},
upherasshole: {
name: 'Up Her Asshole',
label: 'UpHerA',
url: 'http://www.upherasshole.com',
description: 'You don\'t need to travel the globe in search of the anal wonders of the world, because you get your own private tour right here on Up Her Asshole! Our stunning pornstars and rookie starlets welcome all ass fetish and anal sex fans, with their twerking bubble butts and winking assholes. However, big booty worship is just a slice of the fun. Combined with juicy tits (big and small), wet pussy (hairy and bald), these girls deliver a spectacular sensory experience in HD POV. Not only are you in danger of busting a nut before the going gets good, but also when the good turns remarkable with rimming, fingering and butt toys!',
tags: ['anal'],
parameters: {
tourId: 9,
},
},
},
};

36
src/networks/xempire.js Normal file
View File

@ -0,0 +1,36 @@
'use strict';
module.exports = {
name: 'XEmpire',
url: 'https://www.xempire.com',
description: 'XEmpire.com brings you today\'s top pornstars in beautifully shot, HD sex scenes across 4 unique porn sites of gonzo porn, interracial, lesbian & erotica!',
sites: {
hardx: {
name: 'HardX',
label: 'HardX',
url: 'https://www.hardx.com',
description: 'Welcome to HardX.com, home of exclusive hardcore gonzo porn and first time anal scenes, DP, blowbangs and gangbangs from today\'s hottest porn stars!',
},
eroticax: {
name: 'EroticaX',
label: 'EroX',
url: 'https://www.eroticax.com',
description: 'EroticaX.com features intimate scenes of passionate, erotic sex. Watch the sensual side of hardcore porn as your favorite pornstars have real, intense orgasms.',
tags: ['erotic'],
},
darkx: {
name: 'DarkX',
label: 'DarkX',
url: 'https://www.darkx.com',
description: 'Watch interracial BBC porn videos on DarkX.com, featuring the best pornstars taking big black cock in exclusive scenes. The best black on white porn inside!',
tags: ['interracial'],
},
lesbianx: {
name: 'LesbianX',
label: 'LesX',
url: 'https://www.lesbianx.com',
description: 'LesbianX.com features today\'s top pornstars in hardcore lesbian porn. Watch passionate & intense girl on girl sex videos, from erotic kissing to pussy licking.',
tags: ['lesbian'],
},
},
};

View File

@ -0,0 +1,44 @@
'use strict';
/* eslint-disable */
const bhttp = require('bhttp');
const cheerio = require('cheerio');
const moment = require('moment');
const tagMap = {};
function scrapeLatest(html, site) {
const $ = cheerio.load(html, { normalizeWhitespace: true });
}
function scrapeUpcoming(html, site) {
const $ = cheerio.load(html, { normalizeWhitespace: true });
}
function scrapeScene(html, url, site) {
const $ = cheerio.load(html, { normalizeWhitespace: true });
}
async function fetchLatest(site) {
const res = await bhttp.get(`${site.url}/url`);
return scrapeLatest(res.body.toString(), site);
}
async function fetchUpcoming(site) {
const res = await bhttp.get(`${site.url}/url`);
return scrapeUpcoming(res.body.toString(), site);
}
async function fetchScene(url, site) {
const res = await bhttp.get(url);
return scrapeScene(res.body.toString(), url, site);
}
module.exports = {
fetchLatest,
fetchUpcoming,
fetchScene,
};

View File

@ -2,12 +2,14 @@
const xempire = require('./xempire');
const julesjordan = require('./julesjordan');
const kink = require('./kink');
const legalporno = require('./legalporno');
const pervcity = require('./pervcity');
module.exports = {
xempire,
julesjordan,
kink,
legalporno,
pervcity,
};

127
src/scrapers/kink.js Normal file
View File

@ -0,0 +1,127 @@
'use strict';
const bhttp = require('bhttp');
const cheerio = require('cheerio');
const moment = require('moment');
const { kink } = require('../networks');
const tagMap = {
Airtight: 'airtight',
Anal: 'anal',
Asian: 'asian',
BDSM: 'BDSM',
Blowbang: 'blowbang',
Blowjob: 'blowjob',
Bondage: 'bondage',
Choking: 'choking',
'Corporal Punishment': 'corporal punishment',
'Double Penetration': 'DP',
Gangbang: 'gangbang',
'High Heels': 'high heels',
Petite: 'petite',
'Role Play': 'roleplay',
'Rope Bondage': 'bondage',
'Rough Sex': 'rough',
Shaved: 'shaved',
Slapping: 'slapping',
'Small Tits': 'small boobs',
Squirting: 'squirting',
White: 'white',
};
function scrapeLatest(html, site) {
const $ = cheerio.load(html, { normalizeWhitespace: true });
const sceneElements = $('.shoot-list .shoot').toArray();
return sceneElements.map((element) => {
const sceneLinkElement = $(element).find('.shoot-thumb-title a');
const href = sceneLinkElement.attr('href');
const url = `https://kink.com${href}`;
const id = href.split('/')[2];
const title = sceneLinkElement.text();
const date = moment.utc($(element).find('.date').text(), 'MMM DD, YYYY').toDate();
const actors = $(element).find('.shoot-thumb-models a').map((actorIndex, actorElement) => $(actorElement).text()).toArray();
const stars = $(element).find('.average-rating').attr('data-rating') / 10;
const timestamp = $(element).find('.video span').text();
const timestampComponents = timestamp.split(':'); // fix mixed hh:mm:ss and mm:ss format
const duration = moment.duration(timestampComponents.length > 2 ? timestamp : `0:${timestamp}`).asSeconds();
return {
url,
id,
title,
actors,
date,
rating: {
stars,
},
duration,
site,
};
});
}
async function scrapeScene(html, url, id, ratingRes, site) {
const $ = cheerio.load(html, { normalizeWhitespace: true });
// const title = $('h1.shoot-title').text().replace(/\ue800/, ''); // fallback, special character is 'like'-heart
const title = $('h1.shoot-title span.favorite-button').attr('data-title');
const actorsRaw = $('.shoot-info p.starring');
const sitename = $('.shoot-logo a').attr('href').split('/')[2];
const channelSite = kink.sites[sitename];
const date = moment.utc($(actorsRaw)
.prev()
.text()
.trim()
.replace('Date: ', ''),
'MMMM DD, YYYY')
.toDate();
const actors = $(actorsRaw).find('span.names a').map((actorIndex, actorElement) => $(actorElement).text()).toArray();
const description = $('.shoot-info .description').text();
const { average: stars } = ratingRes.body;
const rawTags = $('.tag-list > a[href*="/tag"]').map((tagIndex, tagElement) => $(tagElement).text()).toArray();
const tags = rawTags.reduce((accTags, tag) => (tagMap[tag] ? [...accTags, tagMap[tag]] : accTags), []);
return {
url,
id,
title,
date,
actors,
description,
rating: {
stars,
},
tags,
site: channelSite || site,
};
}
async function fetchLatest(site) {
const res = await bhttp.get(`${site.url}/latest`);
return scrapeLatest(res.body.toString(), site);
}
async function fetchScene(url, site) {
const id = new URL(url).pathname.split('/')[2];
const [res, ratingRes] = await Promise.all([
bhttp.get(url),
bhttp.get(`https://kink.com/api/ratings/${id}`),
]);
return scrapeScene(res.body.toString(), url, id, ratingRes, site);
}
module.exports = {
fetchLatest,
fetchScene,
};

View File

@ -65,8 +65,7 @@ function scrapeScene(html, url, site) {
.find('a[href*="com/model"]')
.map((actorIndex, actorElement) => $(actorElement).text()).toArray();
const runtime = $('span[title="Runtime"]').text().trim().split(':');
const duration = Number(runtime[0]) * 3600 + Number(runtime[1]) * 60 + Number(runtime[2]);
const duration = moment.duration($('span[title="Runtime"]').text().trim()).asSeconds();
const rawTags = $(tagsElement).find('a').map((tagIndex, tagElement) => $(tagElement).text()).toArray();
const tags = rawTags.reduce((accTags, tag) => (tagMap[tag] ? [...accTags, tagMap[tag]] : accTags), []);

View File

@ -119,8 +119,7 @@ function scrapeScene(html, url, site) {
const description = data.description || undefined;
const stars = (data.aggregateRating.ratingValue / data.aggregateRating.bestRating) * 5;
const runtime = data.duration.slice(2).split(':');
const duration = Number(runtime[0]) * 3600 + Number(runtime[1]) * 60 + Number(runtime[2]);
const duration = moment.duration(data.duration.slice(2).split(':')).asSeconds();
const rawTags = data.keywords.split(', ');
const tags = rawTags.reduce((accTags, tag) => (tagMap[tag] ? [...accTags, tagMap[tag]] : accTags), []);

View File

@ -1,10 +1,12 @@
'use strict';
module.exports = {
airtight: [],
anal: [],
asian: ['asians'],
'ass licking': ['rimming', 'rimjob', 'anilingus'],
ATM: ['ass to mouth'],
BDSM: [],
'big black cock': ['BBC', 'bbc', 'big black cock', 'big black cocks'],
'big cock': ['big cocks'],
'big butt': ['big butts'],
@ -12,9 +14,12 @@ module.exports = {
blonde: ['blondes'],
blowjob: [],
blowbang: [],
bondage: [],
brunette: ['brunettes'],
bukkake: [],
cheerleader: ['cheer leader'],
choking: [],
'corporal punishment': [],
creampie: ['creampies'],
cumshot: [],
deepthroat: ['deep throat'],
@ -22,13 +27,15 @@ module.exports = {
DP: ['dp', 'double penetration'],
DVP: ['DPP', 'dpp', 'dvp', 'double vaginal penetration', 'double pussy penetration'],
'double blowjob': [],
ebony: [],
ebony: ['black'],
facefucking: [],
facial: ['facials'],
gangbang: [],
gaping: ['gape', 'gapes'],
gonzo: [],
hairy: [],
hardcore: [],
'high heels': [],
latina: [],
lingerie: [],
maid: [],
@ -36,9 +43,13 @@ module.exports = {
petite: [],
'pussy licking': ['cunnilingus'],
redhead: ['red head'],
roleplay: ['role play'],
rough: [],
schoolgirl: ['school girl'],
shaved: [],
slapping: [],
'small boobs': ['small tits'],
squirting: [],
swallowing: ['swallow'],
stockings: [],
tattoo: ['tattoos'],
@ -46,4 +57,5 @@ module.exports = {
teen: ['teens'],
toy: ['toys'],
TP: ['tp', 'triple penetration'],
white: [],
};

View File

@ -56,7 +56,7 @@ function renderReleases(scenes, screen) {
bg: 'red',
},
track: {
bg: 'blue',
bg: 'magenta',
},
},
items,