diff --git a/assets/components/tags/tags.vue b/assets/components/tags/tags.vue index 215aaf58..6098aa4b 100644 --- a/assets/components/tags/tags.vue +++ b/assets/components/tags/tags.vue @@ -50,9 +50,9 @@ async function mounted() { ], appearance: [ 'asian', - 'ebony', + 'black', 'latina', - 'caucasian', + 'white', 'natural-boobs', 'fake-boobs', 'blonde', diff --git a/public/img/logos/pinkyxxx/favicon.png b/public/img/logos/pinkyxxx/favicon.png new file mode 100644 index 00000000..8e99c1ba Binary files /dev/null and b/public/img/logos/pinkyxxx/favicon.png differ diff --git a/public/img/logos/pinkyxxx/lazy/network.png b/public/img/logos/pinkyxxx/lazy/network.png new file mode 100644 index 00000000..68f63719 Binary files /dev/null and b/public/img/logos/pinkyxxx/lazy/network.png differ diff --git a/public/img/logos/pinkyxxx/lazy/pinkyxxx.png b/public/img/logos/pinkyxxx/lazy/pinkyxxx.png new file mode 100644 index 00000000..bd5d210d Binary files /dev/null and b/public/img/logos/pinkyxxx/lazy/pinkyxxx.png differ diff --git a/public/img/logos/pinkyxxx/misc/favicon.png b/public/img/logos/pinkyxxx/misc/favicon.png new file mode 100644 index 00000000..319a2a50 Binary files /dev/null and b/public/img/logos/pinkyxxx/misc/favicon.png differ diff --git a/public/img/logos/pinkyxxx/misc/favicon_background.png b/public/img/logos/pinkyxxx/misc/favicon_background.png new file mode 100644 index 00000000..31bb3de2 Binary files /dev/null and b/public/img/logos/pinkyxxx/misc/favicon_background.png differ diff --git a/public/img/logos/pinkyxxx/misc/favicon_border.png b/public/img/logos/pinkyxxx/misc/favicon_border.png new file mode 100644 index 00000000..8e99c1ba Binary files /dev/null and b/public/img/logos/pinkyxxx/misc/favicon_border.png differ diff --git a/public/img/logos/pinkyxxx/misc/pinky-xxx.png b/public/img/logos/pinkyxxx/misc/pinky-xxx.png new file mode 100644 index 00000000..e4b6b5c8 Binary files /dev/null and b/public/img/logos/pinkyxxx/misc/pinky-xxx.png differ diff --git a/public/img/logos/pinkyxxx/misc/pinky-xxx_tld.png b/public/img/logos/pinkyxxx/misc/pinky-xxx_tld.png new file mode 100644 index 00000000..a42ef9c4 Binary files /dev/null and b/public/img/logos/pinkyxxx/misc/pinky-xxx_tld.png differ diff --git a/public/img/logos/pinkyxxx/network.png b/public/img/logos/pinkyxxx/network.png new file mode 100644 index 00000000..fa8d288d Binary files /dev/null and b/public/img/logos/pinkyxxx/network.png differ diff --git a/public/img/logos/pinkyxxx/pinkyxxx.png b/public/img/logos/pinkyxxx/pinkyxxx.png new file mode 100644 index 00000000..7a5ba7a6 Binary files /dev/null and b/public/img/logos/pinkyxxx/pinkyxxx.png differ diff --git a/public/img/logos/pinkyxxx/thumbs/network.png b/public/img/logos/pinkyxxx/thumbs/network.png new file mode 100644 index 00000000..9c3320f0 Binary files /dev/null and b/public/img/logos/pinkyxxx/thumbs/network.png differ diff --git a/public/img/logos/pinkyxxx/thumbs/pinkyxxx.png b/public/img/logos/pinkyxxx/thumbs/pinkyxxx.png new file mode 100644 index 00000000..adc500e4 Binary files /dev/null and b/public/img/logos/pinkyxxx/thumbs/pinkyxxx.png differ diff --git a/public/img/tags/ebony/1.jpeg b/public/img/tags/black/1.jpeg similarity index 100% rename from public/img/tags/ebony/1.jpeg rename to public/img/tags/black/1.jpeg diff --git a/public/img/tags/ebony/2.jpeg b/public/img/tags/black/2.jpeg similarity index 100% rename from public/img/tags/ebony/2.jpeg rename to public/img/tags/black/2.jpeg diff --git a/public/img/tags/ebony/lazy/1.jpeg b/public/img/tags/black/lazy/1.jpeg similarity index 100% rename from public/img/tags/ebony/lazy/1.jpeg rename to public/img/tags/black/lazy/1.jpeg diff --git a/public/img/tags/ebony/lazy/2.jpeg b/public/img/tags/black/lazy/2.jpeg similarity index 100% rename from public/img/tags/ebony/lazy/2.jpeg rename to public/img/tags/black/lazy/2.jpeg diff --git a/public/img/tags/ebony/thumbs/1.jpeg b/public/img/tags/black/thumbs/1.jpeg similarity index 100% rename from public/img/tags/ebony/thumbs/1.jpeg rename to public/img/tags/black/thumbs/1.jpeg diff --git a/public/img/tags/ebony/thumbs/2.jpeg b/public/img/tags/black/thumbs/2.jpeg similarity index 100% rename from public/img/tags/ebony/thumbs/2.jpeg rename to public/img/tags/black/thumbs/2.jpeg diff --git a/public/img/tags/caucasian/0.jpeg b/public/img/tags/white/0.jpeg similarity index 100% rename from public/img/tags/caucasian/0.jpeg rename to public/img/tags/white/0.jpeg diff --git a/public/img/tags/caucasian/1.jpeg b/public/img/tags/white/1.jpeg similarity index 100% rename from public/img/tags/caucasian/1.jpeg rename to public/img/tags/white/1.jpeg diff --git a/public/img/tags/caucasian/2.jpeg b/public/img/tags/white/2.jpeg similarity index 100% rename from public/img/tags/caucasian/2.jpeg rename to public/img/tags/white/2.jpeg diff --git a/public/img/tags/caucasian/lazy/0.jpeg b/public/img/tags/white/lazy/0.jpeg similarity index 100% rename from public/img/tags/caucasian/lazy/0.jpeg rename to public/img/tags/white/lazy/0.jpeg diff --git a/public/img/tags/caucasian/lazy/1.jpeg b/public/img/tags/white/lazy/1.jpeg similarity index 100% rename from public/img/tags/caucasian/lazy/1.jpeg rename to public/img/tags/white/lazy/1.jpeg diff --git a/public/img/tags/caucasian/lazy/2.jpeg b/public/img/tags/white/lazy/2.jpeg similarity index 100% rename from public/img/tags/caucasian/lazy/2.jpeg rename to public/img/tags/white/lazy/2.jpeg diff --git a/public/img/tags/caucasian/lazy/poster.jpeg b/public/img/tags/white/lazy/poster.jpeg similarity index 100% rename from public/img/tags/caucasian/lazy/poster.jpeg rename to public/img/tags/white/lazy/poster.jpeg diff --git a/public/img/tags/caucasian/poster.jpeg b/public/img/tags/white/poster.jpeg similarity index 100% rename from public/img/tags/caucasian/poster.jpeg rename to public/img/tags/white/poster.jpeg diff --git a/public/img/tags/caucasian/thumbs/0.jpeg b/public/img/tags/white/thumbs/0.jpeg similarity index 100% rename from public/img/tags/caucasian/thumbs/0.jpeg rename to public/img/tags/white/thumbs/0.jpeg diff --git a/public/img/tags/caucasian/thumbs/1.jpeg b/public/img/tags/white/thumbs/1.jpeg similarity index 100% rename from public/img/tags/caucasian/thumbs/1.jpeg rename to public/img/tags/white/thumbs/1.jpeg diff --git a/public/img/tags/caucasian/thumbs/2.jpeg b/public/img/tags/white/thumbs/2.jpeg similarity index 100% rename from public/img/tags/caucasian/thumbs/2.jpeg rename to public/img/tags/white/thumbs/2.jpeg diff --git a/public/img/tags/caucasian/thumbs/poster.jpeg b/public/img/tags/white/thumbs/poster.jpeg similarity index 100% rename from public/img/tags/caucasian/thumbs/poster.jpeg rename to public/img/tags/white/thumbs/poster.jpeg diff --git a/seeds/00_tags.js b/seeds/00_tags.js index b192f241..8fbdefdd 100644 --- a/seeds/00_tags.js +++ b/seeds/00_tags.js @@ -407,8 +407,8 @@ const tags = [ group: 'clothing', }, { - name: 'ebony', - slug: 'ebony', + name: 'black', + slug: 'black', priority: 5, group: 'ethnicity', }, @@ -967,8 +967,8 @@ const tags = [ slug: 'wet', }, { - name: 'caucasian', - slug: 'caucasian', + name: 'white', + slug: 'white', priority: 7, group: 'ethnicity', }, @@ -1187,8 +1187,8 @@ const aliases = [ for: 'bisexual', }, { - name: 'black', - for: 'ebony', + name: 'ebony', + for: 'black', }, { name: 'blonde hair', @@ -1824,8 +1824,8 @@ const aliases = [ for: 'corporal-punishment', }, { - name: 'white', - for: 'caucasian', + name: 'caucasian', + for: 'white', }, { name: 'work', diff --git a/seeds/02_sites.js b/seeds/02_sites.js index 78d34e5f..0a7b1a29 100644 --- a/seeds/02_sites.js +++ b/seeds/02_sites.js @@ -5666,7 +5666,7 @@ const sites = [ description: "You've just won the golden ticket to the best Chocolate BJs on the planet! We've sought far and wide to bring you the most beautiful black and ethnic pornstars. And they're in our members' area now! They can't wait to suck your white lollipop and lick the thick cream shooting from your big dick. Of course, no matter how sweet the booty or juicy the big tits, these brown foxes aren't all sugar and spice. In fact, when it comes to giving head, these big ass ebony babes know what they want: huge white cocks filling their throats!", url: 'http://www.chocolatebjs.com', parent: 'pervcity', - tags: ['blowjob', 'ebony'], + tags: ['blowjob', 'black'], parameters: { siteId: 5, tourId: 6, @@ -5724,6 +5724,13 @@ const sites = [ url: 'https://bcm.xxx', parent: 'pimpxxx', }, + // PINKY XXX + { + name: 'Pinky XXX', + slug: 'pinkyxxx', + url: 'https://pinkyxxx.com', + independent: true, + }, // PORN CZ { name: 'Czech Sex Casting', @@ -8113,7 +8120,7 @@ const sites = [ slug: 'myblackcoeds', url: 'https://teencoreclub.com/browsevideos/site/302/MyBlackCoeds', tags: [ - 'ebony', + 'black', ], alias: [ 'mbc', @@ -9200,7 +9207,7 @@ const sites = [ description: 'AllBlackX.com features the hottest ebony pornstar beauties in hardcore black on black gonzo porn. From director Mason, watch 4k ultra HD videos inside', url: 'https://www.allblackx.com', parent: 'xempire', - tags: ['ebony', 'bbc'], + tags: ['black', 'bbc'], }, { slug: 'lesbianx', diff --git a/seeds/04_media.js b/seeds/04_media.js index 0b4bede4..c0c44a13 100644 --- a/seeds/04_media.js +++ b/seeds/04_media.js @@ -605,7 +605,7 @@ const tagPosters = [ ['brunette', 0, 'Darcie Dolce for Playboy'], ['bondage', 0, 'Veronica Leal for Her Limit'], ['bukkake', 0, 'Jaye Summers in "Facialized 5" for HardX'], - ['caucasian', 2, 'Kenzie Reeves for Bang'], + ['white', 2, 'Kenzie Reeves for Bang'], ['creampie', 1, 'Eveline Dellai for Nubiles'], ['cum-in-mouth', 1, 'Sarah Vandella in "Blow Bang Vandella" for HardX'], ['cum-on-butt', 0, 'Jynx Maze in "Don\'t Make Me Beg 4" for Evil Angel'], @@ -623,7 +623,7 @@ const tagPosters = [ ['dp', 3, 'Hime Marie in LegalPorno AA047'], ['dvp', 'poster', 'Riley Reid in "Pizza That Ass" for Reid My Lips'], ['dv-tp', 'poster', 'Juelz Ventura in "Gangbanged 5" for Elegant Angel'], - ['ebony', 2, 'Nia Nacci for Sweetheart Video'], + ['black', 2, 'Nia Nacci for Sweetheart Video'], ['facefucking', 5, 'Mia Moore B for Throated'], ['facial', 0, 'Brooklyn Gray in "All About Ass 4" for Evil Angel'], ['fake-boobs', 7, 'Charley Atwell for iCandiGirls'], @@ -722,8 +722,8 @@ const tagPhotos = [ ['blowjob', 3, 'Rose Valie for Hands On Hardcore'], ['blowjob', 2, 'Luna Kitsuen in "Gag Reflex" for Evil Angel'], // ['bukkake', 'poster', 'Mia Malkova in "Facialized 2" for HardX'], - ['caucasian', 0, 'Remy Lacroix for HardX'], - ['caucasian', 1, 'Sheena Shaw for Brazzers'], + ['white', 0, 'Remy Lacroix for HardX'], + ['white', 1, 'Sheena Shaw for Brazzers'], ['creampie', 2, 'Natasha Lapiedra in "New and Ready" for 5K Porn'], ['creampie', 'poster', 'Alina Lopez in "Making Yourself Unforgettable" for Blacked'], ['cum-drunk', 0, 'Ashly Anderson in "Rough Love" for Hookup Hotshot'], @@ -791,7 +791,7 @@ const tagPhotos = [ ['dvp', 0, 'Aaliyah Hadid in "Squirting From Double Penetration With Anal" for Bang Bros'], ['dv-tp', 1, 'Adriana Chechik in "Adriana\'s Triple Anal Penetration!"'], ['dv-tp', 0, 'Luna Rival in LegalPorno SZ1490'], - ['ebony', 1, 'Ana Foxxx in "DP Me 4" for HardX'], + ['black', 1, 'Ana Foxxx in "DP Me 4" for HardX'], ['facial', 3, 'Paige Owens in "Oral Restraint" for Babes'], ['facial', 'poster', 'Jynx Maze'], ['facial', 2, 'Ashly Anderson for Hookup Hotshot'], diff --git a/src/scrapers/pinkyxxx.js b/src/scrapers/pinkyxxx.js new file mode 100644 index 00000000..d0f4d1da --- /dev/null +++ b/src/scrapers/pinkyxxx.js @@ -0,0 +1,112 @@ +'use strict'; + +const qu = require('../utils/qu'); +const http = require('../utils/http'); + +async function getTrailer(entryId, channel) { + const videoLinksRes = await http.post('https://pinkyxxx.com/wp-admin/admin-ajax.php', { + action: 'vidplay', + vid: entryId, + type: 'promo', + }, { + encodeJSON: false, + decodeJSON: true, + }); + + if (!videoLinksRes.ok || !videoLinksRes.body.size1) { + return null; + } + + const scriptUrl = qu.extract(videoLinksRes.body.size1)?.query.url('script', 'src', { origin: channel.url }); + const videoScriptRes = await http.get(scriptUrl); + + if (!videoScriptRes.ok) { + return null; + } + + const videoDataString = videoScriptRes.body.match(/"clip":({.*"})/)?.[1]; + const videoData = videoDataString && JSON.parse(videoDataString); + + const posterUrlString = videoScriptRes.body.match(/src="(.*poster.*?)"/)?.[1]; + const posterUrlEl = videoScriptRes.document.createElement('span'); + + posterUrlEl.innerHTML = posterUrlString; + + return { + trailer: videoData?.url || null, + poster: posterUrlEl.textContent || null, + }; +} + +function scrapeAll(scenes) { + return scenes.map((scene) => { + const release = {}; + + release.entryId = scene.ID; + release.url = scene.permalink; + + release.title = scene.title; + release.description = scene.description; + + release.date = qu.extractDate(scene.info?.post_date, 'YYYY-MM-DD HH:mm:ss') || qu.extractDate(scene.date, 'MMMM D, YYYY'); // eslint-disable-line camelcase + + release.poster = scene.poster[0]; + release.photos = Object.entries(scene).reduce((acc, [key, data]) => { + if (/thumb/.test(key)) { + return [...acc, data.url]; + } + + return acc; + }, []); + + return release; + }); +} + +async function scrapeScene({ query }, channel) { + const release = {}; + + release.title = query.cnt('.title'); + release.description = query.cnt('.description'); + + release.entryId = query.q('body', 'class').match(/postid-(\d+)/)?.[1]; + + const { poster, trailer } = await getTrailer(release.entryId, channel) || {}; + + release.poster = poster; + release.trailer = trailer; + + return release; +} + +async function fetchLatest(channel, page) { + const res = await http.post('https://pinkyxxx.com/wp-admin/admin-ajax.php', { + action: 'vls', + limit: 10, + offset: (page - 1) * 10, + }, { + encodeJSON: false, + decodeJSON: true, + }); + + if (res.ok) { + return scrapeAll(res.body.listings); + } + + return res.status; +} + +async function fetchScene(url, channel) { + const res = await qu.get(url); + + if (res.ok) { + return scrapeScene(res.item, channel); + } + + return res.status; +} + +module.exports = { + fetchLatest, + fetchScene, +}; diff --git a/src/scrapers/scrapers.js b/src/scrapers/scrapers.js index 9dac647c..766580bc 100644 --- a/src/scrapers/scrapers.js +++ b/src/scrapers/scrapers.js @@ -56,6 +56,7 @@ const pervcity = require('./pervcity'); const porncz = require('./porncz'); const pornhub = require('./pornhub'); const pascalssubsluts = require('./pascalssubsluts'); // reserved keyword +const pinkyxxx = require('./pinkyxxx'); const privateNetwork = require('./private'); // reserved keyword const puretaboo = require('./puretaboo'); const realitykings = require('./realitykings'); @@ -146,6 +147,7 @@ const scrapers = { perfectgonzo, pervcity, pimpxxx: cherrypimps, + pinkyxxx, porncz, pornpros: whalemember, private: privateNetwork,