From 693983dc29fd5a3eeb5a3b3a487d98ead547ff1f Mon Sep 17 00:00:00 2001 From: DebaucheryLibrarian Date: Tue, 25 Jul 2023 03:03:41 +0200 Subject: [PATCH] Added screen caps separate from photos. Added Tokyo Hot. Added hair type, shoe size and blood type actor fields. --- assets/components/releases/banner.vue | 4 +- assets/components/releases/release.vue | 8 +- assets/js/curate.js | 1 + assets/js/entities/actions.js | 33 +++- assets/js/fragments.js | 36 +++- assets/js/tags/actions.js | 9 +- migrations/20230725001453_caps.js | 23 +++ migrations/20230725020639_blood_type.js | 27 +++ package-lock.json | 14 +- package.json | 2 +- public/img/logos/tokyohot/favicon.png | Bin 0 -> 1757 bytes public/img/logos/tokyohot/favicon_dark.png | Bin 0 -> 1757 bytes public/img/logos/tokyohot/favicon_light.png | Bin 0 -> 1757 bytes public/img/logos/tokyohot/lazy/network.png | Bin 0 -> 2761 bytes public/img/logos/tokyohot/lazy/tokyohot.png | Bin 0 -> 2761 bytes public/img/logos/tokyohot/misc/tokyo-hot.png | Bin 0 -> 12647 bytes .../logos/tokyohot/misc/tokyo-hot_white.png | Bin 0 -> 5457 bytes public/img/logos/tokyohot/network.png | Bin 0 -> 12647 bytes public/img/logos/tokyohot/thumbs/network.png | Bin 0 -> 15514 bytes public/img/logos/tokyohot/thumbs/tokyohot.png | Bin 0 -> 15514 bytes public/img/logos/tokyohot/tokyohot.png | Bin 0 -> 12647 bytes seeds/00_tags.js | 28 ++- seeds/02_sites.js | 7 + src/actors.js | 27 +++ src/app.js | 3 +- src/argv.js | 5 + src/media.js | 6 +- src/releases.js | 3 + src/scrapers/scrapers.js | 3 + src/scrapers/tokyohot.js | 171 ++++++++++++++++++ src/store-releases.js | 83 +-------- src/update-search.js | 92 ++++++++++ 32 files changed, 472 insertions(+), 113 deletions(-) create mode 100644 migrations/20230725001453_caps.js create mode 100644 migrations/20230725020639_blood_type.js create mode 100644 public/img/logos/tokyohot/favicon.png create mode 100644 public/img/logos/tokyohot/favicon_dark.png create mode 100644 public/img/logos/tokyohot/favicon_light.png create mode 100644 public/img/logos/tokyohot/lazy/network.png create mode 100644 public/img/logos/tokyohot/lazy/tokyohot.png create mode 100644 public/img/logos/tokyohot/misc/tokyo-hot.png create mode 100644 public/img/logos/tokyohot/misc/tokyo-hot_white.png create mode 100644 public/img/logos/tokyohot/network.png create mode 100644 public/img/logos/tokyohot/thumbs/network.png create mode 100644 public/img/logos/tokyohot/thumbs/tokyohot.png create mode 100644 public/img/logos/tokyohot/tokyohot.png create mode 100644 src/scrapers/tokyohot.js create mode 100644 src/update-search.js diff --git a/assets/components/releases/banner.vue b/assets/components/releases/banner.vue index bef85578c..afee58e53 100755 --- a/assets/components/releases/banner.vue +++ b/assets/components/releases/banner.vue @@ -2,7 +2,7 @@
({ ...acc, [clip.poster.id]: clip.poster }), {}); const uniqueClipPosters = Array.from(new Set(clips.map((clip) => clip.poster.id) || [])).map((posterId) => clipPostersById[posterId]); - const photosWithClipPosters = (this.release.photos || []).concat(this.release.scenesPhotos || []).concat(uniqueClipPosters); + const photosWithClipPosters = (this.release.photos || []).concat(this.release.caps || []).concat(this.release.scenesPhotos || []).concat(uniqueClipPosters); if (this.release.trailer || (this.release.teaser && this.release.teaser.mime !== 'image/gif')) { // poster will be on trailer video diff --git a/assets/components/releases/release.vue b/assets/components/releases/release.vue index 4a6e6173a..9a1c322e5 100755 --- a/assets/components/releases/release.vue +++ b/assets/components/releases/release.vue @@ -21,14 +21,14 @@
0 || this.release.scenesPhotos?.length > 0) && this.$route.hash === '#album'; + return this.release.photos?.length > 0 || this.release.caps?.length > 0 || this.release.scenesPhotos?.length > 0; } async function mounted() { diff --git a/assets/js/curate.js b/assets/js/curate.js index ece3535f7..ac135cb39 100755 --- a/assets/js/curate.js +++ b/assets/js/curate.js @@ -80,6 +80,7 @@ function curateRelease(release, type = 'scene', context = {}) { curatedRelease.series = release.series?.filter(Boolean).map(({ serie }) => curateRelease(serie, 'serie', context)) || []; curatedRelease.chapters = release.chapters?.filter(Boolean).map((chapter) => curateRelease(chapter, 'chapter', context)) || []; curatedRelease.photos = release.photos?.filter(Boolean).map((photo) => photo.media || photo) || []; + curatedRelease.caps = release.caps?.filter(Boolean).map((cap) => cap.media || cap) || []; curatedRelease.scenesPhotos = release.scenesPhotos?.filter(Boolean).map((photo) => photo.media || photo) || []; curatedRelease.covers = release.covers?.filter(Boolean).map(({ media }) => media) || []; diff --git a/assets/js/entities/actions.js b/assets/js/entities/actions.js index 07b392ac3..0a59e502a 100755 --- a/assets/js/entities/actions.js +++ b/assets/js/entities/actions.js @@ -89,21 +89,34 @@ function initEntitiesActions(store, router) { offset: $offset orderBy: $orderBy filter: { - not: { tags: { overlaps: $exclude } } effectiveDate: { lessThan: $before, greaterThan: $after } showcased: { equalTo: true } - or: [ + and: [ { - channelSlug: { equalTo: $entitySlug } - channelType: { equalTo: $entityType } + or: [ + { + not: { tags: { overlaps: $exclude } } + } + { + tags: { isNull: true } + } + ] } { - networkSlug: { equalTo: $entitySlug } - networkType: { equalTo: $entityType } - } - { - parentNetworkSlug: { equalTo: $entitySlug } - parentNetworkType: { equalTo: $entityType } + or: [ + { + channelSlug: { equalTo: $entitySlug } + channelType: { equalTo: $entityType } + } + { + networkSlug: { equalTo: $entitySlug } + networkType: { equalTo: $entityType } + } + { + parentNetworkSlug: { equalTo: $entitySlug } + parentNetworkType: { equalTo: $entityType } + } + ] } ] } diff --git a/assets/js/fragments.js b/assets/js/fragments.js index fcd8a3c6e..064832108 100755 --- a/assets/js/fragments.js +++ b/assets/js/fragments.js @@ -354,6 +354,31 @@ const releasePhotosFragment = ` } `; +const releaseCapsFragment = ` + caps: releasesCaps(orderBy: MEDIA_BY_MEDIA_ID__INDEX_ASC) { + media { + id + index + path + thumbnail + width + height + thumbnailWidth + thumbnailHeight + lazy + isS3 + comment + sfw: sfwMedia { + id + thumbnail + lazy + path + comment + } + } + } +`; + const releaseTrailerFragment = ` trailer: releasesTrailer { media { @@ -398,6 +423,7 @@ const releaseFields = ` ${releaseTagsFragment} ${releasePosterFragment} ${releasePhotosFragment} + ${releaseCapsFragment} ${siteFragment} studio { id @@ -470,7 +496,14 @@ const releasesFragment = ` offset: $offset orderBy: $orderBy filter: { - not: { tags: { overlaps: $exclude } } + or: [ + { + not: { tags: { overlaps: $exclude } } + } + { + tags: { isNull: true } + } + ] effectiveDate: { lessThan: $before, greaterThan: $after } showcased: { equalTo: true } } @@ -535,6 +568,7 @@ const releaseFragment = ` ${releaseTagsFragment} ${releasePosterFragment} ${releasePhotosFragment} + ${releaseCapsFragment} ${releaseCoversFragment} ${releaseTrailerFragment} ${releaseTeaserFragment} diff --git a/assets/js/tags/actions.js b/assets/js/tags/actions.js index 21c2ce15a..1868111d4 100755 --- a/assets/js/tags/actions.js +++ b/assets/js/tags/actions.js @@ -161,7 +161,14 @@ function initTagsActions(store, _router) { offset: $offset orderBy: $orderBy filter: { - not: { tags: { overlaps: $exclude } } + or: [ + { + not: { tags: { overlaps: $exclude } } + } + { + tags: { isNull: true } + } + ] tags: { anyEqualTo: $tagSlug } effectiveDate: { lessThan: $before, greaterThan: $after } showcased: { equalTo: true } diff --git a/migrations/20230725001453_caps.js b/migrations/20230725001453_caps.js new file mode 100644 index 000000000..9bac273cc --- /dev/null +++ b/migrations/20230725001453_caps.js @@ -0,0 +1,23 @@ +const config = require('config'); + +exports.up = async (knex) => { + await knex.schema.createTable('releases_caps', (table) => { + table.integer('release_id') + .notNullable() + .references('id') + .inTable('releases'); + + table.text('media_id') + .notNullable() + .references('id') + .inTable('media'); + }); + + await knex.raw('GRANT ALL ON releases_caps TO :visitor;', { + visitor: knex.raw(config.database.query.user), + }); +}; + +exports.down = async (knex) => { + await knex.schema.dropTable('releases_caps'); +}; diff --git a/migrations/20230725020639_blood_type.js b/migrations/20230725020639_blood_type.js new file mode 100644 index 000000000..af1a36d9a --- /dev/null +++ b/migrations/20230725020639_blood_type.js @@ -0,0 +1,27 @@ +exports.up = async (knex) => { + await knex.schema.alterTable('actors_profiles', (table) => { + table.string('hair_type'); + table.decimal('shoe_size'); + table.string('blood_type'); + }); + + await knex.schema.alterTable('actors', (table) => { + table.string('hair_type'); + table.decimal('shoe_size'); + table.string('blood_type'); + }); +}; + +exports.down = async (knex) => { + await knex.schema.alterTable('actors_profiles', (table) => { + table.dropColumn('hair_type'); + table.dropColumn('shoe_size'); + table.dropColumn('blood_type'); + }); + + await knex.schema.alterTable('actors', (table) => { + table.dropColumn('hair_type'); + table.dropColumn('shoe_size'); + table.dropColumn('blood_type'); + }); +}; diff --git a/package-lock.json b/package-lock.json index 1ebeffbf3..f264f1a78 100755 --- a/package-lock.json +++ b/package-lock.json @@ -80,7 +80,7 @@ "tunnel": "0.0.6", "ua-parser-js": "^1.0.32", "undici": "^4.13.0", - "unprint": "^0.10.1", + "unprint": "^0.10.3", "url-pattern": "^1.0.3", "v-tooltip": "^2.0.3", "video.js": "^7.11.4", @@ -17538,9 +17538,9 @@ } }, "node_modules/unprint": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/unprint/-/unprint-0.10.1.tgz", - "integrity": "sha512-2KtzIQKlOzXyDDyrCQQQXWuljC6kHjAhYZT1NRiDT2Lr1GgnwR+R9iVqbq6iz1Z1Oflt7ngpYW1MGHy3xDnduw==", + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/unprint/-/unprint-0.10.3.tgz", + "integrity": "sha512-ui8BbBo4JmKR++w50rSUFyg8X6l9EAbLRpATxdjxyS7yYevjcGMEt3HT0nrBG2JXDMkLwWZ+WoOaz3qC5stSxQ==", "dependencies": { "axios": "^0.27.2", "bottleneck": "^2.19.5", @@ -32378,9 +32378,9 @@ "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" }, "unprint": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/unprint/-/unprint-0.10.1.tgz", - "integrity": "sha512-2KtzIQKlOzXyDDyrCQQQXWuljC6kHjAhYZT1NRiDT2Lr1GgnwR+R9iVqbq6iz1Z1Oflt7ngpYW1MGHy3xDnduw==", + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/unprint/-/unprint-0.10.3.tgz", + "integrity": "sha512-ui8BbBo4JmKR++w50rSUFyg8X6l9EAbLRpATxdjxyS7yYevjcGMEt3HT0nrBG2JXDMkLwWZ+WoOaz3qC5stSxQ==", "requires": { "axios": "^0.27.2", "bottleneck": "^2.19.5", diff --git a/package.json b/package.json index f49d75889..a21c3327f 100755 --- a/package.json +++ b/package.json @@ -139,7 +139,7 @@ "tunnel": "0.0.6", "ua-parser-js": "^1.0.32", "undici": "^4.13.0", - "unprint": "^0.10.1", + "unprint": "^0.10.3", "url-pattern": "^1.0.3", "v-tooltip": "^2.0.3", "video.js": "^7.11.4", diff --git a/public/img/logos/tokyohot/favicon.png b/public/img/logos/tokyohot/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..69c41bef034b1d421dbf3ce70120926cbcf6b657 GIT binary patch literal 1757 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 literal 0 HcmV?d00001 diff --git a/public/img/logos/tokyohot/favicon_light.png b/public/img/logos/tokyohot/favicon_light.png new file mode 100644 index 0000000000000000000000000000000000000000..592daa535e08309280fe759528e9e77ccbda1f11 GIT binary patch literal 1757 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 literal 0 HcmV?d00001 diff --git a/public/img/logos/tokyohot/lazy/tokyohot.png b/public/img/logos/tokyohot/lazy/tokyohot.png new file mode 100644 index 0000000000000000000000000000000000000000..2ea36427a2f76bb8a8e974fd063f44a0cf1f3b8a GIT binary patch literal 2761 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 literal 0 HcmV?d00001 diff --git a/public/img/logos/tokyohot/misc/tokyo-hot.png b/public/img/logos/tokyohot/misc/tokyo-hot.png new file mode 100644 index 0000000000000000000000000000000000000000..b0e8a0700a6276aea2c7a3957c971f104dd1c36c GIT binary patch literal 12647 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 QT5yk{s;H$N`2~T#2{df7rSkgIMt8fy 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 literal 0 HcmV?d00001 diff --git a/public/img/logos/tokyohot/network.png b/public/img/logos/tokyohot/network.png new file mode 100644 index 0000000000000000000000000000000000000000..30c712081ea1334391f2f187fbf0e8d454f39ac8 GIT binary patch literal 12647 zcmXw9cRXBCx7Azp-aA2rj7W^0=)LzAj6TZfogi9tB1DZadS}$pTSN^pL>;{agXqGW z@4fH+am#Ptd(OS*?0xRtd#x3(qoqtj#7KmJfkC3GqM(O?foY3Amm|PK@7-dTuhE7m zXL)%YRe5=Kh?j?hv#UJ@247lenzYKm8|I;R`cO_9{FiY+yK*hWTPP4AKwTtPPGjc# zqW$laoMvu*q2x$#Uth{lWmG~_Eop5e`!(jq!A8j*C(na0e{>0GAayV^&k5G^U28Qgfb_S&HP;r6}8-j|9mGYX#4#zSrCsw~IVO0}fq znSc63okdrVFz!B|41!KBUTp~z?@D*b*>6($~36?m^u5Yq= z{u608@XGA_-tb<)hp(3Ho-E8COjBA0FM(j~g?i?t0N9(KG&3fjhyDT9P_bVVTQIPM z!wAR2(pUGK(zvW4Ol@t)P6w=zc5GtVIcj}RD7$8n4#w)#UanW~^z-SSoeRY3$Ub&z zQLUa>Zy(1CtCByyh5lE*SC=PW{K93aZM}A>&(iMDUcs|fS5`nDA2BeLmr~NvXM_+H zQ*R6mA+G;ym;q2(KeQ3wM^#f1e;1#g8t^O)F<*ix!Jq>V90yf+xXbq zvHLswII%0MYU&tAkkVmbuw$qyyfp||Jn9O}wlvJVdNke5lQiauNd2Re8P8WtOsTtL z$_S$|qjtu%Dl4VwWLonJpt&gfYhATcCmXmFF^{=K*pct#I2eJafZL%6!JsDKuBfz= zNAEiZ+IRn4+->GX{^;5@TB+>Fw0=Ck3Ooo*XPlIFJZb6)u7S0K0|0&0n%cQ2Yejb+&;e=!OzB^n^JkJ@-@1Uop`6F)er^|<6fRhY zN7VHMj&QO zNXX+?261}#UB<(o9UoA6vW5OVZH|eWYvX3*XlL%FSnB;7-}avog2>(^5#rEtq?3Ef zr1bZZA};@Hk9grQ{+nw!4-+NH$G`P7o<7ZFWaONK_~O6UF<-chOR|JmSO=G_QBdF* z{nuW6#eM&{H#ms@o+-AbD`8S2u{VA6u@caS2co_DZ__aD5Fu2nUPXDYVa6KUd-xla zof9XIEpGT(5AEgi{{8=sB%6yB;D8a(lbnLReDUOZZfolPL$Tj3zafsF)`M8gW<=AS z!m=`YWB_H+b*znRQyfgJ9`TXIfFDzd{Y0n#$^wANm`VlrvKF=V<=TUxe}5{odB11m z>itq{hP$R*W+%VwrZE{SHtST)PO$OmLufbzf?u&ZSPnRuJ6cLHtPlUbN&fd;^nYf_ zqpx2CX+64|W}y|Kuap>=h0jDYIqz_8!B1V#oJuHfQSsM4!i{VAzGu<(0oHobO|U%u zbmM=6MVwu&k?nKZ2UceCX(#yFTgoRww3{nZ*LwWaCM3&my1K3Mqb!bdIIea7>((90 zocEFV_7??-=@R_ZypOY$jXO9}2JgPwWWVrkzkkPi57UT$_WzSfi~3rjBkwELpTDDx zlSV&v&XcuNigLU&zuOCs^88Pj+%Cw|LcD-i+-LRj){>{y#Ae!3WYMiP&6mfc9`3Jp z-j5{SM2#2h{cn^sDA)ha<`V07r-9t{y|%`7E-!i}Qa6vg_Bi|^#OB}%6mWq9um10B zGSI);!66g+jY-ux#8B;q<)1bf=eWgXcmXx3eiC9*9V$`)a2RJq`m##3{`)?o?Cw|=+GFEdz*ARjARs(c_6_>BwosNIiT9Lz;mIhn_YOhk9tK^NrpC+38>5>OR2!uI|OpxE$y8@?+^U}SptuS@(*@i1JE*FQn` zT3W|2AofkD@WcW`?azQ#YNBva*CR5=yDRe~(^^P*)FzD^u%eoSf8GMGMZD^@-Y#Ofi z9o~>14_ot^%{P;sNBxWUZ4I zfv=ff{uyYp5HXtV*2Y|J?SYX^*=mM-JUvynvu5Y8Fbwx1ne-<^1WA82flu_Y)wTHD zQF{e<^%@fOeD50?L-tjG&a(jt2dL2Ke=P96-1T-k^0Fruj2Mai>%Ei*7rqKV{SB`s zI~lM=fI!AR4~O>RysxN_^jZj@m39~DjnuVFz^dK7B4$44iz7nn_mRV=K_mkgIDO^^ z?aMV>!y(RG7NOr@O$E#mts{ts%ui!1VQ<+##xap#fgVT#?8W9u)(yVxNp^tga4e}6 zh5@3vz+HmGcC71MUU-G`Q83(sG~K;zRx0kjfLYB3lRgRZ&DUp~Rz$JwFW`#$iZ#je z{-imYq94gYVajr)ET{UQ$X6&m{FF{Wl-Sa90}46JTQZP1%GZe6`qV}0tveDZ9FQ{>UoQ(yiB1LdJ?COP&Z9s^{6nsl67f$M5M~IhR2YnPIehUbkpF zzI1gmW1Fvl!$y#3T060Wn?43hf-0qHlPBV#E;)TPF-YD2Mj<8e@FvGPj;WdY=FLd( z@WHIhd??ijrrDuOz^fgbXn%^BL+-+qvTaO58wkoJqQ~6rXhCqpl5Fti-o97X|C)G? zj|f6)+Pv4=`_v0!S%#YS1JN3Sh*ZSf6GhjVRZ#VDfdRKJMJ1o}KSAwWaoqAs9asZfGM%-Z>S01sNTN{6Jy?rLV=)}w$Ems#aqAiyA z487b-Qtt)9`QU7%6boK+jq zxd_IL<^HZn6pw_%_^A3i6Q$xjxY(0-(h&XXz|1jk20&%SyV;R~AKNBpfh9(gJTXke ziS16W$r^?ipZA9Q^8NlhleN1!fOt4`m17Uv@Dncd(_SHlJnRxAUiTj!4zNil1uW)r3CXY8m+4zSpy1F?~bBnM>v)9Kp3MH_k*@;}^# z;jLsNq~>?=f|LdzH~=J6*{|&+Dx*p-!!*~+#GEMUs)UjCK*EvtK=?I&>%%Ci}&qX#t58F3}0FDE@vzFQH-!znkRH z>i*RytEQxu{+h9S>zqj%=nsWGzGzpqb8U%D?(-E&?opv<<%pIOya}l?KXj&+7BAda zz18<-i5Z>hpLSGBX#I7S(Y_tK>eg8zvpvB$k4#va|3Z5hqhtg7h>EKSqw9A(XVHOe@mLY}DM3oRYs z1;t^GTSC>g{fb+al2m~I@g|-5wZDEQOR4i6L+(<25Q4{*dwVE zxN!QEqVI5D^SPe0`*C8YPu1a)Vir``1YlG?xN~mmx902dBjV#>1_FgG!|?Au5a%nb z$r&YVerk){OfxwdNHQZAQm4DSxGRCk@Ojf=TxYD7+fI8!EYOP-oGd$|pfaAq(o`x(TUH8s_ZLxki-($~0CY zno?sk-Vc4D+Fq?S^ zR-$G;baY!w4^(^1`%pd{V2*rjQ`)qsFlhG8_#|hO8)aO3@TTASa&jAZS7~lQ8#{7cAxHb0V86G}G0OVjwAl|-b zig?a@^;pSgm;Br7T$%P|Xl`P=8w>_APZXc)TWbETaCWmMPJePe0*OH!2J+K74g_M{ zVL}sw&uI=e?#w$0y7+YZ+qW5GR2l-#$$w!XWf`UYwffDL40xDT2GC?p~^ zhKY?X+!}dKaUYu1F!e^k>X4VW7My-tzg)J;EX0 zyC)ZGX9SaAOz*X2T*tGb^!D9)J0X)EB+i(sR?pz>zp|^)l_c1M(i2CSfH{?B?3WU@ zaN*;=&+xF|^NrcExTcfip__-x0LCZYlq5j8+zCf@A!Sh>MXv-v><~(O(e?Iu!@t2e zqJb^%vztMAKOu4Ezfyd(X@c1NS^B=mH{HAcTz_RB0jjw^(y9x^%E1sEiZ56GOl8=5 zniKE(js;>08nvRap=8(s5j6$9-B`v`E>oD%<{zvy- z{LTqax7_J1YgCRdh&4UrK_Us1@#?g~@GM6;@n+czJR&(*{{(BK?E}Q}u=H)k-?n*< zzg~ras3??D^jO9GRhk^8*|L+{YwXeOuX;CfRJA7HBl&aF5c&F0QD<@QBI*RY7zY;^ z>}`e5poW5!!#ET518?ZlL2eJVh>9&=Rs>KZsY9`-jmE`rfb~(J-*N9xP zSZSR2wxA{!rI7c%-pxiY_4uY6Jta=1w2PfcCTmoiY&QOmgLD~0$hugg8hcY{!a9Oz z^ICsr|C5?~wv&G_fL#2I%EyhTR zAu0qTShABH!<0b280;oe8Q9M^YS1P5g&c~Q02xSh%zFHF7`RYKG&wX!laKbqIN(YR z+_RYANDE$}1%;7US!G|0kAioKP@JXClR(>Xb?RD;nzDc&JKLMglUHl)KNf{GL8?85 zOi5!RD!_Q$EVai9l;g9`#2SCVd?CZj9i4e6I1dcPX;;ecY4lqxYs z7RBd)uY}SJDWOQ~Xh#*vQH`L$)^P(q5!>+yEJrGwcrhwP$EuS;&6>|9uxPmtE?<-I zs1rD%`&(%q4A+k{>p7nNy+9WabCB{+YE$^D-;#!Z(0Yu)3Wii>2!k}aMnznnq#QdQ z2_etKiD#d@`j~1l2_s2Snd_T!@NNjLS;4W$rpeg9#2w|&<1?*bQqs}wS`tb z6Sp0&)CI{@qAY9Xv_6Gcnb&x_iBgWCSJ?-$rp}Ux#s6 zXpx@1yRV27Htuv2mg2X(9)qDUwgO(-Fri8|jkU6s!Y(r!{>(7yf%d8(g?|0&Rx%yI zhl1+rv=CM@QtKG3jOanWKiGLH2&J^@rnRYgt{k~$M>S^0GEJT@46=Ki&7KuTRd?%m zIo)CaPL=lR0IOT++DhHH}OjM(*iLqu3;CXCESA{_X0(J2$wgU)-EakReaTz^I! ziahs-9~5OwI7f|JO~&?`erdRMpo*3}E^w?4Lny#WE~$VVT!3H^=+@aJX`g%@ zAi}t3&Vma^w2!rOAwSR)Wcipy|eojE1m)`7y(F8;?PJW z;Pjs?Q_Ce34U>RcpbPQ{_v*eOJwdJXQ_*Vvl1Mq}KKbEla$sCFeNb^kZ+PBI?V21@ zDo>VVgc8Wv;ft*h-H0m7<8qBn0Q7b4F04Iqbe)KFRm$$D=1Cjgv0ht>LvXe1M8mRn zk~33l&9K4ySrN;XEi)!H$ax$9KZ*Wa)AKk%lo4Moong8la3fF>YH+KAQ>LAjE%UBK zcsj`{T@~pF|D{I%nc8aM3_gZi3;k&_pF_FB%RBfiv)edU?1$*S4=X(3^whDL*3qeH zU!Tv_ux;x-Znd8`gefYDV-n`k5f5$h@t|nvW#G0l2wu!N5!+;irG$Uars?G{<(BVC z?ycE;X%Y;8TY_QsrW?|=M&~?*J!Ao=^)Tb9T`MvTqOT7hZ9PRnlYU&bnxxsmkr-M! zFJ`QmkY$GstGVCAV(GT3$5r)dqLrVZ3cb6&G?OD)7)P3Uj$=9ELV`L>K-z-PEgcv2 z4uVG8*ywlmbok5|%wGbhv-T`qs|KoY-OH?Gl@<04uwbKhL8S*X_GOQ)`5b*NWvFSvBfh5qFZcl2Z0=g-=qDItVd zAp!H13^Ox338M2Cx)YU=8mp({LCZD6%xHL+;~aHsH<(@A!thdbLgKD?+;@i=E7$mv zFC0jwj4}0neB9|Z#r1EW_Wj&MaYLl7bN+~r{Dm5HEf{r{iC9H&X**Cs3=c*FW)t5D zD~2S`ot}nNomNcnUO$A2BuL#ke@CyL5H*CC=J}PoDPktW<@0=41;RzSnHKECoIstB zqLMJa5^2JT80H!_c&W-iie1a{1uzQ8E7esn;!t)ul{VkJ=2rbkUg{0XQ%b9QTOTR? zVGbb!bQrf}94T{H4gdDmOF=xo^Is{^qe9K)24eQU8Mw2GAtdthgD$g$9L(&qS77Ve zN^<~GIi)v?_O_i#XM!iaJm0qX%WnY1eQ|HP=CDP5r8-AR#eg`TFun|P-;kYMvFnRr zj9B}Q{>g~le__VM-PaHmNGE4`!{s8=?Pb9d}e|fq?ekp<5f4WWfO04T<|Y=n#RsZ0X~%NI8@K; zU8WUxJ>32S1?AVsazKQO<(8j>y99jB!9UO5WA|=Sota@hLM2XV$9GWS&15<3nCMY% z291D*EhO1gCry)NEtKgCa!l=a?;5l;1QP@@sg#leix7udCA8D}?fvLty71%E>x=WJf5irl?cz#8yHvnrhi7yRgRx$oCr=Mk*@i6`-Ac)?yncpH!3GW&LkV?AAA#}m-bT+V1PQBCKsHyIAf zQOl&sl@Kb({%&tTtF`JMvFbZNDzv0I>e`{_!DfZ@I~EL1pdE7iY+D3LATt&ogd5t- zV`%sgKm+vzm58n`;{KAAnXQyffFN4jS-CoGP`bj+39sSgx%hZLJv5CLwhjCAYBHT* za?Ai*-S(~QDgo2w;6`y*E>7 z5d}rM%^pjoxp`!XPA!JM9}$N<3e;%|5SNyBsv5V-`4%?#Q=j+6e6wo%tU}tIr6QA= zY!4XnI7~m=%B1vW=Huk=BzVo(kDSzx#`g;kutxK~f7t|A&|FOyan|7_+=?ZwKiSZSleaI)8nF{{eiR(>pu`C&Oz3&FNqPxz)4MwPfcnL z<|F3dSA`bt8j;9+fyN>#2K9#WS}R$pLV_Y;;EbZTcMxRT9#11(|FmLi4=hLT!O(b_ z<1VvH0kp8zTpFu62#$(Ms&Jd3`}84+f~+8m^|pCf4D%RVL)x{Jo!5I?O+9ohYZ5Au zIel3FJ{LtCQM{M$ev+4mdjX$5)M>+ck@}svIt!iAJXcf*yWfTlwI8#;wSq>DgB5tG#fv^hNyeI!7R_jG?R~jdAQ>p}>o&N}!9QVXyj%r<4rrMC2bVbDqK(2o(p&iK4H_%~-zQ$z5G{4+|Fc$Y0* zCz}2HFGzOt<={E1=xp1Sct9ywl*rBWr7G@zE1k%&FywuIz1`{1H$@7|JzJlfWMW!zU$8FPOv`0p~wJ-B?7}d|Rvv9vt zP%=HhT37sah(9aDjoaO0xZWY?!5_2{|Eke$w9bx{DW=~mbR!-FHGy|#T$MwDV#%}0 zray%|yxn1A^NZIVBR9>LouO~hkS`^|cO?Im_29~Jeyk(O6Q=+`%u0=%nYjvDJ)y9xDUkIQNAj4d@Ygr+GR8Z8c(hV6 z_mQonoRI%rC9!c0VXR&qnSD!^?uB9rKQ^{;FscXI;gqZ3R5s7fCFpc3DNqhZ0?=cZ>YNLh&hyCDED^AD;}h5Wt|bNBZAk5^jk z_rAlqb}|)wut%wUd37XV5-3e?A29!oYMJC%%;9I(3xIy~;=f@*y@0@&r!NDu!z{^O zCMC}+<>&M6VPKGn{znUdF4mVmoI!QkinEKDn!YOBqgf|SU?8L79n)?gn_@q?8qY*F zia8!{FVeONfaY-&j0ChAIV`?pmVSe{;GYj>abw=sJS+2GsrzhuO6m5xFb%rK5skIz z%9=m6J&7&TIlYNQg44$=5u*n)Xwt}_LlZgEuJVHDQ7}Y3jN6AxgJx z>+1Ia!d<_uQa+_~kX&8xlURxUuO}bP8ZrFSLIsZ2nOQ^ZS*2$hyK?O^)?|-uoLypv z!W;V~ojeG)C=}aD3auSneez+FJ5`UJbudYZ_In~n%8}m)t;WkBJp{auo(q+yB@oeT zN$NmJon9SmKo3y`mp!#f5)aD&#A;i56c2}d?-RDH@%z&IY5=ugQPN3WyRi6;&L-oo zTk1SjNZjY2LY+j_Ryye-J}gO>GIsbd4QIbP&Sag~?RAFHLQSoIQGLy{rEt}Lbv=uf z%-Z;#BMrDKIZH)bNCU_z?%Jt#cu~BxC_L04yzNDEy;NeMwW{QNNyBQg z{Oy+Ht^kLc{xX6A9!ebDF*#cP%wvOV$4g2atqJNi&&e$I1>*Z!y26ZD-(Cs^g+I{7 zT>r^m@w`^}k7aLUss4ZJ`fabf^IBM6!U|n>lSq$GA%_C* zYnnmjP%ms4`L{iU#}lDVH(8 z^(~B81vFTheJnXX$AaN{``ucU;pt;Vl_P>t=XBX|+PScy!7dRhYjRsybQ(tk|h0^2lauGR=GAUTvrMHhGu_~`YFN-sBJoXdJwD-=8VF1=0n z?iK@@K=BE$536gQEN7cxTMc6=8mx)hjzgtCQg!#nvbn&5+;dX9?>3m(==ihh)^I)k zlt{gD84n|hRrM?S01ajv_D1;pK$A|g zb?5JGu3w>YlkMt0;!C%qy@e z%k^i;p&r)OWwJexY5f9B!Gnbbj?wA%R;Cp&87untX_Ex%neadVN56ZC>81U-Az?6m zY)HRQn^H5ghw0VMORiyf&|tRqAcSRNr#rx^1Tqu{SfiYK%!tug6s_vg+YgIq{VR83 zqgIZh*PJYE)Khc(BiYWbPz`Z4y3nnh@8CGrtyVy~@Kd+g55{Mhcs9Oy3~T}zk7vfc zX7c_M2Po9PPL5f(sqk$M4!#Xq$%=?zibyDHx`%Ur4um*V>ej^cPIUvv@)meQ^oXKk z<2GHZ+6?42t_{c@0yw_+#%_+PeJX6mi)445e5tHo?aOMR7)#8o>Q$B{d3_KE@NRtQ zu}|z7%BH(Rh0?_sQ;w+5TtDgycvOZh)}KYmBf7!0wuaJYlWL?|-?>M)9YP)zQWiOJ zA$i;qV~aLj{xn)lkt6RtH1#RjUS{-WswBFo=1$C0DHaz0hEwm-LS3T2>HcNxNAZaK z4h!>tIECsg)W%!oe!lV)!SpL5|(#S_XLw09ipRWR88>*0L4R@-SJ4abxLg*13Z!)r0jVL9&{8#g9XE z7{|u^OmxK{1rBCO-6p1H+YyBZW~&Um`i~&mm-E@ci zqb;79@~b`EFN1nue|M3cBrE6{NzEK-R!Q#wEX~ulC>YrKnJV;|NnW0F-ynbzhiOy1Bi$Lc(&J2RnHK2sgmgC~ z+CPQf8!Wc(xx)T|W8b3kNSBX%z^yCi5RD{t4Q0=_%dJ;2#%x#n6Hn#l9ZGqIlqmg7 z1EM)F?2MaB_?Gprs|>jJlsCicU9mJ;i7BKcy}n_aSlJ3cZ}y_rm+xM z*}f&js$#zI8S0c|Sn!yFA+H){#`99}rz=`dK-S6H^8u|3l*Sk4DqO3iqLN`LA&D>v zk^L;UKH7fCyW3%))?MgBGMRV-?h;BL`)BoWX#OPf+*meA<+?EO6i%v;r}lhR@>g*T z0crA6Vq>+K*xVRKk4)2;Sv`5AEq~UDPp6-zSgiLBUyTt}L#)?L4s%|E4tJirU|AWF zduLtL3x)N987VNYgW_Or5(De29k*W7iuhyAe`<~mXtv@sXN%#Ax~e+#E2i)#uN$uG zFlob%vmNOo-L1pH4=3AR<`o7qKR;x|)`U8?8rq`sVT7a?_x zmv^L->1x|ci>~Rkq=DxlWua(khMVXI+fy+;K`YjQ(*Z=7U&jMDn2~Fk*@xqv3IcJ7 zfF(=!egl9IQ`B6Aq)dtY$@Jba{ki7D&S&b}g(H1M70XAiUAcEGd7C7pVW!39bl%z3 z^Dq9sB98XDAw|+WtLbvO!FrXE-ygWE!g&k3vnWZ5VtQg=!E0*Q#CET8c%e@aS%Pmq zO!!SpgB=^Y^(3;1bl+ye_t^|@MtBA4sc0_l29Qwv`oXU13W17_tt|JB@4YJ7dPlC1 zW8yP^3mLGuMN@)1oMheEh@9CXc?|b?A-G~fEo-E@1Cur*VCUK3=}jE>RN3rfI}_Uo z6LSa_Fmz$jv~b5Au#@CTZxt=TBF8Zrp?fx-G6>m|qn0iQL<4|i*UyjvXplieiXh!n zWkefAFsuL@O;>2gK8*qO{J1 zXmFG+W7)=i^OG378>1WpS#pZBEN4mGP3({MLJE%1+R-RTBkz#1GWK1mw~5hrZPU8S z_)8Vd^otJpbqZBG(Z^7xdk5{mLU8nt*gk+l=d<&#$Co;iTmO QEx5-}Rn$_bm9vigAMSpzxc~qF literal 0 HcmV?d00001 diff --git a/public/img/logos/tokyohot/thumbs/network.png b/public/img/logos/tokyohot/thumbs/network.png new file mode 100644 index 0000000000000000000000000000000000000000..9d3d69f7caacdd22bea59973d4e5e175ac80b3be GIT binary patch literal 15514 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 literal 0 HcmV?d00001 diff --git a/public/img/logos/tokyohot/thumbs/tokyohot.png b/public/img/logos/tokyohot/thumbs/tokyohot.png new file mode 100644 index 0000000000000000000000000000000000000000..f9a695bdb469e178df9ee4ded32a20fa2fc1cdfb GIT binary patch literal 15514 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 literal 0 HcmV?d00001 diff --git a/public/img/logos/tokyohot/tokyohot.png b/public/img/logos/tokyohot/tokyohot.png new file mode 100644 index 0000000000000000000000000000000000000000..c7a913c93a77a56f9980529bb46d3eca6000b6fd GIT binary patch literal 12647 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 QEx5-}Rn$_bm9vigAGnOKUjP6A literal 0 HcmV?d00001 diff --git a/seeds/00_tags.js b/seeds/00_tags.js index df09cc4c6..244f1791a 100755 --- a/seeds/00_tags.js +++ b/seeds/00_tags.js @@ -1158,6 +1158,18 @@ const tags = [ name: 'exotic', slug: 'exotic', }, + { + name: 'japanese', + slug: 'japanese', + }, + { + name: 'jav', + slug: 'jav', + }, + { + name: 'fetish', + slug: 'fetish', + }, ]; const aliases = [ @@ -2287,11 +2299,23 @@ const aliases = [ }, { name: 'pronebone', - slug: 'prone-bone', + for: 'prone-bone', }, { name: 'prone', - slug: 'prone-bone', + for: 'prone-bone', + }, + { + name: 'japanese adult videos', + for: 'jav', + }, + { + name: 'japanese adult video', + for: 'jav', + }, + { + name: 'sm', + for: 'bdsm', }, ]; diff --git a/seeds/02_sites.js b/seeds/02_sites.js index 9ba58728c..59cc0c760 100755 --- a/seeds/02_sites.js +++ b/seeds/02_sites.js @@ -11089,6 +11089,13 @@ const sites = [ siteId: 20, }, }, + // TOKYO HOT + { + name: 'Tokyo Hot', + slug: 'tokyohot', + url: 'https://my.tokyo-hot.com', + tags: ['jav'], + }, // TOP WEB MODELS { name: '2 Girls 1 Camera', diff --git a/src/actors.js b/src/actors.js index 4ea8f77e1..192c604ab 100755 --- a/src/actors.js +++ b/src/actors.js @@ -106,6 +106,21 @@ const ethnicities = { white: 'white', }; +const bloodTypes = { + A: 'A', + 'A+': 'A+', + 'A-': 'A-', + B: 'B', + 'B+': 'B+', + 'B-': 'B-', + AB: 'AB', + 'AB+': 'AB+', + 'AB-': 'AB-', + O: 'O', + 'O+': 'O+', + 'O-': 'O-', +}; + function getBoolean(value) { if (typeof value === 'boolean') { return value; @@ -195,6 +210,7 @@ function toBaseActors(actorsOrNames, release) { name, slug, entryId: (entity && (entryId || actorOrName.entryId)) || null, + suppliedEntryId: entryId, entity, hasProfile: !!actorOrName.name, // actor contains profile information }; @@ -257,12 +273,15 @@ function curateActor(actor, withDetails = false, isProfile = false) { circumcised: actor.circumcised, height: actor.height, weight: actor.weight, + shoeSize: actor.shoe_size, eyes: actor.eyes, hairColor: actor.hair_color, + hairType: actor.hair_type, hasTattoos: actor.has_tattoos, hasPiercings: actor.has_piercings, tattoos: actor.tattoos, piercings: actor.piercings, + bloodType: actor.blood_type, ...(isProfile && { description: actor.description }), placeOfBirth: actor.birth_country && { country: { @@ -347,12 +366,15 @@ function curateProfileEntry(profile) { natural_boobs: profile.naturalBoobs, height: profile.height, weight: profile.weight, + shoe_size: profile.shoeSize, hair_color: profile.hairColor, + hair_type: profile.hairType, eyes: profile.eyes, has_tattoos: profile.hasTattoos, has_piercings: profile.hasPiercings, piercings: profile.piercings, tattoos: profile.tattoos, + blood_type: profile.bloodType, avatar_media_id: profile.avatarMediaId || null, }; @@ -386,6 +408,7 @@ async function curateProfile(profile, actor) { curatedProfile.nationality = profile.nationality?.trim() || null; // used to derive country when country not available curatedProfile.ethnicity = ethnicities[profile.ethnicity?.trim().toLowerCase()] || null; + curatedProfile.hairType = profile.hairType?.trim() || null; curatedProfile.hairColor = hairColors[(profile.hairColor || profile.hair)?.toLowerCase().replace('hair', '').trim()] || null; curatedProfile.eyes = eyeColors[profile.eyes?.trim().toLowerCase()] || null; @@ -411,6 +434,7 @@ async function curateProfile(profile, actor) { curatedProfile.height = Number(profile.height) || profile.height?.match?.(/\d+/)?.[0] || null; curatedProfile.weight = Number(profile.weight) || profile.weight?.match?.(/\d+/)?.[0] || null; + curatedProfile.shoeSize = Number(profile.shoeSize) || profile.shoeSize?.match?.(/\d+/)?.[0] || null; // separate measurement values curatedProfile.cup = profile.cup || (typeof profile.bust === 'string' && profile.bust?.match?.(/[a-zA-Z]+/)?.[0]) || null; @@ -435,6 +459,7 @@ async function curateProfile(profile, actor) { curatedProfile.naturalBoobs = getBoolean(profile.naturalBoobs); curatedProfile.hasTattoos = getBoolean(profile.hasTattoos); curatedProfile.hasPiercings = getBoolean(profile.hasPiercings); + curatedProfile.bloodType = bloodTypes[profile.bloodType?.trim().toUpperCase()] || null; if (argv.resolvePlace) { const [placeOfBirth, placeOfResidence] = await Promise.all([ @@ -564,6 +589,7 @@ async function interpolateProfiles(actorIdsOrNames) { 'bust', 'waist', 'hip', + 'shoe_size', 'penis_length', 'penis_girth', 'circumcised', @@ -571,6 +597,7 @@ async function interpolateProfiles(actorIdsOrNames) { 'eyes', 'has_tattoos', 'has_piercings', + 'blood_type', ].reduce((acc, property) => ({ ...acc, [property]: getMostFrequent(valuesByProperty[property]), diff --git a/src/app.js b/src/app.js index a5d3bd4c9..c07f3cf40 100755 --- a/src/app.js +++ b/src/app.js @@ -16,7 +16,8 @@ const logger = require('./logger')(__filename); const knex = require('./knex'); const fetchUpdates = require('./updates'); const { fetchScenes, fetchMovies } = require('./deep'); -const { storeScenes, storeMovies, updateSceneSearch, updateMovieSearch, associateMovieScenes } = require('./store-releases'); +const { storeScenes, storeMovies, associateMovieScenes } = require('./store-releases'); +const { updateSceneSearch, updateMovieSearch } = require('./update-search'); const { scrapeActors, deleteActors, flushActors, flushProfiles, interpolateProfiles } = require('./actors'); const { flushEntities } = require('./entities'); const { deleteScenes, deleteMovies, flushScenes, flushMovies, flushBatches } = require('./releases'); diff --git a/src/argv.js b/src/argv.js index ff2bc4b69..d4df5df2b 100755 --- a/src/argv.js +++ b/src/argv.js @@ -226,6 +226,11 @@ const { argv } = yargs type: 'boolean', default: true, }) + .option('caps', { + describe: 'Include release screen caps', + type: 'boolean', + default: true, + }) .option('trailers', { describe: 'Include release trailers', type: 'boolean', diff --git a/src/media.js b/src/media.js index b3164ad5e..cddc2635d 100755 --- a/src/media.js +++ b/src/media.js @@ -567,7 +567,7 @@ async function storeFile(media, options) { return storeImageFile(media, hashDir, hashSubDir, filename, filedir, filepath, options); } - if (['posters', 'photos', 'covers'].includes(media.role)) { + if (['posters', 'photos', 'caps', 'covers'].includes(media.role)) { throw new Error(`Media for '${media.role}' must be an image, but '${media.meta.mimetype}' was detected`); } @@ -873,6 +873,7 @@ async function associateReleaseMedia(releases, type = 'release') { ...(argv.images && argv.poster ? toBaseMedias([release.poster], 'posters') : []), ...(argv.images && argv.covers ? toBaseMedias(release.covers, 'covers') : []), ...(argv.images && argv.photos ? toBaseMedias(release.photos, 'photos') : []), + ...(argv.images && argv.caps ? toBaseMedias(release.caps, 'caps') : []), ...(argv.videos && argv.trailer ? toBaseMedias([release.trailer], 'trailers') : []), ...(argv.videos && argv.teaser ? toBaseMedias([release.teaser], 'teasers') : []), ], @@ -888,7 +889,7 @@ async function associateReleaseMedia(releases, type = 'release') { return acc; }, {}); - await Promise.reduce(['posters', 'covers', 'photos', 'teasers', 'trailers'], async (chain, role) => { + await Promise.reduce(['posters', 'covers', 'photos', 'caps', 'teasers', 'trailers'], async (chain, role) => { // stage by role so posters are prioritized over photos and videos await chain; @@ -1006,6 +1007,7 @@ async function flushOrphanedMedia() { knex('tags_photos').select('media_id'), knex('releases_posters').select('media_id'), knex('releases_photos').select('media_id'), + knex('releases_caps').select('media_id'), knex('releases_covers').select('media_id'), knex('releases_trailers').select('media_id'), knex('releases_teasers').select('media_id'), diff --git a/src/releases.js b/src/releases.js index 1ebf78bf1..4e636b43e 100755 --- a/src/releases.js +++ b/src/releases.js @@ -5,6 +5,7 @@ const inquirer = require('inquirer'); const logger = require('./logger')(__filename); const knex = require('./knex'); const argv = require('./argv'); +const { updateSceneSearch } = require('./update-search'); const { flushOrphanedMedia } = require('./media'); const { graphql } = require('./web/graphql'); @@ -303,6 +304,8 @@ async function deleteScenes(sceneIds) { .whereRaw('id = ANY(:sceneIds)', { sceneIds }) .delete(); + await updateSceneSearch(sceneIds); + logger.info(`Removed ${deleteCount}/${sceneIds.length} scenes`); return deleteCount; diff --git a/src/scrapers/scrapers.js b/src/scrapers/scrapers.js index d9f6b6c7a..b075c73cb 100755 --- a/src/scrapers/scrapers.js +++ b/src/scrapers/scrapers.js @@ -61,6 +61,7 @@ const spizoo = require('./spizoo'); const teamskeet = require('./teamskeet'); const teencoreclub = require('./teencoreclub'); const teenmegaworld = require('./teenmegaworld'); +const tokyohot = require('./tokyohot'); const topwebmodels = require('./topwebmodels'); const traxxx = require('./traxxx'); const vivid = require('./vivid'); @@ -151,6 +152,7 @@ const scrapers = { teencoreclub, teenmegaworld, teamskeet, + tokyohot, topwebmodels, transbella: porndoe, traxxx, @@ -288,6 +290,7 @@ const scrapers = { teencoreclub, teenmegaworld, thatsitcomshow: nubiles, + tokyohot, topwebmodels, transangels: mindgeek, transbella: porndoe, diff --git a/src/scrapers/tokyohot.js b/src/scrapers/tokyohot.js new file mode 100644 index 000000000..b8f1e05d4 --- /dev/null +++ b/src/scrapers/tokyohot.js @@ -0,0 +1,171 @@ +'use strict'; + +const unprint = require('unprint'); + +const slugify = require('../utils/slugify'); + +function scrapeAll(scenes, channel) { + return scenes.map(({ query }) => { + const release = {}; + + const pathname = query.url(); + + release.url = unprint.prefixUrl(pathname, channel.url); + release.entryId = pathname.match(/product\/(\w+)/)?.[1]; + release.shootId = query.attribute('img', 'title'); + + release.title = query.content('.title')?.replace(/^tokyo hot\s*/i, ''); + release.description = query.content('.text'); + + const poster = query.img(); + + release.poster = [ + poster.replace('220x124', '820x462'), + poster, + ]; + + return release; + }); +} + +function scrapeScene({ query }, url, channel) { + const release = {}; + + release.entryId = new URL(url).pathname.match(/product\/(\w+)/)?.[1]; + release.shootId = query.content('//dt[contains(text(), "Product ID")]/following-sibling::dd[1]'); + + release.title = query.content('.contents h2'); + release.description = query.content('.contents .sentence'); + release.date = query.date('//dt[contains(text(), "Release Date")]/following-sibling::dd[1]', 'YYYY/MM/DD'); + release.duration = query.duration('//dt[contains(text(), "Duration")]/following-sibling::dd[1]'); + + release.actors = query.all('.info a[href*="/cast"]').map((el) => ({ + name: unprint.query.content(el), + url: unprint.query.url(el, null, { origin: channel.url }), + })); + + release.tags = query.contents('.info a[href*="type=play"]'); + + const poster = query.poster('.movie video'); + + release.poster = [ + poster, + poster.replace('820x462', '220x124'), + ]; + + release.trailer = query.video('.movie source'); + + release.photos = query.imgs('.scap a', { attribute: 'href' }).map((img) => [ + img, + img.replace('640x480_wlimited', '150x150_default'), + ]); + + release.caps = query.imgs('.vcap a', { attribute: 'href' }).map((img) => [ + img, + img.replace('640x480_wlimited', '120x120_default'), + ]); + + return release; +} + +// measurements are specified as a range in centimeters 85 ~ 89cm +function getMeasurement(string, inches = false) { + if (!string) { + return null; + } + + const value = Array.from(string.matchAll(/(\d+(?:\.\d+)?)\s*cm/g)).at(-1)?.[1]; + + if (!value) { + return null; + } + + if (inches) { + return Math.round(Number(value) * 0.393701); + } + + return Number(value); +} + +function scrapeProfile({ query }) { + const profile = {}; + + const keys = query.contents('.info dt'); + const values = query.contents('.info dd'); + + const bio = Object.fromEntries(keys.map((key, index) => [slugify(key, '_'), values[index]])); + + profile.birthPlace = bio.home_town; + + profile.height = getMeasurement(bio.height); + + profile.cup = bio.cup_size?.replace('cup', '').trim(); + profile.bust = getMeasurement(bio.bust_size, true); + profile.waist = getMeasurement(bio.waist_size, true); + profile.hip = getMeasurement(bio.hip_size || bio.hip, true); + + profile.hairStyle = bio.hair_style; + profile.shoeSize = getMeasurement(bio.shoes_size); + + profile.bloodType = bio.blood_type.replace('type', '').trim(); + + profile.avatar = query.img('#profile img'); + + return profile; +} + +async function fetchLatest(channel, page) { + const url = `${channel.url}/product/?vendor=Tokyo-Hot&page=${page}&order=published_at`; + + const res = await unprint.get(url, { + selectAll: '#main .list .detail', + agent: { + rejectUnauthorized: false, + }, + }); + + if (res.ok) { + return scrapeAll(res.context, channel); + } + + return res.status; +} + +async function fetchScene(url, channel) { + const res = await unprint.get(url, { + agent: { + rejectUnauthorized: false, + }, + }); + + if (res.ok) { + return scrapeScene(res.context, url, channel); + } + + return res.status; +} + +async function fetchProfile(actor, context) { + if (!actor.url) { + // search is cumbersome + return null; + } + + const res = await unprint.get(actor.url, { + agent: { + rejectUnauthorized: false, + }, + }); + + if (res.ok) { + return scrapeProfile(res.context, context); + } + + return res.status; +} + +module.exports = { + fetchLatest, + fetchScene, + fetchProfile, +}; diff --git a/src/store-releases.js b/src/store-releases.js index 44dabc540..8697eb85e 100755 --- a/src/store-releases.js +++ b/src/store-releases.js @@ -16,6 +16,7 @@ const { associateActors, associateDirectors, scrapeActors, toBaseActors } = requ const { associateReleaseTags } = require('./tags'); const { curateEntity } = require('./entities'); const { associateReleaseMedia } = require('./media'); +const { updateSceneSearch, updateMovieSearch } = require('./update-search'); const { notify } = require('./alerts'); async function curateReleaseEntry(release, batchId, existingRelease, type = 'scene') { @@ -229,50 +230,6 @@ async function filterDuplicateReleases(releases) { }; } -async function updateSceneSearch(releaseIds) { - logger.info(`Updating search documents for ${releaseIds ? releaseIds.length : 'all' } releases`); - - const documents = await knex.raw(` - SELECT - releases.id AS release_id, - TO_TSVECTOR( - 'english', - COALESCE(releases.title, '') || ' ' || - releases.entry_id || ' ' || - entities.name || ' ' || - entities.slug || ' ' || - COALESCE(array_to_string(entities.alias, ' '), '') || ' ' || - COALESCE(parents.name, '') || ' ' || - COALESCE(parents.slug, '') || ' ' || - COALESCE(array_to_string(parents.alias, ' '), '') || ' ' || - COALESCE(releases.shoot_id, '') || ' ' || - COALESCE(TO_CHAR(releases.date, 'YYYY YY MM FMMM FMMonth mon DD FMDD'), '') || ' ' || - STRING_AGG(COALESCE(actors.name, ''), ' ') || ' ' || - STRING_AGG(COALESCE(directors.name, ''), ' ') || ' ' || - STRING_AGG(COALESCE(tags.name, ''), ' ') || ' ' || - STRING_AGG(COALESCE(tags_aliases.name, ''), ' ') - ) as document - FROM releases - LEFT JOIN entities ON releases.entity_id = entities.id - LEFT JOIN entities AS parents ON parents.id = entities.parent_id - LEFT JOIN releases_actors AS local_actors ON local_actors.release_id = releases.id - LEFT JOIN releases_directors AS local_directors ON local_directors.release_id = releases.id - LEFT JOIN releases_tags AS local_tags ON local_tags.release_id = releases.id - LEFT JOIN actors ON local_actors.actor_id = actors.id - LEFT JOIN actors AS directors ON local_directors.director_id = directors.id - LEFT JOIN tags ON local_tags.tag_id = tags.id AND tags.priority >= 6 - LEFT JOIN tags as tags_aliases ON local_tags.tag_id = tags_aliases.alias_for AND tags_aliases.secondary = true - ${releaseIds ? 'WHERE releases.id = ANY(?)' : ''} - GROUP BY releases.id, entities.name, entities.slug, entities.alias, parents.name, parents.slug, parents.alias; - `, releaseIds && [releaseIds]); - - if (documents.rows?.length > 0) { - await bulkInsert('releases_search', documents.rows, ['release_id']); - } - - await knex.raw('REFRESH MATERIALIZED VIEW releases_summaries;'); -} - async function storeChapters(releases) { const chapters = releases .map((release) => release.chapters?.map((chapter, index) => ({ @@ -380,44 +337,6 @@ async function associateSerieScenes(series, serieScenes) { await bulkInsert('series_scenes', associations, false); } -async function updateMovieSearch(movieIds, target = 'movie') { - logger.info(`Updating search documents for ${movieIds ? movieIds.length : 'all' } ${target}s`); - - const documents = await knex.raw(` - SELECT - ${target}s.id AS ${target}_id, - TO_TSVECTOR( - 'english', - COALESCE(${target}s.title, '') || ' ' || - entities.name || ' ' || - entities.slug || ' ' || - COALESCE(array_to_string(entities.alias, ' '), '') || ' ' || - COALESCE(parents.name, '') || ' ' || - COALESCE(parents.slug, '') || ' ' || - COALESCE(array_to_string(parents.alias, ' '), '') || ' ' || - COALESCE(TO_CHAR(${target}s.date, 'YYYY YY MM FMMM FMMonth mon DD FMDD'), '') || ' ' || - STRING_AGG(COALESCE(releases.title, ''), ' ') || ' ' || - STRING_AGG(COALESCE(actors.name, ''), ' ') || ' ' || - STRING_AGG(COALESCE(tags.name, ''), ' ') - ) as document - FROM ${target}s - LEFT JOIN entities ON ${target}s.entity_id = entities.id - LEFT JOIN entities AS parents ON parents.id = entities.parent_id - LEFT JOIN ${target}s_scenes ON ${target}s_scenes.${target}_id = ${target}s.id - LEFT JOIN releases ON releases.id = ${target}s_scenes.scene_id - LEFT JOIN releases_actors ON releases_actors.release_id = ${target}s_scenes.scene_id - LEFT JOIN releases_tags ON releases_tags.release_id = releases.id - LEFT JOIN actors ON actors.id = releases_actors.actor_id - LEFT JOIN tags ON tags.id = releases_tags.tag_id - ${movieIds ? `WHERE ${target}s.id = ANY(?)` : ''} - GROUP BY ${target}s.id, entities.name, entities.slug, entities.alias, parents.name, parents.slug, parents.alias; - `, movieIds && [movieIds]); - - if (documents.rows?.length > 0) { - await bulkInsert(`${target}s_search`, documents.rows, [`${target}_id`]); - } -} - async function storeMovies(movies, useBatchId) { if (!movies || movies.length === 0) { return []; diff --git a/src/update-search.js b/src/update-search.js new file mode 100644 index 000000000..bf03dd5d4 --- /dev/null +++ b/src/update-search.js @@ -0,0 +1,92 @@ +'use strict'; + +const knex = require('./knex'); +const logger = require('./logger')(__filename); +const bulkInsert = require('./utils/bulk-insert'); + +async function updateSceneSearch(releaseIds) { + logger.info(`Updating search documents for ${releaseIds ? releaseIds.length : 'all' } releases`); + + const documents = await knex.raw(` + SELECT + releases.id AS release_id, + TO_TSVECTOR( + 'english', + COALESCE(releases.title, '') || ' ' || + releases.entry_id || ' ' || + entities.name || ' ' || + entities.slug || ' ' || + COALESCE(array_to_string(entities.alias, ' '), '') || ' ' || + COALESCE(parents.name, '') || ' ' || + COALESCE(parents.slug, '') || ' ' || + COALESCE(array_to_string(parents.alias, ' '), '') || ' ' || + COALESCE(releases.shoot_id, '') || ' ' || + COALESCE(TO_CHAR(releases.date, 'YYYY YY MM FMMM FMMonth mon DD FMDD'), '') || ' ' || + STRING_AGG(COALESCE(actors.name, ''), ' ') || ' ' || + STRING_AGG(COALESCE(directors.name, ''), ' ') || ' ' || + STRING_AGG(COALESCE(tags.name, ''), ' ') || ' ' || + STRING_AGG(COALESCE(tags_aliases.name, ''), ' ') + ) as document + FROM releases + LEFT JOIN entities ON releases.entity_id = entities.id + LEFT JOIN entities AS parents ON parents.id = entities.parent_id + LEFT JOIN releases_actors AS local_actors ON local_actors.release_id = releases.id + LEFT JOIN releases_directors AS local_directors ON local_directors.release_id = releases.id + LEFT JOIN releases_tags AS local_tags ON local_tags.release_id = releases.id + LEFT JOIN actors ON local_actors.actor_id = actors.id + LEFT JOIN actors AS directors ON local_directors.director_id = directors.id + LEFT JOIN tags ON local_tags.tag_id = tags.id AND tags.priority >= 6 + LEFT JOIN tags as tags_aliases ON local_tags.tag_id = tags_aliases.alias_for AND tags_aliases.secondary = true + ${releaseIds ? 'WHERE releases.id = ANY(?)' : ''} + GROUP BY releases.id, entities.name, entities.slug, entities.alias, parents.name, parents.slug, parents.alias; + `, releaseIds && [releaseIds]); + + if (documents.rows?.length > 0) { + await bulkInsert('releases_search', documents.rows, ['release_id']); + } + + await knex.raw('REFRESH MATERIALIZED VIEW releases_summaries;'); +} + +async function updateMovieSearch(movieIds, target = 'movie') { + logger.info(`Updating search documents for ${movieIds ? movieIds.length : 'all' } ${target}s`); + + const documents = await knex.raw(` + SELECT + ${target}s.id AS ${target}_id, + TO_TSVECTOR( + 'english', + COALESCE(${target}s.title, '') || ' ' || + entities.name || ' ' || + entities.slug || ' ' || + COALESCE(array_to_string(entities.alias, ' '), '') || ' ' || + COALESCE(parents.name, '') || ' ' || + COALESCE(parents.slug, '') || ' ' || + COALESCE(array_to_string(parents.alias, ' '), '') || ' ' || + COALESCE(TO_CHAR(${target}s.date, 'YYYY YY MM FMMM FMMonth mon DD FMDD'), '') || ' ' || + STRING_AGG(COALESCE(releases.title, ''), ' ') || ' ' || + STRING_AGG(COALESCE(actors.name, ''), ' ') || ' ' || + STRING_AGG(COALESCE(tags.name, ''), ' ') + ) as document + FROM ${target}s + LEFT JOIN entities ON ${target}s.entity_id = entities.id + LEFT JOIN entities AS parents ON parents.id = entities.parent_id + LEFT JOIN ${target}s_scenes ON ${target}s_scenes.${target}_id = ${target}s.id + LEFT JOIN releases ON releases.id = ${target}s_scenes.scene_id + LEFT JOIN releases_actors ON releases_actors.release_id = ${target}s_scenes.scene_id + LEFT JOIN releases_tags ON releases_tags.release_id = releases.id + LEFT JOIN actors ON actors.id = releases_actors.actor_id + LEFT JOIN tags ON tags.id = releases_tags.tag_id + ${movieIds ? `WHERE ${target}s.id = ANY(?)` : ''} + GROUP BY ${target}s.id, entities.name, entities.slug, entities.alias, parents.name, parents.slug, parents.alias; + `, movieIds && [movieIds]); + + if (documents.rows?.length > 0) { + await bulkInsert(`${target}s_search`, documents.rows, [`${target}_id`]); + } +} + +module.exports = { + updateSceneSearch, + updateMovieSearch, +};