diff --git a/config/default.js b/config/default.js index 61d81160..7f57e7a0 100644 --- a/config/default.js +++ b/config/default.js @@ -306,6 +306,10 @@ module.exports = { interval: 1000, concurrency: 1, }, + 'www.twistys.com': { + interval: 1000, + concurrency: 1, + }, 'westcoastproductions.com': { interval: 100, concurrency: 1, diff --git a/public/img/logos/gotfilled/favicon.png b/public/img/logos/gotfilled/favicon.png new file mode 100644 index 00000000..8cd427bd Binary files /dev/null and b/public/img/logos/gotfilled/favicon.png differ diff --git a/public/img/logos/gotfilled/favicon_dark.png b/public/img/logos/gotfilled/favicon_dark.png new file mode 100644 index 00000000..62f46146 Binary files /dev/null and b/public/img/logos/gotfilled/favicon_dark.png differ diff --git a/public/img/logos/gotfilled/favicon_light.png b/public/img/logos/gotfilled/favicon_light.png new file mode 100644 index 00000000..4a726d79 Binary files /dev/null and b/public/img/logos/gotfilled/favicon_light.png differ diff --git a/public/img/logos/gotfilled/gotfilled.png b/public/img/logos/gotfilled/gotfilled.png new file mode 100644 index 00000000..2951000b Binary files /dev/null and b/public/img/logos/gotfilled/gotfilled.png differ diff --git a/public/img/logos/gotfilled/lazy/favicon-dark.png b/public/img/logos/gotfilled/lazy/favicon-dark.png new file mode 100644 index 00000000..bea7ec75 Binary files /dev/null and b/public/img/logos/gotfilled/lazy/favicon-dark.png differ diff --git a/public/img/logos/gotfilled/lazy/favicon-light.png b/public/img/logos/gotfilled/lazy/favicon-light.png new file mode 100644 index 00000000..80921036 Binary files /dev/null and b/public/img/logos/gotfilled/lazy/favicon-light.png differ diff --git a/public/img/logos/gotfilled/lazy/favicon.png b/public/img/logos/gotfilled/lazy/favicon.png new file mode 100644 index 00000000..e4099724 Binary files /dev/null and b/public/img/logos/gotfilled/lazy/favicon.png differ diff --git a/public/img/logos/gotfilled/lazy/gotfilled.png b/public/img/logos/gotfilled/lazy/gotfilled.png new file mode 100644 index 00000000..0f1cfce4 Binary files /dev/null and b/public/img/logos/gotfilled/lazy/gotfilled.png differ diff --git a/public/img/logos/gotfilled/lazy/network.png b/public/img/logos/gotfilled/lazy/network.png new file mode 100644 index 00000000..2166883f Binary files /dev/null and b/public/img/logos/gotfilled/lazy/network.png differ diff --git a/public/img/logos/gotfilled/misc/got-filled_dark.png b/public/img/logos/gotfilled/misc/got-filled_dark.png new file mode 100644 index 00000000..edaf953a Binary files /dev/null and b/public/img/logos/gotfilled/misc/got-filled_dark.png differ diff --git a/public/img/logos/gotfilled/network.png b/public/img/logos/gotfilled/network.png new file mode 100644 index 00000000..57adf605 Binary files /dev/null and b/public/img/logos/gotfilled/network.png differ diff --git a/public/img/logos/gotfilled/thumbs/favicon-dark.png b/public/img/logos/gotfilled/thumbs/favicon-dark.png new file mode 100644 index 00000000..2f4c6895 Binary files /dev/null and b/public/img/logos/gotfilled/thumbs/favicon-dark.png differ diff --git a/public/img/logos/gotfilled/thumbs/favicon-light.png b/public/img/logos/gotfilled/thumbs/favicon-light.png new file mode 100644 index 00000000..53fc88e7 Binary files /dev/null and b/public/img/logos/gotfilled/thumbs/favicon-light.png differ diff --git a/public/img/logos/gotfilled/thumbs/favicon.png b/public/img/logos/gotfilled/thumbs/favicon.png new file mode 100644 index 00000000..4a843221 Binary files /dev/null and b/public/img/logos/gotfilled/thumbs/favicon.png differ diff --git a/public/img/logos/gotfilled/thumbs/gotfilled.png b/public/img/logos/gotfilled/thumbs/gotfilled.png new file mode 100644 index 00000000..85c78b57 Binary files /dev/null and b/public/img/logos/gotfilled/thumbs/gotfilled.png differ diff --git a/public/img/logos/gotfilled/thumbs/network.png b/public/img/logos/gotfilled/thumbs/network.png new file mode 100644 index 00000000..ce71206c Binary files /dev/null and b/public/img/logos/gotfilled/thumbs/network.png differ diff --git a/public/img/logos/inserted/favicon.png b/public/img/logos/inserted/favicon.png new file mode 100644 index 00000000..8edc69d9 Binary files /dev/null and b/public/img/logos/inserted/favicon.png differ diff --git a/public/img/logos/inserted/favicon_dark.png b/public/img/logos/inserted/favicon_dark.png new file mode 100644 index 00000000..7a953396 Binary files /dev/null and b/public/img/logos/inserted/favicon_dark.png differ diff --git a/public/img/logos/inserted/favicon_light.png b/public/img/logos/inserted/favicon_light.png new file mode 100644 index 00000000..5a0c847a Binary files /dev/null and b/public/img/logos/inserted/favicon_light.png differ diff --git a/public/img/logos/inserted/inserted.png b/public/img/logos/inserted/inserted.png new file mode 100644 index 00000000..97f7deeb Binary files /dev/null and b/public/img/logos/inserted/inserted.png differ diff --git a/public/img/logos/inserted/lazy/favicon.png b/public/img/logos/inserted/lazy/favicon.png new file mode 100644 index 00000000..9586ad67 Binary files /dev/null and b/public/img/logos/inserted/lazy/favicon.png differ diff --git a/public/img/logos/inserted/lazy/favicon_dark.png b/public/img/logos/inserted/lazy/favicon_dark.png new file mode 100644 index 00000000..473ed776 Binary files /dev/null and b/public/img/logos/inserted/lazy/favicon_dark.png differ diff --git a/public/img/logos/inserted/lazy/favicon_light.png b/public/img/logos/inserted/lazy/favicon_light.png new file mode 100644 index 00000000..31521144 Binary files /dev/null and b/public/img/logos/inserted/lazy/favicon_light.png differ diff --git a/public/img/logos/inserted/lazy/inserted.png b/public/img/logos/inserted/lazy/inserted.png new file mode 100644 index 00000000..c0261a2b Binary files /dev/null and b/public/img/logos/inserted/lazy/inserted.png differ diff --git a/public/img/logos/inserted/lazy/network.png b/public/img/logos/inserted/lazy/network.png new file mode 100644 index 00000000..327eb7c0 Binary files /dev/null and b/public/img/logos/inserted/lazy/network.png differ diff --git a/public/img/logos/inserted/network.png b/public/img/logos/inserted/network.png new file mode 100644 index 00000000..a3f7cd3b Binary files /dev/null and b/public/img/logos/inserted/network.png differ diff --git a/public/img/logos/inserted/thumbs/favicon.png b/public/img/logos/inserted/thumbs/favicon.png new file mode 100644 index 00000000..9dd9a863 Binary files /dev/null and b/public/img/logos/inserted/thumbs/favicon.png differ diff --git a/public/img/logos/inserted/thumbs/favicon_dark.png b/public/img/logos/inserted/thumbs/favicon_dark.png new file mode 100644 index 00000000..3db4c79e Binary files /dev/null and b/public/img/logos/inserted/thumbs/favicon_dark.png differ diff --git a/public/img/logos/inserted/thumbs/favicon_light.png b/public/img/logos/inserted/thumbs/favicon_light.png new file mode 100644 index 00000000..e04463ea Binary files /dev/null and b/public/img/logos/inserted/thumbs/favicon_light.png differ diff --git a/public/img/logos/inserted/thumbs/inserted.png b/public/img/logos/inserted/thumbs/inserted.png new file mode 100644 index 00000000..0c259bc3 Binary files /dev/null and b/public/img/logos/inserted/thumbs/inserted.png differ diff --git a/public/img/logos/inserted/thumbs/network.png b/public/img/logos/inserted/thumbs/network.png new file mode 100644 index 00000000..6aca1444 Binary files /dev/null and b/public/img/logos/inserted/thumbs/network.png differ diff --git a/seeds/02_sites.js b/seeds/02_sites.js index 10148ad7..4dd79206 100644 --- a/seeds/02_sites.js +++ b/seeds/02_sites.js @@ -7554,6 +7554,26 @@ const sites = [ independent: true, parent: 'radical', }, + { + name: 'Got Filled', + slug: 'gotfilled', + url: 'https://gotfilled.com', + independent: true, + parent: 'radical', + parameters: { + layout: 'metadata', + }, + }, + { + name: 'Inserted', + slug: 'inserted', + url: 'https://inserted.com', + independent: true, + parent: 'radical', + parameters: { + layout: 'metadata', + }, + }, // REALITY KINGS { name: 'Look At Her Now', diff --git a/src/scrapers/radical.js b/src/scrapers/radical.js new file mode 100644 index 00000000..a49e3187 --- /dev/null +++ b/src/scrapers/radical.js @@ -0,0 +1,143 @@ +'use strict'; + +const http = require('../utils/http'); +const qu = require('../utils/qu'); +const slugify = require('../utils/slugify'); +const { lbsToKg, feetInchesToCm } = require('../utils/convert'); + +function scrapeSceneMetadata(data, channel) { + const release = {}; + + release.entryId = data.id; + release.url = `${channel.url}/tour/videos/${data.id}/${slugify(data.title, '-', { removePunctuation: true })}`; + + release.title = data.title; + release.description = data.description; + + release.date = new Date(data.release_date); + release.duration = qu.durationToSeconds(data.videos_duration); + + release.actors = data.models.map((model) => ({ + entryId: model.id, + name: model.name, + gender: model.gender, + avatar: model.thumb, + url: `${channel.url}/tour/models/${model.id}/${slugify(model.name, '-', { removePunctuation: true })}`, + })); + + release.poster = data.trailer?.poster || [data.thumb?.replace('mobile.jpg', '.jpg'), data.thumb]; + release.photos = [ + data.extra_thumbs?.find((url) => /portrait1.jpg/.test(url)), + data.extra_thumbs?.find((url) => /scene.jpg/.test(url)), + data.extra_thumbs?.find((url) => /portrait2.jpg/.test(url)), + ]; // ordered by chronology: portrait1.jpg and scene.jpg are usually pre-shoot poses, portrait2.jpg is the cumshot aftermath + + release.trailer = data.trailer && { + src: data.trailer.src, + type: data.trailer.type, + }; + + release.teaser = data.special_thumbs; + + release.tags = [].concat(data.tags?.map((tag) => tag.name)); + release.qualities = data.downloads && Object.values(data.downloads)?.map((download) => download.meta_data.height); + release.stars = data.rating; + + return release; +} + +function scrapeAllMetadata(scenes, channel) { + return scenes.map((data) => scrapeSceneMetadata(data, channel)); +} + +function scrapeProfileMetadata(data, channel) { + const profile = {}; + + profile.entryId = data.id; + profile.url = `${channel.url}/tour/models/${data.id}/${slugify(data.name, '-', { removePunctuation: true })}`; + + profile.description = data.attributes.bio?.value; + profile.dateOfBirth = qu.parseDate(data.attributes.birthdate?.value, 'YYYY-MM-DD'); + profile.gender = data.gender; + profile.age = data.attributes.age?.value; + profile.birthPlace = data.attributes.born?.value; + + profile.measurements = data.attributes.measurements?.value; + profile.height = feetInchesToCm(data.attributes.height?.value); + profile.weight = lbsToKg(data.attributes.weight?.value); + + profile.eyes = data.attributes.eyes?.value; + profile.hairColor = data.attributes.hair?.value; + + profile.avatar = data.thumb; + profile.date = new Date(data.publish_date); + + return profile; +} + +async function fetchLatestMetadata(channel, page = 1) { + const url = `${channel.url}/tour/videos?page=${page}`; + const res = await http.get(url, { + parse: true, + extract: { + runScripts: 'dangerously', + }, + }); + + if (res.ok && res.window.__DATA__) { + return scrapeAllMetadata(res.window.__DATA__.videos.items, channel); + } + + if (res.ok) { + return res.window.__DATA__?.error || null; + } + + return res.status; +} + +async function fetchSceneMetadata(url, channel) { + const res = await http.get(url, { + parse: true, + extract: { + runScripts: 'dangerously', + }, + }); + + if (res.ok && res.window.__DATA__?.video) { + return scrapeSceneMetadata(res.window.__DATA__.video, channel); + } + + if (res.ok) { + return res.window.__DATA__?.error || null; + } + + return res.status; +} + +async function fetchProfileMetadata(actor, channel) { + const res = await http.get(`${channel.url}/tour/search-preview/${actor.name}`, { + headers: { + 'X-Requested-With': 'XMLHttpRequest', + }, + }); + + if (res.ok) { + const model = res.body.models?.items.find((modelX) => slugify(modelX.name) === actor.slug); + + if (model) { + return scrapeProfileMetadata(model, channel); + } + + return null; + } + + return res.status; +} + +module.exports = { + metadata: { + fetchLatest: fetchLatestMetadata, + fetchScene: fetchSceneMetadata, + fetchProfile: fetchProfileMetadata, + }, +}; diff --git a/src/scrapers/scrapers.js b/src/scrapers/scrapers.js index 677a48c2..b2b3d992 100644 --- a/src/scrapers/scrapers.js +++ b/src/scrapers/scrapers.js @@ -52,6 +52,7 @@ const pierrewoodman = require('./pierrewoodman'); const pinkyxxx = require('./pinkyxxx'); const privateNetwork = require('./private'); // reserved keyword const purgatoryx = require('./purgatoryx'); // reserved keyword +const radical = require('./radical'); const score = require('./score'); const spizoo = require('./spizoo'); const teamskeet = require('./teamskeet'); @@ -138,6 +139,7 @@ const scrapers = { pornpros: whalemember, private: privateNetwork, purgatoryx, + radical, score, sexyhub: mindgeek, spizoo, @@ -208,6 +210,7 @@ const scrapers = { gaywire: bangbros, girlfaction: fullpornnetwork, gloryholesecrets: aziani, + gotfilled: radical, hergape: fullpornnetwork, hitzefrei, homemadeanalwhores: fullpornnetwork, @@ -216,6 +219,7 @@ const scrapers = { hushpass: hush, hussiepass: hush, iconmale: mindgeek, + inserted: radical, interracialpass: hush, interracialpovs: hush, inthecrack,