diff --git a/public/img/logos/littlecapricedreams/favicon.png b/public/img/logos/littlecapricedreams/favicon.png new file mode 100644 index 00000000..3e731c53 Binary files /dev/null and b/public/img/logos/littlecapricedreams/favicon.png differ diff --git a/public/img/logos/littlecapricedreams/lazy/favicon.png b/public/img/logos/littlecapricedreams/lazy/favicon.png new file mode 100644 index 00000000..5b73283e Binary files /dev/null and b/public/img/logos/littlecapricedreams/lazy/favicon.png differ diff --git a/public/img/logos/littlecapricedreams/lazy/littlecaprice.png b/public/img/logos/littlecapricedreams/lazy/littlecaprice.png new file mode 100644 index 00000000..3a5b04b9 Binary files /dev/null and b/public/img/logos/littlecapricedreams/lazy/littlecaprice.png differ diff --git a/public/img/logos/littlecapricedreams/lazy/littlecapricedreams.png b/public/img/logos/littlecapricedreams/lazy/littlecapricedreams.png new file mode 100644 index 00000000..dfed4c87 Binary files /dev/null and b/public/img/logos/littlecapricedreams/lazy/littlecapricedreams.png differ diff --git a/public/img/logos/littlecapricedreams/littlecapricedreams.png b/public/img/logos/littlecapricedreams/littlecapricedreams.png new file mode 100644 index 00000000..965aecac Binary files /dev/null and b/public/img/logos/littlecapricedreams/littlecapricedreams.png differ diff --git a/public/img/logos/littlecapricedreams/misc/favicon.png b/public/img/logos/littlecapricedreams/misc/favicon.png new file mode 100644 index 00000000..3c83dbc1 Binary files /dev/null and b/public/img/logos/littlecapricedreams/misc/favicon.png differ diff --git a/public/img/logos/littlecapricedreams/misc/favicon_small.png b/public/img/logos/littlecapricedreams/misc/favicon_small.png new file mode 100644 index 00000000..398672a0 Binary files /dev/null and b/public/img/logos/littlecapricedreams/misc/favicon_small.png differ diff --git a/public/img/logos/littlecapricedreams/misc/favicon_tm.png b/public/img/logos/littlecapricedreams/misc/favicon_tm.png new file mode 100644 index 00000000..645f0b22 Binary files /dev/null and b/public/img/logos/littlecapricedreams/misc/favicon_tm.png differ diff --git a/public/img/logos/littlecapricedreams/misc/little-caprice-dreams_dark.png b/public/img/logos/littlecapricedreams/misc/little-caprice-dreams_dark.png new file mode 100644 index 00000000..d8d386be Binary files /dev/null and b/public/img/logos/littlecapricedreams/misc/little-caprice-dreams_dark.png differ diff --git a/public/img/logos/littlecapricedreams/misc/little-caprice-dreams_light.png b/public/img/logos/littlecapricedreams/misc/little-caprice-dreams_light.png new file mode 100644 index 00000000..a84ec461 Binary files /dev/null and b/public/img/logos/littlecapricedreams/misc/little-caprice-dreams_light.png differ diff --git a/public/img/logos/littlecapricedreams/misc/little-caprice.png b/public/img/logos/littlecapricedreams/misc/little-caprice.png new file mode 100644 index 00000000..3a2eed7e Binary files /dev/null and b/public/img/logos/littlecapricedreams/misc/little-caprice.png differ diff --git a/public/img/logos/littlecapricedreams/misc/little-caprice_light.png b/public/img/logos/littlecapricedreams/misc/little-caprice_light.png new file mode 100644 index 00000000..965aecac Binary files /dev/null and b/public/img/logos/littlecapricedreams/misc/little-caprice_light.png differ diff --git a/public/img/logos/littlecapricedreams/misc/little-caprice_original.png b/public/img/logos/littlecapricedreams/misc/little-caprice_original.png new file mode 100644 index 00000000..3254c29a Binary files /dev/null and b/public/img/logos/littlecapricedreams/misc/little-caprice_original.png differ diff --git a/public/img/logos/littlecapricedreams/misc/little-caprice_tld.png b/public/img/logos/littlecapricedreams/misc/little-caprice_tld.png new file mode 100644 index 00000000..c159a25a Binary files /dev/null and b/public/img/logos/littlecapricedreams/misc/little-caprice_tld.png differ diff --git a/public/img/logos/littlecapricedreams/thumbs/favicon.png b/public/img/logos/littlecapricedreams/thumbs/favicon.png new file mode 100644 index 00000000..5b73283e Binary files /dev/null and b/public/img/logos/littlecapricedreams/thumbs/favicon.png differ diff --git a/public/img/logos/littlecapricedreams/thumbs/littlecaprice.png b/public/img/logos/littlecapricedreams/thumbs/littlecaprice.png new file mode 100644 index 00000000..124997ac Binary files /dev/null and b/public/img/logos/littlecapricedreams/thumbs/littlecaprice.png differ diff --git a/public/img/logos/littlecapricedreams/thumbs/littlecapricedreams.png b/public/img/logos/littlecapricedreams/thumbs/littlecapricedreams.png new file mode 100644 index 00000000..c49b15b0 Binary files /dev/null and b/public/img/logos/littlecapricedreams/thumbs/littlecapricedreams.png differ diff --git a/public/img/tags/anal-creampie/3.jpeg b/public/img/tags/anal-creampie/3.jpeg new file mode 100644 index 00000000..b44dfe34 Binary files /dev/null and b/public/img/tags/anal-creampie/3.jpeg differ diff --git a/public/img/tags/anal-creampie/lazy/3.jpeg b/public/img/tags/anal-creampie/lazy/3.jpeg new file mode 100644 index 00000000..9c4bde06 Binary files /dev/null and b/public/img/tags/anal-creampie/lazy/3.jpeg differ diff --git a/public/img/tags/anal-creampie/thumbs/3.jpeg b/public/img/tags/anal-creampie/thumbs/3.jpeg new file mode 100644 index 00000000..226b8b40 Binary files /dev/null and b/public/img/tags/anal-creampie/thumbs/3.jpeg differ diff --git a/public/img/tags/anal-fingering/3.jpeg b/public/img/tags/anal-fingering/3.jpeg new file mode 100644 index 00000000..0c804071 Binary files /dev/null and b/public/img/tags/anal-fingering/3.jpeg differ diff --git a/public/img/tags/anal-fingering/lazy/3.jpeg b/public/img/tags/anal-fingering/lazy/3.jpeg new file mode 100644 index 00000000..470c0928 Binary files /dev/null and b/public/img/tags/anal-fingering/lazy/3.jpeg differ diff --git a/public/img/tags/anal-fingering/thumbs/3.jpeg b/public/img/tags/anal-fingering/thumbs/3.jpeg new file mode 100644 index 00000000..a3d6cf18 Binary files /dev/null and b/public/img/tags/anal-fingering/thumbs/3.jpeg differ diff --git a/public/img/tags/blowjob/2.jpeg b/public/img/tags/blowjob/2.jpeg new file mode 100644 index 00000000..97efcfd2 Binary files /dev/null and b/public/img/tags/blowjob/2.jpeg differ diff --git a/public/img/tags/blowjob/3.jpeg b/public/img/tags/blowjob/3.jpeg new file mode 100644 index 00000000..012a3be8 Binary files /dev/null and b/public/img/tags/blowjob/3.jpeg differ diff --git a/public/img/tags/blowjob/lazy/2.jpeg b/public/img/tags/blowjob/lazy/2.jpeg new file mode 100644 index 00000000..1ecd20bb Binary files /dev/null and b/public/img/tags/blowjob/lazy/2.jpeg differ diff --git a/public/img/tags/blowjob/lazy/3.jpeg b/public/img/tags/blowjob/lazy/3.jpeg new file mode 100644 index 00000000..e7021be0 Binary files /dev/null and b/public/img/tags/blowjob/lazy/3.jpeg differ diff --git a/public/img/tags/blowjob/thumbs/2.jpeg b/public/img/tags/blowjob/thumbs/2.jpeg new file mode 100644 index 00000000..e7d47a87 Binary files /dev/null and b/public/img/tags/blowjob/thumbs/2.jpeg differ diff --git a/public/img/tags/blowjob/thumbs/3.jpeg b/public/img/tags/blowjob/thumbs/3.jpeg new file mode 100644 index 00000000..5ec400b4 Binary files /dev/null and b/public/img/tags/blowjob/thumbs/3.jpeg differ diff --git a/public/img/tags/mfm/7.jpeg b/public/img/tags/mfm/7.jpeg new file mode 100644 index 00000000..59307b5e Binary files /dev/null and b/public/img/tags/mfm/7.jpeg differ diff --git a/public/img/tags/mfm/lazy/7.jpeg b/public/img/tags/mfm/lazy/7.jpeg new file mode 100644 index 00000000..620bdd5f Binary files /dev/null and b/public/img/tags/mfm/lazy/7.jpeg differ diff --git a/public/img/tags/mfm/thumbs/7.jpeg b/public/img/tags/mfm/thumbs/7.jpeg new file mode 100644 index 00000000..2cfe85a9 Binary files /dev/null and b/public/img/tags/mfm/thumbs/7.jpeg differ diff --git a/seeds/00_tags.js b/seeds/00_tags.js index 7bd47a53..5f1a58dd 100644 --- a/seeds/00_tags.js +++ b/seeds/00_tags.js @@ -1098,6 +1098,10 @@ const aliases = [ for: 'bts', secondary: true, }, + { + name: 'behind the scene', + for: 'bts', + }, { name: 'blindfolded', for: 'blindfold', @@ -1265,6 +1269,10 @@ const aliases = [ name: 'couples fantasies', for: 'couples', }, + { + name: 'couple sex', + for: 'couples', + }, { name: 'creampies', for: 'creampie', diff --git a/seeds/02_sites.js b/seeds/02_sites.js index 463ba12b..90097341 100644 --- a/seeds/02_sites.js +++ b/seeds/02_sites.js @@ -4225,6 +4225,13 @@ const sites = [ url: 'https://letsdoeit.com/channels/bums-besuch.en.html', parent: 'letsdoeit', }, + // LITTLE CAPRICE + { + name: 'Little Caprice Dreams', + slug: 'littlecapricedreams', + alias: ['little caprice'], + url: 'https://www.littlecaprice-dreams.com', + }, // MAMACITAZ { name: 'Her Big Ass', diff --git a/seeds/04_media.js b/seeds/04_media.js index a6143d36..6e920632 100644 --- a/seeds/04_media.js +++ b/seeds/04_media.js @@ -694,12 +694,14 @@ const tagPhotos = [ ['anal', 3, 'Dakota Skye for Brazzers'], // ['anal', 1, 'Veronica Leal and Tina Kay in "Agents On Anal Mission" for Asshole Fever'], // ['anal', 0, 'Veronica Leal'], + ['anal-creampie', 3, 'Rose Valerie for Euro Sex Parties'], ['anal-creampie', 0, 'Gina Valentina and Jane Wilde in "A Very Special Anniversary" for Tushy'], ['anal-creampie', 1, 'Aleska Diamond in "Aleska Wants More" for Asshole Fever'], ['ass-eating', 4, 'Vanna Bardot and Isiah Maxwell in "Vanna Craves Isiah\'s Cock!" for DarkX'], ['ass-eating', 3, 'Abella Danger and Karma Rx in "Neon Dreaming" for Brazzers'], ['ass-eating', 1, 'Aidra Fox and Cassidy Klein in "Lesbian Anal Yoga" for LesbianX'], ['ass-eating', 0, 'Angelica Heart and Leanna Sweet in "ATM Bitches" for Asshole Fever'], + ['anal-fingering', 3, 'Rose Valerie for DDF Network'], ['anal-fingering', 1, 'Cherry Kiss, Veronica Leal and Sybil in "Capture This" for Lez Cuties'], ['anal-fingering', 2, 'Aidra Fox and Cassidy Klein in "Lesbian Anal Yoga" for LesbianX'], ['bts', 0, 'Janice Griffith in "Day With A Pornstar: Janice" for Brazzers'], @@ -708,6 +710,8 @@ const tagPhotos = [ ['blonde', 3, 'Kylie Page in "A Juicy Afternoon Delight" for New Sensations'], ['blonde', 2, 'Isabelle Deltore for Her Limit'], ['blowbang', 'poster', 'Marsha May in "Feeding Frenzy 12" for Jules Jordan'], + ['blowjob', 3, 'Rose Valie for Hands On Hardcore'], + ['blowjob', 2, 'Luna Kitsuen in "Gag Reflex" for Evil Angel'], ['blowjob', 1, 'Kylie Page in "Stepsis Gives Soapy Handjob In Shower" for Spy Fam'], // ['bukkake', 'poster', 'Mia Malkova in "Facialized 2" for HardX'], ['caucasian', 0, 'Remy Lacroix for HardX'], @@ -819,6 +823,7 @@ const tagPhotos = [ ['maid', 1, 'Alessandra Jane for Brazzers'], // ['milf', 0, 'Olivia Austin in "Dredd 3" for Jules Jordan'], ['mff', 0, 'Madison Ivy, Adriana Chechik and Keiran Lee in "Day With A Pornstar" for Brazzers'], + ['mfm', 7, 'Rose Valerie for Euro Sex Parties'], ['mfm', 1, 'Lana Rhoades in "Gangbang Me 3" for HardX'], ['mfm', 6, 'Honey Gold in "Slut Puppies 12" for Jules Jordan'], ['natural-boobs', 1, 'Nia Nacci for First Class POV'], diff --git a/src/scrapers/littlecapricedreams.js b/src/scrapers/littlecapricedreams.js new file mode 100644 index 00000000..96c27863 --- /dev/null +++ b/src/scrapers/littlecapricedreams.js @@ -0,0 +1,79 @@ +'use strict'; + +const qu = require('../utils/qu'); + +function scrapeAll(scenes) { + return scenes.map(({ query, el }) => { + const release = {}; + + release.url = query.url('a'); + release.entryId = query.q(el, null, 'id')?.match(/post-(\d+)/)?.[1]; + + release.title = query.cnt('.meta h3'); + release.date = query.date('.meta .post-meta', 'MMMM D, YYYY'); + + release.poster = query.img('img'); + + return release; + }); +} + +function scrapeScene({ query }) { + const release = {}; + + const script = query.cnt('script.yoast-schema-graph'); + const data = script && JSON.parse(script); + + release.entryId = query.q('article.project', 'id')?.match(/post-(\d+)/)?.[1]; + + release.title = query.cnt('.vid_title'); + release.description = query.cnt('.vid_desc p'); + + release.date = query.date('.vid_date', 'MMMM D, YYYY'); + release.duration = query.dur('.vid_length'); + + release.actors = query.all('.vid_infos a[href*="author/"]').map(actorEl => ({ + name: query.cnt(actorEl), + url: query.url(actorEl, null), + })); + + release.tags = query.cnts('.vid_infos a[rel="tag"]'); + + const posterData = data['@graph']?.find(item => item['@type'] === 'ImageObject'); + + release.poster = posterData?.url + || query.q('meta[property="og:image"]', 'content') + || query.q('meta[name="twitter:image"]', 'content'); + + release.stars = Math.min(Number(query.q('.post-ratings-image', 'title')?.match(/average:\s*(\d\.\d+)/)?.[1]), 5) || null; // rating out of 5, yet sometimes 5.07? + + // TODO: photo gallery, find if any video has a trailer + console.log(release); + return release; +} + +async function fetchLatest(channel) { + // no apparent pagination, all updates on one page + const res = await qu.getAll(`${channel.url}/videos/`, '.project'); + + if (res.ok) { + return scrapeAll(res.items, channel); + } + + return res.status; +} + +async function fetchScene(url, channel) { + const res = await qu.get(url); + + if (res.ok) { + return scrapeScene(res.item, channel); + } + + return res.status; +} + +module.exports = { + fetchLatest, + fetchScene, +}; diff --git a/src/scrapers/scrapers.js b/src/scrapers/scrapers.js index a026e3bd..8dccccc1 100644 --- a/src/scrapers/scrapers.js +++ b/src/scrapers/scrapers.js @@ -38,6 +38,7 @@ const kellymadison = require('./kellymadison'); const killergram = require('./killergram'); const kink = require('./kink'); const legalporno = require('./legalporno'); +const littlecapricedreams = require('./littlecapricedreams'); const porndoe = require('./porndoe'); const men = require('./men'); const metrohd = require('./metrohd'); @@ -53,7 +54,6 @@ const perfectgonzo = require('./perfectgonzo'); 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'); @@ -69,6 +69,7 @@ const twistys = require('./twistys'); const vivid = require('./vivid'); const vixen = require('./vixen'); const vogov = require('./vogov'); +const whalemember = require('./whalemember'); const wicked = require('./wicked'); const xempire = require('./xempire'); const zerotolerance = require('./zerotolerance'); @@ -128,6 +129,7 @@ const scrapers = { kink, legalporno, letsdoeit: porndoe, + littlecapricedreams, mamacitaz: porndoe, men, metrohd, diff --git a/src/utils/http.js b/src/utils/http.js index aef75a0b..3a02149b 100644 --- a/src/utils/http.js +++ b/src/utils/http.js @@ -9,6 +9,7 @@ const Bottleneck = require('bottleneck'); const { JSDOM } = require('jsdom'); const logger = require('../logger')(__filename); +const virtualConsole = require('./virtual-console')(__filename); const argv = require('../argv'); const pipeline = util.promisify(stream.pipeline); @@ -105,7 +106,7 @@ async function request(method = 'get', url, body, requestOptions = {}, limiter) if (Buffer.isBuffer(res.body)) { const html = res.body.toString(); - const window = new JSDOM(html).window; + const window = new JSDOM(html, { virtualConsole }).window; return { ...res, diff --git a/src/utils/qu.js b/src/utils/qu.js index b90d9c02..121bb877 100644 --- a/src/utils/qu.js +++ b/src/utils/qu.js @@ -3,8 +3,9 @@ const { JSDOM } = require('jsdom'); const moment = require('moment'); const http = require('./http'); +const virtualConsole = require('./virtual-console')(__filename); -const { window: globalWindow } = new JSDOM(''); +const { window: globalWindow } = new JSDOM('', { virtualConsole }); function trim(str) { if (typeof str !== 'string') { @@ -440,7 +441,7 @@ function initAll(context, selector, window) { } function extract(htmlValue, selector) { - const { window } = new JSDOM(htmlValue); + const { window } = new JSDOM(htmlValue, { virtualConsole }); if (selector) { return init(window.document.querySelector(selector), window); @@ -450,7 +451,7 @@ function extract(htmlValue, selector) { } function extractAll(htmlValue, selector) { - const { window } = new JSDOM(htmlValue); + const { window } = new JSDOM(htmlValue, { virtualConsole }); return initAll(window.document, selector, window); } diff --git a/src/utils/virtual-console.js b/src/utils/virtual-console.js new file mode 100644 index 00000000..443ad345 --- /dev/null +++ b/src/utils/virtual-console.js @@ -0,0 +1,18 @@ +'use strict'; + +const { VirtualConsole } = require('jsdom'); +const path = require('path'); + +const logger = require('../logger')(__filename); + +function getVirtualConsole(filepath) { + const virtualConsole = new VirtualConsole(); + const context = path.basename(filepath); + + virtualConsole.on('error', message => logger.warn(`Error from JSDOM in ${context}: ${message}`)); + virtualConsole.on('jsdomError', message => logger.warn(`Error from JSDOM in ${context}: ${message}`)); + + return virtualConsole; +} + +module.exports = getVirtualConsole;