From 3aa53e431dbd91cf34529d50c6b6d35fce28848d Mon Sep 17 00:00:00 2001 From: DebaucheryLibrarian Date: Fri, 6 Feb 2026 23:06:08 +0100 Subject: [PATCH] Updated Hentaied, added new sites. --- config/default.js | 2 + package-lock.json | 8 +-- package.json | 2 +- seeds/01_networks.js | 11 +++-- seeds/02_sites.js | 44 +++++++++++++---- seeds/06_affiliates.js | 18 ++++++- src/scrapers/amnesiac.js | 78 ----------------------------- src/scrapers/hentaied.js | 103 +++++++++++++++++++++++++++++++++++++++ src/scrapers/releases.js | 4 +- 9 files changed, 169 insertions(+), 101 deletions(-) delete mode 100644 src/scrapers/amnesiac.js create mode 100644 src/scrapers/hentaied.js diff --git a/config/default.js b/config/default.js index e36936b2..596c70c9 100755 --- a/config/default.js +++ b/config/default.js @@ -186,6 +186,8 @@ module.exports = { 'voyeurcams', 'wifesluts', 'wishescumtrue', + // hentaied + 'somegore', ], networks: [ // dummy network for testing diff --git a/package-lock.json b/package-lock.json index 7e17cd91..e312ebf9 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.26", + "unprint": "^0.18.27", "url-pattern": "^1.0.3", "v-tooltip": "^2.1.3", "video.js": "^8.6.1", @@ -20380,9 +20380,9 @@ } }, "node_modules/unprint": { - "version": "0.18.26", - "resolved": "https://registry.npmjs.org/unprint/-/unprint-0.18.26.tgz", - "integrity": "sha512-E9DAwwBtwZmg+2A6y7Ili94XGCkjuyl5saVA+G5oEy6lnFvum58aubOtfQO1Qasiy/xVeBZbwk5QZ/VPzGIchw==", + "version": "0.18.27", + "resolved": "https://registry.npmjs.org/unprint/-/unprint-0.18.27.tgz", + "integrity": "sha512-XYLwX0vZPs9b+pK2h9P5dO3AWk8BUe41dnmbWSLU4qVGm8LYi5bBz7PP9wnaaPZJdAB8neaoZymFX4/WCjMR7g==", "dependencies": { "bottleneck": "^2.19.5", "cookie": "^1.1.1", diff --git a/package.json b/package.json index 664f8dd2..35b36e74 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.26", + "unprint": "^0.18.27", "url-pattern": "^1.0.3", "v-tooltip": "^2.1.3", "video.js": "^8.6.1", diff --git a/seeds/01_networks.js b/seeds/01_networks.js index 6889fb8f..6086daef 100755 --- a/seeds/01_networks.js +++ b/seeds/01_networks.js @@ -245,9 +245,10 @@ const networks = [ parent: 'porndoe', }, { - slug: 'amnesiac', - name: 'Amnesiac', - hasLogo: true, + slug: 'hentaied', + rename: 'amnesiac', + name: 'Hentaied', + url: 'https://hentaied.pro', }, { slug: 'analvids', @@ -945,7 +946,7 @@ exports.seed = (knex) => Promise.resolve() alias: network.alias, url: network.url, description: network.description, - has_logo: network.hasLogo, + has_logo: network.hasLogo ?? true, showcased: typeof network.showcased === 'boolean' ? network.showcased : true, parameters: network.parameters, parent_id: grandParentNetworksBySlug[network.parent] || null, @@ -961,7 +962,7 @@ exports.seed = (knex) => Promise.resolve() alias: network.alias, url: network.url, description: network.description, - has_logo: network.hasLogo, + has_logo: network.hasLogo ?? true, showcased: typeof network.showcased === 'boolean' ? network.showcased : true, parameters: network.parameters, parent_id: parentNetworksBySlug[network.parent] || grandParentNetworksBySlug[network.parent] || null, diff --git a/seeds/02_sites.js b/seeds/02_sites.js index 52b7ea31..58a82f3f 100755 --- a/seeds/02_sites.js +++ b/seeds/02_sites.js @@ -1105,68 +1105,92 @@ const sites = [ slug: 'cumflation', url: 'https://cumflation.com', tags: ['cumflation'], - parent: 'amnesiac', + parent: 'hentaied', }, { name: 'Hentaied', slug: 'hentaied', url: 'https://hentaied.com', tags: ['tentacle'], - parent: 'amnesiac', + parent: 'hentaied', }, { name: 'Futanari', slug: 'futanari', url: 'https://futanari.xxx', tags: ['futanari'], - parent: 'amnesiac', + parent: 'hentaied', }, { name: 'Freeze', slug: 'freeze', url: 'https://freeze.xxx', tags: ['timestop'], - parent: 'amnesiac', + parent: 'hentaied', }, { name: 'Somegore', slug: 'somegore', url: 'https://somegore.com', tags: ['gore'], - parent: 'amnesiac', + parent: 'hentaied', }, { name: 'Defeated', slug: 'defeated', url: 'https://defeatedsexfight.com', - parent: 'amnesiac', + parent: 'hentaied', }, { name: 'Parasited', slug: 'parasited', url: 'https://parasited.com', tags: ['parasite'], - parent: 'amnesiac', + parent: 'hentaied', }, { name: 'Plants vs Cunts', slug: 'plantsvscunts', url: 'https://plantsvscunts.com', tags: ['tentacle'], - parent: 'amnesiac', + parent: 'hentaied', }, { name: 'Voodooed', slug: 'voodooed', url: 'https://voodooed.com', tags: ['voodoo'], - parent: 'amnesiac', + parent: 'hentaied', }, { name: 'Vored', slug: 'vored', 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 { diff --git a/seeds/06_affiliates.js b/seeds/06_affiliates.js index 5fee34d5..42f898ed 100755 --- a/seeds/06_affiliates.js +++ b/seeds/06_affiliates.js @@ -728,11 +728,27 @@ const affiliates = [ }, 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 { network: 'bang', parameters: { - query: 'aff=eyJ3IjoiMTQ1ODYiLCJsIjoiMzE2NDYiLCJ0IjoiNDU4NjEifQ==', // supported + query: 'aff=eyJ3IjoiMTQ1ODYiLCJsIjoiMzE2NDYiLCJ0IjoiNDU4NjEifQ==', }, comment: '$25 per signup', }, diff --git a/src/scrapers/amnesiac.js b/src/scrapers/amnesiac.js deleted file mode 100644 index 793cc4f8..00000000 --- a/src/scrapers/amnesiac.js +++ /dev/null @@ -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, -}; diff --git a/src/scrapers/hentaied.js b/src/scrapers/hentaied.js new file mode 100644 index 00000000..d9dd7a72 --- /dev/null +++ b/src/scrapers/hentaied.js @@ -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, +}; diff --git a/src/scrapers/releases.js b/src/scrapers/releases.js index a56bf865..5d0b8d52 100644 --- a/src/scrapers/releases.js +++ b/src/scrapers/releases.js @@ -5,7 +5,7 @@ const angelogodshackoriginal = require('./angelogodshackoriginal'); // const archangel = require('./archangel'); const assylum = require('./assylum'); const americanpornstar = require('./americanpornstar'); -const amnesiac = require('./amnesiac'); +const hentaied = require('./hentaied'); const aziani = require('./aziani'); const badoink = require('./badoink'); const bamvisions = require('./bamvisions'); @@ -105,7 +105,7 @@ module.exports = { amateurallure: julesjordan, americanpornstar, amateureuro: porndoe, - amnesiac, + hentaied, angelogodshackoriginal, modelmediaasia: modelmedia, assylum,