diff --git a/public/img/logos/fcuk/favicon.png b/public/img/logos/fcuk/favicon.png index acc7db52..c57b7b21 100644 Binary files a/public/img/logos/fcuk/favicon.png and b/public/img/logos/fcuk/favicon.png differ diff --git a/public/img/logos/fcuk/fcuk.png b/public/img/logos/fcuk/fcuk.png index 61aa3fd2..a678ceed 100644 Binary files a/public/img/logos/fcuk/fcuk.png and b/public/img/logos/fcuk/fcuk.png differ diff --git a/public/img/logos/fcuk/lazy/afterhoursexposed.png b/public/img/logos/fcuk/lazy/afterhoursexposed.png index ee0663de..df306224 100644 Binary files a/public/img/logos/fcuk/lazy/afterhoursexposed.png and b/public/img/logos/fcuk/lazy/afterhoursexposed.png differ diff --git a/public/img/logos/fcuk/lazy/backroomcastingcouch.png b/public/img/logos/fcuk/lazy/backroomcastingcouch.png index 56ead794..cc0013db 100644 Binary files a/public/img/logos/fcuk/lazy/backroomcastingcouch.png and b/public/img/logos/fcuk/lazy/backroomcastingcouch.png differ diff --git a/public/img/logos/fcuk/lazy/blackambush.png b/public/img/logos/fcuk/lazy/blackambush.png index 98e0b539..4aff30ae 100644 Binary files a/public/img/logos/fcuk/lazy/blackambush.png and b/public/img/logos/fcuk/lazy/blackambush.png differ diff --git a/public/img/logos/fcuk/lazy/eurocoeds.png b/public/img/logos/fcuk/lazy/eurocoeds.png index 67aae1e1..81b9edae 100644 Binary files a/public/img/logos/fcuk/lazy/eurocoeds.png and b/public/img/logos/fcuk/lazy/eurocoeds.png differ diff --git a/public/img/logos/fcuk/lazy/exploitedcollegegirls.png b/public/img/logos/fcuk/lazy/exploitedcollegegirls.png index f24163b9..82550333 100644 Binary files a/public/img/logos/fcuk/lazy/exploitedcollegegirls.png and b/public/img/logos/fcuk/lazy/exploitedcollegegirls.png differ diff --git a/public/img/logos/fcuk/lazy/fcuk.png b/public/img/logos/fcuk/lazy/fcuk.png index be62d0f7..e2f99e73 100644 Binary files a/public/img/logos/fcuk/lazy/fcuk.png and b/public/img/logos/fcuk/lazy/fcuk.png differ diff --git a/public/img/logos/fcuk/lazy/nebraskacoeds.png b/public/img/logos/fcuk/lazy/nebraskacoeds.png index 7dc77e3f..662cfdcf 100644 Binary files a/public/img/logos/fcuk/lazy/nebraskacoeds.png and b/public/img/logos/fcuk/lazy/nebraskacoeds.png differ diff --git a/public/img/logos/fcuk/lazy/network.png b/public/img/logos/fcuk/lazy/network.png index 68416bc4..27d42559 100644 Binary files a/public/img/logos/fcuk/lazy/network.png and b/public/img/logos/fcuk/lazy/network.png differ diff --git a/public/img/logos/fcuk/lazy/southbeachcoeds.png b/public/img/logos/fcuk/lazy/southbeachcoeds.png index 6cccabb6..3eadad80 100644 Binary files a/public/img/logos/fcuk/lazy/southbeachcoeds.png and b/public/img/logos/fcuk/lazy/southbeachcoeds.png differ diff --git a/public/img/logos/fcuk/lazy/springbreaklife.png b/public/img/logos/fcuk/lazy/springbreaklife.png index 1d3a3d9c..d72cbf98 100644 Binary files a/public/img/logos/fcuk/lazy/springbreaklife.png and b/public/img/logos/fcuk/lazy/springbreaklife.png differ diff --git a/public/img/logos/fcuk/network.png b/public/img/logos/fcuk/network.png index 170efcb1..239bfc7e 100644 Binary files a/public/img/logos/fcuk/network.png and b/public/img/logos/fcuk/network.png differ diff --git a/public/img/logos/fcuk/thumbs/afterhoursexposed.png b/public/img/logos/fcuk/thumbs/afterhoursexposed.png index f1841837..2489f9f7 100644 Binary files a/public/img/logos/fcuk/thumbs/afterhoursexposed.png and b/public/img/logos/fcuk/thumbs/afterhoursexposed.png differ diff --git a/public/img/logos/fcuk/thumbs/backroomcastingcouch.png b/public/img/logos/fcuk/thumbs/backroomcastingcouch.png index 9974cca0..56a249ed 100644 Binary files a/public/img/logos/fcuk/thumbs/backroomcastingcouch.png and b/public/img/logos/fcuk/thumbs/backroomcastingcouch.png differ diff --git a/public/img/logos/fcuk/thumbs/blackambush.png b/public/img/logos/fcuk/thumbs/blackambush.png index 6370fff1..9f248a4d 100644 Binary files a/public/img/logos/fcuk/thumbs/blackambush.png and b/public/img/logos/fcuk/thumbs/blackambush.png differ diff --git a/public/img/logos/fcuk/thumbs/eurocoeds.png b/public/img/logos/fcuk/thumbs/eurocoeds.png index a1cba59f..47439e29 100644 Binary files a/public/img/logos/fcuk/thumbs/eurocoeds.png and b/public/img/logos/fcuk/thumbs/eurocoeds.png differ diff --git a/public/img/logos/fcuk/thumbs/exploitedcollegegirls.png b/public/img/logos/fcuk/thumbs/exploitedcollegegirls.png index aa38ca9a..84ab6742 100644 Binary files a/public/img/logos/fcuk/thumbs/exploitedcollegegirls.png and b/public/img/logos/fcuk/thumbs/exploitedcollegegirls.png differ diff --git a/public/img/logos/fcuk/thumbs/fcuk.png b/public/img/logos/fcuk/thumbs/fcuk.png index a10a7e4a..eba131ff 100644 Binary files a/public/img/logos/fcuk/thumbs/fcuk.png and b/public/img/logos/fcuk/thumbs/fcuk.png differ diff --git a/public/img/logos/fcuk/thumbs/nebraskacoeds.png b/public/img/logos/fcuk/thumbs/nebraskacoeds.png index 32e8771a..73305724 100644 Binary files a/public/img/logos/fcuk/thumbs/nebraskacoeds.png and b/public/img/logos/fcuk/thumbs/nebraskacoeds.png differ diff --git a/public/img/logos/fcuk/thumbs/network.png b/public/img/logos/fcuk/thumbs/network.png index 4481159b..98645d0c 100644 Binary files a/public/img/logos/fcuk/thumbs/network.png and b/public/img/logos/fcuk/thumbs/network.png differ diff --git a/public/img/logos/fcuk/thumbs/southbeachcoeds.png b/public/img/logos/fcuk/thumbs/southbeachcoeds.png index 7ed90b1c..902fe470 100644 Binary files a/public/img/logos/fcuk/thumbs/southbeachcoeds.png and b/public/img/logos/fcuk/thumbs/southbeachcoeds.png differ diff --git a/public/img/logos/fcuk/thumbs/springbreaklife.png b/public/img/logos/fcuk/thumbs/springbreaklife.png index dc5e5c79..18bddb25 100644 Binary files a/public/img/logos/fcuk/thumbs/springbreaklife.png and b/public/img/logos/fcuk/thumbs/springbreaklife.png differ diff --git a/seeds/02_sites.js b/seeds/02_sites.js index ea044fee..8e229c8a 100644 --- a/seeds/02_sites.js +++ b/seeds/02_sites.js @@ -2139,6 +2139,12 @@ const sites = [ url: 'https://eurocoeds.com', parent: 'fcuk', }, + { + name: 'After Hours Exposed', + slug: 'afterhoursexposed', + url: 'https://afterhoursexposed.com', + parent: 'fcuk', + }, // FOR BONDAGE { name: 'Crowd Bondage', diff --git a/src/scrapers/fcuk.js b/src/scrapers/fcuk.js index ae9d898e..7eb8b825 100644 --- a/src/scrapers/fcuk.js +++ b/src/scrapers/fcuk.js @@ -2,7 +2,7 @@ const qu = require('../utils/qu'); -function scrapeLatest(scenes, channel) { +function scrapeLatestBlog(scenes, channel) { return scenes.map(({ query }) => { const release = {}; @@ -18,6 +18,11 @@ function scrapeLatest(scenes, channel) { release.description = query.text('p'); release.date = query.date('h5 strong, .videos h3', 'MMM. DD, YYYY', /\w+. \d{2}, \d{4}/); + if (!/\band\b/.test(release.title) && new RegExp(release.title).test(release.description)) { + // scene title is probably the actor name + release.actors = [release.title]; + } + release.poster = query.img('.bigthumb', null, { origin: channel.url }); release.photos = query.imgs('.smallthumb', null, { origin: channel.url }); @@ -27,7 +32,33 @@ function scrapeLatest(scenes, channel) { }); } -function scrapeScene({ query }, url, channel) { +function scrapeAll(scenes, channel) { + return scenes.map(({ query }) => { + const release = {}; + + release.url = query.url('.updateInfo h5 a:not([href*="content/"]):not([href*="#coming"])'); + release.entryId = query.url('.updateThumb img', 'alt'); + + release.title = query.q('.updateInfo h5 a', true); + + release.actors = query.all('.tour_update_models a', true); + release.date = query.date('.availdate, .updateInfo p span:nth-child(2)', 'MM/DD/YYYY'); + + release.poster = query.img('.updateThumb img'); + + const trailer = query.q('.updateInfo h5 a', 'onclick')?.match(/'(.+)'/)?.[1]; + + if (trailer) { + release.trailer = { + src: `${channel.url}${trailer}`, + }; + } + + return release; + }); +} + +function scrapeSceneBlog({ query }, url, channel) { const release = {}; release.entryId = new URL(url).pathname.match(/\/scene\/(\d+)\/(\d+)/).slice(1, 3).join('-'); @@ -35,7 +66,7 @@ function scrapeScene({ query }, url, channel) { release.title = query.q('h4 strong, .videos h3', true); release.description = query.q('#about p, .videos p', true); - const actors = query.urls('a[href*="/girl/"]').map(actorUrl => actorUrl.match(/video-(\w+)/)?.[1]).filter(Boolean); + const actors = query.urls('a[href*="/girl/"]').map(actorUrl => actorUrl.match(/video-([\w\s]+)/)?.[1]).filter(Boolean); if (actors.length > 0) { release.actors = actors; @@ -52,20 +83,69 @@ function scrapeScene({ query }, url, channel) { return release; } -async function fetchLatest(channel, page = 1) { +function scrapeScene({ query, html }, url, channel) { + const release = {}; + + release.title = query.q('.updatesBlock h2', true); + release.poster = query.meta('property="og:image"'); + release.entryId = release.poster.match(/\/content\/(.*)\//)?.[1]; + + const trailer = html.match(/src="(.+\.mp4)"/)?.[1]; + + if (trailer) { + release.trailer = { + src: `${channel.url}${trailer}`, + }; + } + + console.log(release); + return release; +} + +async function fetchLatestBlog(channel, page) { const url = `${channel.url}/free/updates/videos/${(page - 1) * 10}`; const res = await qu.getAll(url, '.videos'); - return res.ok ? scrapeLatest(res.items, channel) : res.status; + return res.ok ? scrapeLatestBlog(res.items, channel) : res.status; +} + +async function fetchLatest(channel, page = 1) { + if (channel.parameters?.blog) { + return fetchLatestBlog(channel, page); + } + + const url = `${channel.url}/categories/Movies_${page}_d.html`; + const res = await qu.getAll(url, '.bodyArea .updateItem'); + + return res.ok ? scrapeAll(res.items, channel) : res.status; +} + +async function fetchUpcoming(channel) { + if (channel.parameters?.blog) { + return []; + } + + const res = await qu.getAll(channel.url, '#owl-upcomingScenes .updateItem'); + + return res.ok ? scrapeAll(res.items, channel) : res.status; } async function fetchScene(url, channel) { const res = await qu.get(url); - return res.ok ? scrapeScene(res.item, url, channel) : res.status; + if (res.ok) { + if (channel.parameters?.blog) { + return scrapeSceneBlog(res.item, url, channel); + } + + return scrapeScene(res.item, url, channel); + } + + return res.status; } module.exports = { fetchLatest, fetchScene, + fetchUpcoming, }; diff --git a/src/updates.js b/src/updates.js index a27d28fb..766b859f 100644 --- a/src/updates.js +++ b/src/updates.js @@ -53,15 +53,15 @@ async function filterUniqueReleases(latestReleases, accReleases) { } function needNextPage(uniqueReleases, pageAccReleases) { - if (argv.last && pageAccReleases.length < argv.last) { - // request for last N releases not yet satisfied - return true; - } - if (uniqueReleases.length === 0) { return false; } + if (argv.last && pageAccReleases.length < argv.last) { + // TODO: find a way to paginate if scraper filters page with multiple channels, see Kelly Madison + return true; + } + if (uniqueReleases.every(release => !!release.date)) { const oldestReleaseOnPage = uniqueReleases .sort((releaseA, releaseB) => releaseB.date - releaseA.date)