Merged Vogov into Teen Mega World, added No Boring, set up affiliate links.
This commit is contained in:
@@ -14605,6 +14605,26 @@ const sites = [
|
|||||||
siteId: 52,
|
siteId: 52,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
slug: 'vogov',
|
||||||
|
name: 'VogoV',
|
||||||
|
url: 'https://vogov.com',
|
||||||
|
parent: 'teenmegaworld',
|
||||||
|
parameters: {
|
||||||
|
siteId: 54,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
slug: 'noboring',
|
||||||
|
name: 'No Boring',
|
||||||
|
styled: 'NoBoring',
|
||||||
|
url: 'https://noboring.com',
|
||||||
|
parent: 'teenmegaworld',
|
||||||
|
parameters: {
|
||||||
|
siteId: 49,
|
||||||
|
native: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
// TESTE DE FUDELIDADE
|
// TESTE DE FUDELIDADE
|
||||||
{
|
{
|
||||||
name: 'Teste de Fudelidade',
|
name: 'Teste de Fudelidade',
|
||||||
@@ -15135,13 +15155,6 @@ const sites = [
|
|||||||
parent: 'vixen',
|
parent: 'vixen',
|
||||||
tags: ['hotwife'],
|
tags: ['hotwife'],
|
||||||
},
|
},
|
||||||
// VOGOV
|
|
||||||
{
|
|
||||||
slug: 'vogov',
|
|
||||||
name: 'VogoV',
|
|
||||||
url: 'https://www.vogov.com',
|
|
||||||
description: 'Top rated models. Graceful locations. Best gonzo scenes. 4K UHD 60 FPS. So, in general Vogov is a website that is worth visiting and exploring carefully. It gives a chance to spend a fantastic night with gorgeous girls ready to experiment and to full around with their lovers.',
|
|
||||||
},
|
|
||||||
// WANKZ VR
|
// WANKZ VR
|
||||||
{
|
{
|
||||||
name: 'WankzVR',
|
name: 'WankzVR',
|
||||||
|
|||||||
@@ -204,7 +204,7 @@ const affiliates = [
|
|||||||
comment: 'per signup',
|
comment: 'per signup',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
channel: 'disruptivefilms',
|
network: 'disruptivefilms',
|
||||||
url: 'https://www.g2buddy.com/disruptivefilms/go.php?pr=9&su=2&si=119&ad=277470&pa=index&ar=&buffer=',
|
url: 'https://www.g2buddy.com/disruptivefilms/go.php?pr=9&su=2&si=119&ad=277470&pa=index&ar=&buffer=',
|
||||||
comment: 'per signup',
|
comment: 'per signup',
|
||||||
},
|
},
|
||||||
@@ -750,6 +750,103 @@ const affiliates = [
|
|||||||
channel: 'bamvisions',
|
channel: 'bamvisions',
|
||||||
url: 'https://secure.bamvisions.com/track/MTQ5OS4xLjEuMS4wLjAuMC4wLjA',
|
url: 'https://secure.bamvisions.com/track/MTQ5OS4xLjEuMS4wLjAuMC4wLjA',
|
||||||
},
|
},
|
||||||
|
// teen mega world
|
||||||
|
{
|
||||||
|
network: 'teenmegaworld',
|
||||||
|
url: 'https://secure.teenmegaworld.net/track/MzAxNjcxLjUuMS4xLjAuMC4wLjAuMA',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
channel: 'analangels',
|
||||||
|
url: 'https://secure.anal-angels.com/track/MzAxNjcxLjUuMzMuNjYuMC4wLjAuMC4w',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
channel: 'analbeauty',
|
||||||
|
url: 'https://secure.anal-beauty.com/track/MzAxNjcxLjUuNDAuNjcuMC4wLjAuMC4w',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
channel: 'beautyangels',
|
||||||
|
url: 'https://secure.beauty-angels.com/track/MzAxNjcxLjUuMjcuNjguMC4wLjAuMC4w',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
channel: 'beauty4k',
|
||||||
|
url: 'https://secure.beauty4k.com/track/MzAxNjcxLjUuNDIuNjkuMC4wLjAuMC4w',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
channel: 'creampieangels',
|
||||||
|
url: 'https://secure.creampie-angels.com/track/MzAxNjcxLjUuMzAuNzAuMC4wLjAuMC4w',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
channel: 'dirtycoach',
|
||||||
|
url: 'https://secure.dirty-coach.com/track/MzAxNjcxLjUuMzkuMzkuMC4wLjAuMC4w',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
channel: 'dirtydoctor',
|
||||||
|
url: 'https://secure.dirty-doctor.com/track/MzAxNjcxLjUuMzYuMzYuMC4wLjAuMC4w',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
channel: 'firstbgg',
|
||||||
|
url: 'https://secure.firstbgg.com/track/MzAxNjcxLjUuMzIuNzEuMC4wLjAuMC4w',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
channel: 'fuckstudies',
|
||||||
|
url: 'https://secure.fuckstudies.com/track/MzAxNjcxLjUuMjIuNzIuMC4wLjAuMC4w',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
channel: 'gagngape',
|
||||||
|
url: 'https://secure.gag-n-gape.com/track/MzAxNjcxLjUuNDUuNDUuMC4wLjAuMC4w',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
channel: 'noboring',
|
||||||
|
url: 'https://secure.noboring.com/track/MzAxNjcxLjUuNTEuNTEuMC4wLjAuMC4w',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
channel: 'ohmyholes',
|
||||||
|
url: 'https://ohmyholes.com/track/MzAxNjcxLjUuNTguNzMuMC4wLjAuMC4w',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
channel: 'oldnyoung',
|
||||||
|
url: 'https://secure.old-n-young.com/track/MzAxNjcxLjUuMTAuNzQuMC4wLjAuMC4w',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
channel: 'rawcouples',
|
||||||
|
url: 'https://secure.rawcouples.com/track/MzAxNjcxLjUuNTUuNzUuMC4wLjAuMC4w',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
channel: 'soloteengirls',
|
||||||
|
url: 'https://secure.soloteengirls.net/track/MzAxNjcxLjUuMi4yLjAuMC4wLjAuMA',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
channel: 'squirtingvirgin',
|
||||||
|
url: 'https://secure.squirtingvirgin.com/track/MzAxNjcxLjUuMjguMjguMC4wLjAuMC4w',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
channel: 'teensexmania',
|
||||||
|
url: 'https://secure.teensexmania.com/track/MzAxNjcxLjUuMTMuNzYuMC4wLjAuMC4w',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
channel: 'teensexmovs',
|
||||||
|
url: 'https://secure.teensexmovs.com/track/MzAxNjcxLjUuMy43Ny4wLjAuMC4wLjA',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
channel: 'tmwpov',
|
||||||
|
url: 'https://tmwpov.com/track/MzAxNjcxLjUuNTcuNzguMC4wLjAuMC4w',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
channel: 'tmwvrnet',
|
||||||
|
url: 'https://secure.tmwvrnet.com/track/MzAxNjcxLjUuNDQuNzkuMC4wLjAuMC4w',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
channel: 'trickymasseur',
|
||||||
|
url: 'https://secure.trickymasseur.com/track/MzAxNjcxLjUuMjYuODAuMC4wLjAuMC4w',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
channel: 'vogov',
|
||||||
|
url: 'https://secure.vogov.com/track/MzAxNjcxLjUuNTkuODUuMC4wLjAuMC4w',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
channel: 'xangels',
|
||||||
|
url: 'https://secure.x-angels.com/track/MzAxNjcxLjUuMzguODEuMC4wLjAuMC4w',
|
||||||
|
},
|
||||||
// etc
|
// etc
|
||||||
{
|
{
|
||||||
network: 'bang',
|
network: 'bang',
|
||||||
@@ -1123,6 +1220,16 @@ exports.seed = async (knex) => {
|
|||||||
const channelsBySlug = channels.reduce((acc, channel) => ({ ...acc, [channel.slug]: channel }), {});
|
const channelsBySlug = channels.reduce((acc, channel) => ({ ...acc, [channel.slug]: channel }), {});
|
||||||
const tagsBySlug = tags.reduce((acc, tag) => ({ ...acc, [tag.slug]: tag }), {});
|
const tagsBySlug = tags.reduce((acc, tag) => ({ ...acc, [tag.slug]: tag }), {});
|
||||||
|
|
||||||
|
affiliates.forEach((affiliate) => {
|
||||||
|
if (affiliate.channel && !channelsBySlug[affiliate.channel]) {
|
||||||
|
throw new Error(`Unmatched affiliate channel ${affiliate.channel}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (affiliate.network && !networksBySlug[affiliate.network]) {
|
||||||
|
throw new Error(`Unmatched affiliate network ${affiliate.network}`);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
const affiliatesWithEntityId = affiliates.map((affiliate) => ({
|
const affiliatesWithEntityId = affiliates.map((affiliate) => ({
|
||||||
id: getAffiliateId(affiliate),
|
id: getAffiliateId(affiliate),
|
||||||
entity_id: networksBySlug[affiliate.network]?.id || channelsBySlug[affiliate.channel]?.id || null,
|
entity_id: networksBySlug[affiliate.network]?.id || channelsBySlug[affiliate.channel]?.id || null,
|
||||||
|
|||||||
@@ -75,7 +75,6 @@ const traxxx = require('./traxxx');
|
|||||||
const virtualtaboo = require('./virtualtaboo');
|
const virtualtaboo = require('./virtualtaboo');
|
||||||
const vivid = require('./vivid');
|
const vivid = require('./vivid');
|
||||||
const vixen = require('./vixen');
|
const vixen = require('./vixen');
|
||||||
const vogov = require('./vogov');
|
|
||||||
const wankzvr = require('./wankzvr');
|
const wankzvr = require('./wankzvr');
|
||||||
const whalemember = require('./whalemember');
|
const whalemember = require('./whalemember');
|
||||||
// const xempire = require('./xempire');
|
// const xempire = require('./xempire');
|
||||||
@@ -181,7 +180,6 @@ module.exports = {
|
|||||||
virtualtaboo,
|
virtualtaboo,
|
||||||
vivid,
|
vivid,
|
||||||
vixen,
|
vixen,
|
||||||
vogov,
|
|
||||||
wankzvr,
|
wankzvr,
|
||||||
westcoastproductions: adultempire,
|
westcoastproductions: adultempire,
|
||||||
whalemember,
|
whalemember,
|
||||||
|
|||||||
@@ -41,8 +41,8 @@ function scrapeAll(scenes, channel) {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
async function fetchLatest(channel, page = 1) {
|
async function fetchLatest(channel, page = 1, { parameters }) {
|
||||||
const url = `${channel.type === 'network' ? channel.url : channel.parent.url}/search.php?site[]=${channel.parameters.siteId}&page=${page}`;
|
const url = `${channel.type === 'network' || parameters.native ? channel.url : channel.parent.url}/search.php?site[]=${channel.parameters.siteId}&page=${page}`;
|
||||||
const res = await unprint.get(url, { selectAll: '.video-list .thumb' });
|
const res = await unprint.get(url, { selectAll: '.video-list .thumb' });
|
||||||
|
|
||||||
if (res.ok) {
|
if (res.ok) {
|
||||||
|
|||||||
@@ -1,203 +0,0 @@
|
|||||||
'use strict';
|
|
||||||
|
|
||||||
// const slugify = require('../utils/slugify');
|
|
||||||
const { ex, ctxa } = require('../utils/q');
|
|
||||||
const http = require('../utils/http');
|
|
||||||
|
|
||||||
function getLicenseCode(html) {
|
|
||||||
const licensePrefix = 'license_code: \'';
|
|
||||||
const licenseStart = html.indexOf(licensePrefix);
|
|
||||||
const licenseCode = html.slice(licenseStart + licensePrefix.length, html.indexOf('\'', licenseStart + licensePrefix.length));
|
|
||||||
|
|
||||||
const c = '16px';
|
|
||||||
let f;
|
|
||||||
let g;
|
|
||||||
let h;
|
|
||||||
let i;
|
|
||||||
let j;
|
|
||||||
let k;
|
|
||||||
let l;
|
|
||||||
let m;
|
|
||||||
let n;
|
|
||||||
|
|
||||||
for (f = '', g = 1; g < licenseCode.length; g += 1) {
|
|
||||||
f += parseInt(licenseCode[g], 10) ? parseInt(licenseCode[g], 10) : 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (j = parseInt(f.length / 2, 10),
|
|
||||||
k = parseInt(f.substring(0, j + 1), 10),
|
|
||||||
l = parseInt(f.substring(j), 10),
|
|
||||||
g = l - k,
|
|
||||||
g < 0 && (g = -g),
|
|
||||||
f = g,
|
|
||||||
g = k - l,
|
|
||||||
g < 0 && (g = -g),
|
|
||||||
f += g,
|
|
||||||
f *= 2,
|
|
||||||
f = String(f),
|
|
||||||
i = (parseInt(c, 10) / 2) + 2,
|
|
||||||
m = '',
|
|
||||||
g = 0; g < j + 1; g += 1) {
|
|
||||||
for (h = 1; h <= 4; h += 1) {
|
|
||||||
n = parseInt(licenseCode[g + h], 10) + parseInt(f[g], 10);
|
|
||||||
|
|
||||||
if (n >= i) n -= i;
|
|
||||||
m += n;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return m;
|
|
||||||
}
|
|
||||||
|
|
||||||
function decodeTrailerUrl(html, encodedTrailerUrl) {
|
|
||||||
const licenseCode = getLicenseCode(html);
|
|
||||||
const i = licenseCode;
|
|
||||||
|
|
||||||
let j;
|
|
||||||
let k;
|
|
||||||
let l;
|
|
||||||
let m;
|
|
||||||
let n;
|
|
||||||
let o;
|
|
||||||
|
|
||||||
const d = '16px';
|
|
||||||
const g = encodedTrailerUrl.split('/').slice(2);
|
|
||||||
|
|
||||||
let h = g[5].substring(0, 2 * parseInt(d, 10));
|
|
||||||
|
|
||||||
for (j = h, k = h.length - 1; k >= 0; k -= 1) {
|
|
||||||
for (l = k, m = k; m < i.length; m += 1) {
|
|
||||||
l += parseInt(i[m], 10);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (; l >= h.length;) {
|
|
||||||
l -= h.length;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (n = '', o = 0; o < h.length; o += 1) {
|
|
||||||
if (o === k) {
|
|
||||||
n += h[l];
|
|
||||||
} else {
|
|
||||||
n += (o === l ? h[k] : h[o]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
h = n;
|
|
||||||
}
|
|
||||||
|
|
||||||
g[5] = g[5].replace(j, h);
|
|
||||||
const trailer = g.join('/');
|
|
||||||
|
|
||||||
return trailer;
|
|
||||||
}
|
|
||||||
|
|
||||||
function scrapeLatest(html) {
|
|
||||||
const { document } = ex(html);
|
|
||||||
|
|
||||||
return ctxa(document, '.video-post').map(({ q, qa, qd }) => {
|
|
||||||
const release = {};
|
|
||||||
|
|
||||||
// release.entryId = slugify(release.title);
|
|
||||||
release.entryId = q('.ico-fav-0').dataset.favVideoId;
|
|
||||||
|
|
||||||
const titleEl = q('.video-title-title');
|
|
||||||
release.title = titleEl.title;
|
|
||||||
release.url = titleEl.href;
|
|
||||||
|
|
||||||
release.date = qd('.video-data em', 'MMM DD, YYYY');
|
|
||||||
release.actors = qa('.video-model-list a', true);
|
|
||||||
|
|
||||||
const posterData = q('img.thumb').dataset;
|
|
||||||
release.poster = posterData.src;
|
|
||||||
release.trailer = posterData.preview;
|
|
||||||
|
|
||||||
return release;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function scrapeScene(html, url) {
|
|
||||||
const { qu } = ex(html);
|
|
||||||
const release = { url };
|
|
||||||
|
|
||||||
// release.entryId = slugify(release.title);
|
|
||||||
[release.entryId] = qu.q('link[rel="canonical"]').href.match(/\d+/);
|
|
||||||
|
|
||||||
release.title = qu.meta('meta[property="og:title"]') || qu.q('.video-page-header h1', true);
|
|
||||||
release.description = qu.meta('meta[property="og:description"]') || qu.q('.info-video-description', true);
|
|
||||||
|
|
||||||
release.date = qu.date('.info-video-details li:first-child span', 'MMM DD, YYYY');
|
|
||||||
release.duration = qu.dur('.info-video-details li:nth-child(2) span');
|
|
||||||
|
|
||||||
release.actors = qu.all('.info-video-models a', true);
|
|
||||||
release.tags = qu.all('.info-video-category a', true);
|
|
||||||
|
|
||||||
release.photos = qu.urls('.swiper-wrapper .swiper-slide a').map((source) => source.replace('.jpg/', '.jpg'));
|
|
||||||
release.poster = qu.meta('meta[property="og:image"]');
|
|
||||||
|
|
||||||
if (!release.poster) {
|
|
||||||
const previewStart = html.indexOf('preview_url');
|
|
||||||
release.poster = html.slice(html.indexOf('http', previewStart), html.indexOf('.jpg', previewStart) + 4);
|
|
||||||
}
|
|
||||||
|
|
||||||
const varsPrefix = 'flashvars = {';
|
|
||||||
const varsStart = html.indexOf(varsPrefix);
|
|
||||||
const varsString = html.slice(varsStart + varsPrefix.length, html.indexOf('};', varsStart));
|
|
||||||
|
|
||||||
const vars = varsString.split(',').reduce((acc, item) => {
|
|
||||||
const [prop, value] = item.split(': ');
|
|
||||||
acc[prop.trim()] = value.trim().replace(/'/g, '');
|
|
||||||
|
|
||||||
return acc;
|
|
||||||
}, {});
|
|
||||||
|
|
||||||
release.trailer = [
|
|
||||||
{
|
|
||||||
src: decodeTrailerUrl(html, vars.video_url),
|
|
||||||
quality: parseInt(vars.video_url_text, 10),
|
|
||||||
},
|
|
||||||
{
|
|
||||||
src: decodeTrailerUrl(html, vars.video_alt_url),
|
|
||||||
quality: parseInt(vars.video_alt_url_text, 10),
|
|
||||||
},
|
|
||||||
{
|
|
||||||
src: decodeTrailerUrl(html, vars.video_alt_url2),
|
|
||||||
quality: parseInt(vars.video_alt_url2_text, 10),
|
|
||||||
},
|
|
||||||
{
|
|
||||||
src: decodeTrailerUrl(html, vars.video_alt_url3),
|
|
||||||
quality: parseInt(vars.video_alt_url3_text, 10),
|
|
||||||
},
|
|
||||||
{
|
|
||||||
src: decodeTrailerUrl(html, vars.video_alt_url4),
|
|
||||||
quality: parseInt(vars.video_alt_url4_text, 10),
|
|
||||||
},
|
|
||||||
];
|
|
||||||
|
|
||||||
return release;
|
|
||||||
}
|
|
||||||
|
|
||||||
async function fetchLatest(site, page = 1) {
|
|
||||||
const url = `https://vogov.com/latest-videos/?sort_by=post_date&from=${page}`;
|
|
||||||
const res = await http.get(url);
|
|
||||||
|
|
||||||
if (res.statusCode === 200) {
|
|
||||||
return scrapeLatest(res.body.toString(), site);
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
async function fetchScene(url) {
|
|
||||||
const res = await http.get(url);
|
|
||||||
|
|
||||||
if (res.statusCode === 200) {
|
|
||||||
return scrapeScene(res.body.toString(), url);
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = {
|
|
||||||
fetchLatest,
|
|
||||||
fetchScene,
|
|
||||||
};
|
|
||||||
Reference in New Issue
Block a user