Added Hookup Hotshot.

This commit is contained in:
DebaucheryLibrarian 2020-09-03 22:22:12 +02:00
parent f6353ca14c
commit c187a27123
18 changed files with 130 additions and 12 deletions

View File

@ -249,7 +249,7 @@
{{ description.text }} {{ description.text }}
<router-link :to="`/${description.entity.type}/${description.entity.slug}`"> <router-link :to="`/${description.entity.type}/${description.entity.slug}`">
<img <img
v-if="description.entity.type === 'network' || description.entity.independent" v-if="description.entity.type === 'network' || !description.entity.parent || description.entity.independent"
:src="`/img/logos/${description.entity.slug}/thumbs/network.png`" :src="`/img/logos/${description.entity.slug}/thumbs/network.png`"
class="description-logo" class="description-logo"
> >

View File

@ -160,6 +160,7 @@ export default {
data() { data() {
return { return {
entity: null, entity: null,
pageTitle: null,
totalCount: null, totalCount: null,
limit: Number(this.$route.query.limit) || 20, limit: Number(this.$route.query.limit) || 20,
expanded: false, expanded: false,

Binary file not shown.

After

Width:  |  Height:  |  Size: 988 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 252 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

View File

@ -184,7 +184,7 @@ const tags = [
}, },
{ {
name: 'behind the scenes', name: 'behind the scenes',
slug: 'behind-the-scenes', slug: 'bts',
priority: 6, priority: 6,
}, },
{ {
@ -1053,8 +1053,8 @@ const aliases = [
for: 'titty-fuck', for: 'titty-fuck',
}, },
{ {
name: 'bts', name: 'behind the scenes',
for: 'behind-the-scenes', for: 'bts',
secondary: true, secondary: true,
}, },
{ {
@ -1718,14 +1718,18 @@ const aliases = [
for: 'transsexual', for: 'transsexual',
secondary: true, secondary: true,
}, },
{
name: 'trimmed pussy',
for: 'trimmed',
},
{ {
name: 'ts', name: 'ts',
for: 'transsexual', for: 'transsexual',
}, },
{
name: 'ts cock',
for: 'transsexual',
},
{
name: 'trimmed pussy',
for: 'trimmed',
},
{ {
name: 'vr', name: 'vr',
for: 'virtual reality', for: 'virtual reality',

View File

@ -2557,6 +2557,12 @@ const sites = [
siteId: 1, siteId: 1,
}, },
}, },
// HOOKUP HOTSHOT
{
slug: 'hookuphotshot',
name: 'Hookup Hotshot',
url: 'https://www.hookuphotshot.com',
},
// HUSSIE PASS // HUSSIE PASS
{ {
slug: 'hussiepass', slug: 'hussiepass',

View File

@ -595,7 +595,7 @@ const tagPosters = [
['atm', 2, 'Jureka Del Mar in "Stretched Out" for Her Limit'], ['atm', 2, 'Jureka Del Mar in "Stretched Out" for Her Limit'],
['atogm', 0, 'Alysa Gap and Logan in "Anal Buffet 4" for Evil Angel'], ['atogm', 0, 'Alysa Gap and Logan in "Anal Buffet 4" for Evil Angel'],
['bdsm', 0, 'Dani Daniels in "The Traning of Dani Daniels, Day 2" for The Training of O at Kink'], ['bdsm', 0, 'Dani Daniels in "The Traning of Dani Daniels, Day 2" for The Training of O at Kink'],
['behind-the-scenes', 0, 'Janice Griffith in "Day With A Pornstar: Janice" for Brazzers'], ['bts', 0, 'Janice Griffith in "Day With A Pornstar: Janice" for Brazzers'],
['blonde', 1, 'Marsha May in "Once You Go Black 7" for Jules Jordan'], ['blonde', 1, 'Marsha May in "Once You Go Black 7" for Jules Jordan'],
['blowbang', 0, 'Lacy Lennon in "Lacy Lennon\'s First Blowbang" for HardX'], ['blowbang', 0, 'Lacy Lennon in "Lacy Lennon\'s First Blowbang" for HardX'],
['blowjob', 0, 'Adriana Chechik in "The Dinner Party" for Real Wife Stories (Brazzers)'], ['blowjob', 0, 'Adriana Chechik in "The Dinner Party" for Real Wife Stories (Brazzers)'],
@ -676,7 +676,7 @@ const tagPhotos = [
['anal', 3, 'Dakota Skye for Brazzers'], ['anal', 3, 'Dakota Skye for Brazzers'],
// ['anal', 1, 'Veronica Leal and Tina Kay in "Agents On Anal Mission" for Asshole Fever'], // ['anal', 1, 'Veronica Leal and Tina Kay in "Agents On Anal Mission" for Asshole Fever'],
// ['anal', 0, 'Veronica Leal'], // ['anal', 0, 'Veronica Leal'],
['behind-the-scenes', 1, 'Madison Ivy in "Day With A Pornstar" for Brazzers'], ['bts', 1, 'Madison Ivy in "Day With A Pornstar" for Brazzers'],
['blonde', 2, 'Isabelle Deltore for Her Limit'], ['blonde', 2, 'Isabelle Deltore for Her Limit'],
['blowbang', 'poster', 'Marsha May in "Feeding Frenzy 12" for Jules Jordan'], ['blowbang', 'poster', 'Marsha May in "Feeding Frenzy 12" for Jules Jordan'],
// ['bukkake', 'poster', 'Mia Malkova in "Facialized 2" for HardX'], // ['bukkake', 'poster', 'Mia Malkova in "Facialized 2" for HardX'],
@ -708,6 +708,7 @@ const tagPhotos = [
['facial', 'poster', 'Jynx Maze'], ['facial', 'poster', 'Jynx Maze'],
['facefucking', 2, 'Jynx Maze for Throated'], ['facefucking', 2, 'Jynx Maze for Throated'],
['facefucking', 3, 'Adriana Chechik in "Performing Magic Butt Tricks With Jules Jordan. What Will Disappear In Her Ass?" for Jules Jordan'], ['facefucking', 3, 'Adriana Chechik in "Performing Magic Butt Tricks With Jules Jordan. What Will Disappear In Her Ass?" for Jules Jordan'],
['fake-boobs', 9, 'Putri Cinta for StasyQ'],
['fake-boobs', 8, 'Amber Alena for Score'], ['fake-boobs', 8, 'Amber Alena for Score'],
['fake-boobs', 1, 'Lela Star in "Thick" for Jules Jordan'], ['fake-boobs', 1, 'Lela Star in "Thick" for Jules Jordan'],
// ['fake-boobs', 6, 'Cathy Heaven in "Heavenly Ass" for Big Wett Butts'], // ['fake-boobs', 6, 'Cathy Heaven in "Heavenly Ass" for Big Wett Butts'],

View File

@ -0,0 +1,103 @@
'use strict';
const qu = require('../utils/q');
const slugify = require('../utils/slugify');
function scrapeAll(scenes) {
return scenes.map(({ query }) => {
const release = {};
release.url = query.url('.date-title a');
const avatarEl = query.el('.girl-thumb-container img');
release.actors = query.all('.date-starring a').map((actorEl) => {
const name = query.cnt(actorEl);
return {
name,
gender: 'female',
url: query.url(actorEl, null),
...(new RegExp(name).test(avatarEl.alt) && {
avatar: [
avatarEl.src.replace(/-\d+x\d+/, ''),
avatarEl.src,
].map(src => ({ src, queueMethod: '1s' })),
}),
};
}).concat({
name: 'Bryan Gozzling',
gender: 'male',
});
release.duration = query.dur('.date-facts');
release.stars = query.number('[data-rating]', null, 'data-rating');
const photoCount = query.number('input[id*=count]', null, 'value');
const photoPath = query.url('input[id*=baseurl]', 'value');
release.poster = {
src: query.img('.date-img-swap'),
queueMethod: '1s',
};
release.photos = [...Array(photoCount)].map((value, index) => ({
src: `${photoPath}/${String(index + 1).padStart(2, '0')}.jpg`,
queueMethod: '1s',
}));
// dates appear to be manually curated
const fullTitle = query.cnt('.date-title a');
const [monthName, date, title] = fullTitle.match(/(\w+)\.? (\d+)\s*-?\s*(.*)/)?.slice(1) || [];
const [year, month] = release.poster.src.match(/uploads\/(\d+)\/(\d+)/)?.slice(1) || [];
release.title = title.replace(/behind the\.\.\./i, 'Behind the Scenes');
release.date = qu.extractDate(`${year}-${monthName || month}-${date}`, ['YYYY-MM-DD', 'YYYY-MMM-DD', 'YYYY-MMMM-DD']);
// release.entryId = new URL(release.url).pathname.split('/')[2];
release.entryId = `${release.date.getFullYear()}-${release.date.getMonth() + 1}-${release.date.getDate()}-${slugify(release.actors[0].name)}`;
release.tags = ['rough', ...release.title.match(/behind the scenes|anal/gi) || []];
return release;
});
}
function scrapeProfile({ query }) {
const profile = {};
profile.gender = 'female';
profile.description = query.cnts('.girl-about p:not(.bio-facts)').join(' ');
profile.avatar = query.img('.girl-pic');
// no deep scraping available, and not all scene details available here
return profile;
}
async function fetchLatest(channel, page = 1) {
const url = `${channel.url}/the-dates/page/${page}`;
const res = await qu.getAll(url, '#et-projects li');
if (res.ok) {
return scrapeAll(res.items, channel);
}
return res.status;
}
async function fetchProfile({ name: actorName }, entity, include) {
const url = `${entity.url}/girls/${slugify(actorName)}`;
const res = await qu.get(url);
if (res.ok) {
return scrapeProfile(res.item, actorName, entity, include);
}
return res.status;
}
module.exports = {
fetchLatest,
fetchProfile,
};

View File

@ -23,6 +23,7 @@ const fcuk = require('./fcuk');
const fullpornnetwork = require('./fullpornnetwork'); const fullpornnetwork = require('./fullpornnetwork');
const girlsway = require('./girlsway'); const girlsway = require('./girlsway');
const hitzefrei = require('./hitzefrei'); const hitzefrei = require('./hitzefrei');
const hookuphotshot = require('./hookuphotshot');
const hush = require('./hush'); const hush = require('./hush');
const iconmale = require('./iconmale'); const iconmale = require('./iconmale');
const insex = require('./insex'); const insex = require('./insex');
@ -104,6 +105,7 @@ module.exports = {
girlsway, girlsway,
girlgirl: julesjordan, girlgirl: julesjordan,
hitzefrei, hitzefrei,
hookuphotshot,
hussiepass: hush, hussiepass: hush,
hushpass: hush, hushpass: hush,
insex, insex,
@ -191,6 +193,7 @@ module.exports = {
hergape: fullpornnetwork, hergape: fullpornnetwork,
hitzefrei, hitzefrei,
homemadeanalwhores: fullpornnetwork, homemadeanalwhores: fullpornnetwork,
hookuphotshot,
hotcrazymess: nubiles, hotcrazymess: nubiles,
hushpass: hush, hushpass: hush,
hussiepass: hush, hussiepass: hush,

View File

@ -183,7 +183,7 @@ async function scrapeChannel(channelEntity, accNetworkReleases) {
if (!scraper) { if (!scraper) {
logger.warn(`No scraper found for '${channelEntity.name}' (${channelEntity.parent?.name})`); logger.warn(`No scraper found for '${channelEntity.name}' (${channelEntity.parent?.name})`);
return []; return emptyReleases;
} }
try { try {
@ -196,7 +196,7 @@ async function scrapeChannel(channelEntity, accNetworkReleases) {
} catch (error) { } catch (error) {
logger.error(`Failed to scrape releases from ${channelEntity.name} using ${scraper.slug}: ${error.message}`); logger.error(`Failed to scrape releases from ${channelEntity.name} using ${scraper.slug}: ${error.message}`);
return []; return emptyReleases;
} }
} }