diff --git a/assets/components/actors/actor.vue b/assets/components/actors/actor.vue index dc42be69..9779b848 100644 --- a/assets/components/actors/actor.vue +++ b/assets/components/actors/actor.vue @@ -166,6 +166,32 @@ +
  • + Dick + + + + + + + + +
  • +
  • + +circles2 + + + diff --git a/assets/img/icons/crop.svg b/assets/img/icons/crop.svg new file mode 100644 index 00000000..c769dee8 --- /dev/null +++ b/assets/img/icons/crop.svg @@ -0,0 +1,5 @@ + + +crop + + diff --git a/assets/img/icons/height2.svg b/assets/img/icons/height2.svg new file mode 100644 index 00000000..249f4b54 --- /dev/null +++ b/assets/img/icons/height2.svg @@ -0,0 +1,5 @@ + + +height2 + + diff --git a/assets/img/icons/highlight.svg b/assets/img/icons/highlight.svg new file mode 100644 index 00000000..1289abc1 --- /dev/null +++ b/assets/img/icons/highlight.svg @@ -0,0 +1,5 @@ + + +highlight + + diff --git a/assets/img/icons/page-break.svg b/assets/img/icons/page-break.svg new file mode 100644 index 00000000..27abd4ae --- /dev/null +++ b/assets/img/icons/page-break.svg @@ -0,0 +1,5 @@ + + +page-break + + diff --git a/assets/img/icons/page-break2.svg b/assets/img/icons/page-break2.svg new file mode 100644 index 00000000..71d64ae0 --- /dev/null +++ b/assets/img/icons/page-break2.svg @@ -0,0 +1,5 @@ + + +page-break2 + + diff --git a/assets/img/icons/radio-unchecked.svg b/assets/img/icons/radio-unchecked.svg new file mode 100644 index 00000000..b9726805 --- /dev/null +++ b/assets/img/icons/radio-unchecked.svg @@ -0,0 +1,5 @@ + + +radio-unchecked + + diff --git a/assets/img/icons/rulers.svg b/assets/img/icons/rulers.svg new file mode 100644 index 00000000..63b5551f --- /dev/null +++ b/assets/img/icons/rulers.svg @@ -0,0 +1,5 @@ + + +rulers + + diff --git a/assets/img/icons/scissors3.svg b/assets/img/icons/scissors3.svg new file mode 100644 index 00000000..d080d2bf --- /dev/null +++ b/assets/img/icons/scissors3.svg @@ -0,0 +1,5 @@ + + +scissors3 + + diff --git a/assets/img/icons/spinner11.svg b/assets/img/icons/spinner11.svg new file mode 100644 index 00000000..08f9e82c --- /dev/null +++ b/assets/img/icons/spinner11.svg @@ -0,0 +1,5 @@ + + +spinner11 + + diff --git a/assets/img/icons/target.svg b/assets/img/icons/target.svg new file mode 100644 index 00000000..52af8f29 --- /dev/null +++ b/assets/img/icons/target.svg @@ -0,0 +1,5 @@ + + +target + + diff --git a/assets/img/icons/target2.svg b/assets/img/icons/target2.svg new file mode 100644 index 00000000..395e2748 --- /dev/null +++ b/assets/img/icons/target2.svg @@ -0,0 +1,5 @@ + + +target2 + + diff --git a/assets/img/icons/target3.svg b/assets/img/icons/target3.svg new file mode 100644 index 00000000..d3bac7f3 --- /dev/null +++ b/assets/img/icons/target3.svg @@ -0,0 +1,5 @@ + + +target3 + + diff --git a/assets/img/icons/tree.svg b/assets/img/icons/tree.svg new file mode 100644 index 00000000..93acf006 --- /dev/null +++ b/assets/img/icons/tree.svg @@ -0,0 +1,5 @@ + + +tree + + diff --git a/assets/img/icons/width.svg b/assets/img/icons/width.svg new file mode 100644 index 00000000..d5de10c2 --- /dev/null +++ b/assets/img/icons/width.svg @@ -0,0 +1,5 @@ + + +width + + diff --git a/assets/js/actors/actions.js b/assets/js/actors/actions.js index e54759f1..73aad7f5 100644 --- a/assets/js/actors/actions.js +++ b/assets/js/actors/actions.js @@ -45,6 +45,11 @@ function initActorActions(store, router) { waist hip naturalBoobs + penisLengthMetric: penisLength(units:METRIC) + penisLengthImperial: penisLength(units:IMPERIAL) + penisGirthMetric: penisGirth(units:METRIC) + penisGirthImperial: penisGirth(units:IMPERIAL) + circumcised heightMetric: height(units:METRIC) heightImperial: height(units:IMPERIAL) weightMetric: weight(units:METRIC) diff --git a/migrations/20190325001339_releases.js b/migrations/20190325001339_releases.js index 7658a2a5..4a79b88a 100644 --- a/migrations/20190325001339_releases.js +++ b/migrations/20190325001339_releases.js @@ -278,6 +278,7 @@ exports.up = knex => Promise.resolve() table.integer('penis_length', 3); table.integer('penis_girth', 3); + table.boolean('circumcised'); table.integer('height', 3); table.integer('weight', 3); @@ -355,6 +356,7 @@ exports.up = knex => Promise.resolve() table.integer('penis_length', 3); table.integer('penis_girth', 3); + table.boolean('circumcised'); table.integer('height', 3); table.integer('weight', 3); @@ -1144,6 +1146,8 @@ exports.up = knex => Promise.resolve() return knex.raw(` COMMENT ON COLUMN actors.height IS E'@omit read,update,create,delete,all,many'; COMMENT ON COLUMN actors.weight IS E'@omit read,update,create,delete,all,many'; + COMMENT ON COLUMN actors.penis_length IS E'@omit read,update,create,delete,all,many'; + COMMENT ON COLUMN actors.penis_girth IS E'@omit read,update,create,delete,all,many'; COMMENT ON FUNCTION actors_tags IS E'@sortable'; COMMENT ON FUNCTION actors_channels IS E'@sortable'; diff --git a/public/img/logos/hussiepass/hussiepass.png b/public/img/logos/hussiepass/hussiepass.png index 490d2d03..55d77583 100644 Binary files a/public/img/logos/hussiepass/hussiepass.png and b/public/img/logos/hussiepass/hussiepass.png differ diff --git a/public/img/logos/hussiepass/lazy/eyeontheguy.png b/public/img/logos/hussiepass/lazy/eyeontheguy.png index 275e77be..aa2ce422 100644 Binary files a/public/img/logos/hussiepass/lazy/eyeontheguy.png and b/public/img/logos/hussiepass/lazy/eyeontheguy.png differ diff --git a/public/img/logos/hussiepass/lazy/favicon.png b/public/img/logos/hussiepass/lazy/favicon.png index 65facede..15d07144 100644 Binary files a/public/img/logos/hussiepass/lazy/favicon.png and b/public/img/logos/hussiepass/lazy/favicon.png differ diff --git a/public/img/logos/hussiepass/lazy/hussiepass.png b/public/img/logos/hussiepass/lazy/hussiepass.png index 9d5f6ab9..dc02ec86 100644 Binary files a/public/img/logos/hussiepass/lazy/hussiepass.png and b/public/img/logos/hussiepass/lazy/hussiepass.png differ diff --git a/public/img/logos/hussiepass/lazy/interracialpovs.png b/public/img/logos/hussiepass/lazy/interracialpovs.png index 2d88e126..3286242a 100644 Binary files a/public/img/logos/hussiepass/lazy/interracialpovs.png and b/public/img/logos/hussiepass/lazy/interracialpovs.png differ diff --git a/public/img/logos/hussiepass/lazy/network.png b/public/img/logos/hussiepass/lazy/network.png index 9870727e..653e4bf4 100644 Binary files a/public/img/logos/hussiepass/lazy/network.png and b/public/img/logos/hussiepass/lazy/network.png differ diff --git a/public/img/logos/hussiepass/lazy/povpornstars.png b/public/img/logos/hussiepass/lazy/povpornstars.png index 96ddaa9a..ea787b92 100644 Binary files a/public/img/logos/hussiepass/lazy/povpornstars.png and b/public/img/logos/hussiepass/lazy/povpornstars.png differ diff --git a/public/img/logos/hussiepass/lazy/seehimfuck.png b/public/img/logos/hussiepass/lazy/seehimfuck.png index a5b6cebc..155926da 100644 Binary files a/public/img/logos/hussiepass/lazy/seehimfuck.png and b/public/img/logos/hussiepass/lazy/seehimfuck.png differ diff --git a/public/img/logos/hussiepass/misc/hussie-pass_neon.jpg b/public/img/logos/hussiepass/misc/hussie-pass_neon.jpg new file mode 100644 index 00000000..22fb6c63 Binary files /dev/null and b/public/img/logos/hussiepass/misc/hussie-pass_neon.jpg differ diff --git a/public/img/logos/hussiepass/misc/hussie-pass_neon.png b/public/img/logos/hussiepass/misc/hussie-pass_neon.png new file mode 100644 index 00000000..394764f6 Binary files /dev/null and b/public/img/logos/hussiepass/misc/hussie-pass_neon.png differ diff --git a/public/img/logos/hussiepass/misc/hussie-pass_neon_emblem.jpg b/public/img/logos/hussiepass/misc/hussie-pass_neon_emblem.jpg new file mode 100644 index 00000000..2e9e730c Binary files /dev/null and b/public/img/logos/hussiepass/misc/hussie-pass_neon_emblem.jpg differ diff --git a/public/img/logos/hussiepass/misc/hussie-pass_neon_full.png b/public/img/logos/hussiepass/misc/hussie-pass_neon_full.png new file mode 100644 index 00000000..ee5d8286 Binary files /dev/null and b/public/img/logos/hussiepass/misc/hussie-pass_neon_full.png differ diff --git a/public/img/logos/hussiepass/thumbs/eyeontheguy.png b/public/img/logos/hussiepass/thumbs/eyeontheguy.png index 542c3ed1..4144cf33 100644 Binary files a/public/img/logos/hussiepass/thumbs/eyeontheguy.png and b/public/img/logos/hussiepass/thumbs/eyeontheguy.png differ diff --git a/public/img/logos/hussiepass/thumbs/favicon.png b/public/img/logos/hussiepass/thumbs/favicon.png index 65facede..15d07144 100644 Binary files a/public/img/logos/hussiepass/thumbs/favicon.png and b/public/img/logos/hussiepass/thumbs/favicon.png differ diff --git a/public/img/logos/hussiepass/thumbs/hussiepass.png b/public/img/logos/hussiepass/thumbs/hussiepass.png index 9674869f..01a354fe 100644 Binary files a/public/img/logos/hussiepass/thumbs/hussiepass.png and b/public/img/logos/hussiepass/thumbs/hussiepass.png differ diff --git a/public/img/logos/hussiepass/thumbs/interracialpovs.png b/public/img/logos/hussiepass/thumbs/interracialpovs.png index f13ac1a9..f949113e 100644 Binary files a/public/img/logos/hussiepass/thumbs/interracialpovs.png and b/public/img/logos/hussiepass/thumbs/interracialpovs.png differ diff --git a/public/img/logos/hussiepass/thumbs/network.png b/public/img/logos/hussiepass/thumbs/network.png index 387b8b03..a17d2828 100644 Binary files a/public/img/logos/hussiepass/thumbs/network.png and b/public/img/logos/hussiepass/thumbs/network.png differ diff --git a/public/img/logos/hussiepass/thumbs/povpornstars.png b/public/img/logos/hussiepass/thumbs/povpornstars.png index 189d2df4..d0e34932 100644 Binary files a/public/img/logos/hussiepass/thumbs/povpornstars.png and b/public/img/logos/hussiepass/thumbs/povpornstars.png differ diff --git a/public/img/logos/hussiepass/thumbs/seehimfuck.png b/public/img/logos/hussiepass/thumbs/seehimfuck.png index b54a80c1..beae41db 100644 Binary files a/public/img/logos/hussiepass/thumbs/seehimfuck.png and b/public/img/logos/hussiepass/thumbs/seehimfuck.png differ diff --git a/public/img/tags/deepthroat/3.jpeg b/public/img/tags/deepthroat/3.jpeg new file mode 100644 index 00000000..3c31d301 Binary files /dev/null and b/public/img/tags/deepthroat/3.jpeg differ diff --git a/public/img/tags/deepthroat/lazy/3.jpeg b/public/img/tags/deepthroat/lazy/3.jpeg new file mode 100644 index 00000000..0071711a Binary files /dev/null and b/public/img/tags/deepthroat/lazy/3.jpeg differ diff --git a/public/img/tags/deepthroat/thumbs/3.jpeg b/public/img/tags/deepthroat/thumbs/3.jpeg new file mode 100644 index 00000000..c3a7bc1f Binary files /dev/null and b/public/img/tags/deepthroat/thumbs/3.jpeg differ diff --git a/public/img/tags/fake-cum/0.jpeg b/public/img/tags/fake-cum/0.jpeg new file mode 100644 index 00000000..a41833c9 Binary files /dev/null and b/public/img/tags/fake-cum/0.jpeg differ diff --git a/public/img/tags/fake-cum/0a.jpeg b/public/img/tags/fake-cum/0a.jpeg new file mode 100644 index 00000000..144550e1 Binary files /dev/null and b/public/img/tags/fake-cum/0a.jpeg differ diff --git a/public/img/tags/fake-cum/1.jpeg b/public/img/tags/fake-cum/1.jpeg new file mode 100644 index 00000000..791ed889 Binary files /dev/null and b/public/img/tags/fake-cum/1.jpeg differ diff --git a/public/img/tags/fake-cum/1a.jpeg b/public/img/tags/fake-cum/1a.jpeg new file mode 100644 index 00000000..176661c4 Binary files /dev/null and b/public/img/tags/fake-cum/1a.jpeg differ diff --git a/public/img/tags/fake-cum/2.jpeg b/public/img/tags/fake-cum/2.jpeg new file mode 100644 index 00000000..942657a8 Binary files /dev/null and b/public/img/tags/fake-cum/2.jpeg differ diff --git a/public/img/tags/fake-cum/lazy/0.jpeg b/public/img/tags/fake-cum/lazy/0.jpeg new file mode 100644 index 00000000..8c8a3d36 Binary files /dev/null and b/public/img/tags/fake-cum/lazy/0.jpeg differ diff --git a/public/img/tags/fake-cum/lazy/0a.jpeg b/public/img/tags/fake-cum/lazy/0a.jpeg new file mode 100644 index 00000000..c3a2ddc9 Binary files /dev/null and b/public/img/tags/fake-cum/lazy/0a.jpeg differ diff --git a/public/img/tags/fake-cum/lazy/1.jpeg b/public/img/tags/fake-cum/lazy/1.jpeg new file mode 100644 index 00000000..f0b8de0d Binary files /dev/null and b/public/img/tags/fake-cum/lazy/1.jpeg differ diff --git a/public/img/tags/fake-cum/lazy/1a.jpeg b/public/img/tags/fake-cum/lazy/1a.jpeg new file mode 100644 index 00000000..e4f170ff Binary files /dev/null and b/public/img/tags/fake-cum/lazy/1a.jpeg differ diff --git a/public/img/tags/fake-cum/lazy/2.jpeg b/public/img/tags/fake-cum/lazy/2.jpeg new file mode 100644 index 00000000..a67790c2 Binary files /dev/null and b/public/img/tags/fake-cum/lazy/2.jpeg differ diff --git a/public/img/tags/fake-cum/thumbs/0.jpeg b/public/img/tags/fake-cum/thumbs/0.jpeg new file mode 100644 index 00000000..5168a93f Binary files /dev/null and b/public/img/tags/fake-cum/thumbs/0.jpeg differ diff --git a/public/img/tags/fake-cum/thumbs/0a.jpeg b/public/img/tags/fake-cum/thumbs/0a.jpeg new file mode 100644 index 00000000..9f01c676 Binary files /dev/null and b/public/img/tags/fake-cum/thumbs/0a.jpeg differ diff --git a/public/img/tags/fake-cum/thumbs/1.jpeg b/public/img/tags/fake-cum/thumbs/1.jpeg new file mode 100644 index 00000000..44227139 Binary files /dev/null and b/public/img/tags/fake-cum/thumbs/1.jpeg differ diff --git a/public/img/tags/fake-cum/thumbs/1a.jpeg b/public/img/tags/fake-cum/thumbs/1a.jpeg new file mode 100644 index 00000000..c5bb8e1a Binary files /dev/null and b/public/img/tags/fake-cum/thumbs/1a.jpeg differ diff --git a/public/img/tags/fake-cum/thumbs/2.jpeg b/public/img/tags/fake-cum/thumbs/2.jpeg new file mode 100644 index 00000000..6e95b4ee Binary files /dev/null and b/public/img/tags/fake-cum/thumbs/2.jpeg differ diff --git a/public/img/tags/interracial/1.jpeg b/public/img/tags/interracial/1.jpeg new file mode 100644 index 00000000..fe0dc09a Binary files /dev/null and b/public/img/tags/interracial/1.jpeg differ diff --git a/public/img/tags/interracial/1a.jpeg b/public/img/tags/interracial/1a.jpeg new file mode 100644 index 00000000..d48f806a Binary files /dev/null and b/public/img/tags/interracial/1a.jpeg differ diff --git a/public/img/tags/interracial/lazy/1.jpeg b/public/img/tags/interracial/lazy/1.jpeg new file mode 100644 index 00000000..44c8105c Binary files /dev/null and b/public/img/tags/interracial/lazy/1.jpeg differ diff --git a/public/img/tags/interracial/lazy/1a.jpeg b/public/img/tags/interracial/lazy/1a.jpeg new file mode 100644 index 00000000..5157bd77 Binary files /dev/null and b/public/img/tags/interracial/lazy/1a.jpeg differ diff --git a/public/img/tags/interracial/thumbs/0.jpeg b/public/img/tags/interracial/thumbs/0.jpeg index cc9a7056..df3ae25a 100644 Binary files a/public/img/tags/interracial/thumbs/0.jpeg and b/public/img/tags/interracial/thumbs/0.jpeg differ diff --git a/public/img/tags/interracial/thumbs/1.jpeg b/public/img/tags/interracial/thumbs/1.jpeg new file mode 100644 index 00000000..284e3b14 Binary files /dev/null and b/public/img/tags/interracial/thumbs/1.jpeg differ diff --git a/public/img/tags/interracial/thumbs/1a.jpeg b/public/img/tags/interracial/thumbs/1a.jpeg new file mode 100644 index 00000000..5a8623bc Binary files /dev/null and b/public/img/tags/interracial/thumbs/1a.jpeg differ diff --git a/seeds/02_sites.js b/seeds/02_sites.js index 112ff34c..454e7280 100644 --- a/seeds/02_sites.js +++ b/seeds/02_sites.js @@ -3066,9 +3066,6 @@ const sites = [ url: 'https://seehimfuck.com', tags: ['male-focus'], parent: 'hussiepass', - parameters: { - tour: true, - }, }, { slug: 'interracialpovs', @@ -3076,9 +3073,6 @@ const sites = [ url: 'https://www.interracialpovs.com', tags: ['interracial', 'pov'], parent: 'hussiepass', - parameters: { - tour: true, - }, }, { slug: 'povpornstars', @@ -3089,7 +3083,6 @@ const sites = [ parameters: { latest: 'http://www.povpornstars.com/tour/categories/movies_%d_d.html', profile: 'http://www.povpornstars.com/tour/models/%s.html', - tour: true, }, }, // HUSH PASS @@ -3176,7 +3169,7 @@ const sites = [ url: 'https://suburbansexparty.com', parent: 'hushpass', parameters: { - latest: 'https://hushpass.com/t1/categories/suburban-sex-party_%_d.html', + latest: 'https://hushpass.com/t1/categories/suburban-sex-party_%d_d.html', media: 'https://hushpass.com', t1: true, }, diff --git a/seeds/04_media.js b/seeds/04_media.js index 44cda6ae..c5a4b755 100644 --- a/seeds/04_media.js +++ b/seeds/04_media.js @@ -627,6 +627,7 @@ const tagPosters = [ ['facefucking', 5, 'Mia Moore B for Throated'], ['facial', 0, 'Brooklyn Gray in "All About Ass 4" for Evil Angel'], ['fake-boobs', 14, 'Rikki Six for Dream Dolls'], + ['fake-cum', 2, 'Mimi Allen for Fucked Up Facials'], ['family', 0, 'Teanna Trump in "A Family Appear: Part One" for Brazzers'], ['femdom', 0, 'Alina Li in "Asian Domination… She Holds Jules Jordan\'s Cock Hostage!" for Jules Jordan'], ['fingering', 1, 'Marry Queen for Babespotting.tv'], @@ -634,7 +635,7 @@ const tagPosters = [ ['gangbang', 5, 'Carter Cruise\'s first gangbang in "Slut Puppies 9" for Jules Jordan'], ['gaping', 1, 'Vina Sky in "Vina Sky Does Anal" for HardX'], ['indian', 0, 'Resha in "Casting Resha" for Watch 4 Beauty'], - ['interracial', 0, 'Jaye Summers and Prince Yahshua in "Platinum Pussy 3" for Jules Jordan'], + ['interracial', 1, 'Caprice and Valerie in "Sexual Attraction" for Hegre'], ['latina', 3, 'Gina Valentina for Brazzers'], ['lesbian', 0, 'Jenna Sativa and Alina Lopez in "Opposites Attract" for Girl Girl'], ['maid', 0, 'Whitney Wright in "Dredd Up Your Ass 2" for Jules Jordan'], @@ -731,6 +732,7 @@ const tagPhotos = [ // ['dap', 8, 'Lady Gang in SZ2478 LegalPorno'], ['dap', 'poster', 'Haley Reed in "Young Hot Ass" for Evil Angel'], ['dap', 0, 'Nicole Black doing double anal during a gangbang in GIO971 for LegalPorno'], + ['deepthroat', 3, 'Kira Noir in "Ebony Throat Vs Monster Cock" for Throated'], ['deepthroat', 1, 'Jynx Maze in "Slutty and Sluttier 13" for Evil Angel'], ['deepthroat', 0, 'Chanel Grey in "Deepthroating Is Fun" for Throated'], ['double-blowjob', 0, 'Kira Noir and Kali Roses for Brazzers'], @@ -798,6 +800,8 @@ const tagPhotos = [ // ['fake-boobs', 6, 'Cathy Heaven in "Heavenly Ass" for Big Wett Butts'], ['fake-boobs', 7, 'Madison Ivy for Baby Got Boobs (Brazzers)'], ['fake-boobs', 12, 'Nikki Monroe and Kortney Kane for Big Tits In Uniform'], + ['fake-cum', 0, 'Jynx Maze for Cumshot Surprise (Porn Pros)'], + ['fake-cum', 1, 'Ricki White for Fucked Up Facials'], ['fingering', 2, 'Kylie Page and Hadley Viscara in "Busty Blonde Bombshells" for LesbianX'], ['fingering', 0, 'Ashly Anderson in "Rough Love" for Hookup Hotshot'], ['gangbang', 'poster', 'Kristen Scott in "Interracial Gangbang!" for Jules Jordan'], @@ -808,6 +812,7 @@ const tagPhotos = [ ['gaping', 'poster', 'Zoey Monroe in "Manuel DPs Them All 5" for Jules Jordan'], ['gaping', 3, 'Jessyka Swan for 21Sextury'], ['gaping', 2, 'Alex Grey in "DP Masters 5" for Jules Jordan'], + ['interracial', 0, 'Jaye Summers and Prince Yahshua in "Platinum Pussy 3" for Jules Jordan'], ['latina', 2, 'Veronica Leal for Her Limit'], ['latina', 1, 'Jynx Maze in "Big Anal Asses 2" for HardX'], ['latina', 0, 'Vienna Black for Spizoo'], diff --git a/src/actors.js b/src/actors.js index 335905f8..72e9241a 100644 --- a/src/actors.js +++ b/src/actors.js @@ -180,6 +180,9 @@ function curateActor(actor, withDetails = false, isProfile = false) { waist: actor.waist, hip: actor.hip, naturalBoobs: actor.natural_boobs, + penisLength: actor.penis_length, + penisGirth: actor.penis_girth, + circumcised: actor.circumcised, height: actor.height, weight: actor.weight, eyes: actor.eyes, @@ -262,6 +265,9 @@ function curateProfileEntry(profile) { bust: profile.bust, waist: profile.waist, hip: profile.hip, + penis_length: profile.penisLength, + penis_girth: profile.penisGirth, + circumcised: profile.circumcised, natural_boobs: profile.naturalBoobs, height: profile.height, weight: profile.weight, @@ -323,16 +329,35 @@ async function curateProfile(profile) { curatedProfile.dateOfDeath = Number.isNaN(Number(profile.dateOfDeath)) ? null : profile.dateOfDeath; + curatedProfile.height = Number(profile.height) || profile.height?.match?.(/\d+/)?.[0] || null; + curatedProfile.weight = Number(profile.weight) || profile.weight?.match?.(/\d+/)?.[0] || null; + curatedProfile.cup = profile.cup || (typeof profile.bust === 'string' && profile.bust?.match?.(/[a-zA-Z]+/)?.[0]) || null; curatedProfile.bust = Number(profile.bust) || profile.bust?.match?.(/\d+/)?.[0] || null; curatedProfile.waist = Number(profile.waist) || profile.waist?.match?.(/\d+/)?.[0] || null; curatedProfile.hip = Number(profile.hip) || profile.hip?.match?.(/\d+/)?.[0] || null; - curatedProfile.height = Number(profile.height) || profile.height?.match?.(/\d+/)?.[0] || null; - curatedProfile.weight = Number(profile.weight) || profile.weight?.match?.(/\d+/)?.[0] || null; + curatedProfile.penisLength = Number(profile.penisLength) || profile.penisLength?.match?.(/\d+/)?.[0] || null; + curatedProfile.penisGirth = Number(profile.penisGirth) || profile.penisGirth?.match?.(/\d+/)?.[0] || null; - curatedProfile.naturalBoobs = typeof profile.naturalBoobs === 'boolean' ? profile.naturalBoobs : null; - curatedProfile.hasTattoos = typeof profile.hasTattoos === 'boolean' ? profile.hasTattoos : null; - curatedProfile.hasPiercings = typeof profile.hasPiercings === 'boolean' ? profile.hasPiercings : null; + curatedProfile.circumcised = (typeof profile.circumcised === 'boolean' && profile.circumcised) + || (/yes/i.test(profile.circumcised) && true) + || (/no/i.test(profile.circumcised) && false) + || null; + + curatedProfile.naturalBoobs = (typeof profile.naturalBoobs === 'boolean' && profile.naturalBoobs) + || (/yes/i.test(profile.naturalBoobs) && true) + || (/no/i.test(profile.naturalBoobs) && false) + || null; + + curatedProfile.hasTattoos = (typeof profile.hasTattoos === 'boolean' && profile.hasTattoos) + || (/yes/i.test(profile.hasTattoos) && true) + || (/no/i.test(profile.hasTattoos) && true) + || null; + + curatedProfile.hasPiercings = (typeof profile.hasPiercings === 'boolean' && profile.hasPiercings) + || (/yes/i.test(profile.hasPiercings) && true) + || (/no/i.test(profile.hasPiercings) && true) + || null; if (argv.resolvePlace) { const [placeOfBirth, placeOfResidence] = await Promise.all([ @@ -437,6 +462,9 @@ async function interpolateProfiles(actorIds) { 'bust', 'waist', 'hip', + 'penis_length', + 'penis_girth', + 'circumcised', 'natural_boobs', 'height', 'hair_color', diff --git a/src/scrapers/hush.js b/src/scrapers/hush.js index 28ffdf11..55b5082a 100644 --- a/src/scrapers/hush.js +++ b/src/scrapers/hush.js @@ -2,11 +2,17 @@ const util = require('util'); -const { get, geta, ed, formatDate, ctxa } = require('../utils/q'); +const { get, getAll, ed, formatDate, prefixUrl, ctxa } = require('../utils/q'); const slugify = require('../utils/slugify'); -const { feetInchesToCm } = require('../utils/convert'); +const { feetInchesToCm, inchesToCm } = require('../utils/convert'); function deriveEntryId(release) { + if (release.date && release.url) { + const slug = new URL(release.url).pathname.match(/\/trailers\/(.*).html/)[1]; + + return `${slugify(formatDate(release.date, 'YYYY-MM-DD'))}-${slugify(slug)}`; + } + if (release.date && release.title) { return `${slugify(formatDate(release.date, 'YYYY-MM-DD'))}-${slugify(release.title)}`; } @@ -50,21 +56,25 @@ function getImageWithFallbacks(q, selector, site, el) { return sources.filter(Boolean).map(src => `${site.parameters?.media || site.url}${src}`); } -function scrapeAll(scenes, site) { - return scenes.map(({ qu }) => { +function scrapeAll(scenes, channel) { + return scenes.map(({ query }) => { const release = {}; - release.title = qu.q('h3 a', 'title') || qu.q('h3 a', true); - release.url = qu.url('h3 a'); + release.title = query.q('h4 a', true); + release.url = query.url('a'); - release.date = qu.date('.modeldata p', 'YYYY-MM-DD', /\d{4}-\d{2}-\d{2}/); - release.duration = qu.dur('.modeldata p'); + release.date = query.date('.date', 'YYYY-MM-DD'); + release.duration = query.duration('.time'); - if (/bts|behind the scenes/i.test(release.title)) release.tags = ['behind the scenes']; + const count = query.number('a img', null, 'cnt'); - release.poster = getImageWithFallbacks(qu.q, '.modelimg img', site); + [release.poster, ...release.photos] = Array.from({ length: count }, (value, index) => [ + query.img('a img', `src${index}_3x`, { origin: channel.url }), + query.img('a img', `src${index}_2x`, { origin: channel.url }), + query.img('a img', `src${index}_1x`, { origin: channel.url }), + ]); - // release.entryId = q('.modelimg img', 'id').match(/set-target-(\d+)/)[1]; + release.stars = query.count('img[src*="star_full"]') + (query.count('img[src*="star_half"]') * 0.5); release.entryId = deriveEntryId(release); return release; @@ -107,45 +117,37 @@ function scrapeAllT1(scenes, site, accNetworkReleases) { }).filter(Boolean); } -function scrapeAllTour(scenes) { - return scenes.map(({ qu }) => { - const release = {}; +function scrapeScene({ html, query }, channel, url) { + const release = { url }; // url used for entry ID - release.title = qu.q('h4 a', true); - release.url = qu.url('a'); - release.date = qu.date('.tour_update_models + span', 'YYYY-MM-DD'); + release.title = query.cnt('.videoDetails h3'); + release.description = query.cnt('.videoDetails p'); - release.actors = qu.all('.tour_update_models a', true); + release.date = query.date('.videoInfo p', ['MM/DD/YYYY', 'YYYY-MM-DD']); + release.duration = Number(query.cnt('.videoInfo p:nth-of-type(2)')?.match(/(\d+) min/i)?.[1]) * 60; - release.poster = qu.img('a img'); - - release.entryId = deriveEntryId(release); - - return release; - }); -} - -function scrapeScene({ html, qu }, site, url, baseRelease) { - const release = { url }; - - release.title = qu.q('.centerwrap h2', true); - release.description = qu.q('.videocontent p', true); - - release.date = qu.date('.videodetails .date', ['MM/DD/YYYY', 'YYYY-MM-DD']); - release.duration = qu.dur('.videodetails .date'); - - release.actors = qu.all('.modelname a', true); + release.actors = query.cnts('.update_models a'); const posterPath = html.match(/poster="([\w-/.]+)"/)?.[1]; - [release.poster, release.photos] = extractPoster(posterPath, site, baseRelease); + const poster = prefixUrl(posterPath, channel.url); + + [release.poster, ...release.photos] = [poster, ...query.imgs('.item-thumb img', 'src0_1x', { origin: channel.url })] + .map(src => [ + src.replace('-1x', '-3x'), + src.replace('-1x', '-2x'), + src, + ]); const trailerPath = html.match(/\/trailers\/.*.mp4/); - if (trailerPath) release.trailer = { src: `${site.parameters?.media || site.url}${trailerPath}` }; - const stars = qu.q('.modelrates + p', true).match(/\d.\d/)?.[0]; - if (stars) release.stars = Number(stars); + if (trailerPath) { + // release.trailer = { src: `${channel.parameters?.media || channel.url}${trailerPath}` }; + release.trailer = prefixUrl(trailerPath, channel.parameters?.media || channel.url); + } + + release.tags = query.cnts('.featuring a[href*="categories/"]'); + release.stars = query.count('.stars img[src*="star_full"]') + (query.count('.stars img[src*="star_half"]') * 0.5); - // release.entryId = html.match(/set-target-(\d+)/)[1]; release.entryId = deriveEntryId(release); return release; @@ -193,64 +195,6 @@ function scrapeSceneT1({ html, qu }, site, url, baseRelease) { return release; } -function scrapeSceneTour({ html, qu }, site, url) { - const release = {}; - - if (url) release.url = url; - release.title = qu.q('.update_title, .video-title', true); - release.description = qu.q('.latest_update_description, .video-summary', true); - - const date = qu.date('.availdate, .update_date', 'YYYY-MM-DD'); - if (date) release.date = date; - - release.actors = qu.all('.update_block_info .tour_update_models a, .video-model .tour_update_models a', true); - release.tags = qu.all('.update_tags a, .tour_update_tags a', true); - - const [photo, poster, ...photos] = qu.imgs('.update_image img:not(.play_icon_overlay)'); - if (poster || photo) release.poster = poster || photo; - if ((photo && poster) || photos) release.photos = poster ? [photo, ...photos] : photos; // don't use first photo when already used as fallback poster - - if (release.date) release.entryId = deriveEntryId(release); - - const trailerCode = qu.q('.update_image a', 'onclick'); - const trailerPath = trailerCode?.match(/tload\('(.*)'\)/)?.[1] || html.match(/\/trailer\/.*\.mp4/)?.[0]; - if (trailerPath && /^http/.test(trailerPath)) release.trailer = { src: trailerPath }; - else if (trailerPath) release.trailer = { src: `${site.parameters?.media || site.url}${trailerPath}` }; - - return release; -} - -function scrapeProfile({ el, qu }, site) { - const profile = {}; - - const bio = qu.texts('.stats p').reduce((acc, info) => { - const [key, value] = info.split(':'); - - return { - ...acc, - [slugify(key, '_')]: value.trim(), - }; - }, {}); - - if (bio.measurements) { - const [bust, waist, hip] = bio.measurements.split('-'); - - if (bust) profile.bust = bust; - if (waist) profile.waist = Number(waist); - if (hip) profile.hip = Number(hip); - } - - if (bio.age) profile.age = Number(bio.age); - if (bio.height) profile.height = feetInchesToCm(bio.height); - - profile.avatar = getImageWithFallbacks(qu.q, '.profileimg img', site); - - const qReleases = ctxa(el, '.modelFeatures .modelfeature'); - profile.releases = scrapeAll(qReleases, site); - - return profile; -} - function scrapeProfileT1({ el, qu }, site) { const profile = {}; @@ -289,15 +233,16 @@ function scrapeProfileT1({ el, qu }, site) { return profile; } -function scrapeProfileTour({ el, qu }, site) { +function scrapeProfile({ query }, channel) { const profile = {}; - const bio = qu.texts('.model_bio').reduce((acc, info) => { - const [key, value] = info.split(':'); + const bio = query.all('.stats li').reduce((acc, bioEl) => { + const key = query.cnt(bioEl, 'strong'); + const value = query.url(bioEl) || query.text(bioEl); return { ...acc, - [slugify(key, '_')]: value.trim(), + [slugify(key, '_')]: value, }; }, {}); @@ -318,6 +263,11 @@ function scrapeProfileTour({ el, qu }, site) { if (hip) profile.hip = Number(hip); } + if (bio.penis_length) profile.penisLength = Number(bio.penis_length.match(/(\d+)\s*cm/i)?.[1] || inchesToCm(bio.penis_length.match(/(\d+\.?\d+)\s*in/i)?.[1])) || null; + if (bio.penis_girth) profile.penisGirth = Number(bio.penis_girth.match(/(\d+)\s*cm/i)?.[1] || inchesToCm(bio.penis_girth.match(/(\d+\.?\d+)\s*in/i)?.[1])) || null; + if (bio.circumcised && /yes/i.test(bio.circumcised)) profile.circumcised = true; + if (bio.circumcised && /no/i.test(bio.circumcised)) profile.circumcised = false; + if (bio.natural_breasts && /yes/i.test(bio.natural_breasts)) profile.naturalBoobs = true; if (bio.natural_breasts && /no/i.test(bio.natural_breasts)) profile.naturalBoobs = false; @@ -328,33 +278,31 @@ function scrapeProfileTour({ el, qu }, site) { if (bio.aliases) profile.aliases = bio.aliases.split(',').map(alias => alias.trim()); - profile.avatar = getImageWithFallbacks(qu.q, '.model_picture img', site); + profile.social = [bio.onlyfans, bio.twitter, bio.instagram].filter(Boolean); - const qReleases = ctxa(el, '.update_block'); - profile.releases = qReleases.map((qRelease) => { - const url = qRelease.qu.url('.update_image a[href]'); - const release = scrapeSceneTour(qRelease, site); - - if (!/\/(signup|join)/i.test(url)) release.url = url; - release.entryId = deriveEntryId(release); - release.site = site; - - return release; - }); + profile.avatar = [ + query.img('.profile-pic img', 'src0_3x', { origin: channel.url }), + query.img('.profile-pic img', 'src0_2x', { origin: channel.url }), + query.img('.profile-pic img', 'src0_1x', { origin: channel.url }), + ]; return profile; } -async function fetchLatest(site, page = 1, include, { uniqueReleases, duplicateReleases }) { +async function fetchLatest(site, page = 1, include, { uniqueReleases = [], duplicateReleases = [] }) { const url = (site.parameters?.latest && util.format(site.parameters.latest, page)) || (site.parameters?.t1 && `${site.url}/t1/categories/movies_${page}_d.html`) || `${site.url}/categories/movies_${page}_d.html`; - const res = await geta(url, '.modelfeature, .item-video, .updateItem'); + const res = await getAll(url, '.modelfeature, .item-video, .updateItem'); - if (!res.ok) return res.status; - if (site.parameters?.t1) return scrapeAllT1(res.items, site, [...uniqueReleases, ...duplicateReleases]); - if (site.parameters?.tour) return scrapeAllTour(res.items, site); + if (!res.ok) { + return res.status; + } + + if (site.parameters?.t1) { + return scrapeAllT1(res.items, site, [...uniqueReleases, ...duplicateReleases]); + } return scrapeAll(res.items, site, uniqueReleases); } @@ -362,9 +310,13 @@ async function fetchLatest(site, page = 1, include, { uniqueReleases, duplicateR async function fetchScene(url, site, baseRelease) { const res = await get(url); - if (!res.ok) return res.status; - if (site.parameters?.t1) return scrapeSceneT1(res.item, site, url, baseRelease); - if (site.parameters?.tour) return scrapeSceneTour(res.item, site, url, baseRelease); + if (!res.ok) { + return res.status; + } + + if (site.parameters?.t1) { + return scrapeSceneT1(res.item, site, url, baseRelease); + } return scrapeScene(res.item, site, url, baseRelease); } @@ -377,15 +329,19 @@ async function fetchProfile({ name: actorName }, { site }) { const res1 = site.parameters?.profile ? await get(util.format(site.parameters.profile, actorSlugA)) - : await get(`${site.url}/${t1}models/${actorSlugA}.html`); + : await get(`${site.url}/${t1}models/${actorSlugA}.html`, null, null, { followRedirects: false }); const res = (res1.ok && res1) || (site.parameters?.profile && await get(util.format(site.parameters.profile, actorSlugB))) - || await get(`${site.url}/${t1}models/${actorSlugB}.html`); + || await get(`${site.url}/${t1}models/${actorSlugB}.html`, null, null, { followRedirects: false }); - if (!res.ok) return res.status; - if (site.parameters?.t1) return scrapeProfileT1(res.item, site); - if (site.parameters?.tour) return scrapeProfileTour(res.item, site); + if (!res.ok) { + return res.status; + } + + if (site.parameters?.t1) { + return scrapeProfileT1(res.item, site); + } return scrapeProfile(res.item, site); } diff --git a/src/utils/convert.js b/src/utils/convert.js index 5e4e8d22..d4794116 100644 --- a/src/utils/convert.js +++ b/src/utils/convert.js @@ -26,6 +26,10 @@ function cmToFeetInches(centimeters) { return { feet, inches }; } +function cmToInches(centimeters) { + return centimeters / 2.54; +} + function heightToCm(height) { if (!height) return null; @@ -52,6 +56,7 @@ function kgToLbs(kgs) { module.exports = { cmToFeetInches, + cmToInches, feetInchesToCm, heightToCm, inchesToCm, diff --git a/src/web/plugins/actors.js b/src/web/plugins/actors.js index bac398c6..60254ad1 100644 --- a/src/web/plugins/actors.js +++ b/src/web/plugins/actors.js @@ -2,7 +2,7 @@ const { makeExtendSchemaPlugin, gql } = require('graphile-utils'); const moment = require('moment'); -const { cmToFeetInches, kgToLbs } = require('../../utils/convert'); +const { cmToFeetInches, cmToInches, kgToLbs } = require('../../utils/convert'); const schemaExtender = makeExtendSchemaPlugin(_build => ({ typeDefs: gql` @@ -16,6 +16,8 @@ const schemaExtender = makeExtendSchemaPlugin(_build => ({ ageAtDeath: Int @requires(columns: ["dateOfBirth", "dateOfDeath"]) height(units:Units): String @requires(columns: ["height"]) weight(units:Units): String @requires(columns: ["weight"]) + penisLength(units:Units): String @requires(columns: ["penis_length"]) + penisGirth(units:Units): String @requires(columns: ["penis_girth"]) } `, resolvers: { @@ -47,6 +49,20 @@ const schemaExtender = makeExtendSchemaPlugin(_build => ({ ? kgToLbs(parent.weight).toString() : parent.weight.toString(); }, + penisLength(parent, args, _context, _info) { + if (!parent.penisLength) return null; + + return args.units === 'IMPERIAL' + ? (Math.round(cmToInches(parent.penisLength) * 4) / 4).toString() // round to nearest quarter inch + : parent.penisLength.toString(); + }, + penisGirth(parent, args, _context, _info) { + if (!parent.penisGirth) return null; + + return args.units === 'IMPERIAL' + ? (Math.round(cmToInches(parent.penisGirth) * 4) / 4).toString() // round to nearest quarter inch + : parent.penisGirth.toString(); + }, }, }, }));