diff --git a/assets/components/networks/networks.vue b/assets/components/networks/networks.vue index eb7d4537..54c0229f 100644 --- a/assets/components/networks/networks.vue +++ b/assets/components/networks/networks.vue @@ -142,7 +142,7 @@ export default { .entity-tiles { display: grid; grid-template-columns: repeat(auto-fill, minmax(15rem, 1fr)); - grid-gap: 1rem; + grid-gap: .5rem; padding: 1rem 0; } diff --git a/public/img/logos/badoink/18vr.png b/public/img/logos/badoink/18vr.png new file mode 100644 index 00000000..a3240d0c Binary files /dev/null and b/public/img/logos/badoink/18vr.png differ diff --git a/public/img/logos/badoink/babevr.png b/public/img/logos/badoink/babevr.png new file mode 100644 index 00000000..9ded13b7 Binary files /dev/null and b/public/img/logos/badoink/babevr.png differ diff --git a/public/img/logos/badoink/badoinkvr.png b/public/img/logos/badoink/badoinkvr.png new file mode 100644 index 00000000..5b947da0 Binary files /dev/null and b/public/img/logos/badoink/badoinkvr.png differ diff --git a/public/img/logos/badoink/favicon.png b/public/img/logos/badoink/favicon.png new file mode 100644 index 00000000..f7c120fa Binary files /dev/null and b/public/img/logos/badoink/favicon.png differ diff --git a/public/img/logos/badoink/favicon_dark.png b/public/img/logos/badoink/favicon_dark.png new file mode 100644 index 00000000..8530f15e Binary files /dev/null and b/public/img/logos/badoink/favicon_dark.png differ diff --git a/public/img/logos/badoink/favicon_light.png b/public/img/logos/badoink/favicon_light.png new file mode 100644 index 00000000..9f1045e3 Binary files /dev/null and b/public/img/logos/badoink/favicon_light.png differ diff --git a/public/img/logos/badoink/lazy/18vr.png b/public/img/logos/badoink/lazy/18vr.png new file mode 100644 index 00000000..a7233398 Binary files /dev/null and b/public/img/logos/badoink/lazy/18vr.png differ diff --git a/public/img/logos/badoink/lazy/babevr.png b/public/img/logos/badoink/lazy/babevr.png new file mode 100644 index 00000000..47531690 Binary files /dev/null and b/public/img/logos/badoink/lazy/babevr.png differ diff --git a/public/img/logos/badoink/lazy/badoinkvr.png b/public/img/logos/badoink/lazy/badoinkvr.png new file mode 100644 index 00000000..2f1146c5 Binary files /dev/null and b/public/img/logos/badoink/lazy/badoinkvr.png differ diff --git a/public/img/logos/badoink/lazy/network.png b/public/img/logos/badoink/lazy/network.png new file mode 100644 index 00000000..9350d22f Binary files /dev/null and b/public/img/logos/badoink/lazy/network.png differ diff --git a/public/img/logos/badoink/lazy/realvr.png b/public/img/logos/badoink/lazy/realvr.png new file mode 100644 index 00000000..44122250 Binary files /dev/null and b/public/img/logos/badoink/lazy/realvr.png differ diff --git a/public/img/logos/badoink/lazy/vrcosplayx.png b/public/img/logos/badoink/lazy/vrcosplayx.png new file mode 100644 index 00000000..2932bc13 Binary files /dev/null and b/public/img/logos/badoink/lazy/vrcosplayx.png differ diff --git a/public/img/logos/badoink/misc/18-vr.svg b/public/img/logos/badoink/misc/18-vr.svg new file mode 100755 index 00000000..a3c910bf --- /dev/null +++ b/public/img/logos/badoink/misc/18-vr.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/img/logos/badoink/misc/18-vr_dark.svg b/public/img/logos/badoink/misc/18-vr_dark.svg new file mode 100755 index 00000000..9d92454f --- /dev/null +++ b/public/img/logos/badoink/misc/18-vr_dark.svg @@ -0,0 +1 @@ +18VR Logo \ No newline at end of file diff --git a/public/img/logos/badoink/misc/babe-vr.svg b/public/img/logos/badoink/misc/babe-vr.svg new file mode 100755 index 00000000..dcdfdcad --- /dev/null +++ b/public/img/logos/badoink/misc/babe-vr.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/img/logos/badoink/misc/babe-vr_dark.png b/public/img/logos/badoink/misc/babe-vr_dark.png new file mode 100644 index 00000000..b870058e Binary files /dev/null and b/public/img/logos/badoink/misc/babe-vr_dark.png differ diff --git a/public/img/logos/badoink/misc/babe-vr_light.png b/public/img/logos/badoink/misc/babe-vr_light.png new file mode 100644 index 00000000..9c0d8d83 Binary files /dev/null and b/public/img/logos/badoink/misc/babe-vr_light.png differ diff --git a/public/img/logos/badoink/misc/badoink-vr.svg b/public/img/logos/badoink/misc/badoink-vr.svg new file mode 100755 index 00000000..ce9af052 --- /dev/null +++ b/public/img/logos/badoink/misc/badoink-vr.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/img/logos/badoink/misc/badoink-vr_blue.svg b/public/img/logos/badoink/misc/badoink-vr_blue.svg new file mode 100644 index 00000000..da3c09e6 --- /dev/null +++ b/public/img/logos/badoink/misc/badoink-vr_blue.svg @@ -0,0 +1,31 @@ + + diff --git a/public/img/logos/badoink/misc/real-vr.svg b/public/img/logos/badoink/misc/real-vr.svg new file mode 100755 index 00000000..725c556f --- /dev/null +++ b/public/img/logos/badoink/misc/real-vr.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/img/logos/badoink/misc/vr-cosplay-x.svg b/public/img/logos/badoink/misc/vr-cosplay-x.svg new file mode 100755 index 00000000..57f5aa51 --- /dev/null +++ b/public/img/logos/badoink/misc/vr-cosplay-x.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/img/logos/badoink/misc/vr-cosplay-x_dark.png b/public/img/logos/badoink/misc/vr-cosplay-x_dark.png new file mode 100644 index 00000000..5fd2fd21 Binary files /dev/null and b/public/img/logos/badoink/misc/vr-cosplay-x_dark.png differ diff --git a/public/img/logos/badoink/misc/vr-cosplay-x_light.png b/public/img/logos/badoink/misc/vr-cosplay-x_light.png new file mode 100644 index 00000000..fe80da2d Binary files /dev/null and b/public/img/logos/badoink/misc/vr-cosplay-x_light.png differ diff --git a/public/img/logos/badoink/network.png b/public/img/logos/badoink/network.png new file mode 100644 index 00000000..c729d6cf Binary files /dev/null and b/public/img/logos/badoink/network.png differ diff --git a/public/img/logos/badoink/realvr.png b/public/img/logos/badoink/realvr.png new file mode 100644 index 00000000..d8898132 Binary files /dev/null and b/public/img/logos/badoink/realvr.png differ diff --git a/public/img/logos/badoink/thumbs/18vr.png b/public/img/logos/badoink/thumbs/18vr.png new file mode 100644 index 00000000..7ea6bd79 Binary files /dev/null and b/public/img/logos/badoink/thumbs/18vr.png differ diff --git a/public/img/logos/badoink/thumbs/babevr.png b/public/img/logos/badoink/thumbs/babevr.png new file mode 100644 index 00000000..5c5acc17 Binary files /dev/null and b/public/img/logos/badoink/thumbs/babevr.png differ diff --git a/public/img/logos/badoink/thumbs/badoinkvr.png b/public/img/logos/badoink/thumbs/badoinkvr.png new file mode 100644 index 00000000..0de1f34b Binary files /dev/null and b/public/img/logos/badoink/thumbs/badoinkvr.png differ diff --git a/public/img/logos/badoink/thumbs/network.png b/public/img/logos/badoink/thumbs/network.png new file mode 100644 index 00000000..93807b51 Binary files /dev/null and b/public/img/logos/badoink/thumbs/network.png differ diff --git a/public/img/logos/badoink/thumbs/realvr.png b/public/img/logos/badoink/thumbs/realvr.png new file mode 100644 index 00000000..b33f29ad Binary files /dev/null and b/public/img/logos/badoink/thumbs/realvr.png differ diff --git a/public/img/logos/badoink/thumbs/vrcosplayx.png b/public/img/logos/badoink/thumbs/vrcosplayx.png new file mode 100644 index 00000000..c8938815 Binary files /dev/null and b/public/img/logos/badoink/thumbs/vrcosplayx.png differ diff --git a/public/img/logos/badoink/vrcosplayx.png b/public/img/logos/badoink/vrcosplayx.png new file mode 100644 index 00000000..1abbbc36 Binary files /dev/null and b/public/img/logos/badoink/vrcosplayx.png differ diff --git a/seeds/00_tags.js b/seeds/00_tags.js index 7f9e2bd1..9649362a 100644 --- a/seeds/00_tags.js +++ b/seeds/00_tags.js @@ -953,7 +953,7 @@ const tags = [ }, { name: 'virtual reality', - slug: 'virtual-reality', + slug: 'vr', }, { name: 'quarantine', @@ -1821,7 +1821,7 @@ const aliases = [ }, { name: 'vr', - for: 'virtual reality', + for: 'vr', }, { name: 'whipping', diff --git a/seeds/01_networks.js b/seeds/01_networks.js index 5cac7b7f..02bcd42a 100644 --- a/seeds/01_networks.js +++ b/seeds/01_networks.js @@ -108,6 +108,11 @@ const networks = [ url: 'https://www.babes.com', parent: 'mindgeek', }, + { + slug: 'badoink', + name: 'BaDoink', + url: 'http://www.badoink.com', + }, { slug: 'bang', name: 'Bang!', diff --git a/seeds/02_sites.js b/seeds/02_sites.js index 4130d9d2..0925e9c3 100644 --- a/seeds/02_sites.js +++ b/seeds/02_sites.js @@ -624,6 +624,48 @@ const sites = [ slug: 'stepmomlessons', parent: 'babes', }, + // BADOINK + { + name: 'BaDoinkVR', + slug: 'badoinkvr', + url: 'https://www.badoinkvr.com', + tags: ['vr'], + parent: 'badoink', + }, + { + name: 'VR Cosplay X', + slug: 'vrcosplayx', + url: 'https://vrcosplayx.com', + tags: ['vr'], + parent: 'badoink', + parameters: { + latest: 'cosplaypornvideos', + }, + }, + { + name: '18VR', + slug: '18vr', + url: 'https://18vr.com', + tags: ['vr'], + parent: 'badoink', + }, + { + name: 'BabeVR', + slug: 'babevr', + url: 'https://babevr.com', + tags: ['vr'], + parent: 'badoink', + }, + { + name: 'RealVR', + slug: 'realvr', + url: 'https://realvr.com', + tags: ['vr'], + parameters: { + teasers: false, + }, + parent: 'badoink', + }, // BAM VISIONS { slug: 'bamvisions', diff --git a/src/scrapers/badoink.js b/src/scrapers/badoink.js new file mode 100644 index 00000000..0eb2e630 --- /dev/null +++ b/src/scrapers/badoink.js @@ -0,0 +1,98 @@ +'use strict'; + +const qu = require('../utils/qu'); + +function getPoster(posterSources) { + if (posterSources?.[0]) { + const { origin, pathname } = new URL(posterSources[0]); + + return [ + `${origin}${pathname}`, + ...posterSources, + ]; + } + + return null; +} + +function scrapeAll(scenes, channel) { + return scenes.map(({ query }) => { + const release = {}; + + release.url = query.url('a', 'href', { origin: channel.url }); + release.entryId = query.q(null, 'data-video-card-scene-id') || query.q('video', 'data-video-preview-scene-id') || new URL(release.url).pathname.match(/(\d+)\/?$/)?.[1]; + + release.title = query.cnt('.video-card-title span') || query.q('.video-card-title', 'title'); + release.description = query.cnt('.video-card-description'); + + release.date = query.date('.video-card-upload-date', 'YYYY-MM-DD HH:mm:ss', null, 'content') || query.date('.video-card-upload-date', 'MMMM DD, YYYY'); + release.duration = query.duration('.video-card-duration', null, 'content') || query.number('.video-card-duration') * 60; + + release.actors = query.all('.video-card-details--cast a').map(el => ({ + name: qu.query.cnt(el), + url: qu.query.url(el, null, 'href', { origin: channel.url }), + })); + + release.tags = query.cnts('.video-card-tags a'); + + const posterSources = query.srcset('picture source', 'data-srcset') || [query.img('.video-card-image', 'data-src')]; + release.poster = getPoster(posterSources); + + release.teaser = query.video('video') || (channel.parameters?.teasers !== false ? `https://p.badoinkvr.com/d/scene_files/${release.entryId}/preview/preview.mp4` : null); + + return release; + }); +} + +function scrapeScene({ query }, url, channel) { + const release = {}; + + release.entryId = new URL(url).pathname.match(/(\d+)\/?$/)?.[1]; + + release.title = query.cnt('.video-title', '.breadcrumbs__item:last-child [itemprop=name]'); + release.description = query.cnt('.video-description'); + + release.date = query.date('.video-upload-date', 'YYYY-MM-DD HH:mm:ss', null, 'content') || query.date('.video-upload-date', 'MMMM DD, YYYY', /\w+ \d{1,2}, \d{4}/); + release.duration = query.duration('.video-duration', null, 'content') || query.number('.video-duration') * 60; + + release.actors = query.all('.video-actors a').map(el => ({ + name: qu.query.cnt(el), + url: qu.query.url(el, null, 'href', { origin: channel.url }), + })); + + release.tags = query.cnts('.video-tags a'); + + const posterSources = query.srcset('.video-image-container picture source', 'srcset') || [query.img('.video-image')]; + release.poster = getPoster(posterSources); + + const photos = query.imgs('.gallery .gallery-item', 'data-big-image'); + const extraPhotoCount = query.number('.gallery .gallery-item:last-child', /\d+/, 'data-desktop-text'); + const lastPhoto = photos.slice(-1)[0]; + const photosHaveIndex = /_\d+\./.test(lastPhoto); + + release.photos = [ + ...photos, + ...Array.from(photosHaveIndex ? { length: extraPhotoCount } : [], (value, index) => lastPhoto.replace(/_\d+\./, `_${index + photos.length + 1}.`)), + ]; + + release.teaser = channel.parameters?.teasers !== false ? `https://p.badoinkvr.com/d/scene_files/${release.entryId}/preview/preview.mp4` : null; + + return release; +} + +async function fetchLatest(channel, page) { + const res = await qu.getAll(`${channel.url}/${channel.parameters?.latest || 'vrpornvideos'}/${page}`, '.video-card', { + Cookie: 'affsubid=12345-;', // required to show teaser video, exact number doesn't seem to matter + }); + + if (res.ok) { + return scrapeAll(res.items, channel); + } + + return res.status; +} + +module.exports = { + fetchLatest, + scrapeScene, +}; diff --git a/src/scrapers/scrapers.js b/src/scrapers/scrapers.js index af03bfce..60910643 100644 --- a/src/scrapers/scrapers.js +++ b/src/scrapers/scrapers.js @@ -5,6 +5,7 @@ const assylum = require('./assylum'); const aziani = require('./aziani'); const amateurallure = require('./amateurallure'); const americanpornstar = require('./americanpornstar'); +const badoink = require('./badoink'); const bamvisions = require('./bamvisions'); const bang = require('./bang'); const bangbros = require('./bangbros'); @@ -71,6 +72,7 @@ const scrapers = { amateureuro: porndoe, assylum, aziani, + badoink, bamvisions, bang, bangbros,