From 12c3f0d7b9a50987472ccbb84c1dc4acf374a6db Mon Sep 17 00:00:00 2001 From: DebaucheryLibrarian Date: Thu, 14 Jan 2021 01:37:50 +0100 Subject: [PATCH] Added Top Web Models framework. --- assets/components/entities/entity.vue | 2 +- assets/components/expand/expand.vue | 6 +- public/img/logos/pinkyxxx/favicon.png | Bin 1430 -> 1362 bytes .../logos/pinkyxxx/misc/favicon_border.png | Bin 1430 -> 1362 bytes seeds/00_tags.js | 2 +- seeds/01_networks.js | 5 ++ seeds/02_sites.js | 75 +++++++++++++++++- src/scrapers/scrapers.js | 2 + src/utils/qu.js | 19 ++++- 9 files changed, 101 insertions(+), 10 deletions(-) diff --git a/assets/components/entities/entity.vue b/assets/components/entities/entity.vue index 2b251485..49193987 100644 --- a/assets/components/entities/entity.vue +++ b/assets/components/entities/entity.vue @@ -83,7 +83,7 @@ v-if="entity.children.length > 0" v-slot="scroll" :expanded="expanded" - class="scroll-dark" + class="scroll-light" @expand="(state) => expanded = state" > !!Nplu2UkH5`~h)ub5eAX67Ne2 zEn>XzcpvB8b9nDQK&Y3QW_64Knr@q^L|n{dSH-SZ1Q13a1b%@B6dDYR+OnKqQ`JhG`RT5KnE|2Iqa^2rJ4e@j3CRNf#u3C`-Ngjg)JvC_t@Xllfh#8Fk#DPPEVta9Gstd*;*c~AbrP)=W2<~pq*B(R7jND!f* ziW17O5u;rv#eYJI&f`A*LDw&lOCeVYj2sK7K!fc1!T;d*Y_0snxR(@)1D!99^Dzu` z?E;OO<9r`GPU8d!J_A>J%U`JjGoPf_T3Yl7=-mb`u3MV22VCv|15bu*%B~coCFJwK z`x$*x7U;hPde*$THP3PS0HkSF$s6F{5Ev;?_PWozyAa#w_HR#fem_OKa+TCw7D1D; z0Wt^;6e9(YyIH=I>;Wi$DoI2^R9M5kmrZO;Q5462Z$8^wD=QKU3o8qDG?Dm7EHqRI67iLXVk4-crL8JjooQ#LGxOek7BgyQdf)VQ zX80#JdAaAj{Lee*|IR&EBMaeBiw8Ik%tVbbpaS03;MyM{q->=GL~TMQak3w zuJm3qCq2W!Dq-kP{kfkTZd)3N^&06=i_N~rPWZ`X%IEvrfj z!0i4(yyXe;%g?ZWMx2{WWdQHmT9v73JX2F9|1>~s*KM$W(gI7Je^2$5ZFpu>DgFIh zmSVMi%ac5Fi_Spm#g}n%03sI2`yI|&SU6j?J+1f>C_0~cue(4Q{7|8#mny(=h|P|q z3LiJ)4a@#F0eC}moP#qhh)diYM()TK)#iSP2Lf9g9sT9kU#deZQFI0Zs~fP7M@ilI z02N*WI~wtS&98A5?ZZ#m>i>i9#g{7q`Mhkl{Fg*2h8Q^8w_u2m~g`-U7A@L%&;k zBhobF%Ms*@5mIJHy2c*BmmyV??-YjKTHaQyp_+K|kpOlJL%&+KPUyB$z;$4OF!U=0 zC#MpL;=umQjVS@V&U{p-Fm&l^bW{IF1#TO1f~`#$`j4V#MrDeEpjM$0?A zW<3u@0_jsFCXvs>uDWez6^(2WuFPDa+#&+35r#fomH>pI_XEp;As6or0wH1O9i^7w YHzQ&e^Nj?8v;Y7A07*qoM6N<$g6u6$!vFvP delta 1331 zcmV-31 zSe-10ia2T&iclfc3avVryz~#6G$bi5j)H5!!JoydgNw7S4z7YA_ygkR=A`H%CEk}5 zTEuwa@jlMG=kVTrfWKa5s@X9PsG4P@5^*7uT@`|_@Sz9&7=K1sVx~SPib;6Z*FAMp z-Nks8ci*4YtK>`u_ypovrW+RV2J!T!rE}gVjS%3k+)cM(_n-2Uxp&hH0EhH{ona4@Bl zu>mp&3l=gPAA-z(lj{K}e{D%bK~z}7y_QXATvZgufA_wRagv%>OhQ8gEw!aIZHl-M z({$k%7F!DncF{tWM>j>Gpn|)q;6`-e%68SlP;gPf5_DsuMG#A$*$8P8w5EZiB~n6S zXYw`g^SXG+e`K=};8Wmx%dx$* zjWY53ZQ#9{gDW5}p+y5z#P2J15V#Hu7JCZ&)7*#z0}&vQpuOAFeX)mKOtkg5X&GE{t0v=`pfD{;AJ2AR;*0epi_YZ1t0iF;5AuzmUQjAi#H-?sj z1N2#rJ+oy1yn!*ozKTXH0vESz82NurQvT#lvO8`Ae`DDIL<%)mPG`OB^vUDSjdw`y!<;JoG7 z4>lCZy15M^yf5zJnL~(n1562SgqrrjRci&Q1iWcE_Agacx-snqe1)3ys$6j?0iOd` zEytcpe{-d0sIvuNlogS6fk(hCpkO(6u@)y;0L%a{0rLr!3oXZv>T#lHZFS4B-7F5| zhL?`2gHV7UZK_@*8SnvvQb_5AYa5SO6&GKEa+MW8l7Wv_h*fb*t$jR|40&m(5H}6L pcfbcgP{YmeBJhpn*qIsl54d0`SaxD2X8-^I2>?k&PDHLkV1k5ecr5?` diff --git a/public/img/logos/pinkyxxx/misc/favicon_border.png b/public/img/logos/pinkyxxx/misc/favicon_border.png index 8e99c1ba0961792b285239a7718b454e19fa3647..9acfaa8578c1faba6d1cf79bf664d66b5baf06f6 100644 GIT binary patch delta 1262 zcmV!!Nplu2UkH5`~h)ub5eAX67Ne2 zEn>XzcpvB8b9nDQK&Y3QW_64Knr@q^L|n{dSH-SZ1Q13a1b%@B6dDYR+OnKqQ`JhG`RT5KnE|2Iqa^2rJ4e@j3CRNf#u3C`-Ngjg)JvC_t@Xllfh#8Fk#DPPEVta9Gstd*;*c~AbrP)=W2<~pq*B(R7jND!f* ziW17O5u;rv#eYJI&f`A*LDw&lOCeVYj2sK7K!fc1!T;d*Y_0snxR(@)1D!99^Dzu` z?E;OO<9r`GPU8d!J_A>J%U`JjGoPf_T3Yl7=-mb`u3MV22VCv|15bu*%B~coCFJwK z`x$*x7U;hPde*$THP3PS0HkSF$s6F{5Ev;?_PWozyAa#w_HR#fem_OKa+TCw7D1D; z0Wt^;6eA6uV9|_|>;Wi$DoI2^R9M5kmrZO;Q5462Z$8^wD=QKU3o8qDG?Dm7EHqRI67iLXVk4-crL8JjooQ#LGxOek7BgyQdf)VQ zX80#JdAaAj{Lee*|IR&EBMaeBiw8Ik%tVbbpaS03;MyM{q->=GL~TMQak3w zuJm3qCq2W!Dq-kP{kfkTZd)3N^&06=i_N~rPWZ`X%IEvrfj z!0i4(yyXe;%g?ZWMx2{WWdQHmT9v73JX2F9|1>~s*KM$W(gI7Je^2$5ZFpu>DgFIh zmSVMi%ac5Fi_Spm#g}n%03sI2`yI|&SU6j?J+1f>C_0~cue(4Q{7|8#mny(=h|P|q z3LiJ)4a@#F0eC}moP#qhh)diYM()TK)#iSP2Lf9g9sT9kU#deZQFI0Zs~fP7M@ilI z02N*WI~wtS&98A5?ZZ#m>i>i9#g{7q`Mhkl{Fg*2h8Q^8w_u2m~g`-U7A@L%&;k zBhobF%Ms*@5mIJHy2c*BmmyV??-YjKTHaQyp_+K|kpOlJL%&+KPUyB$z;$4OF!U=0 zC#MpL;=umQjVS@V&U{p-Fm&l^bW{IF1#TO1f~`#$`j4V#MrDeEpjM$0?A zW<3u@0_jsFCXvs>uDWez6^(2WuFPDa+#&+35r#fomH>pI_XEp;As6or0wH1O9i^7w YHzQ&e^Nj?8v;Y7A07*qoM6N<$g71V*!~g&Q delta 1331 zcmV-31 zSe-10ia2T&iclfc3avVryz~#6G$bi5j)H5!!JoydgNw7S4z7YA_ygkR=A`H%CEk}5 zTEuwa@jlMG=kVTrfWKa5s@X9PsG4P@5^*7uT@`|_@Sz9&7=K1sVx~SPib;6Z*FAMp z-Nks8ci*4YtK>`u_ypovrW+RV2J!T!rE}gVjS%3k+)cM(_n-2Uxp&hH0EhH{ona4@Bl zu>mp&3l=gPAA-z(lj{K}e{D%bK~z}7y_QXATvZgufA_wRagv%>OhQ8gEw!aIZHl-M z({$k%7F!DncF{tWM>j>Gpn|)q;6`-e%68SlP;gPf5_DsuMG#A$*$8P8w5EZiB~n6S zXYw`g^SXG+e`K=};8Wmx%dx$* zjWY53ZQ#9{gDW5}p+y5z#P2J15V#Hu7JCZ&)7*#z0}&vQpuOAFeX)mKOtkg5X&GE{t0v=`pfD{;AJ2AR;*0epi_YZ1t0iF;5AuzmUQjAi#H-?sj z1N2#rJ+oy1yn!*ozKTXH0vESz82NurQvT#lvO8`Ae`DDIL<%)mPG`OB^vUDSjdw`y!<;JoG7 z4>lCZy15M^yf5zJnL~(n1562SgqrrjRci&Q1iWcE_Agacx-snqe1)3ys$6j?0iOd` zEytcpe{-d0sIvuNlogS6fk(hCpkO(6u@)y;0L%a{0rLr!3oXZv>T#lHZFS4B-7F5| zhL?`2gHV7UZK_@*8SnvvQb_5AYa5SO6&GKEa+MW8l7Wv_h*fb*t$jR|40&m(5H}6L pcfbcgP{YmeBJhpn*qIsl54d0`SaxD2X8-^I2>?k&PDHLkV1k5ecr5?` diff --git a/seeds/00_tags.js b/seeds/00_tags.js index 8fbdefdd..c527139d 100644 --- a/seeds/00_tags.js +++ b/seeds/00_tags.js @@ -1104,7 +1104,7 @@ const aliases = [ for: 'titty-fucking', }, { - name: 'behind the scenes', + name: 'bts', for: 'bts', secondary: true, }, diff --git a/seeds/01_networks.js b/seeds/01_networks.js index c8052623..b53498f1 100644 --- a/seeds/01_networks.js +++ b/seeds/01_networks.js @@ -464,6 +464,11 @@ const networks = [ name: 'Teen Core Club', url: 'https://teencoreclub.com', }, + { + slug: 'topwebmodels', + name: 'Top Web Models', + url: 'https://tour.topwebmodels.com', + }, { slug: 'transbella', name: 'Trans Bella', diff --git a/seeds/02_sites.js b/seeds/02_sites.js index 123256f7..d862b73c 100644 --- a/seeds/02_sites.js +++ b/seeds/02_sites.js @@ -8704,6 +8704,79 @@ const sites = [ parameters: {}, }, */ + // TOP WEB MODELS + { + name: '2 Girls 1 Camera', + slug: '2girls1camera', + url: 'https://tour.2girls1camera.com', + tags: ['mff'], + parent: 'topwebmodels', + }, + { + name: 'Big Gulp Girls', + slug: 'biggulpgirls', + url: 'https://tour.biggulpgirls.com', + parent: 'topwebmodels', + }, + { + name: 'Cougar Season', + slug: 'cougarseason', + url: 'https://tour.cougarseason.com', + tags: ['milf'], + parent: 'topwebmodels', + }, + { + name: 'Deepthroat Sirens', + slug: 'deepthroatsirens', + url: 'https://tour.deepthroatsirens.com', + tags: ['blowjob', 'deepthroat'], + parent: 'topwebmodels', + }, + { + name: 'Facials Forever', + slug: 'facialsforever', + url: 'https://tour.facialsforever.com', + tags: ['facial'], + parent: 'topwebmodels', + }, + { + name: 'Pounded Petite', + slug: 'poundedpetite', + url: 'https://tour.poundedpetite.com', + parent: 'topwebmodels', + }, + { + name: 'She\'s Brand New', + slug: 'shesbrandnew', + url: 'https://tour.shesbrandnew.com', + parent: 'topwebmodels', + }, + { + name: 'TWM Classics', + slug: 'twmclassics', + url: 'https://tour.topwebmodels.com/sites/twmclassics', + parent: 'topwebmodels', + }, + { + name: 'TWM Interviews', + slug: 'twminterviews', + url: 'https://tour.topwebmodels.com/sites/topwebmodels-interviews', + tags: ['bts'], + parent: 'topwebmodels', + hasLogo: false, + parameters: { + slug: 'topwebmodels-interviews', + }, + }, + { + name: 'TWM Porn Vault', + slug: 'twmpornvault', + url: 'https://tour.topwebmodels.com/sites/twm-porn-vault', + parent: 'topwebmodels', + parameters: { + slug: 'twm-porn-vault', + }, + }, // TRANS BELLA { name: 'Trans Bella', @@ -9273,7 +9346,7 @@ exports.seed = knex => Promise.resolve() const networksMap = networks.reduce((acc, { id, slug }) => ({ ...acc, [slug]: id }), {}); - const tags = await knex('tags').select('*').where('alias_for', null); + const tags = await knex('tags').select('*').whereNull('alias_for'); const tagsMap = tags.reduce((acc, { id, slug }) => ({ ...acc, [slug]: id }), {}); const sitesWithNetworks = sites.map(site => ({ diff --git a/src/scrapers/scrapers.js b/src/scrapers/scrapers.js index e62ee6ec..786a2f1f 100644 --- a/src/scrapers/scrapers.js +++ b/src/scrapers/scrapers.js @@ -66,6 +66,7 @@ const sextreme = require('./21sextreme'); const sextury = require('./21sextury'); const teamskeet = require('./teamskeet'); const teencoreclub = require('./teencoreclub'); +const topwebmodels = require('./topwebmodels'); const transangels = require('./transangels'); const traxxx = require('./traxxx'); const twistys = require('./twistys'); @@ -160,6 +161,7 @@ const scrapers = { swallowsalon: julesjordan, teencoreclub, teamskeet, + topwebmodels, transbella: porndoe, traxxx, twistys, diff --git a/src/utils/qu.js b/src/utils/qu.js index b49c0c89..e566f9ac 100644 --- a/src/utils/qu.js +++ b/src/utils/qu.js @@ -40,6 +40,18 @@ function formatDate(dateValue, format, inputFormat) { return moment(dateValue).format(format); } +function durationToSeconds(durationString, match) { + const durationMatch = durationString.match(match || /(\d+:)?\d+:\d+/); + + if (durationMatch) { + const segments = ['00'].concat(durationMatch[0].split(/[:hm]/)).slice(-3); + + return moment.duration(segments.join(':')).asSeconds(); + } + + return null; +} + function prefixUrl(urlValue, origin, protocol = 'https') { if (!urlValue) { return null; @@ -316,12 +328,10 @@ function duration(context, selector, match, attr = 'textContent') { const durationString = q(context, selector, attr); if (!durationString) return null; - const durationMatch = durationString.match(match || /(\d+:)?\d+:\d+/); + const durationMatch = durationToSeconds(durationString, match); if (durationMatch) { - const segments = ['00'].concat(durationMatch[0].split(/[:hm]/)).slice(-3); - - return moment.duration(segments.join(':')).asSeconds(); + return durationMatch; } const timestampMatch = durationString.match(/(\d+H)?\s*(\d+M)?\s*\d+S?/i); @@ -526,6 +536,7 @@ module.exports = { extractDate, extract, extractAll, + durationToSeconds, init, initAll, formatDate,