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 @@
+
\ 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,