From 6a49f40955eab3d2771bd1e92a0d59e7e7f44d27 Mon Sep 17 00:00:00 2001 From: DebaucheryLibrarian Date: Mon, 2 Feb 2026 04:24:16 +0100 Subject: [PATCH] Updated Pascal's Subsluts for unprint. --- package-lock.json | 9 ++-- package.json | 2 +- src/scrapers/actors.js | 1 - src/scrapers/pascalssubsluts.js | 93 +++++++++++++++++---------------- tests/profiles.js | 1 + 5 files changed, 55 insertions(+), 51 deletions(-) diff --git a/package-lock.json b/package-lock.json index bffddbb0..d70fe1cf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -94,7 +94,7 @@ "tunnel": "0.0.6", "ua-parser-js": "^1.0.37", "undici": "^5.28.1", - "unprint": "^0.18.14", + "unprint": "^0.18.16", "url-pattern": "^1.0.3", "v-tooltip": "^2.1.3", "video.js": "^8.6.1", @@ -20380,10 +20380,9 @@ } }, "node_modules/unprint": { - "version": "0.18.14", - "resolved": "https://registry.npmjs.org/unprint/-/unprint-0.18.14.tgz", - "integrity": "sha512-6sHW3/2W2hNTuE/EcxM8CJ7ZX+JWFmWS0G7OuCYz9CAYX2bb6pAQ9Eaz0FvqCqqk1GjaxHEjWBhQjoACfIuiCA==", - "license": "ISC", + "version": "0.18.16", + "resolved": "https://registry.npmjs.org/unprint/-/unprint-0.18.16.tgz", + "integrity": "sha512-BiqHfGmQIHjTgAta3d2zAnw+jDzlrlJ3IYEkRQe9f3kNMZRbhOTOmWlkRYIzKpJBAEn2ECRwfoiYUaW8gtI5rQ==", "dependencies": { "bottleneck": "^2.19.5", "cookie": "^1.1.1", diff --git a/package.json b/package.json index ee5856f0..34c1d8bf 100755 --- a/package.json +++ b/package.json @@ -153,7 +153,7 @@ "tunnel": "0.0.6", "ua-parser-js": "^1.0.37", "undici": "^5.28.1", - "unprint": "^0.18.14", + "unprint": "^0.18.16", "url-pattern": "^1.0.3", "v-tooltip": "^2.1.3", "video.js": "^8.6.1", diff --git a/src/scrapers/actors.js b/src/scrapers/actors.js index ea839371..5f0e1740 100644 --- a/src/scrapers/actors.js +++ b/src/scrapers/actors.js @@ -204,7 +204,6 @@ module.exports = { badoinkvr: badoink, bamvisions, bang, - bluedonkeymedia, // delphine: modelmedia, meidenvanholland: bluedonkeymedia, // Vurig Vlaanderen uses same database boobpedia, diff --git a/src/scrapers/pascalssubsluts.js b/src/scrapers/pascalssubsluts.js index c027b8ab..88b838a1 100755 --- a/src/scrapers/pascalssubsluts.js +++ b/src/scrapers/pascalssubsluts.js @@ -1,30 +1,31 @@ 'use strict'; -const qu = require('../utils/q'); +const unprint = require('unprint'); + const slugify = require('../utils/slugify'); const capitalize = require('../utils/capitalize'); -const { feetInchesToCm } = require('../utils/convert'); +const { convert } = require('../utils/convert'); function scrapeAll(months, channel, year) { - return months.map(({ query: queryMonth, el }) => { - const month = queryMonth.cnt('h3'); - const scenes = queryMonth.all(el.nextElementSibling, 'li:nth-child(2n)'); + return months.flatMap(({ query: queryMonth, element }) => { + const month = queryMonth.content('h3'); + const scenes = unprint.query.all(element.nextElementSibling, 'li:nth-child(2n)'); - return qu.initAll(scenes).map(({ query }) => { + return unprint.initAll(scenes).map(({ query }) => { const release = {}; - release.url = query.url('a.video-pop-up', 'href', { origin: `${channel.url}/submissive` }); + release.url = query.url('a.video-pop-up', { origin: `${channel.origin}/submissive/` }); release.entryId = new URL(release.url).searchParams.get('id'); - release.title = query.cnt('.updates-item-title h4'); + release.title = query.content('.updates-item-title h4'); - release.date = qu.parseDate(`${month} ${year}`, 'MMMM/YYYY'); + release.date = unprint.extractDate(`${month} ${year}`, 'MMMM YYYY', { match: null }); release.datePrecision = 'month'; release.actors = [{ - name: capitalize(query.q('a.video-pop-up', 'data-modelname'), { uncapitalize: true }), + name: capitalize(query.attribute('a.video-pop-up', 'data-modelname'), { uncapitalize: true }), gender: 'female', - url: query.url('a.video-pop-up', 'data-modellink', { origin: `${channel.url}/submissive` }), + url: query.url('a.video-pop-up', { attribute: 'data-modellink', origin: `${channel.origin}/submissive/` }), }] .filter((actor) => !/lockdown/i.test(actor.name)) .concat({ @@ -36,7 +37,20 @@ function scrapeAll(months, channel, year) { return release; }); - }).flat(); + }); +} + +async function fetchLatest(channel, page = 1) { + const year = new Date().getFullYear() - (page - 1); + + const url = `${channel.url}/submissive/updates.php?y=${year}`; + const res = await unprint.get(url, { selectAll: '.month' }); + + if (res.ok) { + return scrapeAll(res.context, channel, year); + } + + return res.status; } function scrapeScene({ html }, url) { @@ -48,12 +62,22 @@ function scrapeScene({ html }, url) { return release; } +async function fetchScene(url, channel) { + const res = await unprint.get(url); + + if (res.ok) { + return scrapeScene(res.context, url, channel); + } + + return res.status; +} + function scrapeProfile({ query }) { const profile = {}; - const bio = query.all('.about-desc li').reduce((acc, el) => { - const key = query.cnt(el, 'strong'); - const value = query.text(el); + const bio = query.all('.about-desc li').reduce((acc, bioEl) => { + const key = unprint.query.content(bioEl, 'strong'); + const value = unprint.query.text(bioEl); return { ...acc, @@ -63,50 +87,31 @@ function scrapeProfile({ query }) { profile.gender = 'female'; profile.nationality = bio.nationality; - profile.height = /cm/.test(bio.height) ? parseInt(bio.height, 10) : feetInchesToCm(bio.height); profile.age = bio.age; profile.hairColor = bio.hair; - profile.description = query.cnt('.twocolumns'); + profile.height = /['"]|ft/.test(bio.height) + ? convert(bio.height, 'cm') + : parseInt(bio.height, 10); + + profile.description = query.content('.twocolumns'); profile.avatar = query.img('#individual-description img'); // no dates or links available - // profile.releases = scrapeAll(qu.initAll(query.all('.individal-video-item'))); // sic + // profile.releases = scrapeAll(unprint.initAll(query.all('.individal-video-item'))); // sic return profile; } -async function fetchLatest(channel, page = 1) { - const year = new Date().getFullYear() - (page - 1); +async function fetchProfile({ name: actorName, url: actorUrl }, entity, include) { + const url = actorUrl || `${entity.url}/submissive/subslut-${slugify(actorName)}.php`; - const url = `${channel.url}/submissive/updates.php?y=${year}`; - const res = await qu.getAll(url, '.month'); - - if (res.ok) { - return scrapeAll(res.items, channel, year); - } - - return res.status; -} - -async function fetchScene(url, channel) { - const res = await qu.get(url); - - if (res.ok) { - return scrapeScene(res.item, url, channel); - } - - return res.status; -} - -async function fetchProfile({ name: actorName }, entity, include) { - const url = `${entity.url}/submissive/subslut-${slugify(actorName)}.php`; - const res = await qu.get(url, null, null, { + const res = await unprint.get(url, { followRedirects: false, }); if (res.ok && res.status === 200) { - return scrapeProfile(res.item, actorName, entity, include); + return scrapeProfile(res.context, actorName, entity, include); } return res.status; diff --git a/tests/profiles.js b/tests/profiles.js index 932a053f..579a7bf8 100644 --- a/tests/profiles.js +++ b/tests/profiles.js @@ -231,6 +231,7 @@ const actors = [ { entity: 'boyfun', name: 'Amahd Passer', fields: ['avatar', 'age', 'height', 'weight', 'penisLength', 'isCircumcised'] }, { entity: 'bang', name: 'Riley Reid', fields: ['avatar', 'dateOfBirth', 'birthPlace', 'ethnicity', 'hairColor', 'eyes'] }, { entity: 'littlecapricedreams', name: 'Littlecaprice', fields: ['avatar', 'nationality', 'cup', 'measurements', 'height', 'description'] }, // sic + { entity: 'pascalssubsluts', name: 'Zlata Shine', fields: ['avatar', 'gender', 'nationality', 'hairColor', 'height', 'description'] }, // sic ]; const actorScrapers = scrapers.actors;