From e46607a5dfcbb0f3d23aa1ccf81db67237ac3e5e Mon Sep 17 00:00:00 2001 From: DebaucheryLibrarian Date: Sun, 8 Feb 2026 22:35:43 +0100 Subject: [PATCH] Merged Vogov into Teen Mega World, added No Boring, set up affiliate links. --- seeds/02_sites.js | 27 +++-- seeds/06_affiliates.js | 109 +++++++++++++++++- src/scrapers/releases.js | 2 - src/scrapers/teenmegaworld.js | 4 +- src/scrapers/vogov.js | 203 ---------------------------------- 5 files changed, 130 insertions(+), 215 deletions(-) delete mode 100755 src/scrapers/vogov.js diff --git a/seeds/02_sites.js b/seeds/02_sites.js index 82af58eb..5a610b9b 100755 --- a/seeds/02_sites.js +++ b/seeds/02_sites.js @@ -14605,6 +14605,26 @@ const sites = [ 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 { name: 'Teste de Fudelidade', @@ -15135,13 +15155,6 @@ const sites = [ parent: 'vixen', 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 { name: 'WankzVR', diff --git a/seeds/06_affiliates.js b/seeds/06_affiliates.js index 987012b1..e995daea 100755 --- a/seeds/06_affiliates.js +++ b/seeds/06_affiliates.js @@ -204,7 +204,7 @@ const affiliates = [ 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=', comment: 'per signup', }, @@ -750,6 +750,103 @@ const affiliates = [ channel: 'bamvisions', 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 { network: 'bang', @@ -1123,6 +1220,16 @@ exports.seed = async (knex) => { const channelsBySlug = channels.reduce((acc, channel) => ({ ...acc, [channel.slug]: channel }), {}); 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) => ({ id: getAffiliateId(affiliate), entity_id: networksBySlug[affiliate.network]?.id || channelsBySlug[affiliate.channel]?.id || null, diff --git a/src/scrapers/releases.js b/src/scrapers/releases.js index 5d0b8d52..50dd0397 100644 --- a/src/scrapers/releases.js +++ b/src/scrapers/releases.js @@ -75,7 +75,6 @@ const traxxx = require('./traxxx'); const virtualtaboo = require('./virtualtaboo'); const vivid = require('./vivid'); const vixen = require('./vixen'); -const vogov = require('./vogov'); const wankzvr = require('./wankzvr'); const whalemember = require('./whalemember'); // const xempire = require('./xempire'); @@ -181,7 +180,6 @@ module.exports = { virtualtaboo, vivid, vixen, - vogov, wankzvr, westcoastproductions: adultempire, whalemember, diff --git a/src/scrapers/teenmegaworld.js b/src/scrapers/teenmegaworld.js index da210933..b4c0e5e5 100755 --- a/src/scrapers/teenmegaworld.js +++ b/src/scrapers/teenmegaworld.js @@ -41,8 +41,8 @@ function scrapeAll(scenes, channel) { }); } -async function fetchLatest(channel, page = 1) { - const url = `${channel.type === 'network' ? channel.url : channel.parent.url}/search.php?site[]=${channel.parameters.siteId}&page=${page}`; +async function fetchLatest(channel, page = 1, { parameters }) { + 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' }); if (res.ok) { diff --git a/src/scrapers/vogov.js b/src/scrapers/vogov.js deleted file mode 100755 index 1d8ce9bc..00000000 --- a/src/scrapers/vogov.js +++ /dev/null @@ -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, -};