diff --git a/public/img/logos/kellymadison/5kporn.png b/public/img/logos/kellymadison/5kporn.png new file mode 100644 index 00000000..30d07919 Binary files /dev/null and b/public/img/logos/kellymadison/5kporn.png differ diff --git a/public/img/logos/kellymadison/5kteens.png b/public/img/logos/kellymadison/5kteens.png new file mode 100644 index 00000000..917460fb Binary files /dev/null and b/public/img/logos/kellymadison/5kteens.png differ diff --git a/public/img/logos/kellymadison/favicon.png b/public/img/logos/kellymadison/favicon.png index 601d3de6..c638f59a 100644 Binary files a/public/img/logos/kellymadison/favicon.png and b/public/img/logos/kellymadison/favicon.png differ diff --git a/public/img/logos/kellymadison/kellymadison.png b/public/img/logos/kellymadison/kellymadison.png index 7781d5f4..d6e03ce7 100644 Binary files a/public/img/logos/kellymadison/kellymadison.png and b/public/img/logos/kellymadison/kellymadison.png differ diff --git a/public/img/logos/kellymadison/lazy/5kporn.png b/public/img/logos/kellymadison/lazy/5kporn.png new file mode 100644 index 00000000..6b26b212 Binary files /dev/null and b/public/img/logos/kellymadison/lazy/5kporn.png differ diff --git a/public/img/logos/kellymadison/lazy/5kteens.png b/public/img/logos/kellymadison/lazy/5kteens.png new file mode 100644 index 00000000..56d04b19 Binary files /dev/null and b/public/img/logos/kellymadison/lazy/5kteens.png differ diff --git a/public/img/logos/kellymadison/lazy/favicon.png b/public/img/logos/kellymadison/lazy/favicon.png index 1f02a11c..5eaba3e4 100644 Binary files a/public/img/logos/kellymadison/lazy/favicon.png and b/public/img/logos/kellymadison/lazy/favicon.png differ diff --git a/public/img/logos/kellymadison/lazy/kellymadison.png b/public/img/logos/kellymadison/lazy/kellymadison.png index fbef56d5..16869f0d 100644 Binary files a/public/img/logos/kellymadison/lazy/kellymadison.png and b/public/img/logos/kellymadison/lazy/kellymadison.png differ diff --git a/public/img/logos/kellymadison/lazy/network.png b/public/img/logos/kellymadison/lazy/network.png index e96141c0..218e4060 100644 Binary files a/public/img/logos/kellymadison/lazy/network.png and b/public/img/logos/kellymadison/lazy/network.png differ diff --git a/public/img/logos/kellymadison/lazy/pornfidelity.png b/public/img/logos/kellymadison/lazy/pornfidelity.png index d4f67fac..cf19a9c8 100644 Binary files a/public/img/logos/kellymadison/lazy/pornfidelity.png and b/public/img/logos/kellymadison/lazy/pornfidelity.png differ diff --git a/public/img/logos/kellymadison/lazy/teenfidelity.png b/public/img/logos/kellymadison/lazy/teenfidelity.png index 29955c0e..c35ec091 100644 Binary files a/public/img/logos/kellymadison/lazy/teenfidelity.png and b/public/img/logos/kellymadison/lazy/teenfidelity.png differ diff --git a/public/img/logos/kellymadison/network.png b/public/img/logos/kellymadison/network.png index 9a3e1e7d..2c925b1d 100644 Binary files a/public/img/logos/kellymadison/network.png and b/public/img/logos/kellymadison/network.png differ diff --git a/public/img/logos/kellymadison/pornfidelity.png b/public/img/logos/kellymadison/pornfidelity.png index b8b8667b..30a19ed3 100644 Binary files a/public/img/logos/kellymadison/pornfidelity.png and b/public/img/logos/kellymadison/pornfidelity.png differ diff --git a/public/img/logos/kellymadison/teenfidelity.png b/public/img/logos/kellymadison/teenfidelity.png index 8b8d8058..b5c72128 100644 Binary files a/public/img/logos/kellymadison/teenfidelity.png and b/public/img/logos/kellymadison/teenfidelity.png differ diff --git a/public/img/logos/kellymadison/thumbs/5kporn.png b/public/img/logos/kellymadison/thumbs/5kporn.png new file mode 100644 index 00000000..03e5f028 Binary files /dev/null and b/public/img/logos/kellymadison/thumbs/5kporn.png differ diff --git a/public/img/logos/kellymadison/thumbs/5kteens.png b/public/img/logos/kellymadison/thumbs/5kteens.png new file mode 100644 index 00000000..d95b95c3 Binary files /dev/null and b/public/img/logos/kellymadison/thumbs/5kteens.png differ diff --git a/public/img/logos/kellymadison/thumbs/favicon.png b/public/img/logos/kellymadison/thumbs/favicon.png index 1f02a11c..5eaba3e4 100644 Binary files a/public/img/logos/kellymadison/thumbs/favicon.png and b/public/img/logos/kellymadison/thumbs/favicon.png differ diff --git a/public/img/logos/kellymadison/thumbs/kellymadison.png b/public/img/logos/kellymadison/thumbs/kellymadison.png index 501f0ef1..492e447d 100644 Binary files a/public/img/logos/kellymadison/thumbs/kellymadison.png and b/public/img/logos/kellymadison/thumbs/kellymadison.png differ diff --git a/public/img/logos/kellymadison/thumbs/network.png b/public/img/logos/kellymadison/thumbs/network.png index 576324bb..7bf1c77e 100644 Binary files a/public/img/logos/kellymadison/thumbs/network.png and b/public/img/logos/kellymadison/thumbs/network.png differ diff --git a/public/img/logos/kellymadison/thumbs/pornfidelity.png b/public/img/logos/kellymadison/thumbs/pornfidelity.png index 621b1867..12de642a 100644 Binary files a/public/img/logos/kellymadison/thumbs/pornfidelity.png and b/public/img/logos/kellymadison/thumbs/pornfidelity.png differ diff --git a/public/img/logos/kellymadison/thumbs/teenfidelity.png b/public/img/logos/kellymadison/thumbs/teenfidelity.png index 6ff648ad..4e87163a 100644 Binary files a/public/img/logos/kellymadison/thumbs/teenfidelity.png and b/public/img/logos/kellymadison/thumbs/teenfidelity.png differ diff --git a/seeds/00_tags.js b/seeds/00_tags.js index 42e55439..b5e7232f 100644 --- a/seeds/00_tags.js +++ b/seeds/00_tags.js @@ -62,6 +62,11 @@ const tags = [ slug: '4k', description: 'Available in high quality 4K resolution.', }, + { + name: '5K', + slug: '5k', + description: 'Available in very high quality 5K resolution.', + }, { name: '69', slug: '69', diff --git a/seeds/02_sites.js b/seeds/02_sites.js index b7e052c0..e463938d 100644 --- a/seeds/02_sites.js +++ b/seeds/02_sites.js @@ -2763,6 +2763,20 @@ const sites = [ description: 'Home of Kelly Madison and Ryan Madison', parent: 'kellymadison', }, + { + slug: '5kporn', + name: '5K Porn', + url: 'https://www.5kporn.com', + tags: ['5k'], + parent: 'kellymadison', + }, + { + slug: '5kteens', + name: '5K Teens', + url: 'https://www.5kteens.com', + tags: ['5k'], + parent: 'kellymadison', + }, // KILLERGRAM { name: 'Urban Perversions', diff --git a/src/scrapers/kellymadison.js b/src/scrapers/kellymadison.js index 34acf751..2781fbd8 100644 --- a/src/scrapers/kellymadison.js +++ b/src/scrapers/kellymadison.js @@ -9,6 +9,8 @@ const siteMapByKey = { PF: 'pornfidelity', TF: 'teenfidelity', KM: 'kellymadison', + '5KP': '5kporn', + '5KT': '5kteens', }; const siteMapBySlug = Object.entries(siteMapByKey).reduce((acc, [key, value]) => ({ ...acc, [value]: key }), {}); @@ -17,9 +19,9 @@ function scrapeLatest(scenes, site) { return scenes.map(({ query }) => { const release = { site }; - release.shootId = query.q('.card-meta .text-right', true); + release.shootId = query.q('.card-meta .text-right, .row .text-right', true); - const siteId = release.shootId.match(/\w{2}/)[0]; + const siteId = release.shootId.match(/\d?\w{2}/)[0]; const siteSlug = siteMapByKey[siteId]; if (site.slug !== siteSlug) { @@ -27,24 +29,28 @@ function scrapeLatest(scenes, site) { return null; } - const { pathname } = new URL(query.url('h5 a')); + const { pathname } = new URL(query.url('h5 a, .ep-title a')); [release.entryId] = pathname.match(/\d+$/); - release.url = `${site.url}/episodes/${release.entryId}`; + release.url = `${site.url}${pathname}`; - release.title = query.q('h5 a', true); + release.title = query.q('h5 a, .ep-title a', true); - release.date = query.date('.card-meta .text-left', ['MMM D', 'MMM D, YYYY'], /\w+ \d+(, \w+)?/); - release.actors = query.all('.models a', true); + release.date = query.date('.card-meta .text-left, .row .col-4:first-child', ['MMM D', 'MMM D, YYYY'], /\w+ \d+(, \w+)?/); + release.actors = query.all('.models a, .ep-models a', true); release.duration = query.dur('.content a'); - const duration = query.q('.content a', true).match(/(\d+) min/)[1]; + const duration = query.q('.content a, .ep-runtime strong', true).match(/(\d+) min/)[1]; if (duration) release.duration = Number(duration) * 60; - release.poster = query.img('.card-img-top'); - release.teaser = { - src: query.video('video'), - }; + if (query.exists('.episodes-preview')) { + [release.poster, ...release.photos] = query.imgs('.episodes-preview img'); + } else { + release.poster = query.img('.card-img-top'); + release.teaser = { + src: query.video('video'), + }; + } return release; }).filter(scene => scene); @@ -56,28 +62,38 @@ async function scrapeScene({ query, html }, url, baseRelease) { [release.entryId] = pathname.match(/\d+$/); - const titleString = query.q('.card-header.row h4', true); + const titleString = query.q('.card-header.row h4, .trailer-starring span', true); const episode = titleString.match(/#\d+$/)[0]; - release.title = titleString.match(/Trailer: ([\w\s]+) -/)[1]; + release.title = query.q('.trailer-title', true) || titleString.match(/Trailer: ([\w\s]+) -/)[1]; release.channel = slugify(titleString.match(/([\w\s]+) #\d+$/)[1], ''); const siteKey = siteMapBySlug[release.channel]; release.shootId = `${siteKey} ${episode}`; - release.description = query.q('p.card-text', true); + release.description = query.q('p.card-text, h5.heavy + p', true); // order not reliable, get keys - const detailElsByKey = query.all('.card-body h4.card-title').reduce((acc, rowEl) => ({ + const detailElsByKey = query.all('.card-body h4.card-title, .video-summary h5').reduce((acc, rowEl) => ({ ...acc, - [slugify(rowEl.textContent.match(/(\w+):/)?.[1])]: rowEl, + [slugify(rowEl?.textContent.match(/(\w+):/)?.[1])]: rowEl, }), {}); release.date = query.date(detailElsByKey.published, null, 'YYYY-MM-DD'); release.duration = query.dur(detailElsByKey.episode); - release.actors = query.all(detailElsByKey.starring, 'a', true); + const posterPrefix = html.indexOf('poster:'); + const poster = query.img('.trailer-poster') || html.slice(html.indexOf('http', posterPrefix), html.indexOf('.jpg', posterPrefix) + 4); + + if (poster) { + if (baseRelease?.poster) { + release.photos = [poster, ...(baseRelease.photos || [])]; + } else { + release.poster = poster; + } + } + const token = query.meta('name=_token'); const trailerInfoUrl = `${origin}/episodes/trailer/sources/${release.entryId}?type=trailer`; const trailerInfoRes = await http.post(trailerInfoUrl, null, { @@ -93,17 +109,6 @@ async function scrapeScene({ query, html }, url, baseRelease) { })); } - const posterPrefix = html.indexOf('poster:'); - const poster = html.slice(html.indexOf('http', posterPrefix), html.indexOf('.jpg', posterPrefix) + 4); - - if (poster) { - if (baseRelease?.poster) { - release.photos = [poster]; - } else { - release.poster = poster; - } - } - return release; } @@ -128,23 +133,21 @@ function scrapeProfile({ query }) { return profile; } -async function fetchLatest(site, page = 1) { - const url = `https://kellymadison.com/episodes/search?page=${page}`; // TLS issues with teenfidelity.com, same overview on all sites +async function fetchLatest(channel, page = 1) { + const url = `${channel.url}/episodes/search?page=${page}`; // TLS issues with teenfidelity.com, same overview on all sites const res = await http.get(url, { 'X-Requested-With': 'XMLHttpRequest', }); if (res.ok && res.body.status === 'success') { - return scrapeLatest(qu.extractAll(res.body.html, '.episode'), site); + return scrapeLatest(qu.extractAll(res.body.html, '.episode, .ep'), channel); } return res.status; } async function fetchScene(url, channel, baseRelease) { - const { pathname } = new URL(url); - - const res = await qu.get(`https://www.kellymadison.com${pathname}`, null, { + const res = await qu.get(url, null, { 'X-Requested-With': 'XMLHttpRequest', });