Updated Hentaied, added new sites.
This commit is contained in:
@@ -186,6 +186,8 @@ module.exports = {
|
||||
'voyeurcams',
|
||||
'wifesluts',
|
||||
'wishescumtrue',
|
||||
// hentaied
|
||||
'somegore',
|
||||
],
|
||||
networks: [
|
||||
// dummy network for testing
|
||||
|
||||
8
package-lock.json
generated
8
package-lock.json
generated
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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
|
||||
{
|
||||
|
||||
@@ -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',
|
||||
},
|
||||
|
||||
@@ -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
103
src/scrapers/hentaied.js
Normal 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,
|
||||
};
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user