Added profile scraping and Hoby Buchanon to Team Skeet.

This commit is contained in:
DebaucheryLibrarian 2020-07-23 04:29:46 +02:00
parent 9ef5ea8fb6
commit 23e4f87af0
96 changed files with 726 additions and 189 deletions

View File

@ -156,7 +156,7 @@ export default {
return { return {
entity: null, entity: null,
totalCount: null, totalCount: null,
limit: 20, limit: Number(this.$route.query.limit) || 20,
expanded: false, expanded: false,
}; };
}, },

View File

@ -86,7 +86,6 @@ function initEntitiesActions(store, _router) {
or: [ or: [
{ {
slug: { equalTo: $entitySlug } slug: { equalTo: $entitySlug }
type: { equalTo: "channel" }
}, },
{ {
parent: { parent: {

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.9 KiB

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.5 KiB

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.0 KiB

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.1 KiB

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.4 KiB

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1020 B

After

Width:  |  Height:  |  Size: 1020 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.3 KiB

After

Width:  |  Height:  |  Size: 8.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.8 KiB

After

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.9 KiB

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.0 KiB

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.4 KiB

After

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 873 B

After

Width:  |  Height:  |  Size: 873 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.5 KiB

After

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.0 KiB

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.5 KiB

After

Width:  |  Height:  |  Size: 6.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.0 KiB

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.4 KiB

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.5 KiB

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.8 KiB

After

Width:  |  Height:  |  Size: 4.8 KiB

View File

@ -0,0 +1,195 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 24.1.2, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 300 65" style="enable-background:new 0 0 300 65;" xml:space="preserve">
<style type="text/css">
.st0{fill:#514FFF;}
.st1{fill:url(#Path_51_1_);}
.st2{fill:url(#Path_52_1_);}
.st3{fill:url(#Path_53_1_);}
.st4{fill:none;stroke:#FE027C;stroke-width:0.3249;stroke-miterlimit:10;}
.st5{fill:#FE027C;}
.st6{fill:#FFFFFF;}
.st7{fill:#09B83E;}
</style>
<g id="Group_32" transform="translate(2271 286)">
<g id="Group_29" transform="translate(-2467 -304)">
<g id="stayhomepov_inline" transform="translate(146.651 -23.449)">
<g id="Group_18" transform="translate(130.708 59.311)">
<g id="Group_15" transform="translate(0)">
<path id="Path_40" class="st0" d="M-2.6,24.8c0,4-2.5,7.6-6.3,8.9c-0.7,0.3-1.4,0.4-2.2,0.4c-1,0-1.9-0.1-2.9-0.4
c-2.1-0.6-4-1.9-5.3-3.7c-0.4-0.5-0.3-1.3,0.3-1.7l2.2-1.6c0.4-0.3,0.9-0.2,1.2,0.2c1.2,1.2,2.8,1.9,4.5,1.8
c2.1-0.2,3.8-1.9,3.9-4c0-2.9-1.3-3.7-4.8-5.1c-3.2-1.3-7.7-3.1-7.7-9.7c-0.1-3.8,2.3-7.3,5.9-8.6C-13,1.2-12.3,1-11.5,1
c0.8,0,1.7,0.1,2.4,0.4c2,0.6,3.8,1.9,5,3.7c0.4,0.5,0.3,1.3-0.2,1.7l-2.2,1.7c-0.4,0.3-0.9,0.2-1.2-0.2c0,0,0,0,0,0
c-0.9-1.2-2.3-1.9-3.8-1.9c-1.2,0-3.6,1.2-3.6,3.6c0,2.6,1.2,3.3,4.6,4.7C-7.3,15.9-2.6,17.8-2.6,24.8z"/>
<path id="Path_41" class="st0" d="M16.2,2.6v3.1c0,0.6-0.4,1.1-1,1.1h-3.6c-0.6,0.1-1,0.6-1,1.1v24.7c0,0.6-0.4,1.1-1,1.1H7.1
c-0.6-0.1-1-0.6-1-1.1V7.9c0-0.6-0.4-1.1-1-1.1H1.5c-0.6-0.1-1-0.6-1-1.1V2.6c0-0.6,0.4-1.1,1-1.1h13.7
C15.8,1.5,16.3,1.9,16.2,2.6C16.2,2.5,16.2,2.6,16.2,2.6z"/>
<path id="Path_42" class="st0" d="M36,33.7h-2.8c-0.6-0.1-1.1-0.5-1.2-1.1l-1-4.1c-0.1-0.6-0.6-1-1.2-1.1H24
c-0.6,0.1-1.1,0.5-1.2,1.1l-1,4.1c-0.1,0.6-0.6,1-1.2,1.1h-2.8c-0.4,0-0.8-0.4-0.8-0.8c0-0.1,0-0.2,0.1-0.3l7-30.1
c0.1-0.6,0.6-1,1.2-1.1h3.1C29,1.5,29.5,2,29.6,2.5l7,30.1c0.2,0.4,0,0.9-0.5,1C36.1,33.7,36.1,33.7,36,33.7z M29.2,21
l-2.1-8.9c-0.2-0.6-0.4-0.6-0.5,0L24.6,21c-0.2,0.4,0,0.9,0.5,1c0.1,0,0.2,0.1,0.3,0.1h3.2C29,22.1,29.3,21.6,29.2,21L29.2,21z
"/>
<path id="Path_43" class="st0" d="M55.7,2.5l-6.8,20.2c-0.2,0.7-0.3,1.4-0.3,2.2v7.6c0,0.6-0.4,1.1-1,1.1H45
c-0.6-0.1-1-0.6-1-1.1v-7.6c0-0.7-0.1-1.5-0.3-2.2L36.9,2.5C36.7,2,37,1.5,37.5,1.5h2.9c0.6,0.1,1.1,0.5,1.3,1.1l4.1,12.4
c0.2,0.6,0.5,0.6,0.7,0l4.1-12.4c0.2-0.6,0.7-1,1.3-1.1H55C55.6,1.4,55.9,1.9,55.7,2.5z"/>
</g>
<g id="Group_16" transform="translate(113.256 0.052)">
<path id="Path_44" class="st0" d="M-32.3,2.5v30c0,0.6-0.4,1.1-1,1.1h-2.6c-0.6-0.1-1-0.6-1-1.1V21.3c0-0.6-0.4-1.1-1-1.1h-6.8
c-0.6,0.1-1,0.6-1,1.1v11.2c0,0.6-0.4,1.1-1,1.1h-2.6c-0.6-0.1-1-0.6-1-1.1v-30c0-0.6,0.4-1.1,1-1.1h2.6c0.6,0.1,1,0.6,1,1.1
v11.2c0,0.6,0.4,1.1,1,1.1h6.8c0.6-0.1,1-0.6,1-1.1V2.5c0-0.6,0.4-1.1,1-1.1h2.6C-32.7,1.4-32.3,1.9-32.3,2.5z"/>
<path id="Path_45" class="st0" d="M-10.4,11v13.1c0,4.1-2.2,7.7-5.3,9.2c-1,0.5-2.1,0.8-3.3,0.8h-0.8c-1.1,0-2.3-0.3-3.3-0.8
c-3.1-1.5-5.3-5-5.3-9.2V11c0-5.5,3.8-9.9,8.6-9.9h0.8C-14.3,1-10.4,5.5-10.4,11z M-15,11c0-2.6-1.8-4.6-4-4.6h-0.8
c-2.2,0-4,2.1-4,4.6v13.1c0,2.6,1.8,4.6,4,4.6h0.8c2.2,0,4-2.1,4-4.6V11z"/>
<path id="Path_46" class="st0" d="M14.3,2.5v30c0,0.6-0.4,1.1-1,1.1h-2.6c-0.6-0.1-1-0.6-1-1.1V18.3c0-0.6-0.1-0.6-0.3,0
l-3.2,14c-0.1,0.6-0.6,1-1.2,1.1H2.7c-0.6-0.1-1.1-0.5-1.2-1.1l-3.2-14c-0.2-0.6-0.3-0.6-0.3,0v14.2c0,0.6-0.4,1.1-1,1.1h-2.6
c-0.6-0.1-1-0.6-1-1.1v-30c0-0.6,0.4-1.1,1-1.1h3.7c0.6,0.1,1.1,0.5,1.2,1.1l4.2,18.4c0.2,0.6,0.4,0.6,0.5,0L8.2,2.5
c0.1-0.6,0.6-1,1.2-1.1h3.7C13.8,1.4,14.3,1.9,14.3,2.5C14.3,2.5,14.3,2.5,14.3,2.5z"/>
<path id="Path_47" class="st0" d="M23,7.8v5.9c0,0.6,0.4,1.1,1,1.1h5.2c0.6,0.1,1,0.6,1,1.1V19c0,0.6-0.4,1.1-1,1.1H24
c-0.6,0.1-1,0.6-1,1.1v5.9c0,0.6,0.4,1.1,1,1.1h9.1c0.6,0.1,1,0.6,1,1.1v3.1c0,0.6-0.4,1.1-1,1.1H19.4c-0.6-0.1-1-0.6-1-1.1
v-30c0-0.6,0.4-1.1,1-1.1h13.6c0.6,0.1,1,0.6,1,1.1v3.1c0,0.6-0.4,1.1-1,1.1H24C23.4,6.8,23,7.3,23,7.8z"/>
</g>
<g id="Group_17" transform="translate(239.154 0.052)">
<path id="Path_48" class="st0" d="M-67,11.8v3.7c0,5.5-3.8,9.9-8.5,9.9h-3.1c-0.6,0-1,0.6-1,1.2c0,0,0,0,0,0v6
c0,0.6-0.4,1.1-1,1.2h-2.6c-0.6,0-1-0.6-1-1.2c0,0,0,0,0,0V2.6c0-0.6,0.4-1.1,1-1.2h7.2C-71,1.4-67,6.1-67,11.8z M-71.6,11.8
c0-2.8-2-5.1-4.4-5.1h-2.7c-0.6,0-1,0.6-1,1.2c0,0,0,0,0,0v11c0,0.6,0.4,1.1,1,1.2h3.1c2.2,0,4-2.1,4-4.6L-71.6,11.8z"/>
<path id="Path_49" class="st0" d="M-45.3,11v13.1c0,4.1-2.2,7.7-5.3,9.2c-1,0.5-2.1,0.8-3.3,0.8h-0.8c-1.1,0-2.3-0.3-3.3-0.8
c-3.1-1.5-5.3-5-5.3-9.2V11c0-5.5,3.8-9.9,8.6-9.9h0.8C-49.2,1-45.3,5.5-45.3,11z M-49.9,11c0-2.6-1.8-4.6-4-4.6h-0.8
c-2.2,0-4,2.1-4,4.6v13.1c0,2.6,1.8,4.6,4,4.6h0.8c2.2,0,4-2.1,4-4.6L-49.9,11z"/>
<path id="Path_50" class="st0" d="M-22.8,2.5l-7,30.1c-0.1,0.6-0.6,1-1.2,1.1h-3.1c-0.6-0.1-1.1-0.5-1.2-1.1l-7-30.1
c-0.2-0.4,0-0.9,0.5-1c0.1,0,0.2-0.1,0.3-0.1h2.8c0.6,0.1,1.1,0.5,1.2,1.1l4.8,20.5c0.2,0.6,0.4,0.6,0.5,0l4.8-20.5
c0.1-0.6,0.6-1,1.2-1.1h2.8c0.4,0,0.8,0.4,0.8,0.8C-22.7,2.3-22.7,2.4-22.8,2.5z"/>
</g>
</g>
<g id="Group_23" transform="translate(49.349 49.449)">
<linearGradient id="Path_51_1_" gradientUnits="userSpaceOnUse" x1="-294.3531" y1="456.9432" x2="-294.3531" y2="458.3927" gradientTransform="matrix(35.546 0 0 -19.817 10492.2236 9095.2549)">
<stop offset="0" style="stop-color:#FD017D"/>
<stop offset="0.119" style="stop-color:#F60483"/>
<stop offset="0.297" style="stop-color:#E10E92"/>
<stop offset="0.513" style="stop-color:#BF1DAC"/>
<stop offset="0.755" style="stop-color:#9132CF"/>
<stop offset="0.979" style="stop-color:#6048F4"/>
</linearGradient>
<path id="Path_51" class="st1" d="M42.1,38.8l-2.3-2.1L38.6,38l-2.3,2.2L29,47l-7.4-6.8l-1.5-1.4l-0.3-0.3l-1.2-1.3l-2.4,2.1
l1.2,1.1l0.5,0.5l1.6,1.5l9.5,8.7l9.5-8.7l3.2-3.1h0L42.1,38.8z"/>
<linearGradient id="Path_52_1_" gradientUnits="userSpaceOnUse" x1="-296.4972" y1="465.378" x2="-296.4972" y2="466.133" gradientTransform="matrix(73.6095 0 0 -41.6311 21854.0762 19411.6094)">
<stop offset="0" style="stop-color:#FD017D"/>
<stop offset="0.119" style="stop-color:#F60483"/>
<stop offset="0.297" style="stop-color:#E10E92"/>
<stop offset="0.513" style="stop-color:#BF1DAC"/>
<stop offset="0.755" style="stop-color:#9132CF"/>
<stop offset="0.979" style="stop-color:#6048F4"/>
</linearGradient>
<path id="Path_52" class="st2" d="M51.6,8.2C45.7,2.2,36,2.2,30,8.1l-0.8,0.8l-0.8-0.8c-5.9-6-15.6-6-21.6-0.1s-6,15.6-0.1,21.6
c0.1,0.1,0.1,0.1,0.2,0.2L9,32l0,0l0.8,0.8l0,0L11,34l2.2-2l-1.3-1.4l0,0l-0.4-0.4l0,0L9,27.7c-4.8-4.7-4.8-12.5-0.1-17.3
s12.5-4.8,17.3-0.1l3,2.9l3-2.9c4.8-4.7,12.5-4.7,17.3,0.1s4.7,12.5-0.1,17.3L46.8,30l0,0L45,31.8l2.4,2l0.5-0.5l0,0l3.5-3.5
C57.4,24,57.5,14.3,51.6,8.2C51.6,8.3,51.6,8.2,51.6,8.2z"/>
<linearGradient id="Path_53_1_" gradientUnits="userSpaceOnUse" x1="-295.8171" y1="459.1617" x2="-295.8171" y2="459.9846" gradientTransform="matrix(54.9407 0 0 -23.736 16281.5762 10937.6582)">
<stop offset="0" style="stop-color:#FD017D"/>
<stop offset="0.119" style="stop-color:#F60483"/>
<stop offset="0.297" style="stop-color:#E10E92"/>
<stop offset="0.513" style="stop-color:#BF1DAC"/>
<stop offset="0.755" style="stop-color:#9132CF"/>
<stop offset="0.979" style="stop-color:#6048F4"/>
</linearGradient>
<path id="Path_53" class="st3" d="M48.6,37.3l-10.1-7.8v-6.8h-3.6v4l-4.8-3.7c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0-0.1,0s0,0-0.1,0
s0,0-0.1,0s0,0-0.1,0s0,0-0.1,0c0,0,0,0-0.1,0h0c0,0-0.1,0-0.1,0h-0.7c0,0,0,0-0.1,0c0,0,0,0-0.1,0c0,0,0,0-0.1,0c0,0,0,0-0.1,0
s0,0-0.1,0s0,0-0.1,0l0,0c0,0,0,0-0.1,0c0,0,0,0,0,0c0,0,0,0,0,0L9.7,37.3c-0.7,0.5-0.8,1.5-0.3,2.1c0,0,0,0,0,0
c0.3,0.4,0.8,0.6,1.2,0.6c0.4,0,0.7-0.1,1-0.3l17.5-13.5l17.6,13.5c0.3,0.2,0.6,0.3,1,0.3c0.5,0,0.9-0.2,1.2-0.6
C49.4,38.8,49.3,37.8,48.6,37.3z"/>
<g id="Group_22" transform="translate(30.778 39.882)">
<g id="Group_19" transform="translate(0.413 0.464)">
<line id="Line_27" class="st4" x1="-2.5" y1="-7.2" x2="-1.8" y2="-5.9"/>
<line id="Line_28" class="st4" x1="-4.4" y1="-6.5" x2="-3.2" y2="-5.7"/>
<line id="Line_29" class="st4" x1="-5.7" y1="-4.9" x2="-4.3" y2="-4.9"/>
<line id="Line_30" class="st4" x1="-6.1" y1="-2.9" x2="-4.7" y2="-3.6"/>
<line id="Line_31" class="st4" x1="-5.4" y1="-1" x2="-4.6" y2="-2.3"/>
<line id="Line_32" class="st4" x1="-3.8" y1="0.3" x2="-3.7" y2="-1.2"/>
<line id="Line_33" class="st4" x1="-1.8" y1="0.7" x2="-2.5" y2="-0.6"/>
<line id="Line_34" class="st4" x1="0.1" y1="0" x2="-1.1" y2="-0.8"/>
<line id="Line_35" class="st4" x1="1.4" y1="-1.6" x2="0" y2="-1.7"/>
<line id="Line_36" class="st4" x1="1.8" y1="-3.6" x2="0.5" y2="-2.9"/>
<line id="Line_37" class="st4" x1="1.1" y1="-5.5" x2="0.3" y2="-4.3"/>
<line id="Line_38" class="st4" x1="-0.5" y1="-6.9" x2="-0.6" y2="-5.4"/>
</g>
<g id="Group_20">
<path id="Path_54" class="st5" d="M-1.7-7.1C-4.1-7.1-6-5.2-6-2.8c0,2.4,1.9,4.3,4.3,4.3c2.4,0,4.3-1.9,4.3-4.3l0,0
C2.5-5.2,0.6-7.1-1.7-7.1C-1.7-7.1-1.7-7.1-1.7-7.1z M-1.7,0.9c-2,0-3.7-1.7-3.7-3.7c0-2,1.7-3.7,3.7-3.7c2,0,3.7,1.7,3.7,3.7
C2-0.8,0.3,0.9-1.7,0.9z"/>
</g>
<g id="Group_21" transform="translate(1.806 1.806)">
<path id="Path_55" class="st5" d="M-3.5-7.6c-1.6,0-2.9,1.3-2.9,2.9c0,1.6,1.3,2.9,2.9,2.9S-0.6-3-0.6-4.6l0,0
C-0.6-6.2-1.9-7.6-3.5-7.6z M-3-6c-0.2,0-0.4-0.2-0.4-0.4c0-0.2,0.2-0.4,0.4-0.4c0.2,0,0.4,0.2,0.4,0.4l0,0
C-2.6-6.2-2.8-6-3-6L-3-6z M-1.8-4.3c-0.4,0-0.7-0.3-0.7-0.7c0-0.4,0.3-0.7,0.7-0.7c0.4,0,0.7,0.3,0.7,0.7l0,0
C-1.1-4.7-1.4-4.4-1.8-4.3L-1.8-4.3z"/>
</g>
</g>
</g>
</g>
<g id="ts_original" transform="translate(299.6 17.6)">
<g id="Group_25" transform="translate(1.4 0.626)">
<path id="Path_56" class="st6" d="M-24.2,5.8h2.1l1.8,9.3H-22l-0.4-2.1h-1.5l-0.3,2.1H-26L-24.2,5.8z M-22.5,11.8l-0.6-3.7
l-0.5,3.7H-22.5z"/>
<path id="Path_57" class="st6" d="M-15.5,7.1H-17V5.8h4.8v1.4h-1.4v7.9h-1.9V7.1z"/>
<path id="Path_58" class="st6" d="M-11.3,5.8h4v1.3h-2.1v2.5h1.6v1.3h-1.6v3h2.2v1.3h-4.1V5.8z"/>
<path id="Path_59" class="st6" d="M-4.9,5.8h2.1l1.8,9.3h-1.7L-3,13h-1.5l-0.3,2.1h-1.8L-4.9,5.8z M-3.4,11.8L-3.9,8l-0.5,3.8
H-3.4z"/>
<path id="Path_60" class="st6" d="M0,5.8h2.1l1.2,5.9l1.2-5.9h2L6.6,15H5.2L5,8.7L3.7,15H2.6L1.3,8.7L1.2,15h-1.4L0,5.8z"/>
</g>
<g id="Group_26" transform="translate(47.545 0.4)">
<path id="Path_61" class="st7" d="M-38.5,12.5l1.6-0.2c0,1.2,0.3,1.7,0.9,1.7c0.5,0,0.7-0.3,0.7-0.7c0-0.7-0.4-1.4-1-1.8l-1-0.8
c-0.7-0.6-1.2-1.5-1.2-2.4c0-1.6,1-2.4,2.6-2.4c1.9,0,2.2,1.4,2.3,2.6l-1.6,0.2c0-0.8-0.1-1.5-0.7-1.5c-0.4,0-0.7,0.4-0.7,0.8
c0,0.7,0.3,1,0.8,1.5l0.9,0.8c0.9,0.6,1.4,1.7,1.4,2.8c0,1.3-1,2.3-2.2,2.3c-0.1,0-0.1,0-0.2,0C-37.6,15.5-38.4,14.6-38.5,12.5z
"/>
<path id="Path_62" class="st7" d="M-32.4,6h1.9v4l1.7-4h1.8l-1.7,4.2l1.9,5.1h-1.9l-1.5-4.2l-0.3,0.5v3.7h-1.9V6z"/>
<path id="Path_63" class="st7" d="M-26,6h4v1.3h-2.1v2.5h1.6v1.3h-1.6v3h2.2v1.3H-26V6z"/>
<path id="Path_64" class="st7" d="M-21,6h4v1.3h-2.1v2.5h1.6v1.3h-1.6v3h2.2v1.3H-21V6z"/>
<path id="Path_65" class="st7" d="M-15.1,7.4h-1.4V6h4.8v1.4h-1.4v7.9H-15L-15.1,7.4L-15.1,7.4z"/>
</g>
<g id="Group_27" transform="translate(153.373 0.4)">
<path id="Path_66" class="st6" d="M-67,12.5l1.6-0.2c0,1.2,0.3,1.7,0.9,1.7c0.5,0,0.7-0.3,0.7-0.7c0-0.7-0.4-1.4-1-1.8l-1-0.8
c-0.7-0.6-1.2-1.5-1.2-2.4c0-1.6,1-2.4,2.6-2.4c1.9,0,2.2,1.4,2.3,2.6l-1.6,0.2c0-0.8-0.1-1.5-0.7-1.5c-0.4,0-0.7,0.4-0.7,0.8
c0,0.7,0.3,1,0.8,1.5l0.9,0.8c0.9,0.6,1.4,1.7,1.4,2.8c0,1.3-1,2.3-2.2,2.3c-0.1,0-0.1,0-0.2,0C-66.1,15.5-66.9,14.6-67,12.5z"
/>
<path id="Path_67" class="st6" d="M-60.9,6h4v1.3H-59v2.5h1.6v1.3H-59v3h2.2v1.3h-4.1V6z"/>
<path id="Path_68" class="st6" d="M-55.9,6h2.4c1.9,0,3,0.6,3,2.5c0,1.2-0.2,1.9-1.2,2.3l1.3,4.5h-2l-1.1-4.2H-54v4.2h-1.9V6z
M-53.4,10c0.9,0,1.2-0.4,1.2-1.4c0-0.9-0.2-1.3-1.2-1.3H-54V10H-53.4z"/>
<path id="Path_69" class="st6" d="M-49.1,6h1.9v9.3h-1.9V6z"/>
<path id="Path_70" class="st6" d="M-45.8,6h4v1.3h-2.1v2.5h1.6v1.3h-1.6v3h2.2v1.3h-4.1V6z"/>
<path id="Path_71" class="st6" d="M-41,12.5l1.6-0.2c0,1.2,0.3,1.7,0.9,1.7c0.5,0,0.7-0.3,0.7-0.7c0-0.7-0.4-1.4-1-1.8l-1-0.8
c-0.7-0.6-1.2-1.5-1.2-2.4c0-1.6,1-2.4,2.6-2.4c1.9,0,2.2,1.4,2.3,2.6l-1.6,0.2c0-0.8-0.1-1.5-0.7-1.5c-0.4,0-0.7,0.4-0.7,0.8
c0,0.7,0.3,1,0.8,1.5l0.9,0.8c0.9,0.6,1.4,1.7,1.4,2.8c0,1.3-1,2.3-2.2,2.3c-0.1,0-0.1,0-0.2,0C-40.1,15.5-40.9,14.6-41,12.5z"
/>
</g>
<g id="Group_28" transform="translate(88.951 0.4)">
<path id="Path_72" class="st6" d="M-46.8,15.5c-0.5,0-0.9-0.1-1.3-0.2c-0.3-0.1-0.6-0.3-0.8-0.6c-0.2-0.3-0.4-0.6-0.5-1
c-0.1-0.4-0.2-0.9-0.2-1.3V8.9c0-0.4,0.1-0.9,0.2-1.3c0.1-0.4,0.3-0.7,0.5-1c0.2-0.3,0.5-0.5,0.8-0.6c0.4-0.1,0.9-0.2,1.3-0.2
c0.8-0.1,1.6,0.2,2.1,0.7c0.5,0.7,0.7,1.5,0.7,2.3v3.5c0,0.8-0.2,1.6-0.7,2.3C-45.2,15.2-46,15.5-46.8,15.5z M-47.2,14
c0.1,0.1,0.2,0.1,0.3,0.1c0.1,0,0.3,0,0.4-0.1c0.1,0,0.2-0.1,0.2-0.2c0.1-0.1,0.1-0.2,0.2-0.2c0-0.1,0.1-0.2,0.1-0.3V8.1
c0-0.1,0-0.2-0.1-0.3c-0.1-0.1-0.1-0.2-0.2-0.2c-0.1-0.1-0.2-0.2-0.2-0.2c-0.1,0-0.3-0.1-0.4-0.1c-0.2,0-0.2,0-0.3,0.1
s-0.2,0.1-0.2,0.2c-0.1,0.1-0.1,0.2-0.2,0.2c0,0.1-0.1,0.2-0.1,0.3v5.2c0,0.1,0,0.2,0.1,0.3c0,0.1,0.1,0.2,0.2,0.2
C-47.3,13.9-47.2,14-47.2,14L-47.2,14z"/>
<path id="Path_73" class="st6" d="M-42.9,15.3V6h2.4c0.4,0,0.9,0,1.3,0.1c0.3,0.1,0.7,0.2,1,0.4c0.3,0.2,0.5,0.4,0.7,0.7
c0.2,0.4,0.3,0.8,0.2,1.2c0,0.5-0.1,1-0.2,1.5c-0.2,0.4-0.5,0.7-0.9,0.8l1.3,4.6h-2l-1.1-4.2h-0.7v4.2L-42.9,15.3L-42.9,15.3z
M-41,10h0.5c0.5,0,0.8-0.1,1-0.3c0.2-0.3,0.3-0.7,0.3-1.1c0-0.3,0-0.7-0.2-1c-0.2-0.2-0.6-0.3-0.9-0.3h-0.6L-41,10L-41,10z"/>
<path id="Path_74" class="st6" d="M-36.1,15.3V6h1.9v9.4L-36.1,15.3L-36.1,15.3z"/>
<path id="Path_75" class="st6" d="M-30.5,15.5c-0.4,0-0.8-0.1-1.2-0.2c-0.3-0.2-0.6-0.4-0.8-0.7c-0.2-0.3-0.3-0.6-0.4-1
c-0.1-0.4-0.2-0.9-0.2-1.3V9.1c0-0.4,0-0.8,0.1-1.2c0.1-0.3,0.2-0.7,0.2-0.9c0.1-0.3,0.3-0.5,0.5-0.7c0.2-0.2,0.5-0.3,0.8-0.4
c0.3-0.1,0.7-0.2,1.1-0.2c0.4,0,0.8,0.1,1.2,0.2c0.3,0.1,0.6,0.3,0.8,0.6c0.2,0.2,0.3,0.5,0.4,0.8c0.1,0.4,0.2,0.8,0.2,1.2v0.5
h-1.8v-1c0-0.1,0-0.2-0.1-0.3c0-0.1-0.1-0.2-0.2-0.2c-0.1-0.1-0.2-0.2-0.2-0.2c-0.1,0-0.3-0.1-0.4-0.1c-0.1,0-0.3,0-0.4,0.1
c-0.1,0.1-0.2,0.1-0.2,0.2c-0.1,0.1-0.1,0.2-0.2,0.3c-0.1,0.1-0.1,0.3-0.1,0.4v4.4c0,0.4,0.1,0.7,0.2,1.1
c0.1,0.2,0.4,0.4,0.7,0.3c0.3,0,0.6-0.2,0.7-0.4c0.1-0.3,0.2-0.7,0.2-1.1v-0.9h-0.9v-1.2h2.6v4.9h-1.2l-0.2-0.8
C-29.3,15.2-29.8,15.5-30.5,15.5z"/>
<path id="Path_76" class="st6" d="M-26.5,15.3V6h1.9v9.4L-26.5,15.3L-26.5,15.3z"/>
<path id="Path_77" class="st6" d="M-23.4,15.3V6h1.3l2.1,4.9V6h1.6v9.4h-1.2l-2.1-5.2v5.2L-23.4,15.3L-23.4,15.3z"/>
<path id="Path_78" class="st6" d="M-17.3,15.3l1.8-9.4h2.1l1.8,9.4h-1.8l-0.3-2.1h-1.5l-0.3,2.1H-17.3z M-14.9,12.1h1.2
l-0.6-3.7L-14.9,12.1z"/>
<path id="Path_79" class="st6" d="M-10.3,15.3V6h1.9v8.1h2.2v1.3L-10.3,15.3L-10.3,15.3z"/>
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 15 KiB

View File

@ -0,0 +1,29 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 23.0.6, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 240 45" style="enable-background:new 0 0 240 45;" xml:space="preserve">
<style type="text/css">
.st0{fill:#09B83E;}
.st1{fill:#FFFFFF;}
</style>
<g>
<polygon class="st0" points="194.8,0 214.1,0 214.1,6.3 203.8,6.3 203.8,18.3 211.8,18.3 211.8,24.6 203.8,24.6 203.8,38.7
214.2,38.7 214.2,44.9 194.8,44.9 "/>
<g>
<polygon class="st1" points="6.8,6.8 0,6.8 0,0 22.6,0 22.6,6.8 15.9,6.8 15.9,44.9 6.8,44.9 "/>
<polygon class="st1" points="25.8,0 45.1,0 45.1,6.3 34.7,6.3 34.7,18.3 42.7,18.3 42.7,24.6 34.7,24.6 34.7,38.7 45.2,38.7
45.2,44.9 25.8,44.9 "/>
<path class="st1" d="M64.4,29.4l-2.7-18.1l-2.6,18.1H64.4z M56.7,0h10l8.5,44.9h-8.3L65.3,35h-7l-1.7,9.9h-8.5L56.7,0z"/>
<polygon class="st1" points="79.1,0 88.7,0 94.2,28.3 100,0 109.2,0 110,44.9 103.5,44.9 102.8,14.4 97.1,44.9 91.5,44.9
85.7,14.3 85,44.9 78.4,44.9 "/>
<path class="st0" d="M116.3,31.3l7.6-1.3c0.2,5.5,1.4,8.1,4.3,8.1c2.2,0,2.9-1.7,2.9-3.6c0-3.7-1.9-5.8-4.7-8.4l-4.5-3.9
c-3.2-2.8-5.5-5.9-5.5-11.1c0-7.2,4.5-11.1,11.7-11.1c8.7,0,10.5,6.5,10.8,12.2l-7.6,1.1c-0.1-4-0.5-6.8-3.4-6.8c-2,0-3,1.8-3,3.7
c0,3.1,1.5,4.8,3.9,6.9l4.4,3.9c3.6,3.2,6.6,7,6.6,13c0,6.3-4.4,10.9-11.1,10.9C120.5,44.9,116.7,40.6,116.3,31.3"/>
<polygon class="st0" points="142.8,0 151.7,0 151.7,19 159.8,0 168.5,0 160.2,20.2 169.2,44.9 160,44.9 153.2,24.8 151.7,27.3
151.7,44.9 142.8,44.9 "/>
<polygon class="st0" points="172.3,0 191.6,0 191.6,6.3 181.3,6.3 181.3,18.3 189.2,18.3 189.2,24.6 181.3,24.6 181.3,38.7
191.7,38.7 191.7,44.9 172.3,44.9 "/>
<polygon class="st0" points="224.2,6.8 217.4,6.8 217.4,0 240,0 240,6.8 233.3,6.8 233.3,44.9 224.2,44.9 "/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.5 KiB

After

Width:  |  Height:  |  Size: 9.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.6 KiB

After

Width:  |  Height:  |  Size: 9.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 51 KiB

After

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 38 KiB

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.4 KiB

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.4 KiB

After

Width:  |  Height:  |  Size: 8.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 115 KiB

After

Width:  |  Height:  |  Size: 115 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.8 KiB

After

Width:  |  Height:  |  Size: 7.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 7.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 61 KiB

After

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 41 KiB

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 40 KiB

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 70 KiB

After

Width:  |  Height:  |  Size: 70 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.7 KiB

After

Width:  |  Height:  |  Size: 7.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 54 KiB

After

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 81 KiB

After

Width:  |  Height:  |  Size: 81 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.7 KiB

After

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.1 KiB

After

Width:  |  Height:  |  Size: 7.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 27 KiB

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 45 KiB

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 38 KiB

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 65 KiB

After

Width:  |  Height:  |  Size: 65 KiB

View File

@ -229,6 +229,10 @@ const tags = [
name: 'bondage', name: 'bondage',
slug: 'bondage', slug: 'bondage',
}, },
{
name: 'braces',
slug: 'braces',
},
{ {
name: 'brunette', name: 'brunette',
slug: 'brunette', slug: 'brunette',
@ -900,6 +904,11 @@ const tags = [
name: 'virtual reality', name: 'virtual reality',
slug: 'virtual-reality', slug: 'virtual-reality',
}, },
{
name: 'quarantine',
slug: 'quarantine',
description: 'The 2019 Coronavirus outbreak (COVID-19) forced sensible people to quarantine at home, spawning a new porn theme featuring self-isolation and masks.',
},
{ {
name: 'Russian', name: 'Russian',
slug: 'russian', slug: 'russian',

View File

@ -21,6 +21,10 @@ const parentNetworks = [
slug: 'whalemember', slug: 'whalemember',
name: 'Whale Member', name: 'Whale Member',
}, },
{
slug: 'paperstreetmedia',
name: 'Paper Street Media',
},
{ {
slug: 'porndoe', slug: 'porndoe',
name: 'PornDoe', name: 'PornDoe',
@ -412,6 +416,7 @@ const networks = [
name: 'Team Skeet', name: 'Team Skeet',
url: 'https://www.teamskeet.com', url: 'https://www.teamskeet.com',
description: 'Welcome to teamskeet.com, the largest collection of exclusive teen porn sites and videos on the web. Check out our TeamSkeet porn sites now.', description: 'Welcome to teamskeet.com, the largest collection of exclusive teen porn sites and videos on the web. Check out our TeamSkeet porn sites now.',
parent: 'paperstreetmedia',
}, },
{ {
slug: 'teencoreclub', slug: 'teencoreclub',

View File

@ -6465,43 +6465,57 @@ const sites = [
{ {
slug: 'exxxtrasmall', slug: 'exxxtrasmall',
name: 'Exxxtra Small', name: 'Exxxtra Small',
alias: ['ext'], alias: ['exs', 'ext'],
description: '',
url: 'https://www.exxxtrasmall.com', url: 'https://www.exxxtrasmall.com',
parameters: { id: 'exs' }, parameters: { id: 'exxxtrasmall' },
parent: 'teamskeet', parent: 'teamskeet',
}, },
{ {
slug: 'teenpies', slug: 'teenpies',
name: 'Teen Pies', name: 'Teen Pies',
description: '', alias: ['tp'],
url: 'https://www.teenpies.com', url: 'https://www.teenpies.com',
parameters: { id: 'tp' }, parameters: { id: 'teenpies' },
parent: 'teamskeet', parent: 'teamskeet',
}, },
{ {
slug: 'innocenthigh', slug: 'innocenthigh',
name: 'Innocent High', name: 'Innocent High',
alias: ['inh'], alias: ['ih', 'inh'],
description: '',
url: 'https://www.innocenthigh.com', url: 'https://www.innocenthigh.com',
parameters: { id: 'ih' }, parameters: { id: 'innocenthigh' },
parent: 'teamskeet',
},
{
slug: 'kissingsis',
name: 'Kissing Sis',
alias: ['ss'],
url: 'https://www.kissingsis.com',
parameters: { id: 'kissing-sis' },
parent: 'teamskeet',
},
{
slug: 'latinateam',
name: 'Latina Team',
alias: ['lt'],
url: 'https://www.latinateam.com',
parameters: { id: 'latina-team' },
parent: 'teamskeet', parent: 'teamskeet',
}, },
{ {
slug: 'teencurves', slug: 'teencurves',
name: 'Teen Curves', name: 'Teen Curves',
description: '', alias: ['tc'],
url: 'https://www.teencurves.com', url: 'https://www.teencurves.com',
parameters: { id: 'tc' }, parameters: { id: 'teen-curves' },
parent: 'teamskeet', parent: 'teamskeet',
}, },
{ {
slug: 'cfnmteens', slug: 'cfnmteens',
name: 'CFNM Teens', name: 'CFNM Teens',
alias: ['cfnmt'], alias: ['cfnm', 'cfnmt'],
url: 'https://www.cfnmteens.com', url: 'https://www.cfnmteens.com',
parameters: { id: 'cfnm' }, parameters: { id: 'cfnm-teens' },
parent: 'teamskeet', parent: 'teamskeet',
}, },
{ {
@ -6510,23 +6524,23 @@ const sites = [
alias: ['tla'], alias: ['tla'],
url: 'https://www.teensloveanal.com', url: 'https://www.teensloveanal.com',
tags: ['anal'], tags: ['anal'],
parameters: { id: 'tla' }, parameters: { id: 'teens-love-anal' },
parent: 'teamskeet', parent: 'teamskeet',
}, },
{ {
slug: 'mybabysittersclub', slug: 'mybabysittersclub',
name: 'My Babysitters Club', name: 'My Babysitters Club',
description: '', alias: ['bsc'],
url: 'https://www.mybabysittersclub.com', url: 'https://www.mybabysittersclub.com',
parameters: { id: 'bsc' }, parameters: { id: 'my-babysitters-club' },
parent: 'teamskeet', parent: 'teamskeet',
}, },
{ {
slug: 'shesnew', slug: 'shesnew',
name: 'She\'s New', name: 'She\'s New',
alias: ['ssn'], alias: ['sn', 'ssn'],
url: 'https://www.shesnew.com', url: 'https://www.shesnew.com',
parameters: { id: 'bsc' }, parameters: { id: 'shesnew' },
parent: 'teamskeet', parent: 'teamskeet',
}, },
{ {
@ -6534,163 +6548,292 @@ const sites = [
name: 'Teens Do Porn', name: 'Teens Do Porn',
alias: ['tdp'], alias: ['tdp'],
url: 'https://www.teensdoporn.com', url: 'https://www.teensdoporn.com',
parameters: { id: 'tdp' }, parameters: { id: 'teens-do-porn' },
parent: 'teamskeet', parent: 'teamskeet',
}, },
{ {
slug: 'povlife', slug: 'povlife',
name: 'POV Life', name: 'POV Life',
description: '', alias: ['pov'],
url: 'https://www.povlife.com', url: 'https://www.povlife.com',
parameters: { id: 'pov' }, parameters: { id: 'povlife' },
parent: 'teamskeet', parent: 'teamskeet',
}, },
{ {
slug: 'therealworkout', slug: 'therealworkout',
name: 'The Real Workout', name: 'The Real Workout',
description: '', alias: ['trw'],
url: 'https://www.therealworkout.com', url: 'https://www.therealworkout.com',
parameters: { id: 'trw' }, parameters: { id: 'therealworkout' },
parent: 'teamskeet', parent: 'teamskeet',
}, },
{ {
slug: 'thisgirlsucks', slug: 'thisgirlsucks',
name: 'This Girl Sucks', name: 'This Girl Sucks',
alias: ['tgs'], alias: ['tgs'],
description: '',
url: 'https://www.thisgirlsucks.com', url: 'https://www.thisgirlsucks.com',
parameters: { id: 'tgs' }, parameters: { id: 'this-girl-sucks' },
parent: 'teamskeet', parent: 'teamskeet',
}, },
{ {
slug: 'teenslovemoney', slug: 'teenslovemoney',
name: 'Teens Love Money', name: 'Teens Love Money',
alias: ['tlm'], alias: ['tlm'],
description: '',
url: 'https://www.teenslovemoney.com', url: 'https://www.teenslovemoney.com',
parameters: { id: 'tlm' }, parameters: { id: 'teens-love-money' },
parent: 'teamskeet', parent: 'teamskeet',
}, },
{ {
slug: 'oyeloca', slug: 'oyeloca',
name: 'Oye Loca', name: 'Oye Loca',
description: '', alias: ['ol'],
url: 'https://www.oyeloca.com', url: 'https://www.oyeloca.com',
parameters: { id: 'ol' }, tags: ['latina'],
parameters: { id: 'oyeloca' },
parent: 'teamskeet', parent: 'teamskeet',
}, },
{ {
slug: 'tittyattack', slug: 'tittyattack',
name: 'Titty Attack', name: 'Titty Attack',
description: '', alias: ['ta'],
url: 'https://www.tittyattack.com', url: 'https://www.tittyattack.com',
parameters: { id: 'ta' }, parameters: { id: 'titty-attack' },
parent: 'teamskeet', parent: 'teamskeet',
}, },
{ {
slug: 'teenyblack', slug: 'teenyblack',
name: 'Teeny Black', name: 'Teeny Black',
description: '', alias: ['tb'],
url: 'https://www.teenyblack.com', url: 'https://www.teenyblack.com',
parameters: { id: 'tb' }, parameters: { id: 'teenyblack' },
parent: 'teamskeet', parent: 'teamskeet',
}, },
{ {
slug: 'lusthd', slug: 'lusthd',
name: 'Lust HD', name: 'Lust HD',
description: '', alias: ['lhd'],
url: 'https://www.lusthd.com', url: 'https://www.lusthd.com',
parameters: { id: 'lhd' }, parameters: { id: 'lusthd' },
parent: 'teamskeet', parent: 'teamskeet',
}, },
{ {
slug: 'rubateen', slug: 'rubateen',
name: 'Rub A Teen', name: 'Rub A Teen',
description: '', alias: ['rat'],
url: 'https://www.rubateen.com', url: 'https://www.rubateen.com',
parameters: { id: 'rat' }, parameters: { id: 'rubateen' },
parent: 'teamskeet', parent: 'teamskeet',
}, },
{ {
slug: 'herfreshmanyear', slug: 'herfreshmanyear',
name: 'Her Freshman Year', name: 'Her Freshman Year',
description: '', alias: ['hfy'],
url: 'https://www.exxxtrasmall.com', url: 'https://www.herfreshmanyear.com',
parameters: { id: 'hfy' }, parameters: { id: 'her-freshman-year' },
parent: 'teamskeet', parent: 'teamskeet',
}, },
{ {
slug: 'selfdesire', slug: 'selfdesire',
name: 'Self Desire', name: 'Self Desire',
description: '', alias: ['sd'],
url: 'https://www.selfdesire.com', url: 'https://www.selfdesire.com',
parameters: { id: 'sd' }, parameters: { id: 'self-desire' },
parent: 'teamskeet', parent: 'teamskeet',
}, },
{ {
slug: 'solointerviews', slug: 'solointerviews',
name: 'Solo Interviews', name: 'Solo Interviews',
description: '', alias: ['si'],
url: 'https://www.solointerviews.com', url: 'https://www.solointerviews.com',
parameters: { id: 'si' }, parameters: { id: 'solo-interviews' },
parent: 'teamskeet',
},
{
slug: 'teamskeetextras',
name: 'Team Skeet Extras',
description: '',
url: 'https://www.teamskeetextras.com',
parameters: { id: 'tse' },
parent: 'teamskeet', parent: 'teamskeet',
}, },
{ {
slug: 'dyked', slug: 'dyked',
name: 'Dyked', name: 'Dyked',
description: '', alias: ['dyk'],
url: 'https://www.dyked.com', url: 'https://www.dyked.com',
parameters: { id: 'dyk' }, parameters: { id: 'dyked' },
parent: 'teamskeet', parent: 'teamskeet',
}, },
{ {
slug: 'badmilfs', slug: 'badmilfs',
name: 'Bad MILFs', name: 'Bad MILFs',
description: '', alias: ['alias'],
url: 'https://www.badmilfs.com', url: 'https://www.badmilfs.com',
parameters: { id: 'bad' }, parameters: { id: 'bad-milfs' },
parent: 'teamskeet', parent: 'teamskeet',
}, },
{ {
slug: 'gingerpatch', slug: 'gingerpatch',
name: 'Ginger Patch', name: 'Ginger Patch',
description: '', alias: ['gp'],
url: 'https://www.gingerpatch.com', url: 'https://www.gingerpatch.com',
parameters: { id: 'gp' }, parameters: { id: 'gingerpatch' },
parent: 'teamskeet', parent: 'teamskeet',
}, },
{ {
slug: 'bracefaced', slug: 'bracefaced',
name: 'Brace Faced', name: 'Brace Faced',
description: '', alias: ['bfd'],
tags: ['braces'],
url: 'https://www.bracefaced.com', url: 'https://www.bracefaced.com',
parameters: { id: 'bfd' }, parameters: { id: 'bracefaced' },
parent: 'teamskeet', parent: 'teamskeet',
}, },
{ {
slug: 'teenjoi', slug: 'teenjoi',
name: 'Teen JOI', name: 'Teen JOI',
description: '', alias: ['joi'],
url: 'https://www.teenjoi.com', url: 'https://www.teenjoi.com',
parameters: { id: 'joi' }, parameters: { id: 'teen-joi' },
parent: 'teamskeet', parent: 'teamskeet',
}, },
{ {
slug: 'stepsiblings', slug: 'stepsiblings',
name: 'Step Siblings', name: 'Step Siblings',
alias: ['steps'], alias: ['sss', 'steps'],
url: 'https://www.stepsiblings.com', url: 'https://www.stepsiblings.com',
parameters: { id: 'sss' }, parameters: { id: 'stepsiblings' },
parent: 'teamskeet', parent: 'teamskeet',
}, },
{
slug: 'stayhomepov',
name: 'StayHomePOV',
alias: ['shp', 'steps'],
tags: ['pov', 'quarantine'],
url: 'https://www.stayhomepov.com',
parameters: { id: 'stay-home-pov' },
parent: 'teamskeet',
},
{
slug: 'teamskeetextras',
name: 'Team Skeet Extras',
alias: ['tse'],
url: 'https://www.teamskeetextras.com',
parameters: { id: 'extras' },
parent: 'teamskeet',
},
{
slug: 'teamskeetallstars',
name: 'Team Skeet Allstars',
alias: ['tsa', 'steps'],
url: 'https://www.teamskeet.com/series/all-stars',
parameters: { id: 'all-stars' },
parent: 'teamskeet',
},
{
slug: 'teamskeetselects',
name: 'Team Skeet Selects',
alias: ['tsc'],
url: 'https://www.teamskeet.com/series/selects',
parameters: { id: 'selects' },
parent: 'teamskeet',
},
{
slug: 'tshobybuchanon',
name: 'Hoby Buchanon',
alias: ['hob'],
parameters: { id: 'hoby-buchanon' },
parent: 'teamskeet',
},
{
slug: 'teamskeetxog',
name: 'TS X Owen Gray',
alias: ['owg'],
url: 'https://www.teamskeet.com/series/owen-gray',
parameters: { id: 'owen-gray' },
parent: 'teamskeet',
},
{
slug: 'teamskeetxbaeb',
name: 'TS X BAEB',
alias: ['bae'],
url: 'https://www.teamskeet.com/series/baeb',
parameters: { id: 'baeb' },
parent: 'teamskeet',
},
{
slug: 'teamskeetxbananafever',
name: 'TS X Banana Fever',
alias: ['bna'],
url: 'https://www.teamskeet.com/series/bananafever',
parameters: { id: 'bananafever' },
parent: 'teamskeet',
},
{
slug: 'teamskeetxevaelfie',
name: 'TS X Eva Elfie',
alias: ['eva'],
url: 'https://www.teamskeet.com/series/eva-elfie',
parameters: { id: 'eva-elfie' },
parent: 'teamskeet',
},
{
slug: 'teamskeetxfuckingawesome',
name: 'TS X Fucking Awesome',
alias: ['tfa'],
url: 'https://www.teamskeet.com/series/fucking-awesome',
parameters: { id: 'fucking-awesome' },
parent: 'teamskeet',
},
{
slug: 'teamskeetxjamesdeen',
name: 'TS X James Deen',
alias: ['jmd'],
url: 'https://www.teamskeet.com/series/james-deen',
parameters: { id: 'james-deen' },
parent: 'teamskeet',
},
{
slug: 'teamskeetxjoybear',
name: 'TS X Joybear',
alias: ['jyb'],
url: 'https://www.teamskeet.com/series/joybear',
parameters: { id: 'joybear' },
parent: 'teamskeet',
},
{
slug: 'teamskeetxcamsoda',
name: 'TS X CamSoda',
alias: ['lna'],
url: 'https://www.teamskeet.com/series/camsoda',
parameters: { id: 'camsoda' },
parent: 'teamskeet',
},
{
slug: 'teamskeetxlaynalandry',
name: 'TS X Layna Landry',
alias: ['lna'],
url: 'https://www.teamskeet.com/series/layna-landry',
parameters: { id: 'layna-landry' },
parent: 'teamskeet',
},
{
slug: 'teamskeetxlunaxjames',
name: 'TS X Luna X James',
alias: ['lxj'],
url: 'https://www.teamskeet.com/series/luna-x-james',
parameters: { id: 'luna-x-james' },
parent: 'teamskeet',
},
{
slug: 'teamskeetxmickeymod',
name: 'TS X Mickey Mod',
alias: ['mod'],
url: 'https://www.teamskeet.com/series/mickey-mod',
parameters: { id: 'mickey-mod' },
parent: 'teamskeet',
},
{
slug: 'teamskeetxspankmonster',
name: 'TS X SpankMonster',
alias: ['spm'],
url: 'https://www.teamskeet.com/series/spankmonster',
parameters: { id: 'spankmonster' },
parent: 'teamskeet',
},
/* premium, unavailable
{ {
slug: 'submissived', slug: 'submissived',
name: 'Submissived', name: 'Submissived',
@ -6709,6 +6852,7 @@ const sites = [
tags: ['family'], tags: ['family'],
parent: 'teamskeet', parent: 'teamskeet',
}, },
*/
// TEEN CORE CLUB // TEEN CORE CLUB
{ {
name: 'Analyzed Girls', name: 'Analyzed Girls',

View File

@ -232,6 +232,7 @@ module.exports = {
silverstonedvd: famedigital, silverstonedvd: famedigital,
silviasaint: famedigital, silviasaint: famedigital,
swallowed: mikeadriano, swallowed: mikeadriano,
teamskeet,
teencoreclub, teencoreclub,
thatsitcomshow: nubiles, thatsitcomshow: nubiles,
transangels, transangels,

View File

@ -1,180 +1,155 @@
'use strict'; 'use strict';
const bhttp = require('bhttp'); const qu = require('../utils/qu');
const { JSDOM } = require('jsdom'); const http = require('../utils/http');
const moment = require('moment'); const slugify = require('../utils/slugify');
const { lbsToKg, feetInchesToCm } = require('../utils/convert');
function extractTitle(pathname) {
return pathname
.split('/')
.slice(-2)[0]
.split('_')
.map(seg => `${seg.charAt(0).toUpperCase()}${seg.slice(1)}`)
.join(' ');
}
function extractActors(str) {
return str
.split(/,|\band\b/ig)
.filter(actor => !/\.{3}/.test(actor))
.map(actor => actor.trim())
.filter(actor => actor.length > 0);
}
function scrapeLatest(html, site) {
const { document } = new JSDOM(html).window;
const scenes = Array.from(document.querySelectorAll('#updatesList li.grey, #updatesList li.white'));
function scrapeAll(scenes) {
return scenes.map((scene) => { return scenes.map((scene) => {
const release = { site }; const release = {};
const link = scene.querySelector('.info a'); release.entryId = scene.id;
const poster = scene.querySelector('img'); release.url = `https://teamskeet.com/movies/${release.entryId}`;
const { pathname } = new URL(link);
[release.entryId] = poster.id.match(/\d+/); release.title = scene.title;
release.date = qu.extractDate(scene.publishedDate);
release.url = `https://www.teamskeet.com${pathname}`; release.actors = scene.models?.map(model => model.modelName) || [];
release.title = extractTitle(pathname);
release.date = moment.utc(scene.querySelector('strong').textContent, 'MM/DD/YYYY').toDate(); release.poster = [
scene.img.replace('med.jpg', 'hi.jpg'),
scene.img,
];
const photos = Array.from({ length: 5 }, (_value, index) => poster.dataset.original.replace(/\d+.jpg/, `${String(index + 1).padStart(2, '0')}.jpg`)); release.teaser = scene.videoTrailer;
[release.poster] = photos;
release.photos = photos.slice(1);
const actors = scene.querySelector('div span[rel="test"]').textContent; if (scene.video) {
release.actors = extractActors(actors); release.trailer = { stream: `https://videodelivery.net/${scene.video}/manifest/video.mpd` };
}
release.likes = scene.stats.likeCount;
release.dislikes = scene.stats.dislikeCount;
release.channel = slugify(scene.site.name, '')
.replace('hobybuchanon', 'tshobybuchanon'); // slug collision with his own site
return release; return release;
}); });
} }
function scrapeScene(html, site, url) { function scrapeScene(scene) {
const { document } = new JSDOM(html).window; const release = {};
const release = { site };
release.entryId = document.querySelector('#story-and-tags .scene_rater').attributes.rel.value; release.entryId = scene.id;
release.description = document.querySelector('#story-and-tags td:nth-child(2) div').textContent;
const [actors, title, channel] = document.querySelector('title').textContent.split('|').map(item => item.trim());
release.url = url; release.title = scene.title;
release.title = title; release.description = scene.description;
release.actors = extractActors(actors);
release.channel = channel.toLowerCase();
release.tags = Array.from(document.querySelectorAll('#story-and-tags tr:nth-child(2) a'), el => el.rel);
const date = document.querySelector('h3 ~ div:nth-child(4), h3 ~ div div.gray:not(.scene_rater)').textContent.split(':')[1].trim(); release.date = qu.extractDate(scene.publishedDate);
release.date = moment.utc(date, 'MMMM Do, YYYY').toDate(); release.actors = scene.models?.map(model => model.modelName) || [];
const { poster } = document.querySelector('video'); release.poster = [
if (poster && !/gen/.test(poster)) release.poster = [poster.replace('low', 'hi'), poster]; scene.img.replace('med.jpg', 'hi.jpg'),
scene.img,
];
const siteId = document.querySelector('#story-and-tags img').src.match(/\w+.jpg/)[0].replace('.jpg', ''); release.channel = slugify(scene.site.name, '')
const actorsSlug = document.querySelector('h3 a').href.split('/').slice(-2)[0]; .replace('hobybuchanon', 'tshobybuchanon'); // slug collision with his own site
release.photos = Array.from({ length: 5 }, (value, index) => `https://images.psmcdn.net/teamskeet/${siteId}/${actorsSlug}/shared/scenes/new/${String(index + 1).padStart(2, '0')}.jpg`); if (scene.video) {
release.trailer = { stream: `https://videodelivery.net/${scene.video}/manifest/video.mpd` };
const trailer = document.querySelector('div.right.gray a').href; }
if (trailer) release.trailer = { src: trailer };
return release; return release;
} }
function scrapeSceneA(html, site, sceneX, url) { function scrapeProfile(actor) {
const scene = sceneX || new JSDOM(html).window.document; const profile = {};
const release = { site };
release.description = scene.querySelector('.scene-story').textContent.replace('...read more', '...').trim(); if (actor.bio.about) {
// birthdate seems never/rarely correct
const measurements = actor.bio.about.match(/Measurements: (\d+)(\w+)-(\d+)-(\d+)/i);
release.date = moment.utc(scene.querySelector('.scene-date').textContent, 'MM/DD/YYYY').toDate(); if (measurements) {
release.actors = Array.from(scene.querySelectorAll('.starring span'), el => extractActors(el.textContent)).flat(); [profile.bust, profile.cup, profile.waist, profile.hip] = measurements.slice(1);
} else {
const breastSize = actor.bio.breastSize?.match(/(\d+)(\w+)/)?.slice(1) || actor.bio.about.match(/Measurements: (\d+)(\w+)/)?.slice(1);
const durationString = scene.querySelector('.time').textContent.trim(); if (breastSize) {
const duration = ['00'].concat(durationString.split(':')).slice(-3).join(':'); // ensure hh:mm:ss [profile.bust, profile.cup] = breastSize;
release.duration = moment.duration(duration).asSeconds(); }
if (sceneX) {
const titleEl = scene.querySelector(':scope > a');
release.url = titleEl.href;
release.entryId = titleEl.id;
release.title = titleEl.title;
const [poster, ...photos] = Array.from(scene.querySelectorAll('.scene img'), el => el.src);
release.poster = [poster.replace('bio_big', 'video'), poster];
release.photos = photos;
} }
if (!sceneX) { profile.nationality = actor.bio.about.match(/Nationality: (\w+)/i)?.[1];
release.title = scene.querySelector('.title span').textContent; profile.ethnicity = actor.bio.about.match(/Ethnicity: (\w+)/i)?.[1];
release.url = url; profile.hairColor = actor.bio.about.match(/Hair Color: (\w+)/i)?.[1];
release.poster = scene.querySelector('video').poster; const piercings = actor.bio.about.match(/Piercings: (\w+)/i)?.[1];
release.photos = [release.poster.replace('video', 'bio_small'), release.poster.replace('video', 'bio_small2')]; const tattoos = actor.bio.about.match(/Tattoos: (\w+)/i)?.[1];
if (slugify(piercings) === 'yes') profile.hasPiercings = true;
if (slugify(piercings) === 'no') profile.hasPiercings = false;
if (slugify(tattoos) === 'yes') profile.hasTattoos = true;
if (slugify(tattoos) === 'no') profile.hasTattoos = false;
} }
const [, entryIdA, entryIdB] = new URL(release.url).pathname.split('/'); if (actor.bio.heightFeet && actor.bio.heightInches) {
release.entryId = entryIdA === 'scenes' ? entryIdB : entryIdA; profile.height = feetInchesToCm(actor.bio.heightFeet, actor.bio.heightInches);
}
return release; if (actor.bio.weight) {
profile.weight = lbsToKg(actor.bio.weight);
}
profile.avatar = actor.img;
profile.releases = scrapeAll(actor.movies);
return profile;
} }
function scrapeLatestA(html, site) { async function fetchLatest(channel, _page = 1) {
const { document } = new JSDOM(html).window; // freshman year, layna landry
if (!channel.parameters?.id) {
const scenes = Array.from(document.querySelectorAll('.scenewrapper'));
return scenes.map(scene => scrapeSceneA(null, site, scene));
}
async function fetchLatestTeamSkeet(site, page = 1) {
const url = `https://www.teamskeet.com/t1/updates/load?fltrs[site]=${site.parameters.id}&page=${page}&view=newest&fltrs[time]=ALL&order=DESC`;
const res = await bhttp.get(url);
if (res.statusCode === 200) {
return scrapeLatest(res.body.toString(), site);
}
return null; return null;
}
const url = `https://store.psmcdn.net/ts-organic-iiiokv9kyo/seriesContent/${channel.parameters.id}/latestMovies.json`;
const res = await http.get(url);
if (res.ok) {
return scrapeAll(Object.values(res.body), channel);
}
return res.status;
} }
async function fetchLatestA(site) { async function fetchScene(url, channel) {
const url = `${site.url}/scenes`; const entryId = new URL(url).pathname.match(/\/movies\/(.+)$/)[1];
const res = await bhttp.get(url); const apiUrl = `https://store.psmcdn.net/ts-organic-iiiokv9kyo/videosContent/${entryId}.json`;
if (res.statusCode === 200) { const res = await http.get(apiUrl);
return scrapeLatestA(res.body.toString(), site);
if (res.ok) {
return scrapeScene(res.body, channel);
} }
return null; return res.status;
} }
async function fetchLatest(site, page = 1) { async function fetchProfile(baseActor) {
if (site.parameters.id) { const res = await http.get(`https://store.psmcdn.net/ts-organic-iiiokv9kyo/modelsContent/${slugify(baseActor.name)}.json`);
return fetchLatestTeamSkeet(site, page);
if (res.ok && res.body) {
return scrapeProfile(res.body);
} }
if (site.parameters.scraper === 'A') { return res.status;
return fetchLatestA(site, page);
}
return null;
}
async function fetchScene(url, site) {
const session = bhttp.session(); // resolve redirects
const res = await session.get(url);
if (site.parameters?.scraper === 'A') {
return scrapeSceneA(res.body.toString(), site, null, url);
}
return scrapeScene(res.body.toString(), site, url);
} }
module.exports = { module.exports = {
fetchLatest, fetchLatest,
fetchScene, fetchScene,
fetchProfile,
}; };

View File

@ -0,0 +1,180 @@
'use strict';
const bhttp = require('bhttp');
const { JSDOM } = require('jsdom');
const moment = require('moment');
function extractTitle(pathname) {
return pathname
.split('/')
.slice(-2)[0]
.split('_')
.map(seg => `${seg.charAt(0).toUpperCase()}${seg.slice(1)}`)
.join(' ');
}
function extractActors(str) {
return str
.split(/,|\band\b/ig)
.filter(actor => !/\.{3}/.test(actor))
.map(actor => actor.trim())
.filter(actor => actor.length > 0);
}
function scrapeLatest(html, site) {
const { document } = new JSDOM(html).window;
const scenes = Array.from(document.querySelectorAll('#updatesList li.grey, #updatesList li.white'));
return scenes.map((scene) => {
const release = { site };
const link = scene.querySelector('.info a');
const poster = scene.querySelector('img');
const { pathname } = new URL(link);
[release.entryId] = poster.id.match(/\d+/);
release.url = `https://www.teamskeet.com${pathname}`;
release.title = extractTitle(pathname);
release.date = moment.utc(scene.querySelector('strong').textContent, 'MM/DD/YYYY').toDate();
const photos = Array.from({ length: 5 }, (_value, index) => poster.dataset.original.replace(/\d+.jpg/, `${String(index + 1).padStart(2, '0')}.jpg`));
[release.poster] = photos;
release.photos = photos.slice(1);
const actors = scene.querySelector('div span[rel="test"]').textContent;
release.actors = extractActors(actors);
return release;
});
}
function scrapeScene(html, site, url) {
const { document } = new JSDOM(html).window;
const release = { site };
release.entryId = document.querySelector('#story-and-tags .scene_rater').attributes.rel.value;
release.description = document.querySelector('#story-and-tags td:nth-child(2) div').textContent;
const [actors, title, channel] = document.querySelector('title').textContent.split('|').map(item => item.trim());
release.url = url;
release.title = title;
release.actors = extractActors(actors);
release.channel = channel.toLowerCase();
release.tags = Array.from(document.querySelectorAll('#story-and-tags tr:nth-child(2) a'), el => el.rel);
const date = document.querySelector('h3 ~ div:nth-child(4), h3 ~ div div.gray:not(.scene_rater)').textContent.split(':')[1].trim();
release.date = moment.utc(date, 'MMMM Do, YYYY').toDate();
const { poster } = document.querySelector('video');
if (poster && !/gen/.test(poster)) release.poster = [poster.replace('low', 'hi'), poster];
const siteId = document.querySelector('#story-and-tags img').src.match(/\w+.jpg/)[0].replace('.jpg', '');
const actorsSlug = document.querySelector('h3 a').href.split('/').slice(-2)[0];
release.photos = Array.from({ length: 5 }, (value, index) => `https://images.psmcdn.net/teamskeet/${siteId}/${actorsSlug}/shared/scenes/new/${String(index + 1).padStart(2, '0')}.jpg`);
const trailer = document.querySelector('div.right.gray a').href;
if (trailer) release.trailer = { src: trailer };
return release;
}
function scrapeSceneA(html, site, sceneX, url) {
const scene = sceneX || new JSDOM(html).window.document;
const release = { site };
release.description = scene.querySelector('.scene-story').textContent.replace('...read more', '...').trim();
release.date = moment.utc(scene.querySelector('.scene-date').textContent, 'MM/DD/YYYY').toDate();
release.actors = Array.from(scene.querySelectorAll('.starring span'), el => extractActors(el.textContent)).flat();
const durationString = scene.querySelector('.time').textContent.trim();
const duration = ['00'].concat(durationString.split(':')).slice(-3).join(':'); // ensure hh:mm:ss
release.duration = moment.duration(duration).asSeconds();
if (sceneX) {
const titleEl = scene.querySelector(':scope > a');
release.url = titleEl.href;
release.entryId = titleEl.id;
release.title = titleEl.title;
const [poster, ...photos] = Array.from(scene.querySelectorAll('.scene img'), el => el.src);
release.poster = [poster.replace('bio_big', 'video'), poster];
release.photos = photos;
}
if (!sceneX) {
release.title = scene.querySelector('.title span').textContent;
release.url = url;
release.poster = scene.querySelector('video').poster;
release.photos = [release.poster.replace('video', 'bio_small'), release.poster.replace('video', 'bio_small2')];
}
const [, entryIdA, entryIdB] = new URL(release.url).pathname.split('/');
release.entryId = entryIdA === 'scenes' ? entryIdB : entryIdA;
return release;
}
function scrapeLatestA(html, site) {
const { document } = new JSDOM(html).window;
const scenes = Array.from(document.querySelectorAll('.scenewrapper'));
return scenes.map(scene => scrapeSceneA(null, site, scene));
}
async function fetchLatestTeamSkeet(site, page = 1) {
const url = `https://www.teamskeet.com/t1/updates/load?fltrs[site]=${site.parameters.id}&page=${page}&view=newest&fltrs[time]=ALL&order=DESC`;
const res = await bhttp.get(url);
if (res.statusCode === 200) {
return scrapeLatest(res.body.toString(), site);
}
return null;
}
async function fetchLatestA(site) {
const url = `${site.url}/scenes`;
const res = await bhttp.get(url);
if (res.statusCode === 200) {
return scrapeLatestA(res.body.toString(), site);
}
return null;
}
async function fetchLatest(site, page = 1) {
if (site.parameters.id) {
return fetchLatestTeamSkeet(site, page);
}
if (site.parameters.scraper === 'A') {
return fetchLatestA(site, page);
}
return null;
}
async function fetchScene(url, site) {
const session = bhttp.session(); // resolve redirects
const res = await session.get(url);
if (site.parameters?.scraper === 'A') {
return scrapeSceneA(res.body.toString(), site, null, url);
}
return scrapeScene(res.body.toString(), site, url);
}
module.exports = {
fetchLatest,
fetchScene,
};