forked from DebaucheryLibrarian/traxxx
Blowpass now uses Gamma module for latest and upcoming.
This commit is contained in:
parent
8a139e1ac0
commit
631ac34573
|
@ -683,6 +683,10 @@ const sites = [
|
||||||
url: 'https://www.1000facials.com',
|
url: 'https://www.1000facials.com',
|
||||||
description: 'Welcome to 1000Facials.com, your source for the best facial porn with huge cumshots on your favorite teen and MILF pornstars. Watch all the blowjob action inside!',
|
description: 'Welcome to 1000Facials.com, your source for the best facial porn with huge cumshots on your favorite teen and MILF pornstars. Watch all the blowjob action inside!',
|
||||||
network: 'blowpass',
|
network: 'blowpass',
|
||||||
|
parameters: {
|
||||||
|
latest: '/en/videos/latest/All-Categories/0/All-Pornstars/0/',
|
||||||
|
upcoming: '/en/videos/upcoming',
|
||||||
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
slug: 'immorallive',
|
slug: 'immorallive',
|
||||||
|
@ -690,6 +694,10 @@ const sites = [
|
||||||
url: 'https://www.immorallive.com',
|
url: 'https://www.immorallive.com',
|
||||||
description: 'Watch live sex shows and videos on ImmoralLive.com, featuring wild and crazy sex orgies, group sex, blowjob competitions and toy play from the famous Porno Dan. The hottest pornstars and amateur girls cum hard inside',
|
description: 'Watch live sex shows and videos on ImmoralLive.com, featuring wild and crazy sex orgies, group sex, blowjob competitions and toy play from the famous Porno Dan. The hottest pornstars and amateur girls cum hard inside',
|
||||||
network: 'blowpass',
|
network: 'blowpass',
|
||||||
|
parameters: {
|
||||||
|
latest: '/en/videos/latest/All-Categories/0/All-Pornstars/0/',
|
||||||
|
upcoming: '/en/videos/upcoming',
|
||||||
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
slug: 'mommyblowsbest',
|
slug: 'mommyblowsbest',
|
||||||
|
@ -697,6 +705,10 @@ const sites = [
|
||||||
url: 'https://www.mommyblowsbest.com',
|
url: 'https://www.mommyblowsbest.com',
|
||||||
description: 'Welcome to MommyBlowsBest.com. Home to thousands of MILF blowjobs and hot mom porn! Come see why experience counts, right here at MommyBlowsBest.com!',
|
description: 'Welcome to MommyBlowsBest.com. Home to thousands of MILF blowjobs and hot mom porn! Come see why experience counts, right here at MommyBlowsBest.com!',
|
||||||
network: 'blowpass',
|
network: 'blowpass',
|
||||||
|
parameters: {
|
||||||
|
latest: '/en/videos/latest/All-Categories/0/All-Pornstars/0/',
|
||||||
|
upcoming: '/en/videos/upcoming',
|
||||||
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
slug: 'onlyteenblowjobs',
|
slug: 'onlyteenblowjobs',
|
||||||
|
@ -704,6 +716,10 @@ const sites = [
|
||||||
url: 'https://www.onlyteenblowjobs.com',
|
url: 'https://www.onlyteenblowjobs.com',
|
||||||
description: 'OnlyTeenBlowjobs.com brings you the best teen blowjob porn featuring today\'s hottest young pornstars and amateurs. Watch as teens use their little mouths to suck and deepthroat the biggest of cocks!',
|
description: 'OnlyTeenBlowjobs.com brings you the best teen blowjob porn featuring today\'s hottest young pornstars and amateurs. Watch as teens use their little mouths to suck and deepthroat the biggest of cocks!',
|
||||||
network: 'blowpass',
|
network: 'blowpass',
|
||||||
|
parameters: {
|
||||||
|
latest: '/en/videos/latest/All-Categories/0/All-Pornstars/0/',
|
||||||
|
upcoming: '/en/videos/upcoming',
|
||||||
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
slug: 'throated',
|
slug: 'throated',
|
||||||
|
@ -711,6 +727,10 @@ const sites = [
|
||||||
url: 'https://www.throated.com',
|
url: 'https://www.throated.com',
|
||||||
description: 'Throated.com is your portal for extreme throat fuck porn, face fucking videos and deepthroat gagging pornstars. Watch teens and MILFs go balls deep, swallowing cock in HD!',
|
description: 'Throated.com is your portal for extreme throat fuck porn, face fucking videos and deepthroat gagging pornstars. Watch teens and MILFs go balls deep, swallowing cock in HD!',
|
||||||
network: 'blowpass',
|
network: 'blowpass',
|
||||||
|
parameters: {
|
||||||
|
latest: '/en/videos/latest/All-Categories/0/All-Pornstars/0/',
|
||||||
|
upcoming: '/en/videos/upcoming',
|
||||||
|
},
|
||||||
},
|
},
|
||||||
// BRAZZERS
|
// BRAZZERS
|
||||||
{
|
{
|
||||||
|
|
|
@ -78,48 +78,36 @@ function scrapeUpcoming(html, site) {
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
function scrapeScene(html, url, site) {
|
function scrapeScene(html, url, _site) {
|
||||||
const $ = cheerio.load(html, { normalizeWhitespace: true });
|
const { q, qa, qu, qi, qt } = ex(html, '.playerSection');
|
||||||
const sceneElement = $('.playerSection');
|
const release = {};
|
||||||
|
|
||||||
const shootId = sceneElement.find('.vdoCast:contains("Release")').text().replace('Release: ', '');
|
[release.shootId] = q('.vdoTags + .vdoCast', true).match(/\w+$/);
|
||||||
const entryId = url.split('/')[3].slice(5);
|
[release.entryId] = url.split('/')[3].match(/\d+$/);
|
||||||
const title = sceneElement.find('.ps-vdoHdd h1').text();
|
release.title = q('.ps-vdoHdd h1', true);
|
||||||
const description = sceneElement.find('.vdoDesc').text().trim();
|
release.description = q('.vdoDesc', true);
|
||||||
|
|
||||||
const [siteName, ...actors] = sceneElement.find('.vdoCast a').map((actorIndex, actorElement) => $(actorElement).text()).toArray();
|
release.actors = qa('a[href*="/model"]', true);
|
||||||
const siteSlug = siteName.replace(/[\s']+/g, '').toLowerCase();
|
release.tags = qa('.vdoTags a', true);
|
||||||
|
|
||||||
const poster = `https:${$('img#player-overlay-image').attr('src')}`;
|
release.stars = Number(q('div[class*="like"]', true).match(/^\d+/)[0]) / 20;
|
||||||
const trailer = `https:${$('source[type="video/mp4"]').attr('src')}`;
|
|
||||||
|
|
||||||
const firstPhotoUrl = `https:${$('img[data-slider-index="1"]').attr('src')}`;
|
const poster = qi('img#player-overlay-image');
|
||||||
// all scenes seem to have 12 album photos available, not always included on the page
|
release.poster = [
|
||||||
const photos = Array.from({ length: 12 }, (val, index) => firstPhotoUrl.replace(/big\d+/, `big${index + 1}`));
|
|
||||||
|
|
||||||
const tags = $('.vdoTags a').map((tagIndex, tagElement) => $(tagElement).text()).toArray();
|
|
||||||
|
|
||||||
const stars = Number(sceneElement.find('.bVdPl_it_like .bVdPl_txt').text().replace('% like', '')) / 20;
|
|
||||||
|
|
||||||
return {
|
|
||||||
url,
|
|
||||||
shootId,
|
|
||||||
entryId,
|
|
||||||
title,
|
|
||||||
description,
|
|
||||||
actors,
|
|
||||||
tags,
|
|
||||||
poster,
|
poster,
|
||||||
photos,
|
poster.replace('/big_trailer', '/members/450x340'), // load error fallback
|
||||||
trailer: {
|
];
|
||||||
src: trailer,
|
|
||||||
},
|
release.trailer = { src: qt() };
|
||||||
rating: {
|
|
||||||
stars,
|
// all scenes seem to have 12 album photos available, not always included on the page
|
||||||
},
|
const firstPhotoUrl = ex(html).qi('img[data-slider-index="1"]');
|
||||||
site,
|
release.photos = Array.from({ length: 12 }, (val, index) => firstPhotoUrl.replace(/big\d+/, `big${index + 1}`));
|
||||||
channel: siteSlug === 'bangcasting' ? 'bangbroscasting' : siteSlug,
|
|
||||||
};
|
const [channel] = qu('a[href*="/websites"]').match(/\w+$/);
|
||||||
|
release.channel = channel === 'bangcasting' ? 'bangbroscasting' : channel;
|
||||||
|
|
||||||
|
return release;
|
||||||
}
|
}
|
||||||
|
|
||||||
function scrapeProfile(html) {
|
function scrapeProfile(html) {
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
const bhttp = require('bhttp');
|
const bhttp = require('bhttp');
|
||||||
|
|
||||||
const { scrapeAll, scrapeScene, fetchProfile } = require('./gamma');
|
const { fetchLatest, fetchUpcoming, scrapeScene, fetchProfile } = require('./gamma');
|
||||||
|
|
||||||
async function fetchScene(url, site) {
|
async function fetchScene(url, site) {
|
||||||
// const res = await bhttp.get(url);
|
// const res = await bhttp.get(url);
|
||||||
|
@ -21,18 +21,6 @@ async function fetchScene(url, site) {
|
||||||
return release;
|
return release;
|
||||||
}
|
}
|
||||||
|
|
||||||
async function fetchLatest(site, page = 1) {
|
|
||||||
const res = await bhttp.get(`https://www.blowpass.com/en/videos/${site.slug}/latest/All-Categories/0/All-Pornstars/0/${page}`);
|
|
||||||
|
|
||||||
return scrapeAll(res.body.toString(), site);
|
|
||||||
}
|
|
||||||
|
|
||||||
async function fetchUpcoming(site) {
|
|
||||||
const res = await bhttp.get(`https://www.blowpass.com/en/videos/${site.slug}/upcoming`);
|
|
||||||
|
|
||||||
return scrapeAll(res.body.toString(), site);
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
fetchLatest,
|
fetchLatest,
|
||||||
fetchProfile,
|
fetchProfile,
|
||||||
|
|
|
@ -365,11 +365,14 @@ async function fetchLatest(site, page = 1) {
|
||||||
const url = `${site.url}${site.parameters?.latest || '/en/videos/AllCategories/0/'}${page}`;
|
const url = `${site.url}${site.parameters?.latest || '/en/videos/AllCategories/0/'}${page}`;
|
||||||
const res = await bhttp.get(url);
|
const res = await bhttp.get(url);
|
||||||
|
|
||||||
|
console.log(url);
|
||||||
|
|
||||||
return scrapeAll(res.body.toString(), site);
|
return scrapeAll(res.body.toString(), site);
|
||||||
}
|
}
|
||||||
|
|
||||||
async function fetchUpcoming(site) {
|
async function fetchUpcoming(site) {
|
||||||
const res = await bhttp.get(`${site.url}${site.parameters?.upcoming || '/en/videos/AllCategories/0/1/upcoming'}`);
|
const url = `${site.url}${site.parameters?.upcoming || '/en/videos/AllCategories/0/1/upcoming'}`;
|
||||||
|
const res = await bhttp.get(url);
|
||||||
|
|
||||||
return scrapeAll(res.body.toString(), site);
|
return scrapeAll(res.body.toString(), site);
|
||||||
}
|
}
|
||||||
|
@ -450,10 +453,10 @@ async function fetchApiProfile(actorName, siteSlug) {
|
||||||
});
|
});
|
||||||
|
|
||||||
if (res.statusCode === 200 && res.body.results[0].hits.length > 0) {
|
if (res.statusCode === 200 && res.body.results[0].hits.length > 0) {
|
||||||
const actorData = res.body.results[0].hits.find(actor => actor.name === actorName);
|
const actorData = res.body.results[0].hits.find(actor => slugify(actor.name) === slugify(actorName));
|
||||||
|
|
||||||
if (actorData) {
|
if (actorData) {
|
||||||
const actorScenes = await fetchActorScenes(actorName, apiUrl, siteSlug);
|
const actorScenes = await fetchActorScenes(actorData.name, apiUrl, siteSlug);
|
||||||
|
|
||||||
return scrapeApiProfile(actorData, actorScenes, siteSlug);
|
return scrapeApiProfile(actorData, actorScenes, siteSlug);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue