diff --git a/public/img/logos/karups/favicon.png b/public/img/logos/karups/favicon.png new file mode 100644 index 00000000..820a7fb1 Binary files /dev/null and b/public/img/logos/karups/favicon.png differ diff --git a/public/img/logos/karups/karups.png b/public/img/logos/karups/karups.png new file mode 100644 index 00000000..11264f4c Binary files /dev/null and b/public/img/logos/karups/karups.png differ diff --git a/public/img/logos/karups/lazy/karups.png b/public/img/logos/karups/lazy/karups.png new file mode 100644 index 00000000..42ab374c Binary files /dev/null and b/public/img/logos/karups/lazy/karups.png differ diff --git a/public/img/logos/karups/lazy/network.png b/public/img/logos/karups/lazy/network.png new file mode 100644 index 00000000..d4546b5a Binary files /dev/null and b/public/img/logos/karups/lazy/network.png differ diff --git a/public/img/logos/karups/misc/karups.png b/public/img/logos/karups/misc/karups.png new file mode 100644 index 00000000..56377365 Binary files /dev/null and b/public/img/logos/karups/misc/karups.png differ diff --git a/public/img/logos/karups/misc/karups_tld.png b/public/img/logos/karups/misc/karups_tld.png new file mode 100644 index 00000000..49c54a47 Binary files /dev/null and b/public/img/logos/karups/misc/karups_tld.png differ diff --git a/public/img/logos/karups/network.png b/public/img/logos/karups/network.png new file mode 100644 index 00000000..0f2701a9 Binary files /dev/null and b/public/img/logos/karups/network.png differ diff --git a/public/img/logos/karups/thumbs/karups.png b/public/img/logos/karups/thumbs/karups.png new file mode 100644 index 00000000..ea834aa7 Binary files /dev/null and b/public/img/logos/karups/thumbs/karups.png differ diff --git a/public/img/logos/karups/thumbs/network.png b/public/img/logos/karups/thumbs/network.png new file mode 100644 index 00000000..e2854967 Binary files /dev/null and b/public/img/logos/karups/thumbs/network.png differ diff --git a/public/img/tags/schoolgirl/2.jpeg b/public/img/tags/schoolgirl/2.jpeg new file mode 100644 index 00000000..d96ba30c Binary files /dev/null and b/public/img/tags/schoolgirl/2.jpeg differ diff --git a/public/img/tags/schoolgirl/2a.jpeg b/public/img/tags/schoolgirl/2a.jpeg new file mode 100644 index 00000000..854d5a4d Binary files /dev/null and b/public/img/tags/schoolgirl/2a.jpeg differ diff --git a/public/img/tags/schoolgirl/2b.jpeg b/public/img/tags/schoolgirl/2b.jpeg new file mode 100644 index 00000000..c5888508 Binary files /dev/null and b/public/img/tags/schoolgirl/2b.jpeg differ diff --git a/public/img/tags/schoolgirl/lazy/2.jpeg b/public/img/tags/schoolgirl/lazy/2.jpeg new file mode 100644 index 00000000..69f0d2be Binary files /dev/null and b/public/img/tags/schoolgirl/lazy/2.jpeg differ diff --git a/public/img/tags/schoolgirl/lazy/2a.jpeg b/public/img/tags/schoolgirl/lazy/2a.jpeg new file mode 100644 index 00000000..99c1c100 Binary files /dev/null and b/public/img/tags/schoolgirl/lazy/2a.jpeg differ diff --git a/public/img/tags/schoolgirl/lazy/2b.jpeg b/public/img/tags/schoolgirl/lazy/2b.jpeg new file mode 100644 index 00000000..3e251df4 Binary files /dev/null and b/public/img/tags/schoolgirl/lazy/2b.jpeg differ diff --git a/public/img/tags/schoolgirl/originals/2.jpeg b/public/img/tags/schoolgirl/originals/2.jpeg new file mode 100644 index 00000000..6c9efcdc Binary files /dev/null and b/public/img/tags/schoolgirl/originals/2.jpeg differ diff --git a/public/img/tags/schoolgirl/originals/2a.jpeg b/public/img/tags/schoolgirl/originals/2a.jpeg new file mode 100644 index 00000000..60fed9c1 Binary files /dev/null and b/public/img/tags/schoolgirl/originals/2a.jpeg differ diff --git a/public/img/tags/schoolgirl/originals/2b.jpeg b/public/img/tags/schoolgirl/originals/2b.jpeg new file mode 100644 index 00000000..f0e82db8 Binary files /dev/null and b/public/img/tags/schoolgirl/originals/2b.jpeg differ diff --git a/public/img/tags/schoolgirl/thumbs/1.jpeg b/public/img/tags/schoolgirl/thumbs/1.jpeg index 0d093afa..b46ed80c 100644 Binary files a/public/img/tags/schoolgirl/thumbs/1.jpeg and b/public/img/tags/schoolgirl/thumbs/1.jpeg differ diff --git a/public/img/tags/schoolgirl/thumbs/2.jpeg b/public/img/tags/schoolgirl/thumbs/2.jpeg new file mode 100644 index 00000000..7f3b7abd Binary files /dev/null and b/public/img/tags/schoolgirl/thumbs/2.jpeg differ diff --git a/public/img/tags/schoolgirl/thumbs/2a.jpeg b/public/img/tags/schoolgirl/thumbs/2a.jpeg new file mode 100644 index 00000000..451cccc7 Binary files /dev/null and b/public/img/tags/schoolgirl/thumbs/2a.jpeg differ diff --git a/public/img/tags/schoolgirl/thumbs/2b.jpeg b/public/img/tags/schoolgirl/thumbs/2b.jpeg new file mode 100644 index 00000000..02ce10ac Binary files /dev/null and b/public/img/tags/schoolgirl/thumbs/2b.jpeg differ diff --git a/seeds/01_networks.js b/seeds/01_networks.js index 50e9c75b..c8052623 100644 --- a/seeds/01_networks.js +++ b/seeds/01_networks.js @@ -299,6 +299,11 @@ const networks = [ name: 'Jules Jordan', url: 'https://www.julesjordan.com', }, + { + slug: 'karups', + name: 'Karups', + url: 'https://www.karups.com', + }, { slug: 'kellymadison', name: 'Kelly Madison Media', diff --git a/seeds/02_sites.js b/seeds/02_sites.js index 06076246..123256f7 100644 --- a/seeds/02_sites.js +++ b/seeds/02_sites.js @@ -3562,6 +3562,31 @@ const sites = [ tags: ['lesbian'], parent: 'julesjordan', }, + // KARUPS + { + slug: 'karupsprivatecollection', + name: 'Private Collection', + alias: ['kpc'], + url: 'https://www.karups.com/site/kpc', + hasLogo: false, + parent: 'karups', + }, + { + slug: 'karupshometownamateurs', + name: 'Hometown Amateurs', + alias: ['kha'], + url: 'https://www.karups.com/site/kha', + hasLogo: false, + parent: 'karups', + }, + { + slug: 'karupsolderwomen', + name: 'Older Women', + alias: ['kow'], + url: 'https://www.karups.com/site/kow', + hasLogo: false, + parent: 'karups', + }, // KELLY MADISON MEDIA { slug: 'teenfidelity', diff --git a/seeds/04_media.js b/seeds/04_media.js index c0c44a13..13af70a5 100644 --- a/seeds/04_media.js +++ b/seeds/04_media.js @@ -655,7 +655,7 @@ const tagPosters = [ ['pussy-eating', 5, 'Claudia Macc and Victoria Pure for Euro Girls On Girls'], ['redhead', 1, 'Lacy Lennon for Wicked'], ['squirting', 0, 'Veronica Rodriguez in "Hot Latina Squirting" for Jules Jordan'], - ['schoolgirl', 1, 'Eliza Ibarra for Brazzers'], + ['schoolgirl', 2, 'Cindy Shine in "Schoolgirl Stars in Interracial DP Threesome" for Private'], ['swallowing', 'poster'], ['tattoos', 1, 'Joanna Angel for Joanna Angel'], ['teen', 0, 'Alexa Flexy for Sensual Girl'], @@ -872,6 +872,7 @@ const tagPhotos = [ ['pussy-eating', 3, 'Kylie Page and Kalina Ryu in "Training My Masseuse" for All Girl Massage'], ['pussy-eating', 1, 'Anikka Albrite and Riley Reid for In The Crack'], ['redhead', 0, 'Penny Pax in "The Submission of Emma Marx: Boundaries" for New Sensations'], + ['schoolgirl', 1, 'Eliza Ibarra for Brazzers'], ['squirting', 1, 'Abella Danger and Karma Rx in "Neon Dreaming" for Brazzers'], ['tattoos', 0, 'Tigerlilly in "Wrapped In Blue" for Suicide Girls'], ['teen', 1, 'Stalfra aka Precious for Nubiles'], diff --git a/src/deep.js b/src/deep.js index 2e288484..bbc4a300 100644 --- a/src/deep.js +++ b/src/deep.js @@ -7,6 +7,7 @@ const argv = require('./argv'); const include = require('./utils/argv-include')(argv); const logger = require('./logger')(__filename); const knex = require('./knex'); +const qu = require('./utils/qu'); const scrapers = require('./scrapers/scrapers'); function urlToSiteSlug(url) { @@ -87,6 +88,24 @@ function toBaseReleases(baseReleasesOrUrls, entity = null) { .filter(Boolean); } +async function fetchScene(scraper, url, entity, baseRelease, options) { + if (scraper.fetchScene) { + return scraper.fetchScene(baseRelease.url, entity, baseRelease, options, null); + } + + if (scraper.scrapeScene) { + const res = await qu.get(url); + + if (res.ok) { + return scraper.scrapeScene(res.item, url, entity, baseRelease, options); + } + + return res.status; + } + + return null; +} + async function scrapeRelease(baseRelease, entities, type = 'scene') { const entity = baseRelease.entity || entities[urlToSiteSlug(baseRelease.url)]; @@ -110,8 +129,8 @@ async function scrapeRelease(baseRelease, entities, type = 'scene') { return baseRelease; } - if ((type === 'scene' && !layoutScraper.fetchScene) || (type === 'movie' && !layoutScraper.fetchMovie)) { - logger.warn(`The '${entity.name}'-scraper cannot fetch individual ${type}s`); + if ((type === 'scene' && !layoutScraper.fetchScene && !layoutScraper.scrapeScene) || (type === 'movie' && !layoutScraper.fetchMovie)) { + logger.warn(`The '${entity.name}'-scraper cannot scrape individual ${type}s`); return baseRelease; } @@ -119,7 +138,7 @@ async function scrapeRelease(baseRelease, entities, type = 'scene') { logger.verbose(`Fetching ${type} ${baseRelease.url}`); const scrapedRelease = type === 'scene' - ? await layoutScraper.fetchScene(baseRelease.url, entity, baseRelease, include, null) + ? await fetchScene(scraper, baseRelease.url, entity, baseRelease, include, null) : await layoutScraper.fetchMovie(baseRelease.url, entity, baseRelease, include, null); const mergedRelease = { diff --git a/src/scrapers/karups.js b/src/scrapers/karups.js new file mode 100644 index 00000000..0cebb508 --- /dev/null +++ b/src/scrapers/karups.js @@ -0,0 +1,98 @@ +'use strict'; + +const qu = require('../utils/qu'); +const slugify = require('../utils/slugify'); + +const channelSlugs = { + kpc: 'karupsprivatecollection', + kha: 'karupshometownamateurs', + kow: 'karupsolderwomen', +}; + +function scrapeAll(scenes) { + return scenes.map(({ query }) => { + const release = {}; + + release.url = query.url('a'); + release.entryId = new URL(release.url).pathname.match(/(\d+)\.html/)?.[1]; + + release.title = query.cnt('.title'); + release.date = query.date('.date', 'MMM Do, YYYY'); + + release.channel = channelSlugs[query.cnt('.site')]; + + release.poster = query.img('.thumb img'); + + return release; + }); +} + +function scrapeScene({ query }, url) { + const release = {}; + + release.entryId = new URL(url).pathname.match(/(\d+)\.html/)?.[1]; + + release.title = query.cnt('.title'); + release.date = query.date('.date .content', 'MMM Do, YYYY'); + + release.actors = query.all('.models .content a').map(modelEl => ({ + name: query.cnt(modelEl), + url: query.url(modelEl, null), + })); + + release.poster = query.poster(); + release.photos = query.imgs('.video-thumbs img').slice(1); + + release.trailer = query.video(); + + return release; +} + +function scrapeProfile({ query }, entity) { + const profile = {}; + + profile.gender = 'female'; + + profile.avatar = query.img('.model-thumb img[src*=".jpg"]'); + profile.scenes = scrapeAll(qu.initAll(query.all('.listing-videos .item')), entity); + + return profile; +} + +async function fetchLatest(channel, page) { + const res = await qu.getAll(`${channel.url}/videos/page${page}.html`, '.listing-videos .item'); + + if (res.ok) { + return scrapeAll(res.items, channel); + } + + return res.status; +} + +async function fetchProfile(baseActor, entity) { + const searchRes = await qu.getAll(`https://www.karups.com/models/search/${baseActor.slug}/`, '.listing-models .item'); + + if (!searchRes.ok) { + return searchRes.status; + } + + const actorUrl = searchRes.items.find(item => slugify(item.query.cnt('.title')) === baseActor.slug)?.query.url('a'); + + if (!actorUrl) { + return null; + } + + const actorRes = await qu.get(actorUrl); + + if (actorRes.ok) { + return scrapeProfile(actorRes.item, entity); + } + + return actorRes.status; +} + +module.exports = { + fetchLatest, + fetchProfile, + scrapeScene, +}; diff --git a/src/scrapers/scrapers.js b/src/scrapers/scrapers.js index 766580bc..e62ee6ec 100644 --- a/src/scrapers/scrapers.js +++ b/src/scrapers/scrapers.js @@ -35,6 +35,7 @@ const inthecrack = require('./inthecrack'); const jayrock = require('./jayrock'); const jesseloadsmonsterfacials = require('./jesseloadsmonsterfacials'); const julesjordan = require('./julesjordan'); +const karups = require('./karups'); const kellymadison = require('./kellymadison'); const killergram = require('./killergram'); const kink = require('./kink'); @@ -127,6 +128,7 @@ const scrapers = { jayrock, jesseloadsmonsterfacials, julesjordan, + karups, kellymadison, killergram, kink, @@ -226,6 +228,7 @@ const scrapers = { inthecrack, jamesdeen: fullpornnetwork, julesjordan, + karups, kellymadison, killergram, kink,