Added Spizoo.

This commit is contained in:
DebaucheryLibrarian 2021-09-13 01:29:39 +02:00
parent 2d6b285817
commit b164c5dad7
35 changed files with 237 additions and 0 deletions

View File

@ -79,6 +79,11 @@ module.exports = {
'pornmegaload',
'scorelandtv',
'scoretv',
// spizoo
'intimatelesbians',
'porngoespro',
'pornstartease',
'thestripperexperience',
// teenscoreclub
'maiko',
'ncuksinners',

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 39 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 8.1 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 11 KiB

View File

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg width="100%" height="100%" viewBox="0 0 244 54" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:1.41421;">
<g transform="matrix(1,0,0,1,-1331,-10)">
<g transform="matrix(0.218182,0,0,1.88038,1323,-3.32142e-16)">
<g id="logo" transform="matrix(3.67056,0,0,0.425898,-1671.84,1.05462)">
<g id="Spizoo-copia-9" serif:id="Spizoo copia 9" transform="matrix(1,0,0,1,323.096,-55.3236)">
<path d="M188.271,99.069C185.867,96.028 181.84,93.679 176.19,92.023C171.682,90.695 168.977,89.76 168.075,89.215C166.061,88.038 165.055,86.635 165.055,85.005C165.055,83.346 165.821,82.018 167.356,81.021C168.709,80.145 170.244,79.708 171.958,79.708C175.508,79.708 182.483,82.616 185.972,85.353L192.363,72.902C186.002,69.564 176.051,66.355 169.42,66.355C162.82,66.355 157.54,68.563 153.579,72.978C150.189,76.733 148.494,81.464 148.494,87.171C148.494,92.639 150.132,96.724 153.408,99.427C154.55,100.359 155.932,101.169 157.555,101.86C158.577,102.311 161.071,103.122 165.038,104.293C168.313,105.235 170.643,106.162 172.026,107.073C173.889,108.288 174.821,109.807 174.821,111.63C174.821,113.636 173.979,115.185 172.295,116.278C170.852,117.251 169.093,117.736 167.019,117.736C162.419,117.736 154.642,112.477 149.832,108.116L142.992,121.017C149.562,125.679 159.759,131.089 167.44,131.089C171.1,131.089 174.52,130.532 177.701,129.418C186.821,126.257 191.382,119.468 191.382,109.05C191.382,104.985 190.344,101.659 188.271,99.069L188.271,99.069ZM262.288,67.843L262.288,129.42L246.312,129.42L246.312,67.843L262.288,67.843ZM221.129,67.843C228.365,67.846 233.851,69.964 237.6,74.197C240.84,77.833 242.46,82.474 242.46,88.121C242.46,93.679 241.155,98.275 238.545,101.91C235.154,106.627 229.529,108.985 221.669,108.985L211.678,108.985L211.678,129.42L195.702,129.42L195.702,67.843L221.129,67.843ZM321.473,67.843L292.536,116.067L313.714,116.067L325.619,129.42L265.759,129.42L294.831,81.197L266.441,81.197L266.441,67.843L321.473,67.843ZM217.005,96.083C220.473,96.081 222.845,95.327 224.138,93.821C225.312,92.463 225.899,90.624 225.899,88.301C225.899,86.009 225.229,84.176 223.89,82.804C222.55,81.432 220.271,80.745 217.05,80.745L211.678,80.745L211.678,96.083L217.005,96.083Z" style="fill:rgb(47,47,47);"/>
</g>
<g id="Spizoo-copia-11" serif:id="Spizoo copia 11" transform="matrix(1,0,0,1,323.096,-55.3236)">
<path d="M380.54,86.378C381.984,82.662 383.904,79.463 386.274,76.775C392.604,69.588 401.17,65.994 411.971,65.994C422.771,65.994 431.337,69.588 437.667,76.775C443.217,83.091 445.993,90.444 445.993,98.835C445.993,107.196 443.217,114.534 437.667,120.849C431.337,128.037 422.771,131.631 411.971,131.631C401.2,131.631 392.649,128.037 386.319,120.849C383.762,117.94 381.794,114.813 380.447,111.47C379.101,114.813 377.133,117.94 374.576,120.849C368.246,128.037 359.68,131.631 348.88,131.631C338.109,131.631 329.558,128.037 323.228,120.849C317.677,114.534 314.903,107.196 314.903,98.835C314.903,95.016 315.652,91.098 317.153,87.083C318.652,83.068 320.663,79.633 323.183,76.775C329.513,69.588 338.079,65.994 348.88,65.994C359.68,65.994 368.246,69.588 374.576,76.775C377.187,79.747 379.184,82.947 380.54,86.378ZM362.19,110.052C358.73,114.092 354.294,116.112 348.88,116.112C343.465,116.112 339.043,114.077 335.614,110.006C332.847,106.72 331.464,102.996 331.464,98.835C331.464,96.815 331.824,94.825 332.546,92.865C333.809,89.428 335.93,86.676 338.908,84.611C341.886,82.546 345.21,81.512 348.88,81.512C354.203,81.512 358.64,83.532 362.19,87.573C364.957,90.739 366.341,94.493 366.341,98.835C366.341,103.087 364.957,106.826 362.19,110.052L362.19,110.052ZM425.281,110.052C421.821,114.092 417.385,116.112 411.971,116.112C406.556,116.112 402.134,114.077 398.705,110.006C395.938,106.72 394.555,102.996 394.555,98.835C394.555,96.815 394.915,94.825 395.637,92.865C396.9,89.428 399.021,86.676 401.999,84.611C404.977,82.546 408.301,81.512 411.971,81.512C417.294,81.512 421.731,83.532 425.281,87.573C428.048,90.739 429.432,94.493 429.432,98.835C429.432,103.087 428.048,106.826 425.281,110.052L425.281,110.052Z" style="fill:rgb(0,102,156);"/>
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

View File

@ -907,6 +907,10 @@ const tags = [
name: 'strap-on dildo',
slug: 'strap-on-dildo',
},
{
name: 'stripper',
slug: 'stripper',
},
{
name: 'suspension',
slug: 'suspension',

View File

@ -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',

View File

@ -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',

View File

@ -37,6 +37,7 @@ const hairColors = {
'jet-black': 'black',
'red-head': 'red',
'soft-black': 'black',
'brunette/raven': 'brown',
black: 'black',
blonde: 'blonde',
blondie: 'blonde',

View File

@ -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,

165
src/scrapers/spizoo.js Normal file
View File

@ -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,
};