Added BaDoink latest and scene scraper.
This commit is contained in:
98
src/scrapers/badoink.js
Normal file
98
src/scrapers/badoink.js
Normal file
@@ -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,
|
||||
};
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user