diff --git a/config/default.js b/config/default.js index 2432aa987..3b1ac7ac6 100644 --- a/config/default.js +++ b/config/default.js @@ -79,6 +79,11 @@ module.exports = { 'pornmegaload', 'scorelandtv', 'scoretv', + // spizoo + 'intimatelesbians', + 'porngoespro', + 'pornstartease', + 'thestripperexperience', // teenscoreclub 'maiko', 'ncuksinners', diff --git a/public/img/logos/spizoo/favicon.png b/public/img/logos/spizoo/favicon.png new file mode 100644 index 000000000..0e5604829 Binary files /dev/null and b/public/img/logos/spizoo/favicon.png differ diff --git a/public/img/logos/spizoo/favicon_dark.png b/public/img/logos/spizoo/favicon_dark.png new file mode 100644 index 000000000..7027ac739 Binary files /dev/null and b/public/img/logos/spizoo/favicon_dark.png differ diff --git a/public/img/logos/spizoo/favicon_light.png b/public/img/logos/spizoo/favicon_light.png new file mode 100644 index 000000000..5127e5e7f Binary files /dev/null and b/public/img/logos/spizoo/favicon_light.png differ diff --git a/public/img/logos/spizoo/intimatelesbians.png b/public/img/logos/spizoo/intimatelesbians.png new file mode 100644 index 000000000..1ee11092a Binary files /dev/null and b/public/img/logos/spizoo/intimatelesbians.png differ diff --git a/public/img/logos/spizoo/lazy/intimatelesbians.png b/public/img/logos/spizoo/lazy/intimatelesbians.png new file mode 100644 index 000000000..922cba370 Binary files /dev/null and b/public/img/logos/spizoo/lazy/intimatelesbians.png differ diff --git a/public/img/logos/spizoo/lazy/network.png b/public/img/logos/spizoo/lazy/network.png new file mode 100644 index 000000000..c23879267 Binary files /dev/null and b/public/img/logos/spizoo/lazy/network.png differ diff --git a/public/img/logos/spizoo/lazy/porngoespro.png b/public/img/logos/spizoo/lazy/porngoespro.png new file mode 100644 index 000000000..8c6881ee7 Binary files /dev/null and b/public/img/logos/spizoo/lazy/porngoespro.png differ diff --git a/public/img/logos/spizoo/lazy/pornstartease.png b/public/img/logos/spizoo/lazy/pornstartease.png new file mode 100644 index 000000000..843f3b4f8 Binary files /dev/null and b/public/img/logos/spizoo/lazy/pornstartease.png differ diff --git a/public/img/logos/spizoo/lazy/spizoo.png b/public/img/logos/spizoo/lazy/spizoo.png new file mode 100644 index 000000000..9aad791b9 Binary files /dev/null and b/public/img/logos/spizoo/lazy/spizoo.png differ diff --git a/public/img/logos/spizoo/lazy/thestripperexperience.png b/public/img/logos/spizoo/lazy/thestripperexperience.png new file mode 100644 index 000000000..1bc394120 Binary files /dev/null and b/public/img/logos/spizoo/lazy/thestripperexperience.png differ diff --git a/public/img/logos/spizoo/misc/intimate_lesbians.svg b/public/img/logos/spizoo/misc/intimate_lesbians.svg new file mode 100644 index 000000000..6ef907db0 --- /dev/null +++ b/public/img/logos/spizoo/misc/intimate_lesbians.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/img/logos/spizoo/misc/porn_goes_pro.svg b/public/img/logos/spizoo/misc/porn_goes_pro.svg new file mode 100644 index 000000000..42d08c32c --- /dev/null +++ b/public/img/logos/spizoo/misc/porn_goes_pro.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/img/logos/spizoo/misc/porn_star_tease.svg b/public/img/logos/spizoo/misc/porn_star_tease.svg new file mode 100644 index 000000000..5a45b0ded --- /dev/null +++ b/public/img/logos/spizoo/misc/porn_star_tease.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/img/logos/spizoo/misc/spizoo.svg b/public/img/logos/spizoo/misc/spizoo.svg new file mode 100644 index 000000000..46f792ebf --- /dev/null +++ b/public/img/logos/spizoo/misc/spizoo.svg @@ -0,0 +1,16 @@ + + + + + + + + + diff --git a/public/img/logos/spizoo/misc/spizoo_dark.png b/public/img/logos/spizoo/misc/spizoo_dark.png new file mode 100644 index 000000000..4e72533b2 Binary files /dev/null and b/public/img/logos/spizoo/misc/spizoo_dark.png differ diff --git a/public/img/logos/spizoo/misc/spizoo_light.png b/public/img/logos/spizoo/misc/spizoo_light.png new file mode 100644 index 000000000..03b245992 Binary files /dev/null and b/public/img/logos/spizoo/misc/spizoo_light.png differ diff --git a/public/img/logos/spizoo/misc/the_stripper_experience.svg b/public/img/logos/spizoo/misc/the_stripper_experience.svg new file mode 100644 index 000000000..01b18a3cf --- /dev/null +++ b/public/img/logos/spizoo/misc/the_stripper_experience.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/img/logos/spizoo/network.png b/public/img/logos/spizoo/network.png new file mode 100644 index 000000000..711d2de50 Binary files /dev/null and b/public/img/logos/spizoo/network.png differ diff --git a/public/img/logos/spizoo/porngoespro.png b/public/img/logos/spizoo/porngoespro.png new file mode 100644 index 000000000..c5ad9f5d2 Binary files /dev/null and b/public/img/logos/spizoo/porngoespro.png differ diff --git a/public/img/logos/spizoo/pornstartease.png b/public/img/logos/spizoo/pornstartease.png new file mode 100644 index 000000000..0e1647c1f Binary files /dev/null and b/public/img/logos/spizoo/pornstartease.png differ diff --git a/public/img/logos/spizoo/spizoo.png b/public/img/logos/spizoo/spizoo.png new file mode 100644 index 000000000..71e2c1d1f Binary files /dev/null and b/public/img/logos/spizoo/spizoo.png differ diff --git a/public/img/logos/spizoo/thestripperexperience.png b/public/img/logos/spizoo/thestripperexperience.png new file mode 100644 index 000000000..f810e47b8 Binary files /dev/null and b/public/img/logos/spizoo/thestripperexperience.png differ diff --git a/public/img/logos/spizoo/thumbs/intimatelesbians.png b/public/img/logos/spizoo/thumbs/intimatelesbians.png new file mode 100644 index 000000000..f1100dd78 Binary files /dev/null and b/public/img/logos/spizoo/thumbs/intimatelesbians.png differ diff --git a/public/img/logos/spizoo/thumbs/network.png b/public/img/logos/spizoo/thumbs/network.png new file mode 100644 index 000000000..02c4fdf29 Binary files /dev/null and b/public/img/logos/spizoo/thumbs/network.png differ diff --git a/public/img/logos/spizoo/thumbs/porngoespro.png b/public/img/logos/spizoo/thumbs/porngoespro.png new file mode 100644 index 000000000..cbb517396 Binary files /dev/null and b/public/img/logos/spizoo/thumbs/porngoespro.png differ diff --git a/public/img/logos/spizoo/thumbs/pornstartease.png b/public/img/logos/spizoo/thumbs/pornstartease.png new file mode 100644 index 000000000..5ab80c8b1 Binary files /dev/null and b/public/img/logos/spizoo/thumbs/pornstartease.png differ diff --git a/public/img/logos/spizoo/thumbs/spizoo.png b/public/img/logos/spizoo/thumbs/spizoo.png new file mode 100644 index 000000000..c40a304bf Binary files /dev/null and b/public/img/logos/spizoo/thumbs/spizoo.png differ diff --git a/public/img/logos/spizoo/thumbs/thestripperexperience.png b/public/img/logos/spizoo/thumbs/thestripperexperience.png new file mode 100644 index 000000000..8ce251131 Binary files /dev/null and b/public/img/logos/spizoo/thumbs/thestripperexperience.png differ diff --git a/seeds/00_tags.js b/seeds/00_tags.js index 1f36294bb..2b3c65dd7 100644 --- a/seeds/00_tags.js +++ b/seeds/00_tags.js @@ -907,6 +907,10 @@ const tags = [ name: 'strap-on dildo', slug: 'strap-on-dildo', }, + { + name: 'stripper', + slug: 'stripper', + }, { name: 'suspension', slug: 'suspension', diff --git a/seeds/01_networks.js b/seeds/01_networks.js index 0aeef5023..25723547a 100644 --- a/seeds/01_networks.js +++ b/seeds/01_networks.js @@ -519,6 +519,11 @@ const networks = [ url: 'https://www.sexyhub.com', parent: 'mindgeek', }, + { + slug: 'spizoo', + name: 'Spizoo', + url: 'http://www.spizoo.com', + }, { slug: 'teamskeet', name: 'Team Skeet', diff --git a/seeds/02_sites.js b/seeds/02_sites.js index fda5cf0fc..e908b2404 100644 --- a/seeds/02_sites.js +++ b/seeds/02_sites.js @@ -8239,6 +8239,40 @@ const sites = [ tags: ['lesbian'], parent: 'sexyhub', }, + // SPIZOO + { + slug: 'spizoo', + name: 'Spizoo', + url: 'https://www.spizoo.com', + parent: 'spizoo', + }, + { + slug: 'thestripperexperience', + name: 'The Stripper Experience', + url: 'https://www.spizoo.com/categories/stripper.html', + tags: ['stripper'], + parent: 'spizoo', + }, + { + slug: 'intimatelesbians', + name: 'Intimate Lesbians', + url: 'https://www.spizoo.com/categories/lesbian.html', + tags: ['lesbian'], + parent: 'spizoo', + }, + { + slug: 'porngoespro', + name: 'Porn Goes Pro', + url: 'https://www.spizoo.com/categories/porngoespro.html', + parent: 'spizoo', + }, + { + slug: 'pornstartease', + name: 'Porn Star Tease', + url: 'https://www.spizoo.com/categories/solo.html', + tags: ['solo'], + parent: 'spizoo', + }, // TEAM SKEET { slug: 'exxxtrasmall', diff --git a/src/actors.js b/src/actors.js index 8459b9dd0..021d7b8ce 100644 --- a/src/actors.js +++ b/src/actors.js @@ -37,6 +37,7 @@ const hairColors = { 'jet-black': 'black', 'red-head': 'red', 'soft-black': 'black', + 'brunette/raven': 'brown', black: 'black', blonde: 'blonde', blondie: 'blonde', diff --git a/src/scrapers/scrapers.js b/src/scrapers/scrapers.js index 1761f32aa..cac0741f0 100644 --- a/src/scrapers/scrapers.js +++ b/src/scrapers/scrapers.js @@ -51,6 +51,7 @@ const pierrewoodman = require('./pierrewoodman'); const pinkyxxx = require('./pinkyxxx'); const privateNetwork = require('./private'); // reserved keyword const score = require('./score'); +const spizoo = require('./spizoo'); const teamskeet = require('./teamskeet'); const teencoreclub = require('./teencoreclub'); const topwebmodels = require('./topwebmodels'); @@ -134,6 +135,7 @@ const scrapers = { private: privateNetwork, score, sexyhub: mindgeek, + spizoo, swallowsalon: julesjordan, teencoreclub, teamskeet, @@ -256,6 +258,7 @@ const scrapers = { sexyhub: mindgeek, silverstonedvd: famedigital, silviasaint: famedigital, + spizoo, swallowed: mikeadriano, teamskeet, teencoreclub, diff --git a/src/scrapers/spizoo.js b/src/scrapers/spizoo.js new file mode 100644 index 000000000..684aa4320 --- /dev/null +++ b/src/scrapers/spizoo.js @@ -0,0 +1,165 @@ +'use strict'; + +const qu = require('../utils/qu'); +const slugify = require('../utils/slugify'); + +function getEntryId(url) { + return slugify(new URL(url).pathname.match(/\/updates\/(.*)\.html/)?.[1], '-'); +} + +function scrapeAll(scenes) { + return scenes.map(({ query }) => { + const release = {}; + + release.url = query.url('a'); + release.entryId = getEntryId(release.url); + + release.title = query.cnt('.title-label a'); + release.actors = query.all('.update_models a').map(el => ({ + name: query.cnt(el), + url: query.url(el, null), + })); + + release.poster = query.img('a img'); + + return release; + }); +} + +function scrapeScene({ query }, url) { + const release = {}; + + release.entryId = getEntryId(url); + release.title = query.cnt('#media-holder .title'); + + release.date = query.date('#sceneInfo .date', 'YYYY-MM-DD'); + release.duration = query.duration('#sceneInfo .data-others', /\d+:\d+/); + + release.description = query.cnt('#sceneInfo .description'); + + release.actors = query.all('#sceneInfo .data-others a[href*="/models"]').map(el => ({ + name: query.el(el, null, 'title'), + url: query.url(el, null), + })); + + release.tags = query.cnts('.categories-holder a'); + + const poster = query.img('#video-holder .update_thumb'); + const posterPathname = poster && new URL(poster)?.pathname; + + release.poster = [poster, poster?.replace(/imgw=\w+/, 'imgw=680')]; + + release.photos = query.imgs('.photos-holder img') + .filter(src => new URL(src).pathname !== posterPathname) + .map(src => [ + src.replace(/imgw=\d+/, 'imgw=1284'), + src, + ]); + + return release; +} + +function scrapeProfileScenes(scenes) { + return scenes.map(({ query }) => { + const release = {}; + + release.url = query.url('a[href*="/updates"]'); + release.entryId = getEntryId(release.url); + + release.title = query.cnt('.titular, h3 a'); + release.date = query.date('.date-label', 'YYYY-MM-DD'); + release.duration = query.number('.length-label') * 60; + + release.description = query.cnt('.model-update-description'); + + release.actors = query.all('.model-labels a').map(el => ({ + name: query.cnt(el), + url: query.url(el, null), + })); + + const poster = query.img('.update_thumb'); + + release.poster = [poster, poster?.replace(/imgw=\w+/, 'imgw=680')]; + release.tags = query.cnts('.categories-holder a'); + + return release; + }); +} + +function scrapeProfile({ query, el }) { + const profile = {}; + const bioKeys = query.cnts('.statsText b'); + const bioValues = query.texts('.statsText'); + + const bio = bioKeys.reduce((acc, key, index) => ({ + ...acc, + [slugify(key, '_')]: bioValues[index], + }), {}); + + profile.description = query.cnt('.descriptionText'); + profile.avatar = query.img('.model-bio-pic img'); + + profile.height = Number(bio.height?.match(/(\d+)\s?cm/i)?.[1]); + profile.dateOfBirth = qu.extractDate(bio.date_of_birth, 'MMMM D, YYYY'); + + profile.measurements = bio.measurements; + profile.butt = bio.ass_type; + profile.pussy = bio.pussy_type; + + profile.ethnicity = bio.ethnicity; + profile.hairColor = bio.hair_color; + profile.eyes = bio.eye_color; + profile.nationality = bio.nationality; + + if (/tattoo/i.test(bio.body_art)) { + profile.hasTattoos = true; + } + + if (/piercing/i.test(bio.body_art)) { + profile.hasPiercings = true; + } + + profile.scenes = scrapeProfileScenes(qu.initAll(el, '.model-update')); + + return profile; +} + +async function fetchLatest(channel, page) { + const res = await qu.getAll(`${channel.url}/categories/movies_${page}_d.html`, '.thumb-big'); + + if (res.ok) { + return scrapeAll(res.items, channel); + } + + return res.status; +} + +async function fetchProfile(actor, channel) { + if (actor.url) { + const res = await qu.get(actor.url); + + if (res.ok) { + return scrapeProfile(res.item); + } + } + + const resA = await qu.get(`${channel.url}/models/${slugify(actor.name)}.html`); + + if (resA.ok) { + return scrapeProfile(resA.item, channel); + } + + const resB = await qu.get(`${channel.url}/models/${slugify(actor.name, '')}.html`); + + if (resB.ok) { + return scrapeProfile(resB.item, channel); + } + + return resB.status; +} + +module.exports = { + fetchLatest, + fetchProfile, + scrapeScene, +};