2019-03-18 03:46:53 +00:00
'use strict' ;
2020-03-01 04:28:08 +00:00
const util = require ( 'util' ) ;
2020-02-28 02:56:58 +00:00
const Promise = require ( 'bluebird' ) ;
2019-03-18 03:46:53 +00:00
const cheerio = require ( 'cheerio' ) ;
2019-11-21 03:05:32 +00:00
const { JSDOM } = require ( 'jsdom' ) ;
2019-03-18 03:46:53 +00:00
const moment = require ( 'moment' ) ;
2023-07-05 22:14:38 +00:00
const unprint = require ( 'unprint' ) ;
2019-03-18 03:46:53 +00:00
2020-11-22 03:07:09 +00:00
const qu = require ( '../utils/qu' ) ;
2020-08-21 23:57:23 +00:00
const http = require ( '../utils/http' ) ;
2019-11-21 03:05:32 +00:00
const { heightToCm } = require ( '../utils/convert' ) ;
2020-02-24 02:12:58 +00:00
const slugify = require ( '../utils/slugify' ) ;
2019-03-24 00:29:22 +00:00
2020-03-09 01:02:29 +00:00
function getEntryId ( html ) {
2020-05-14 02:26:05 +00:00
const entryId = html . match ( /showtagform\((\d+)\)/ ) ;
2020-03-09 01:02:29 +00:00
2020-05-14 02:26:05 +00:00
if ( entryId ) {
return entryId [ 1 ] ;
}
2020-03-09 01:02:29 +00:00
2020-05-14 02:26:05 +00:00
const setIdIndex = html . indexOf ( 'setid:"' ) ;
2020-03-09 01:02:29 +00:00
2020-05-14 02:26:05 +00:00
if ( setIdIndex ) {
2020-05-18 02:28:38 +00:00
return html . slice ( setIdIndex , html . indexOf ( ',' , setIdIndex ) ) . match ( /\d+/ ) ? . [ 0 ] ;
2020-05-14 02:26:05 +00:00
}
2020-03-09 01:02:29 +00:00
2020-05-14 02:26:05 +00:00
return null ;
2020-03-09 01:02:29 +00:00
}
2020-09-04 23:56:54 +00:00
function scrapeAll ( scenes , site , entryIdFromTitle ) {
2023-07-05 22:14:38 +00:00
return scenes . map ( ( { element , query } ) => {
2020-05-14 02:26:05 +00:00
const release = { } ;
2023-07-05 22:14:38 +00:00
const title = query . content ( '.content_img div, .dvd_info > a, a.update_title, a[title] + a[title], .overlay-text' ) || query . content ( 'a[title*=" "]' ) ;
2020-02-12 22:49:22 +00:00
2021-12-05 22:43:23 +00:00
release . title = title ? . slice ( 0 , title . match ( /starring:/i ) ? . index || Infinity ) . trim ( ) ;
2023-07-05 22:14:38 +00:00
release . url = query . url ( '.content_img a, .dvd_info > a, a.update_title, a[title]' ) ;
2020-11-22 03:07:09 +00:00
release . date = query . date ( '.update_date' , 'MM/DD/YYYY' ) ;
2020-02-12 22:49:22 +00:00
2023-07-05 22:14:38 +00:00
release . entryId = ( entryIdFromTitle && slugify ( release . title ) ) || element . dataset . setid || query . element ( '.rating_box' ) ? . dataset . id || query . attribute ( 'a img' , 'id' ) ? . match ( /set-target-(\d+)/ ) ? . [ 1 ] ;
2020-09-04 23:56:54 +00:00
2021-12-05 22:43:23 +00:00
release . actors = query . all ( '.content_img .update_models a, .update_models a' ) . map ( ( actorEl ) => ( {
2023-07-05 22:14:38 +00:00
name : unprint . query . content ( actorEl ) ,
url : unprint . query . url ( actorEl , null ) ,
2021-11-30 23:00:24 +00:00
} ) ) ;
2020-02-12 22:49:22 +00:00
2020-11-22 03:07:09 +00:00
const dvdPhotos = query . imgs ( '.dvd_preview_thumb' ) ;
2023-07-05 22:14:38 +00:00
const photoCount = Number ( query . attribute ( 'a img.thumbs' , 'cnt' ) ) || 1 ;
2020-02-12 22:49:22 +00:00
2020-05-14 02:26:05 +00:00
[ release . poster , ... release . photos ] = dvdPhotos . length
? dvdPhotos
: Array . from ( { length : photoCount } ) . map ( ( value , index ) => {
2023-07-05 22:14:38 +00:00
const src = query . img ( 'a img.thumbs' , { attribute : ` src ${ index } _1x ` } ) || query . img ( 'a img.thumbs' , { attribute : ` src ${ index } ` } ) || query . img ( 'a img.thumbs' ) ;
2020-11-22 03:07:09 +00:00
const prefixedSrc = qu . prefixUrl ( src , site . url ) ;
2020-09-04 23:56:54 +00:00
if ( src ) {
return [
{
src : prefixedSrc . replace ( /.jpg$/ , '-full.jpg' ) ,
referer : site . url ,
2020-09-17 00:30:58 +00:00
verifyType : 'image' , // sometimes returns 200 OK with text/html instead of 403
} ,
{
src : prefixedSrc . replace ( /-1x.jpg$/ , '-4x.jpg' ) ,
referer : site . url ,
verifyType : 'image' ,
} ,
{
src : prefixedSrc . replace ( /-1x.jpg$/ , '-2x.jpg' ) ,
referer : site . url ,
verifyType : 'image' ,
2020-09-04 23:56:54 +00:00
} ,
{
src : prefixedSrc ,
referer : site . url ,
2020-09-17 00:30:58 +00:00
verifyType : 'image' ,
2020-09-04 23:56:54 +00:00
} ,
] ;
}
return null ;
2020-05-14 02:26:05 +00:00
} ) . filter ( Boolean ) ;
2019-05-08 03:50:13 +00:00
2020-11-22 03:07:09 +00:00
const teaserScript = query . html ( 'script' ) ;
2021-11-30 23:00:24 +00:00
2020-05-14 02:26:05 +00:00
if ( teaserScript ) {
2021-11-30 23:00:24 +00:00
release . teaser = teaserScript . slice ( teaserScript . indexOf ( 'http' ) , teaserScript . indexOf ( '.mp4' ) + 4 ) ;
2020-05-14 02:26:05 +00:00
}
2019-03-26 00:26:47 +00:00
2020-05-14 02:26:05 +00:00
return release ;
} ) ;
2019-03-18 03:46:53 +00:00
}
function scrapeUpcoming ( html , site ) {
2020-05-14 02:26:05 +00:00
const $ = cheerio . load ( html , { normalizeWhitespace : true } ) ;
const scenesElements = $ ( '#coming_soon_carousel' ) . find ( '.table' ) . toArray ( ) ;
return scenesElements . map ( ( element ) => {
2020-09-11 00:36:36 +00:00
const release = { } ;
release . entryId = $ ( element ) . find ( '.upcoming_updates_thumb' ) . attr ( 'id' ) . match ( /\d+/ ) [ 0 ] ;
2020-05-14 02:26:05 +00:00
const details = $ ( element ) . find ( '.update_details_comingsoon' )
. eq ( 1 )
. children ( )
. remove ( ) ;
2020-09-11 00:36:36 +00:00
release . title = details
2020-05-14 02:26:05 +00:00
. end ( )
. text ( )
. trim ( ) ;
2020-09-11 00:36:36 +00:00
release . actors = details
2020-05-14 02:26:05 +00:00
. text ( )
. trim ( )
. split ( ', ' ) ;
2020-09-11 00:36:36 +00:00
release . date = moment
2020-05-14 02:26:05 +00:00
. utc ( $ ( element ) . find ( '.update_date_comingsoon' ) . text ( ) . slice ( 7 ) , 'MM/DD/YYYY' )
. toDate ( ) ;
const photoElement = $ ( element ) . find ( 'a img.thumbs' ) ;
const posterPath = photoElement . attr ( 'src' ) ;
2020-09-11 00:36:36 +00:00
release . poster = posterPath . match ( /^http/ ) ? posterPath : ` ${ site . url } ${ posterPath } ` ;
2020-05-14 02:26:05 +00:00
const videoClass = $ ( element ) . find ( '.update_thumbnail div' ) . attr ( 'class' ) ;
const videoScript = $ ( element ) . find ( ` script:contains( ${ videoClass } ) ` ) . html ( ) ;
2020-09-11 00:36:36 +00:00
if ( videoScript ) {
release . teaser = videoScript . slice ( videoScript . indexOf ( 'https://' ) , videoScript . indexOf ( '.mp4' ) + 4 ) ;
}
return release ;
2020-05-14 02:26:05 +00:00
} ) ;
2019-03-18 03:46:53 +00:00
}
2023-07-05 22:14:38 +00:00
function extractLegacyTrailer ( html , context ) {
const trailerLines = html . split ( '\n' ) . filter ( ( line ) => / movie \ [ "trailer\w*" \ ] \ [ / i . t e s t ( l i n e ) ) ;
if ( trailerLines . length ) {
return trailerLines . map ( ( trailerLine ) => {
// const src = trailerLine.match(/path:"([\w-:/.&=?%]+)"/)?.[1];
const src = trailerLine . match ( /path:"(.+)"/ ) ? . [ 1 ] ;
const quality = trailerLine . match ( /movie_height:'(\d+)/ ) ? . [ 1 ] ;
return src && {
src : /^http/ . test ( src ) ? src : ` ${ context . entity . url } ${ src } ` ,
quality : quality && Number ( quality . replace ( '558' , '540' ) ) ,
} ;
} ) . filter ( Boolean ) ;
}
return null ;
}
const qualities = [
'photos' ,
'1600watermarked' ,
'1280watermarked' ,
'1024watermarked' ,
'thumbs' ,
] ;
function getPhotos ( query , release , context ) {
// https://thumbs.julesjordan.com/members/content//upload/dl03/julesjordan/whitney_wright_dredd/1024watermarked/whitney_wright_julesjordan.com-20.jpg
// https://thumbs.julesjordan.com/members/content//upload/dl03/julesjordan/bambi_barton_manuel_ferrara/1024watermarked/bambi_barton_julesjordan_com-13.jpg
if ( ! release . actors ? . length > 0 ) {
return null ;
}
const photoCount = query . number ( '//div[contains(@class, "title-heading-content")][contains(text(), "Photos")]' ) ;
if ( photoCount ) {
// slug actor order is not always the same as actor list order, prefer trailer slug if available
const path = query . dataset ( '.movieformat_button' , 'src' ) ? . match ( /:(.*)_trailer/ ) ? . [ 1 ] || release . actors . map ( ( actor ) => slugify ( actor . name || actor , '_' ) ) . join ( '_' ) ;
const derivedActorSlug = path . replace ( ` _ ${ release . actors . slice ( 1 ) . map ( ( { name } ) => slugify(name, '_'))} ` , '' ) ;
const actorSlug = derivedActorSlug === path // no replacement took place, so the slug is likely invalid
? slugify ( release . actors [ 0 ] . name || release . actors [ 0 ] , '_' )
: derivedActorSlug ;
return Array . from ( { length : photoCount } , ( value , index ) => qualities
. flatMap ( ( quality ) => [
` https://thumbs. ${ context . entity . slug } .com/trial/content//upload/dl03/ ${ context . entity . slug } / ${ path } / ${ quality } / ${ actorSlug } _ ${ context . entity . slug } _com- ${ index + 1 } .jpg ` ,
` https://thumbs. ${ context . entity . slug } .com/trial/content//upload/dl03/ ${ context . entity . slug } / ${ path } / ${ quality } / ${ actorSlug } _ ${ context . entity . slug } .com- ${ index + 1 } .jpg ` , // .com instead of _com
2023-07-05 22:30:04 +00:00
] ) . map ( ( src ) => ( { src , attempts : 1 } ) ) ) ;
2023-07-05 22:14:38 +00:00
}
return null ;
}
async function scrapeScene ( { html , query } , context ) {
2021-11-30 23:00:24 +00:00
const release = { } ;
2019-12-13 15:59:04 +00:00
2023-07-05 22:14:38 +00:00
release . title = query . content ( '.title_bar_hilite, .movie_title' ) ;
release . description = query . content ( '.update_description' ) || query . text ( '//div[./span[contains(text(), "Description")]]' ) ;
release . entryId = context . entity . parameters ? . entryIdFromTitle ? slugify ( release . title ) : getEntryId ( html ) ;
2020-01-08 04:12:14 +00:00
2023-07-05 22:14:38 +00:00
release . date = query . date ( [ '.update_date' , '//div[./span[contains(text(), "Date")]]' ] , 'MM/DD/YYYY' ) ;
2020-03-09 04:06:37 +00:00
2023-07-05 22:14:38 +00:00
release . actors = query . all ( '.backgroundcolor_info > .update_models a, .item .update_models a, .player-scene-description .update_models a' ) . map ( ( actorEl ) => ( {
name : unprint . query . content ( actorEl ) ,
url : unprint . query . url ( actorEl , null ) ,
2021-11-30 23:00:24 +00:00
} ) ) ;
2023-07-05 22:14:38 +00:00
release . tags = query . contents ( '.update_tags a, .player-scene-description a[href*="/categories"]' ) ;
2023-07-01 20:45:28 +00:00
release . director = release . tags ? . find ( ( tag ) => [ 'mike john' , 'van styles' ] . includes ( tag ? . trim ( ) . toLowerCase ( ) ) ) ;
2019-03-23 21:48:39 +00:00
2023-07-05 22:14:38 +00:00
const posterPath = query . poster ( '#video-player' ) || html . match ( /useimage = "(.*)"/ ) ? . [ 1 ] ;
2019-10-29 03:49:27 +00:00
2020-05-14 02:26:05 +00:00
if ( posterPath ) {
2023-07-05 22:14:38 +00:00
const poster = /^http/ . test ( posterPath ) ? posterPath : ` ${ context . entity . url } ${ posterPath } ` ;
2020-03-01 04:28:08 +00:00
2020-05-14 02:26:05 +00:00
if ( poster ) {
release . poster = {
src : poster ,
2023-07-05 22:14:38 +00:00
referer : context . entity . url ,
2020-05-14 02:26:05 +00:00
} ;
}
}
2019-12-13 15:59:04 +00:00
2023-07-05 22:14:38 +00:00
if ( query . exists ( 'source[data-bitrate="trailer"]' ) ) {
release . trailer = [
query . video ( 'source[data-bitrate="trailer_1080" i]' ) ,
query . video ( 'source[data-bitrate="trailer_720" i]' ) ,
query . video ( 'source[data-bitrate="trailer" i]' ) , // also seems to be 720p
query . video ( 'source[data-bitrate="trailer_mobile" i]' ) , // also seems to be 720p
] ;
} else if ( context . include . trailers && context . entity . slug !== 'manuelferrara' ) {
release . trailer = extractLegacyTrailer ( html , context ) ;
2020-05-14 02:26:05 +00:00
}
2019-12-13 15:59:04 +00:00
2023-07-05 22:14:38 +00:00
// release.photos = async () => await getPhotos(release.entryId, context.entity); // probably no longer works on any site
// release.photos = query.imgs('#images img');
release . photos = getPhotos ( query , release , context ) ;
2020-03-01 04:28:08 +00:00
2020-11-22 03:07:09 +00:00
if ( query . exists ( '.update_dvds a' ) ) {
2020-05-14 02:26:05 +00:00
release . movie = {
2020-11-22 03:07:09 +00:00
url : query . url ( '.update_dvds a' ) ,
2021-11-30 23:00:24 +00:00
title : query . cnt ( '.update_dvds a' ) ,
2020-05-14 02:26:05 +00:00
} ;
2021-07-04 22:06:18 +00:00
release . movie . entryId = new URL ( release . movie . url ) . pathname . split ( '/' ) . slice ( - 1 ) [ 0 ] ? . replace ( '.html' , '' ) ;
2020-05-14 02:26:05 +00:00
}
2019-12-13 15:59:04 +00:00
2021-11-30 23:00:24 +00:00
release . stars = query . number ( '.avg_rating' ) ;
2019-12-13 15:59:04 +00:00
2020-05-14 02:26:05 +00:00
return release ;
2019-03-23 21:48:39 +00:00
}
2020-08-01 13:11:07 +00:00
function scrapeMovie ( { el , query } , url , site ) {
2020-05-14 02:26:05 +00:00
const movie = { url , site } ;
2019-12-13 02:28:52 +00:00
2021-07-04 22:06:18 +00:00
movie . entryId = new URL ( url ) . pathname . split ( '/' ) . slice ( - 1 ) [ 0 ] ? . replace ( '.html' , '' ) ;
2021-11-30 23:00:24 +00:00
movie . title = query . cnt ( '.title_bar span' ) ;
2020-08-01 13:11:07 +00:00
movie . covers = query . urls ( '#dvd-cover-flip > a' ) ;
movie . channel = slugify ( query . q ( '.update_date a' , true ) , '' ) ;
2020-03-08 03:23:10 +00:00
2020-05-14 02:26:05 +00:00
// movie.releases = Array.from(document.querySelectorAll('.cell.dvd_info > a'), el => el.href);
2020-11-22 03:07:09 +00:00
const sceneQus = qu . initAll ( el , '.dvd_details' ) ;
2020-05-14 02:26:05 +00:00
const scenes = scrapeAll ( sceneQus , site ) ;
2020-03-08 03:23:10 +00:00
2020-05-14 02:26:05 +00:00
const curatedScenes = scenes
2021-11-20 22:59:15 +00:00
? . map ( ( scene ) => ( { ... scene , movie } ) )
2021-02-21 21:58:46 +00:00
. sort ( ( sceneA , sceneB ) => sceneA . date - sceneB . date ) ;
2019-12-13 02:28:52 +00:00
2021-12-05 22:43:23 +00:00
movie . date = curatedScenes ? . [ 0 ] ? . date ;
2020-03-08 03:23:10 +00:00
2020-05-14 02:26:05 +00:00
return {
... movie ,
... ( curatedScenes && { scenes : curatedScenes } ) ,
} ;
2019-12-13 02:28:52 +00:00
}
2020-09-04 23:56:54 +00:00
function scrapeProfile ( html , url , actorName , entity ) {
2020-05-14 02:26:05 +00:00
const { document } = new JSDOM ( html ) . window ;
2019-11-21 03:05:32 +00:00
2020-05-14 02:26:05 +00:00
const bio = document . querySelector ( '.model_bio' ) . textContent ;
2020-09-04 23:56:54 +00:00
const avatarEl = document . querySelector ( '.model_bio_pic img, .model_bio_thumb' ) ;
2019-11-21 03:05:32 +00:00
2020-05-14 02:26:05 +00:00
const profile = {
name : actorName ,
} ;
2019-11-21 03:05:32 +00:00
2020-05-14 02:26:05 +00:00
const heightString = bio . match ( /\d+ feet \d+ inches/ ) ;
const ageString = bio . match ( /Age:\s*(\d{2})/ ) ;
const birthDateString = bio . match ( /Age:\s*(\w+ \d{1,2}, \d{4})/ ) ;
const measurementsString = bio . match ( /\w+-\d+-\d+/ ) ;
2019-11-21 03:05:32 +00:00
2020-11-22 03:07:09 +00:00
if ( birthDateString ) profile . birthdate = qu . parseDate ( birthDateString [ 1 ] , 'MMMM D, YYYY' ) ;
2020-05-14 02:26:05 +00:00
if ( ageString ) profile . age = Number ( ageString [ 1 ] ) ;
2020-03-11 02:01:37 +00:00
2020-05-14 02:26:05 +00:00
if ( heightString ) profile . height = heightToCm ( heightString [ 0 ] ) ;
2020-03-11 02:01:37 +00:00
2020-05-14 02:26:05 +00:00
if ( measurementsString ) {
const [ bust , waist , hip ] = measurementsString [ 0 ] . split ( '-' ) ;
2020-03-11 02:01:37 +00:00
2020-05-14 02:26:05 +00:00
if ( bust ) profile . bust = bust ;
if ( waist ) profile . waist = Number ( waist ) ;
if ( hip ) profile . hip = Number ( hip ) ;
}
2019-11-21 03:05:32 +00:00
2020-05-14 02:26:05 +00:00
if ( avatarEl ) {
const avatarSources = [
avatarEl . getAttribute ( 'src0_3x' ) ,
avatarEl . getAttribute ( 'src0_2x' ) ,
avatarEl . getAttribute ( 'src0_1x' ) ,
avatarEl . getAttribute ( 'src0' ) ,
avatarEl . getAttribute ( 'src' ) ,
2020-09-04 23:56:54 +00:00
]
2021-11-20 22:59:15 +00:00
. filter ( ( avatar ) => avatar && ! /p\d+.jpe?g/ . test ( avatar ) ) // remove non-existing attributes and placeholder images
. map ( ( avatar ) => qu . prefixUrl ( avatar , entity . url ) ) ;
2020-02-24 02:12:58 +00:00
2020-05-14 02:26:05 +00:00
if ( avatarSources . length ) profile . avatar = avatarSources ;
}
2019-11-21 03:05:32 +00:00
2021-11-20 22:59:15 +00:00
profile . releases = Array . from ( document . querySelectorAll ( '.category_listing_block .update_details > a:first-child' ) , ( el ) => el . href ) ;
2019-11-21 03:05:32 +00:00
2020-05-14 02:26:05 +00:00
return profile ;
2019-11-21 03:05:32 +00:00
}
2020-09-10 21:49:24 +00:00
async function fetchLatest ( site , page = 1 , include , preData , entryIdFromTitle = false ) {
2020-05-14 02:26:05 +00:00
const url = site . parameters ? . latest
? util . format ( site . parameters . latest , page )
: ` ${ site . url } /trial/categories/movies_ ${ page } _d.html ` ;
2020-03-01 04:28:08 +00:00
2020-11-22 23:05:02 +00:00
// const res = await http.get(url);
2023-07-05 22:14:38 +00:00
const res = await unprint . get ( url , { selectAll : '.update_details, .grid-item' } ) ;
if ( res . ok ) {
return scrapeAll ( res . context , site , typeof site . parameters ? . entryIdFromTitle === 'boolean' ? site . parameters . entryIdFromTitle : entryIdFromTitle ) ;
}
2019-03-23 21:48:39 +00:00
2023-07-05 22:14:38 +00:00
return res . status ;
2019-03-23 21:48:39 +00:00
}
async function fetchUpcoming ( site ) {
2020-05-14 02:26:05 +00:00
if ( site . parameters ? . upcoming === false ) return null ;
2020-03-01 04:28:08 +00:00
2020-05-14 02:26:05 +00:00
const url = site . parameters ? . upcoming ? util . format ( site . parameters . upcoming ) : ` ${ site . url } /trial/index.php ` ;
2020-08-21 23:57:23 +00:00
const res = await http . get ( url ) ;
2020-03-01 04:28:08 +00:00
2020-05-14 02:26:05 +00:00
if ( res . statusCode === 200 ) {
return scrapeUpcoming ( res . body . toString ( ) , site ) ;
}
2019-03-23 21:48:39 +00:00
2020-05-14 02:26:05 +00:00
return res . statusCode ;
2019-03-23 21:48:39 +00:00
}
2019-03-18 03:46:53 +00:00
2019-12-13 02:28:52 +00:00
async function fetchMovie ( url , site ) {
2020-11-22 03:07:09 +00:00
const res = await qu . get ( url ) ;
2019-12-13 02:28:52 +00:00
2020-05-14 02:26:05 +00:00
return res . ok ? scrapeMovie ( res . item , url , site ) : res . status ;
2019-12-13 02:28:52 +00:00
}
2020-09-04 23:56:54 +00:00
async function fetchProfile ( { name : actorName , url } , entity ) {
const actorSlugA = slugify ( actorName , '' ) ;
const actorSlugB = slugify ( actorName , '-' ) ;
2019-11-28 04:36:22 +00:00
2020-09-04 23:56:54 +00:00
const urls = [
url ,
` ${ entity . parameters ? . profile || ` ${ entity . url } /trial/models ` } / ${ actorSlugA } .html ` ,
` ${ entity . parameters ? . profile || ` ${ entity . url } /trial/models ` } / ${ actorSlugB } .html ` ,
] ;
2019-11-28 04:36:22 +00:00
2020-09-04 23:56:54 +00:00
return urls . reduce ( async ( chain , profileUrl ) => {
const profile = await chain ;
2019-11-28 04:36:22 +00:00
2020-09-04 23:56:54 +00:00
if ( profile ) {
return profile ;
}
2019-11-28 04:36:22 +00:00
2020-09-04 23:56:54 +00:00
if ( ! profileUrl ) {
return null ;
}
2019-11-28 04:36:22 +00:00
2020-09-04 23:56:54 +00:00
const res = await http . get ( profileUrl ) ;
2019-11-21 03:05:32 +00:00
2020-09-04 23:56:54 +00:00
if ( res . statusCode === 200 ) {
return scrapeProfile ( res . body . toString ( ) , profileUrl , actorName , entity ) ;
}
2019-11-21 03:05:32 +00:00
2020-09-04 23:56:54 +00:00
return null ;
} , Promise . resolve ( ) ) ;
2019-11-21 03:05:32 +00:00
}
2019-03-23 21:48:39 +00:00
module . exports = {
2020-05-14 02:26:05 +00:00
fetchLatest ,
fetchMovie ,
fetchProfile ,
fetchUpcoming ,
2023-07-05 22:14:38 +00:00
scrapeScene : {
scraper : scrapeScene ,
unprint : true ,
} ,
2019-03-23 21:48:39 +00:00
} ;