Added Killergram.
This commit is contained in:
77
src/scrapers/killergram.js
Normal file
77
src/scrapers/killergram.js
Normal file
@@ -0,0 +1,77 @@
|
||||
'use strict';
|
||||
|
||||
const qu = require('../utils/qu');
|
||||
const slugify = require('../utils/slugify');
|
||||
|
||||
function scrapeAll({ query }) {
|
||||
const urls = query.urls('td > a:not([href*=joinnow])').map(pathname => `http://killergram.com/${encodeURI(pathname)}`);
|
||||
const posters = query.imgs('td > a img');
|
||||
const titles = query.all('.episodeheadertext', true);
|
||||
const actors = query.all('.episodetextinfo:nth-child(3)').map(el => query.all(el, 'a', true));
|
||||
const channels = query.all('.episodetextinfo:nth-child(2) a', true).map(channel => slugify(channel, ''));
|
||||
|
||||
if ([urls.length, posters.length, titles.length, actors.length, channels.length].every((value, index, array) => value === array[0])) { // make sure every set has the same number of items
|
||||
const releases = urls.map((url, index) => ({
|
||||
url,
|
||||
entryId: new URL(url).searchParams.get('id'),
|
||||
title: titles[index],
|
||||
actors: actors[index],
|
||||
channel: channels[index],
|
||||
poster: posters[index],
|
||||
}));
|
||||
|
||||
return releases;
|
||||
}
|
||||
|
||||
return [];
|
||||
}
|
||||
|
||||
function scrapeScene({ query, html }, url) {
|
||||
const release = {};
|
||||
|
||||
release.entryId = new URL(url).searchParams.get('id');
|
||||
release.date = query.date('.episodetext', 'DD MMMM YYYY', /\d{2} \w+ \d{4}/);
|
||||
|
||||
release.description = query.q('.episodetext tr:nth-child(5) td:nth-child(2)', true);
|
||||
release.actors = query.all('.modelstarring a', true);
|
||||
|
||||
const duration = html.match(/(\d+) minutes/)?.[1];
|
||||
if (duration) release.duration = Number(duration) * 60;
|
||||
|
||||
[release.poster, ...release.photos] = query.imgs('img[src*="/models"]');
|
||||
|
||||
return release;
|
||||
}
|
||||
|
||||
function scrapeProfile({ query }, actorName) {
|
||||
const profile = {};
|
||||
|
||||
profile.releases = scrapeAll({ query }).filter(release => release.actors.includes(actorName));
|
||||
|
||||
return profile;
|
||||
}
|
||||
|
||||
async function fetchLatest(channel, page = 1) {
|
||||
const res = await qu.get(`${channel.url}&p=${page}`, '#episodes > table');
|
||||
|
||||
return res.ok ? scrapeAll(res.item, channel) : res.status;
|
||||
}
|
||||
|
||||
async function fetchScene(url, channel) {
|
||||
const res = await qu.get(url, '#episodes > table');
|
||||
|
||||
return res.ok ? scrapeScene(res.item, url, channel) : res.status;
|
||||
}
|
||||
|
||||
async function fetchProfile(actorName) {
|
||||
const url = `http://killergram.com/episodes.asp?page=episodes&model=${encodeURI(actorName)}&ct=model`;
|
||||
const res = await qu.get(url, '#episodes > table');
|
||||
|
||||
return res.ok ? scrapeProfile(res.item, actorName) : res.status;
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
fetchLatest,
|
||||
fetchScene,
|
||||
fetchProfile,
|
||||
};
|
||||
@@ -28,6 +28,7 @@ const jayrock = require('./jayrock');
|
||||
const jesseloadsmonsterfacials = require('./jesseloadsmonsterfacials');
|
||||
const julesjordan = require('./julesjordan');
|
||||
const kellymadison = require('./kellymadison');
|
||||
const killergram = require('./killergram');
|
||||
const kink = require('./kink');
|
||||
const legalporno = require('./legalporno');
|
||||
const men = require('./men');
|
||||
@@ -101,6 +102,7 @@ module.exports = {
|
||||
jesseloadsmonsterfacials,
|
||||
julesjordan,
|
||||
kellymadison,
|
||||
killergram,
|
||||
kink,
|
||||
legalporno,
|
||||
men,
|
||||
@@ -177,6 +179,7 @@ module.exports = {
|
||||
jamesdeen: fullpornnetwork,
|
||||
julesjordan,
|
||||
kellymadison,
|
||||
killergram,
|
||||
legalporno,
|
||||
men,
|
||||
metrohd,
|
||||
|
||||
Reference in New Issue
Block a user