diff --git a/public/img/logos/pascalssubsluts/favicon.png b/public/img/logos/pascalssubsluts/favicon.png new file mode 100644 index 00000000..5602a5ba Binary files /dev/null and b/public/img/logos/pascalssubsluts/favicon.png differ diff --git a/public/img/logos/pascalssubsluts/lazy/network.png b/public/img/logos/pascalssubsluts/lazy/network.png new file mode 100644 index 00000000..1f38990c Binary files /dev/null and b/public/img/logos/pascalssubsluts/lazy/network.png differ diff --git a/public/img/logos/pascalssubsluts/lazy/pascalssubsluts.png b/public/img/logos/pascalssubsluts/lazy/pascalssubsluts.png new file mode 100644 index 00000000..b6f72429 Binary files /dev/null and b/public/img/logos/pascalssubsluts/lazy/pascalssubsluts.png differ diff --git a/public/img/logos/pascalssubsluts/network.png b/public/img/logos/pascalssubsluts/network.png new file mode 100644 index 00000000..824777a2 Binary files /dev/null and b/public/img/logos/pascalssubsluts/network.png differ diff --git a/public/img/logos/pascalssubsluts/pascalssubsluts.png b/public/img/logos/pascalssubsluts/pascalssubsluts.png new file mode 100644 index 00000000..824777a2 Binary files /dev/null and b/public/img/logos/pascalssubsluts/pascalssubsluts.png differ diff --git a/public/img/logos/pascalssubsluts/thumbs/network.png b/public/img/logos/pascalssubsluts/thumbs/network.png new file mode 100644 index 00000000..0bb699b9 Binary files /dev/null and b/public/img/logos/pascalssubsluts/thumbs/network.png differ diff --git a/public/img/logos/pascalssubsluts/thumbs/pascalssubsluts.png b/public/img/logos/pascalssubsluts/thumbs/pascalssubsluts.png new file mode 100644 index 00000000..fc5d262d Binary files /dev/null and b/public/img/logos/pascalssubsluts/thumbs/pascalssubsluts.png differ diff --git a/seeds/02_sites.js b/seeds/02_sites.js index 7117b85d..7a2cb24d 100644 --- a/seeds/02_sites.js +++ b/seeds/02_sites.js @@ -5399,6 +5399,13 @@ const sites = [ tags: ['parody'], parent: 'nubiles', }, + // PASCALS SUBSLUTS + { + slug: 'pascalssubsluts', + name: 'Pascal\'s Sub Sluts', + url: 'https://www.pascalssubsluts.com', + tags: ['rough', 'bdsm'], + }, // PERFECT GONZO { slug: 'allinternal', diff --git a/src/scrapers/pascalssubsluts.js b/src/scrapers/pascalssubsluts.js new file mode 100644 index 00000000..662d27ed --- /dev/null +++ b/src/scrapers/pascalssubsluts.js @@ -0,0 +1,101 @@ +'use strict'; + +const qu = require('../utils/q'); +const capitalize = require('../utils/capitalize'); + +function scrapeAll(months, channel, year) { + return months.map(({ query: queryMonth, el }) => { + const month = queryMonth.cnt('h3'); + const scenes = queryMonth.all(el.nextElementSibling, 'li:nth-child(2n)'); + + return qu.initAll(scenes).map(({ query }) => { + const release = {}; + + release.url = query.url('a.video-pop-up', 'href', { origin: `${channel.url}/submissive` }); + release.entryId = new URL(release.url).searchParams.get('id'); + + release.title = query.cnt('.updates-item-title h4'); + + release.date = qu.parseDate(`${month} ${year}`, 'MMMM/YYYY'); + release.datePrecision = 'month'; + + release.actors = [{ + name: capitalize(query.q('a.video-pop-up', 'data-modelname'), { uncapitalize: true }), + url: query.url('a.video-pop-up', 'data-modellink', { origin: `${channel.url}/submissive` }), + }]; + + release.poster = query.img('img'); + + return release; + }); + }).flat(); +} + +function scrapeScene({ html }, url) { + const release = {}; + + release.entryId = new URL(url).searchParams.get('id'); + release.trailer = html.match(/file: '(.*)'/)[1]; + + return release; +} + +/* +function scrapeProfile({ query, el }, actorName, entity, include) { + const profile = {}; + + profile.description = query.cnt('.bio-text'); + profile.birthPlace = query.cnt('.birth-place span'); + + profile.avatar = query.img('.actor-photo img'); + + if (include.releases) { + return scrapeAll(qu.initAll(el, '.scene')); + } + + console.log(profile); + return profile; +} +*/ + +async function fetchLatest(channel, page = 1) { + const year = new Date().getFullYear() - (page - 1); + + const url = `${channel.url}/submissive/updates.php?y=${year}`; + const res = await qu.getAll(url, '.month'); + + if (res.ok) { + return scrapeAll(res.items, channel, year); + } + + return res.status; +} + +async function fetchScene(url, channel) { + const res = await qu.get(url); + + if (res.ok) { + return scrapeScene(res.item, url, channel); + } + + return res.status; +} + +/* +async function fetchProfile({ name: actorName }, entity, include) { + const url = `${entity.url}/actors/${slugify(actorName, '_')}`; + const res = await qu.get(url); + + if (res.ok) { + return scrapeProfile(res.item, actorName, entity, include); + } + + return res.status; +} +*/ + +module.exports = { + fetchLatest, + fetchScene, + fetchProfile, +}; diff --git a/src/scrapers/scrapers.js b/src/scrapers/scrapers.js index b795964a..c1b57b14 100644 --- a/src/scrapers/scrapers.js +++ b/src/scrapers/scrapers.js @@ -53,6 +53,7 @@ const pervcity = require('./pervcity'); const porncz = require('./porncz'); const pornhub = require('./pornhub'); const whalemember = require('./whalemember'); +const pascalssubsluts = require('./pascalssubsluts'); // reserved keyword const privateNetwork = require('./private'); // reserved keyword const puretaboo = require('./puretaboo'); const realitykings = require('./realitykings'); @@ -134,6 +135,7 @@ module.exports = { naughtyamerica, newsensations, nubiles, + pascalssubsluts, perfectgonzo, pervcity, pimpxxx: cherrypimps, diff --git a/src/utils/qu.js b/src/utils/qu.js index dab80730..79f46ded 100644 --- a/src/utils/qu.js +++ b/src/utils/qu.js @@ -56,6 +56,10 @@ function prefixUrl(urlValue, origin, protocol = 'https') { return `${origin}${urlValue}`; } + if (origin && /^\.\//.test(urlValue)) { + return `${origin}${urlValue.slice(1)}`; + } + if (origin) { return `${origin}/${urlValue}`; }