forked from DebaucheryLibrarian/traxxx
				
			Added Vixen scraper. Added LegalPorno studio IDs.
This commit is contained in:
		
							parent
							
								
									d7ef14e427
								
							
						
					
					
						commit
						439d3225ec
					
				|  | @ -50,6 +50,9 @@ exports.up = knex => Promise.resolve() | |||
|             .inTable('sites'); | ||||
| 
 | ||||
|         table.string('shoot_id'); | ||||
|         table.unique(['site_id', 'shoot_id']); | ||||
| 
 | ||||
|         table.string('url'); | ||||
|         table.string('title'); | ||||
|         table.date('date'); | ||||
|         table.text('description'); | ||||
|  |  | |||
|  | @ -33,4 +33,10 @@ exports.seed = knex => Promise.resolve() | |||
|             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!', | ||||
|         }, | ||||
|         { | ||||
|             id: 'vixen', | ||||
|             name: 'Vixen', | ||||
|             url: 'https://www.vixen.com/', | ||||
|             description: 'Vixen.com features the world’s finest cinematic adult films with 4K quality and high-end erotic photography.', | ||||
|         }, | ||||
|     ])); | ||||
|  |  | |||
|  | @ -358,4 +358,45 @@ exports.seed = knex => Promise.resolve() | |||
|             url: 'https://www.lesbianx.com', | ||||
|             network_id: 'xempire', | ||||
|         }, | ||||
|         // VIXEN
 | ||||
|         { | ||||
|             id: 'vixen', | ||||
|             name: 'Vixen', | ||||
|             label: 'vixen', | ||||
|             description: 'Vixen.com features the world’s finest cinematic adult films with 4K quality and high-end erotic photography.', | ||||
|             url: 'https://www.vixen.com', | ||||
|             network_id: 'vixen', | ||||
|         }, | ||||
|         { | ||||
|             id: 'blacked', | ||||
|             name: 'Blacked', | ||||
|             label: 'blackd', | ||||
|             description: 'Porn videos of beautiful girls in first time interracial porn videos. BLACKED has the hottest pornstars in HD sex videos.', | ||||
|             url: 'https://www.blacked.com', | ||||
|             network_id: 'vixen', | ||||
|         }, | ||||
|         { | ||||
|             id: 'tushy', | ||||
|             name: 'Tushy', | ||||
|             label: 'tushy', | ||||
|             description: 'Watch the world\'s best HD Anal videos! Featuring beautiful, never before seen girls in first time anal. Exclusively on Tushy.com', | ||||
|             url: 'https://www.tushy.com', | ||||
|             network_id: 'vixen', | ||||
|         }, | ||||
|         { | ||||
|             id: 'blackedraw', | ||||
|             name: 'Blacked Raw', | ||||
|             label: 'blkraw', | ||||
|             description: 'Experience real women in interracial sex videos. Passionate sex with beautiful pornstars. No photoshop just the highest quality porn. Everything you see is real.', | ||||
|             url: 'https://www.blackedraw.com', | ||||
|             network_id: 'vixen', | ||||
|         }, | ||||
|         { | ||||
|             id: 'tushyraw', | ||||
|             name: 'Tushy Raw', | ||||
|             label: 'tshraw', | ||||
|             description: 'Anal sex videos with beautiful models and pornstars being fucked in the ass. TUSHY RAW features famous pornstars in high quality anal porn videos.', | ||||
|             url: 'https://www.tushyraw.com', | ||||
|             network_id: 'vixen', | ||||
|         }, | ||||
|     ])); | ||||
|  |  | |||
|  | @ -80,6 +80,14 @@ exports.seed = knex => Promise.resolve() | |||
|             tag: 'corporal punishment', | ||||
|             alias_for: null, | ||||
|         }, | ||||
|         { | ||||
|             tag: 'cowgirl', | ||||
|             alias_for: null, | ||||
|         }, | ||||
|         { | ||||
|             tag: 'reverse cowgirl', | ||||
|             alias_for: null, | ||||
|         }, | ||||
|         { | ||||
|             tag: 'creampie', | ||||
|             alias_for: null, | ||||
|  | @ -108,6 +116,10 @@ exports.seed = knex => Promise.resolve() | |||
|             tag: 'double blowjob', | ||||
|             alias_for: null, | ||||
|         }, | ||||
|         { | ||||
|             tag: 'doggy style', | ||||
|             alias_for: null, | ||||
|         }, | ||||
|         { | ||||
|             tag: 'ebony', | ||||
|             alias_for: null, | ||||
|  | @ -168,6 +180,10 @@ exports.seed = knex => Promise.resolve() | |||
|             tag: 'MILF', | ||||
|             alias_for: null, | ||||
|         }, | ||||
|         { | ||||
|             tag: 'missionary', | ||||
|             alias_for: null, | ||||
|         }, | ||||
|         { | ||||
|             tag: 'natural', | ||||
|             alias_for: null, | ||||
|  | @ -212,6 +228,10 @@ exports.seed = knex => Promise.resolve() | |||
|             tag: 'squirting', | ||||
|             alias_for: null, | ||||
|         }, | ||||
|         { | ||||
|             tag: 'standing doggy style', | ||||
|             alias_for: null, | ||||
|         }, | ||||
|         { | ||||
|             tag: 'swallowing', | ||||
|             alias_for: null, | ||||
|  | @ -262,18 +282,6 @@ exports.seed = knex => Promise.resolve() | |||
|             tag: 'ass to mouth', | ||||
|             alias_for: 'ATM', | ||||
|         }, | ||||
|         { | ||||
|             tag: 'atm', | ||||
|             alias_for: 'ATM', | ||||
|         }, | ||||
|         { | ||||
|             tag: 'bbc', | ||||
|             alias_for: 'BBC', | ||||
|         }, | ||||
|         { | ||||
|             tag: 'bdsm', | ||||
|             alias_for: 'BDSM', | ||||
|         }, | ||||
|         { | ||||
|             tag: 'big ass', | ||||
|             alias_for: 'big butt', | ||||
|  | @ -334,14 +342,18 @@ exports.seed = knex => Promise.resolve() | |||
|             tag: 'cunnilingus', | ||||
|             alias_for: 'pussy licking', | ||||
|         }, | ||||
|         { | ||||
|             tag: 'dap', | ||||
|             alias_for: 'DAP', | ||||
|         }, | ||||
|         { | ||||
|             tag: 'deep throat', | ||||
|             alias_for: 'deepthroat', | ||||
|         }, | ||||
|         { | ||||
|             tag: 'doggystyle', | ||||
|             alias_for: 'doggy style', | ||||
|         }, | ||||
|         { | ||||
|             tag: 'doggie style', | ||||
|             alias_for: 'doggy style', | ||||
|         }, | ||||
|         { | ||||
|             tag: 'double anal penetration', | ||||
|             alias_for: 'DAP', | ||||
|  | @ -362,10 +374,6 @@ exports.seed = knex => Promise.resolve() | |||
|             tag: 'double penetration (dp)', | ||||
|             alias_for: 'DP', | ||||
|         }, | ||||
|         { | ||||
|             tag: 'dp', | ||||
|             alias_for: 'DP', | ||||
|         }, | ||||
|         { | ||||
|             tag: 'DPP', | ||||
|             alias_for: 'DVP', | ||||
|  | @ -394,10 +402,6 @@ exports.seed = knex => Promise.resolve() | |||
|             tag: 'double pussy penetration (dpp)', | ||||
|             alias_for: 'DVP', | ||||
|         }, | ||||
|         { | ||||
|             tag: 'dvp', | ||||
|             alias_for: 'DVP', | ||||
|         }, | ||||
|         { | ||||
|             tag: 'gape', | ||||
|             alias_for: 'gaping', | ||||
|  | @ -418,10 +422,6 @@ exports.seed = knex => Promise.resolve() | |||
|             tag: 'red head', | ||||
|             alias_for: 'redhead', | ||||
|         }, | ||||
|         { | ||||
|             tag: 'milf', | ||||
|             alias_for: 'MILF', | ||||
|         }, | ||||
|         { | ||||
|             tag: 'rimming', | ||||
|             alias_for: 'ass licking', | ||||
|  | @ -446,6 +446,10 @@ exports.seed = knex => Promise.resolve() | |||
|             tag: 'small tits', | ||||
|             alias_for: 'small boobs', | ||||
|         }, | ||||
|         { | ||||
|             tag: 'standing doggystyle', | ||||
|             alias_for: 'standing doggy style', | ||||
|         }, | ||||
|         { | ||||
|             tag: 'swallow', | ||||
|             alias_for: 'swallowing', | ||||
|  | @ -462,10 +466,6 @@ exports.seed = knex => Promise.resolve() | |||
|             tag: 'toys', | ||||
|             alias_for: 'toy', | ||||
|         }, | ||||
|         { | ||||
|             tag: 'tp', | ||||
|             alias_for: 'TP', | ||||
|         }, | ||||
|         { | ||||
|             tag: 'triple penetration', | ||||
|             alias_for: 'TP', | ||||
|  |  | |||
|  | @ -47,8 +47,40 @@ async function accumulateIncludedSites() { | |||
|     return curateSites(rawSites); | ||||
| } | ||||
| 
 | ||||
| async function getExistingReleases() { | ||||
|     return knex('releases'); | ||||
|     // .where('date', '>', new Date(2019, 2, 26));
 | ||||
| } | ||||
| 
 | ||||
| async function storeReleases(releases) { | ||||
|     const curatedReleases = releases.map(release => ({ | ||||
|         site_id: release.site.id, | ||||
|         shoot_id: release.shootId || null, | ||||
|         url: release.url, | ||||
|         title: release.title, | ||||
|         date: release.date, | ||||
|         description: release.description, | ||||
|         duration: release.duration, | ||||
|         likes: release.rating && release.rating.likes, | ||||
|         dislikes: release.rating && release.rating.dislikes, | ||||
|         rating: release.rating && release.rating.stars, | ||||
|     })); | ||||
| 
 | ||||
|     if (curatedReleases.length) { | ||||
|         console.log(`Adding ${curatedReleases.length} releases to database (if unique)`); | ||||
| 
 | ||||
|         const insertQuery = knex('releases').insert(curatedReleases).toString(); | ||||
|         await knex.raw(insertQuery.replace('insert', 'INSERT OR IGNORE')); | ||||
| 
 | ||||
|         return curatedReleases; | ||||
|     } | ||||
| 
 | ||||
|     return []; | ||||
| } | ||||
| 
 | ||||
| async function fetchReleases() { | ||||
|     const sites = await accumulateIncludedSites(); | ||||
|     const releases = await getExistingReleases(); | ||||
| 
 | ||||
|     const scenesPerSite = await Promise.all(sites.map(async (site) => { | ||||
|         const scraper = scrapers[site.id] || scrapers[site.networkId]; | ||||
|  | @ -59,6 +91,10 @@ async function fetchReleases() { | |||
|                 scraper.fetchUpcoming ? scraper.fetchUpcoming(site) : [], | ||||
|             ]); | ||||
| 
 | ||||
|             console.log(`${latest.length} published releases and ${upcoming.length} upcoming releases found`); | ||||
| 
 | ||||
|             await storeReleases(latest, releases); | ||||
| 
 | ||||
|             return [...latest, ...upcoming]; | ||||
|         } | ||||
| 
 | ||||
|  |  | |||
|  | @ -5,7 +5,7 @@ const bhttp = require('bhttp'); | |||
| const cheerio = require('cheerio'); | ||||
| const moment = require('moment'); | ||||
| 
 | ||||
| const tagMap = {}; | ||||
| const { matchTags } = require('../tags'); | ||||
| 
 | ||||
| function scrapeLatest(html, site) { | ||||
|     const $ = cheerio.load(html, { normalizeWhitespace: true }); | ||||
|  |  | |||
|  | @ -5,6 +5,7 @@ const julesjordan = require('./julesjordan'); | |||
| const kink = require('./kink'); | ||||
| const legalporno = require('./legalporno'); | ||||
| const pervcity = require('./pervcity'); | ||||
| const vixen = require('./vixen'); | ||||
| 
 | ||||
| module.exports = { | ||||
|     xempire, | ||||
|  | @ -12,4 +13,5 @@ module.exports = { | |||
|     kink, | ||||
|     legalporno, | ||||
|     pervcity, | ||||
|     vixen, | ||||
| }; | ||||
|  |  | |||
|  | @ -8,7 +8,7 @@ const { matchTags } = require('../tags'); | |||
| 
 | ||||
| function extractTitle(originalTitle) { | ||||
|     const titleComponents = originalTitle.split(' '); | ||||
|     const sceneIdMatch = titleComponents.slice(-1)[0].match(/(GP|SZ|IV|GIO|AA|GL|BZ|FS)\d+/); // detect studio prefixes
 | ||||
|     const sceneIdMatch = titleComponents.slice(-1)[0].match(/(GP|SZ|IV|GIO|RS|TW|MA|FM|SAL|NR|AA|GL|BZ|FS)\d+/); // detect studio prefixes
 | ||||
|     const shootId = sceneIdMatch ? sceneIdMatch[0] : null; | ||||
|     const title = sceneIdMatch ? titleComponents.slice(0, -1).join(' ') : originalTitle; | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue