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
+
+
+
+
+
+ {{ actor.penisLengthMetric }} * {{ actor.penisGirthMetric }} cm
+ {{ actor.penisLengthImperial }}" * {{ actor.penisGirthImperial }}"
+
+
+
+ {{ actor.penisLengthMetric }} cm
+ {{ actor.penisLengthImperial }}"
+
+
+
+
+
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 @@
+
+
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 @@
+
+
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 @@
+
+
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 @@
+
+
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 @@
+
+
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 @@
+
+
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 @@
+
+
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 @@
+
+
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 @@
+
+
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 @@
+
+
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 @@
+
+
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 @@
+
+
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 @@
+
+
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 @@
+
+
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();
+ },
},
},
}));