Updated Hentaied, added new sites.

This commit is contained in:
DebaucheryLibrarian
2026-02-06 23:06:08 +01:00
parent b79cf4fb78
commit 3aa53e431d
9 changed files with 169 additions and 101 deletions

View File

@@ -186,6 +186,8 @@ module.exports = {
'voyeurcams', 'voyeurcams',
'wifesluts', 'wifesluts',
'wishescumtrue', 'wishescumtrue',
// hentaied
'somegore',
], ],
networks: [ networks: [
// dummy network for testing // dummy network for testing

8
package-lock.json generated
View File

@@ -94,7 +94,7 @@
"tunnel": "0.0.6", "tunnel": "0.0.6",
"ua-parser-js": "^1.0.37", "ua-parser-js": "^1.0.37",
"undici": "^5.28.1", "undici": "^5.28.1",
"unprint": "^0.18.26", "unprint": "^0.18.27",
"url-pattern": "^1.0.3", "url-pattern": "^1.0.3",
"v-tooltip": "^2.1.3", "v-tooltip": "^2.1.3",
"video.js": "^8.6.1", "video.js": "^8.6.1",
@@ -20380,9 +20380,9 @@
} }
}, },
"node_modules/unprint": { "node_modules/unprint": {
"version": "0.18.26", "version": "0.18.27",
"resolved": "https://registry.npmjs.org/unprint/-/unprint-0.18.26.tgz", "resolved": "https://registry.npmjs.org/unprint/-/unprint-0.18.27.tgz",
"integrity": "sha512-E9DAwwBtwZmg+2A6y7Ili94XGCkjuyl5saVA+G5oEy6lnFvum58aubOtfQO1Qasiy/xVeBZbwk5QZ/VPzGIchw==", "integrity": "sha512-XYLwX0vZPs9b+pK2h9P5dO3AWk8BUe41dnmbWSLU4qVGm8LYi5bBz7PP9wnaaPZJdAB8neaoZymFX4/WCjMR7g==",
"dependencies": { "dependencies": {
"bottleneck": "^2.19.5", "bottleneck": "^2.19.5",
"cookie": "^1.1.1", "cookie": "^1.1.1",

View File

@@ -153,7 +153,7 @@
"tunnel": "0.0.6", "tunnel": "0.0.6",
"ua-parser-js": "^1.0.37", "ua-parser-js": "^1.0.37",
"undici": "^5.28.1", "undici": "^5.28.1",
"unprint": "^0.18.26", "unprint": "^0.18.27",
"url-pattern": "^1.0.3", "url-pattern": "^1.0.3",
"v-tooltip": "^2.1.3", "v-tooltip": "^2.1.3",
"video.js": "^8.6.1", "video.js": "^8.6.1",

View File

@@ -245,9 +245,10 @@ const networks = [
parent: 'porndoe', parent: 'porndoe',
}, },
{ {
slug: 'amnesiac', slug: 'hentaied',
name: 'Amnesiac', rename: 'amnesiac',
hasLogo: true, name: 'Hentaied',
url: 'https://hentaied.pro',
}, },
{ {
slug: 'analvids', slug: 'analvids',
@@ -945,7 +946,7 @@ exports.seed = (knex) => Promise.resolve()
alias: network.alias, alias: network.alias,
url: network.url, url: network.url,
description: network.description, description: network.description,
has_logo: network.hasLogo, has_logo: network.hasLogo ?? true,
showcased: typeof network.showcased === 'boolean' ? network.showcased : true, showcased: typeof network.showcased === 'boolean' ? network.showcased : true,
parameters: network.parameters, parameters: network.parameters,
parent_id: grandParentNetworksBySlug[network.parent] || null, parent_id: grandParentNetworksBySlug[network.parent] || null,
@@ -961,7 +962,7 @@ exports.seed = (knex) => Promise.resolve()
alias: network.alias, alias: network.alias,
url: network.url, url: network.url,
description: network.description, description: network.description,
has_logo: network.hasLogo, has_logo: network.hasLogo ?? true,
showcased: typeof network.showcased === 'boolean' ? network.showcased : true, showcased: typeof network.showcased === 'boolean' ? network.showcased : true,
parameters: network.parameters, parameters: network.parameters,
parent_id: parentNetworksBySlug[network.parent] || grandParentNetworksBySlug[network.parent] || null, parent_id: parentNetworksBySlug[network.parent] || grandParentNetworksBySlug[network.parent] || null,

View File

@@ -1105,68 +1105,92 @@ const sites = [
slug: 'cumflation', slug: 'cumflation',
url: 'https://cumflation.com', url: 'https://cumflation.com',
tags: ['cumflation'], tags: ['cumflation'],
parent: 'amnesiac', parent: 'hentaied',
}, },
{ {
name: 'Hentaied', name: 'Hentaied',
slug: 'hentaied', slug: 'hentaied',
url: 'https://hentaied.com', url: 'https://hentaied.com',
tags: ['tentacle'], tags: ['tentacle'],
parent: 'amnesiac', parent: 'hentaied',
}, },
{ {
name: 'Futanari', name: 'Futanari',
slug: 'futanari', slug: 'futanari',
url: 'https://futanari.xxx', url: 'https://futanari.xxx',
tags: ['futanari'], tags: ['futanari'],
parent: 'amnesiac', parent: 'hentaied',
}, },
{ {
name: 'Freeze', name: 'Freeze',
slug: 'freeze', slug: 'freeze',
url: 'https://freeze.xxx', url: 'https://freeze.xxx',
tags: ['timestop'], tags: ['timestop'],
parent: 'amnesiac', parent: 'hentaied',
}, },
{ {
name: 'Somegore', name: 'Somegore',
slug: 'somegore', slug: 'somegore',
url: 'https://somegore.com', url: 'https://somegore.com',
tags: ['gore'], tags: ['gore'],
parent: 'amnesiac', parent: 'hentaied',
}, },
{ {
name: 'Defeated', name: 'Defeated',
slug: 'defeated', slug: 'defeated',
url: 'https://defeatedsexfight.com', url: 'https://defeatedsexfight.com',
parent: 'amnesiac', parent: 'hentaied',
}, },
{ {
name: 'Parasited', name: 'Parasited',
slug: 'parasited', slug: 'parasited',
url: 'https://parasited.com', url: 'https://parasited.com',
tags: ['parasite'], tags: ['parasite'],
parent: 'amnesiac', parent: 'hentaied',
}, },
{ {
name: 'Plants vs Cunts', name: 'Plants vs Cunts',
slug: 'plantsvscunts', slug: 'plantsvscunts',
url: 'https://plantsvscunts.com', url: 'https://plantsvscunts.com',
tags: ['tentacle'], tags: ['tentacle'],
parent: 'amnesiac', parent: 'hentaied',
}, },
{ {
name: 'Voodooed', name: 'Voodooed',
slug: 'voodooed', slug: 'voodooed',
url: 'https://voodooed.com', url: 'https://voodooed.com',
tags: ['voodoo'], tags: ['voodoo'],
parent: 'amnesiac', parent: 'hentaied',
}, },
{ {
name: 'Vored', name: 'Vored',
slug: 'vored', slug: 'vored',
url: 'https://vored.com', url: 'https://vored.com',
parent: 'amnesiac', parent: 'hentaied',
},
{
name: 'Monsterporn',
slug: 'monsterporn',
url: 'https://monsterporn.com',
parent: 'hentaied',
},
{
name: 'Vampired',
slug: 'vampired',
url: 'https://vampired.com',
parent: 'hentaied',
},
{
name: 'Mrs. Horsecock',
slug: 'mrshorsecock',
url: 'https://hentaied.pro/projects/mrs-horsecock',
parent: 'hentaied',
},
{
name: 'Twinz',
slug: 'twinz',
url: 'https://hentaied.pro/projects/twinz',
parent: 'hentaied',
}, },
// AMATEUR EURO // AMATEUR EURO
{ {

View File

@@ -728,11 +728,27 @@ const affiliates = [
}, },
comment: '50% rev share', comment: '50% rev share',
}, },
// hentaied / amnesiac
{
network: 'hentaied',
url: 'https://hentaied.pro/amember/aff/go/npjyjuekbvehqzpyqukrgqoogmwbkz',
parameters: {
query: 'ref=npjyjuekbvehqzpyqukrgqoogmwbkz',
dynamicScene: 'https://hentaied.pro{scenePath}?ref=npjyjuekbvehqzpyqukrgqoogmwbkz',
},
},
{
channel: 'defeated',
url: 'https://defeatedsexfight.com/amember/aff/go/jlfowppdazbfucxrgfmgpno',
parameters: {
query: 'ref=jlfowppdazbfucxrgfmgpno', // not currently functional
},
},
// etc // etc
{ {
network: 'bang', network: 'bang',
parameters: { parameters: {
query: 'aff=eyJ3IjoiMTQ1ODYiLCJsIjoiMzE2NDYiLCJ0IjoiNDU4NjEifQ==', // supported query: 'aff=eyJ3IjoiMTQ1ODYiLCJsIjoiMzE2NDYiLCJ0IjoiNDU4NjEifQ==',
}, },
comment: '$25 per signup', comment: '$25 per signup',
}, },

View File

@@ -1,78 +0,0 @@
'use strict';
const unprint = require('unprint');
function scrapeAll(scenes) {
return scenes.map(({ query }) => {
if (query.exists('.crowdfunding-post')) {
return null;
}
const release = {};
release.url = query.url('a');
release.entryId = new URL(release.url).pathname.split('/')[1];
release.title = query.content('.allvideostitle p, .allvideostitle h2');
release.actors = query.contents('.tagsmodels a');
release.poster = query.sourceSet('.vidcont .attachment-thumbnail');
release.teaser = query.video('.vidcont video', { attribute: 'data-src' });
return release;
}).filter(Boolean);
}
function scrapeScene({ query }, { url }) {
const release = {};
release.entryId = new URL(url).pathname.split('/')[1];
release.title = query.content('.title-fav h1');
release.description = query.contents('.description #fullstory, .title-fav .cont > p').join(' ');
release.date = query.date('.datesingle', 'MMMM D, YYYY');
release.duration = query.duration('.cont .duration');
release.actors = query.contents('.cont .tagsmodels:not(.director) a');
release.director = query.content('.cont .director a');
release.poster = [
query.img('.preview .attachment-full'),
query.img('meta[property="og:image"]', { attribute: 'content' }),
];
release.caps = query.all('.gallery a').map((photoEl) => [
unprint.query.url(photoEl, null),
unprint.query.img(photoEl, 'img'),
]);
release.trailer = {
src: query.video('.preview video'),
referer: url,
expectType: {
'binary/octet-stream': 'video/mp4',
},
};
release.tags = query.contents('.post-categories a');
return release;
}
async function fetchLatest(channel, page = 1) {
const url = `${channel.url}/all-videos/page/${page}/`;
const res = await unprint.get(url, { selectAll: '.catposts > div:not(.clearfix):not(.flexcont)' });
if (res.ok) {
return scrapeAll(res.context, channel);
}
return res.status;
}
module.exports = {
fetchLatest,
scrapeScene,
};

103
src/scrapers/hentaied.js Normal file
View File

@@ -0,0 +1,103 @@
'use strict';
const unprint = require('unprint');
function scrapeAll(scenes) {
return scenes.map(({ query }) => {
if (query.exists('.crowdfunding-post')) {
return null;
}
const release = {};
release.url = query.url('a');
release.entryId = new URL(release.url).pathname.split('/')[1];
release.title = query.content('.allvideostitle p, .allvideostitle h2');
release.actors = query.all('.tagsmodels a').map((actorEl) => ({
name: unprint.query.content(actorEl),
url: unprint.query.url(actorEl, null),
}));
release.poster = query.sourceSet('.vidcont .attachment-thumbnail')
|| query.sourceSet('.vidcont .attachment-thumbnail', 'nitro-lazy-srcset');
release.teaser = query.video('.vidcont video', { attribute: 'data-src' });
console.log(release);
return release;
}).filter(Boolean);
}
async function fetchLatest(channel, page = 1) {
const url = new URL(channel.url).pathname.includes('/projects')
? `${channel.url}/page/${page}/`
: `${channel.url}/all-videos/page/${page}/`;
// const res = await unprint.get(url, { selectAll: '.catposts > div:not(.clearfix):not(.flexcont)' });
const res = await unprint.get(url, { selectAll: '.catposts div[class*="post-id"], .catposts .half' });
if (res.ok) {
return scrapeAll(res.context, channel);
}
return res.status;
}
function scrapeScene({ query }, { url }) {
const release = {};
release.entryId = new URL(url).pathname.split('/')[1];
release.title = query.content('.title-fav h1');
release.description = query.contents('.description #fullstory, .title-fav .cont > p').join(' ')
|| query.attribute('meta[property="og:description"]', 'content')?.replace('[…]', '').replace(/\s*read more.*/i, '...'); // html description difficult to extract
release.date = query.date('.datesingle', 'MMMM D, YYYY')
|| query.date('meta[property="article:published_time"]', 'YYYY-MM-DDTHH:mm:ss', { attribute: 'content' });
release.duration = query.duration('.cont .duration, .durationandtime .duration');
release.actors = query.all('.cont .tagsmodels:not(.director) a, .title-fav .tagsmodels:not(.director) a').map((actorEl) => ({
name: unprint.query.content(actorEl),
url: unprint.query.url(actorEl, null),
}));
release.directors = query.contents('.cont .director a');
release.tags = query.contents('.post-categories a');
release.poster = [
query.img('.preview .attachment-full'),
query.img('meta[property="og:image"]', { attribute: 'content' }),
].filter(Boolean);
release.caps = query.all('.gallery a').map((photoEl) => Array.from(new Set([
unprint.query.url(photoEl, null),
unprint.query.img(photoEl),
...unprint.query.sourceSet(photoEl, 'img') || [],
...unprint.query.sourceSet(photoEl, 'img', 'nitro-lazy-srcset') || [],
])).filter(Boolean));
const trailer = query.video('.preview video');
if (trailer) {
release.trailer = {
src: trailer,
referer: url,
expectType: {
'binary/octet-stream': 'video/mp4',
},
};
}
console.log(release);
return release;
}
module.exports = {
fetchLatest,
scrapeScene,
};

View File

@@ -5,7 +5,7 @@ const angelogodshackoriginal = require('./angelogodshackoriginal');
// const archangel = require('./archangel'); // const archangel = require('./archangel');
const assylum = require('./assylum'); const assylum = require('./assylum');
const americanpornstar = require('./americanpornstar'); const americanpornstar = require('./americanpornstar');
const amnesiac = require('./amnesiac'); const hentaied = require('./hentaied');
const aziani = require('./aziani'); const aziani = require('./aziani');
const badoink = require('./badoink'); const badoink = require('./badoink');
const bamvisions = require('./bamvisions'); const bamvisions = require('./bamvisions');
@@ -105,7 +105,7 @@ module.exports = {
amateurallure: julesjordan, amateurallure: julesjordan,
americanpornstar, americanpornstar,
amateureuro: porndoe, amateureuro: porndoe,
amnesiac, hentaied,
angelogodshackoriginal, angelogodshackoriginal,
modelmediaasia: modelmedia, modelmediaasia: modelmedia,
assylum, assylum,