Refactored Mike Adriano scraper. Changed logo and favicon. Added style methods to qu.

This commit is contained in:
DebaucheryLibrarian 2020-07-16 03:47:07 +02:00
parent 6584a46d53
commit 6adfded074
63 changed files with 577 additions and 332 deletions

View File

@ -231,7 +231,7 @@
v-if="release.productionDate"
class="row-tidbit"
>
<span class="row-label">Production date</span>
<span class="row-label">Shoot date</span>
{{ formatDate(release.productionDate, 'MMMM D, YYYY') }}
</div>
</div>

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<browserconfig>
<msapplication>
<tile>
<square150x150logo src="/img/favicon/mstile-150x150.png"/>
<TileColor>#ff6c88</TileColor>
</tile>
</msapplication>
</browserconfig>

Binary file not shown.

After

Width:  |  Height:  |  Size: 850 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

View File

@ -0,0 +1,28 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
width="1388.000000pt" height="1388.000000pt" viewBox="0 0 1388.000000 1388.000000"
preserveAspectRatio="xMidYMid meet">
<metadata>
Created by potrace 1.11, written by Peter Selinger 2001-2013
</metadata>
<g transform="translate(0.000000,1388.000000) scale(0.100000,-0.100000)"
fill="#000000" stroke="none">
<path d="M4200 13869 c-183 -23 -340 -73 -511 -160 -400 -206 -674 -568 -781
-1034 l-23 -100 -3 -4640 c-2 -3327 0 -4675 8 -4765 31 -351 108 -680 232
-994 53 -134 202 -427 283 -556 198 -314 472 -620 770 -859 462 -371 1002
-614 1580 -710 283 -47 250 -46 2140 -46 l1790 0 105 23 c464 102 830 377
1039 782 68 131 109 247 143 400 l23 105 0 1125 0 1125 -23 105 c-34 153 -75
269 -143 400 -208 403 -571 677 -1034 781 -99 23 -106 23 -1067 26 l-968 4 0
779 0 779 968 4 c961 3 968 3 1067 26 463 104 826 378 1034 781 68 131 109
247 143 400 l23 105 0 1125 0 1125 -23 105 c-34 153 -75 269 -143 400 -208
403 -571 677 -1034 781 -99 23 -106 23 -1067 26 l-967 4 -4 622 c-3 600 -4
626 -26 722 -103 463 -385 834 -791 1044 -128 66 -245 108 -395 142 l-100 23
-1090 2 c-599 1 -1119 -2 -1155 -7z m2060 -2769 l0 -1280 1620 0 1620 0 0
-940 0 -940 -1620 0 -1620 0 0 -2117 c0 -2088 3 -2310 33 -2372 8 -16 27 -31
52 -39 75 -25 441 -31 1798 -32 l1357 0 0 -940 0 -940 -1582 0 c-988 0 -1634
4 -1718 10 -545 42 -1017 285 -1368 705 -221 264 -354 549 -424 908 l-22 112
-3 4573 -3 4572 940 0 940 0 0 -1280z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

@ -0,0 +1,19 @@
{
"name": "",
"short_name": "",
"icons": [
{
"src": "/img/favicon/android-chrome-192x192.png",
"sizes": "192x192",
"type": "image/png"
},
{
"src": "/img/favicon/android-chrome-512x512.png",
"sizes": "512x512",
"type": "image/png"
}
],
"theme_color": "#ff6c88",
"background_color": "#ff6c88",
"display": "standalone"
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

View File

@ -0,0 +1,75 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
inkscape:version="1.0 (4035a4fb49, 2020-05-01)"
sodipodi:docname="favicon.svg"
id="svg8"
version="1.1"
viewBox="0 0 6.8008499 14.439897"
height="14.439898mm"
width="6.8008499mm">
<defs
id="defs2" />
<sodipodi:namedview
fit-margin-bottom="0"
fit-margin-right="0"
fit-margin-left="0"
fit-margin-top="0"
inkscape:window-maximized="1"
inkscape:window-y="932"
inkscape:window-x="1182"
inkscape:window-height="1024"
inkscape:window-width="1920"
showguides="false"
showgrid="false"
inkscape:document-rotation="0"
inkscape:current-layer="text835"
inkscape:document-units="mm"
inkscape:cy="-1.3646808"
inkscape:cx="-12.677594"
inkscape:zoom="3.959798"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
borderopacity="1.0"
bordercolor="#666666"
pagecolor="#ffffff"
id="base">
<sodipodi:guide
id="guide837"
orientation="0.70710678,-0.70710678"
position="-151.83278,131.09394" />
</sodipodi:namedview>
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
transform="translate(-31.294238,-94.737942)"
id="layer1"
inkscape:groupmode="layer"
inkscape:label="Layer 1">
<g
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:19.05px;line-height:1.25;font-family:Orbitron;-inkscape-font-specification:'Orbitron Bold';letter-spacing:0px;word-spacing:0px;fill-opacity:1;stroke:none;stroke-width:0.264583"
id="text835"
aria-label="traxxx">
<path
id="path839"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:19.05px;font-family:Orbitron;-inkscape-font-specification:'Orbitron Bold';fill:#ff6c88;fill-opacity:1;stroke-width:0.264583"
d="m 33.923138,109.17784 q -1.08585,0 -1.8669,-0.762 -0.762,-0.78105 -0.762,-1.8669 V 94.737942 h 2.49555 v 3.3909 h 4.3053 v 2.495548 h -4.3053 v 5.39115 q 0,0.5334 0.05715,0.6096 0.0762,0.0571 0.6096,0.0571 h 3.63855 v 2.49555 z" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

View File

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

Before

Width:  |  Height:  |  Size: 4.2 KiB

After

Width:  |  Height:  |  Size: 4.2 KiB

View File

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 17 KiB

View File

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

Before

Width:  |  Height:  |  Size: 2.2 KiB

After

Width:  |  Height:  |  Size: 2.2 KiB

View File

Before

Width:  |  Height:  |  Size: 5.6 KiB

After

Width:  |  Height:  |  Size: 5.6 KiB

View File

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

@ -1,12 +1,95 @@
<svg width="31.051mm" height="7.9587mm" version="1.1" viewBox="0 0 31.051 7.9587" xmlns="http://www.w3.org/2000/svg">
<g transform="translate(-77.202 -97.923)">
<g stroke-width=".26458" aria-label="traxxx">
<path d="m77.89 105.74h1.4076v-4.5826h0.84667v-1.2806h-0.84667v-1.9579h-1.4076v1.9579h-0.68792v1.2806h0.68792z"/>
<path d="m80.917 105.74h1.4076v-3.2597c-0.03175-0.86783 0.41275-1.3547 1.2594-1.3864v-1.3547h-0.10583c-0.60325 0-0.89958 0.16933-1.27 0.70908v-0.5715h-1.2912z"/>
<path d="m90.072 99.881h-1.2912v0.78316c-0.48683-0.64558-1.0689-0.92075-1.9156-0.92075-1.7357 0-2.9845 1.3017-2.9845 3.0903 0 1.7674 1.2382 3.048 2.9528 3.048 0.8255 0 1.3864-0.254 1.9473-0.89958v0.762h1.2912zm-3.0586 1.1536c1.0054 0 1.7251 0.75141 1.7251 1.8203 0 0.42333-0.16933 0.91017-0.42333 1.2065-0.28575 0.34925-0.74083 0.52917-1.2806 0.52917-1.0266 0-1.7357-0.6985-1.7357-1.7251 0-1.0689 0.70908-1.8309 1.7145-1.8309z"/>
<path d="m90.559 105.74h1.6933l1.2277-2.0108 1.2277 2.0108h1.6933l-2.0849-3.0268 1.7886-2.8363h-1.5875l-1.0372 1.7674-1.0583-1.7674h-1.5875l1.7992 2.8363z"/>
<path d="m96.485 105.74h1.6933l1.2277-2.0108 1.2277 2.0108h1.6933l-2.0849-3.0268 1.7886-2.8363h-1.5875l-1.0372 1.7674-1.0583-1.7674h-1.5875l1.7992 2.8363z"/>
<path d="m102.41 105.74h1.6933l1.2277-2.0108 1.2277 2.0108h1.6933l-2.0849-3.0268 1.7886-2.8363h-1.5875l-1.0372 1.7674-1.0583-1.7674h-1.5875l1.7992 2.8363z"/>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
inkscape:version="1.0 (4035a4fb49, 2020-05-01)"
sodipodi:docname="logo.svg"
id="svg8"
version="1.1"
viewBox="0 0 69.132355 14.439899"
height="14.439899mm"
width="69.132355mm">
<defs
id="defs2" />
<sodipodi:namedview
fit-margin-bottom="0"
fit-margin-right="0"
fit-margin-left="0"
fit-margin-top="0"
inkscape:window-maximized="1"
inkscape:window-y="932"
inkscape:window-x="1182"
inkscape:window-height="1024"
inkscape:window-width="1920"
showguides="false"
showgrid="false"
inkscape:document-rotation="0"
inkscape:current-layer="text835"
inkscape:document-units="mm"
inkscape:cy="41.103987"
inkscape:cx="128.82469"
inkscape:zoom="2.8"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
borderopacity="1.0"
bordercolor="#666666"
pagecolor="#ffffff"
id="base">
<sodipodi:guide
id="guide837"
orientation="0.70710678,-0.70710678"
position="-151.83279,131.09395" />
</sodipodi:namedview>
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
transform="translate(-31.294238,-94.737942)"
id="layer1"
inkscape:groupmode="layer"
inkscape:label="Layer 1">
<g
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:19.05px;line-height:1.25;font-family:Orbitron;-inkscape-font-specification:'Orbitron Bold';letter-spacing:0px;word-spacing:0px;fill-opacity:1;stroke:none;stroke-width:0.264583"
id="text835"
aria-label="traxxx">
<path
id="path839"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:19.05px;font-family:Orbitron;-inkscape-font-specification:'Orbitron Bold';stroke-width:0.264583;"
d="m 33.923138,109.17784 q -1.08585,0 -1.8669,-0.762 -0.762,-0.78105 -0.762,-1.8669 V 94.737942 h 2.49555 v 3.3909 h 4.3053 v 2.495548 h -4.3053 v 5.39115 q 0,0.5334 0.05715,0.6096 0.0762,0.0571 0.6096,0.0571 h 3.63855 v 2.49555 z" />
<path
id="path841"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:19.05px;font-family:Orbitron;-inkscape-font-specification:'Orbitron Bold';stroke-width:0.264583;"
d="m 39.752431,109.17784 v -8.4201 q 0,-1.085848 0.762,-1.847848 0.78105,-0.78105 1.8669,-0.78105 h 6.1341 v 2.495548 h -5.6007 q -0.5334,0 -0.6096,0.0762 -0.05715,0.0571 -0.05715,0.59055 v 7.8867 z" />
<path
id="path843"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:19.05px;font-family:Orbitron;-inkscape-font-specification:'Orbitron Bold';stroke-width:0.264583;"
d="m 52.592118,109.17784 q -1.08585,0 -1.8669,-0.762 -0.762,-0.78105 -0.762,-1.8669 v -4.1529 h 8.7249 v -1.1049 q 0,-0.5334 -0.0762,-0.59055 -0.05715,-0.0762 -0.59055,-0.0762 h -8.05815 v -2.495548 h 8.59155 q 1.08585,0 1.84785,0.78105 0.78105,0.762 0.78105,1.847848 v 8.4201 z m 0.5334,-2.49555 h 5.5626 v -2.03835 h -6.22935 v 1.3716 q 0,0.5334 0.05715,0.6096 0.0762,0.0571 0.6096,0.0571 z" />
<path
id="path845"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:19.05px;font-family:Orbitron;-inkscape-font-specification:'Orbitron Bold';stroke-width:0.264583;"
d="m 62.707616,109.17784 v -0.66675 l 4.05765,-4.953 -4.05765,-4.762498 v -0.66675 h 2.7051 l 2.9718,3.505198 2.9718,-3.505198 h 2.7051 v 0.66675 l -4.05765,4.762498 4.05765,4.953 v 0.66675 h -2.68605 l -2.99085,-3.6576 -2.9718,3.6576 z" />
<path
id="path847"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:19.05px;font-family:Orbitron;-inkscape-font-specification:'Orbitron Bold';stroke-width:0.264583;"
d="m 75.890205,109.17784 v -0.66675 l 4.057649,-4.953 -4.057649,-4.762498 v -0.66675 h 2.705099 l 2.9718,3.505198 2.9718,-3.505198 h 2.7051 v 0.66675 l -4.05765,4.762498 4.05765,4.953 v 0.66675 h -2.68605 l -2.99085,-3.6576 -2.9718,3.6576 z" />
<path
id="path849"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:19.05px;font-family:Orbitron;-inkscape-font-specification:'Orbitron Bold';stroke-width:0.264583;"
d="m 89.072791,109.17784 v -0.66675 l 4.05765,-4.953 -4.05765,-4.762498 v -0.66675 h 2.7051 l 2.9718,3.505198 2.9718,-3.505198 h 2.705099 v 0.66675 l -4.057649,4.762498 4.057649,4.953 v 0.66675 h -2.686049 l -2.99085,-3.6576 -2.9718,3.6576 z" />
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 5.2 KiB

12
assets/img/logo_old.svg Normal file
View File

@ -0,0 +1,12 @@
<svg width="31.051mm" height="7.9587mm" version="1.1" viewBox="0 0 31.051 7.9587" xmlns="http://www.w3.org/2000/svg">
<g transform="translate(-77.202 -97.923)">
<g stroke-width=".26458" aria-label="traxxx">
<path d="m77.89 105.74h1.4076v-4.5826h0.84667v-1.2806h-0.84667v-1.9579h-1.4076v1.9579h-0.68792v1.2806h0.68792z"/>
<path d="m80.917 105.74h1.4076v-3.2597c-0.03175-0.86783 0.41275-1.3547 1.2594-1.3864v-1.3547h-0.10583c-0.60325 0-0.89958 0.16933-1.27 0.70908v-0.5715h-1.2912z"/>
<path d="m90.072 99.881h-1.2912v0.78316c-0.48683-0.64558-1.0689-0.92075-1.9156-0.92075-1.7357 0-2.9845 1.3017-2.9845 3.0903 0 1.7674 1.2382 3.048 2.9528 3.048 0.8255 0 1.3864-0.254 1.9473-0.89958v0.762h1.2912zm-3.0586 1.1536c1.0054 0 1.7251 0.75141 1.7251 1.8203 0 0.42333-0.16933 0.91017-0.42333 1.2065-0.28575 0.34925-0.74083 0.52917-1.2806 0.52917-1.0266 0-1.7357-0.6985-1.7357-1.7251 0-1.0689 0.70908-1.8309 1.7145-1.8309z"/>
<path d="m90.559 105.74h1.6933l1.2277-2.0108 1.2277 2.0108h1.6933l-2.0849-3.0268 1.7886-2.8363h-1.5875l-1.0372 1.7674-1.0583-1.7674h-1.5875l1.7992 2.8363z"/>
<path d="m96.485 105.74h1.6933l1.2277-2.0108 1.2277 2.0108h1.6933l-2.0849-3.0268 1.7886-2.8363h-1.5875l-1.0372 1.7674-1.0583-1.7674h-1.5875l1.7992 2.8363z"/>
<path d="m102.41 105.74h1.6933l1.2277-2.0108 1.2277 2.0108h1.6933l-2.0849-3.0268 1.7886-2.8363h-1.5875l-1.0372 1.7674-1.0583-1.7674h-1.5875l1.7992 2.8363z"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

@ -9,9 +9,14 @@
<link rel="stylesheet" href="/css/style.css">
<link rel="icon" href="/img/favicon/favicon-16x16.ico" sizes="16x16">
<link rel="icon" href="/img/favicon/favicon-32x32.ico" sizes="32x32">
<link rel="icon" href="/img/favicon/favicon-62x62.ico" sizes="64x64">
<link rel="apple-touch-icon" sizes="180x180" href="/img/favicon/apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="32x32" href="/img/favicon/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="/img/favicon/favicon-16x16.png">
<link rel="manifest" href="/img/favicon/site.webmanifest">
<link rel="mask-icon" href="/img/favicon/safari-pinned-tab.svg" color="#ff6c88">
<link rel="shortcut icon" href="/img/favicon/favicon.ico">
<meta name="msapplication-TileColor" content="#aa2c66">
<meta name="msapplication-config" content="/img/favicon/browserconfig.xml">
<script src="/js/bundle.js" defer></script>
</head>

View File

@ -80,7 +80,7 @@ function initActorActions(store, router) {
lazy
hash
comment
copyright
credit
sfw: sfwMedia {
id
thumbnail
@ -111,7 +111,7 @@ function initActorActions(store, router) {
lazy
hash
comment
copyright
credit
sfw: sfwMedia {
id
thumbnail
@ -314,7 +314,7 @@ function initActorActions(store, router) {
thumbnail
lazy
comment
copyright
credit
sfw: sfwMedia {
id
thumbnail

View File

@ -621,14 +621,14 @@ exports.up = knex => Promise.resolve()
table.text('title');
table.text('slug');
table.date('date');
table.timestamp('date');
table.index('date');
table.date('production_date');
table.enum('date_precision', ['year', 'month', 'day', 'hour', 'minute', 'second'])
.defaultTo('day');
table.date('production_date');
table.text('description');
table.integer('duration')

218
package-lock.json generated
View File

@ -1490,21 +1490,22 @@
"acorn": {
"version": "7.1.0",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.0.tgz",
"integrity": "sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ=="
"integrity": "sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ==",
"dev": true
},
"acorn-globals": {
"version": "4.3.4",
"resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.4.tgz",
"integrity": "sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==",
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz",
"integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==",
"requires": {
"acorn": "^6.0.1",
"acorn-walk": "^6.0.1"
"acorn": "^7.1.1",
"acorn-walk": "^7.1.1"
},
"dependencies": {
"acorn": {
"version": "6.4.0",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.0.tgz",
"integrity": "sha512-gac8OEcQ2Li1dxIEWGZzsp2BitJxwkwcOm0zHAJLcPJaVvm58FRnk6RkuLRpU1EujipU2ZFODv2P9DLMfnV8mw=="
"version": "7.3.1",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-7.3.1.tgz",
"integrity": "sha512-tLc0wSnatxAQHVHUapaHdz72pi9KUyHjq5KyHjGg9Y8Ifdc79pTh2XvI6I1/chZbnM7QtNKzh66ooDogPZSleA=="
}
}
},
@ -1515,9 +1516,9 @@
"dev": true
},
"acorn-walk": {
"version": "6.2.0",
"resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz",
"integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA=="
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz",
"integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA=="
},
"adm-zip": {
"version": "0.4.14",
@ -1654,11 +1655,6 @@
"resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz",
"integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8="
},
"array-equal": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz",
"integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM="
},
"array-find-index": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz",
@ -2211,9 +2207,9 @@
"dev": true
},
"browser-process-hrtime": {
"version": "0.1.3",
"resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-0.1.3.tgz",
"integrity": "sha512-bRFnI4NnjO6cnyLmOV/7PVoDEMJChlcfN0z4s1YMBY989/SvlfMI1lgCnkFUs53e9gQF+w7qu7XdllSTiSl8Aw=="
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz",
"integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow=="
},
"browserify-aes": {
"version": "1.2.0",
@ -3111,9 +3107,9 @@
"integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw=="
},
"cssstyle": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.2.0.tgz",
"integrity": "sha512-sEb3XFPx3jNnCAMtqrXPDeSgQr+jojtCeNf8cvMNMh1cG970+lljssvQDzPq6lmmJu2Vhqood/gtEomBiHOGnA==",
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz",
"integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==",
"requires": {
"cssom": "~0.3.6"
},
@ -3181,13 +3177,13 @@
}
},
"data-urls": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz",
"integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==",
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz",
"integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==",
"requires": {
"abab": "^2.0.0",
"whatwg-mimetype": "^2.2.0",
"whatwg-url": "^7.0.0"
"abab": "^2.0.3",
"whatwg-mimetype": "^2.3.0",
"whatwg-url": "^8.0.0"
}
},
"dayjs": {
@ -3214,6 +3210,11 @@
"resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
"integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA="
},
"decimal.js": {
"version": "10.2.0",
"resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.2.0.tgz",
"integrity": "sha512-vDPw+rDgn3bZe1+F/pyEwb1oMG2XTlRVgAa6B4KccTEpYgF8w6eQllVbQcfIJnZyvzFtFpxnpGtx8dd7DJp/Rw=="
},
"decode-uri-component": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
@ -3386,11 +3387,18 @@
"integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w=="
},
"domexception": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz",
"integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==",
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz",
"integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==",
"requires": {
"webidl-conversions": "^4.0.2"
"webidl-conversions": "^5.0.0"
},
"dependencies": {
"webidl-conversions": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz",
"integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA=="
}
}
},
"domhandler": {
@ -3635,9 +3643,9 @@
"integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
},
"escodegen": {
"version": "1.14.1",
"resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.1.tgz",
"integrity": "sha512-Bmt7NcRySdIfNPfU2ZoXDrrXsG9ZjvDxcAlMfDUgRBjLOWTuIACXPBFJH7Z+cLb40JeQco5toikyc9t9P8E9SQ==",
"version": "1.14.3",
"resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz",
"integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==",
"requires": {
"esprima": "^4.0.1",
"estraverse": "^4.2.0",
@ -5761,11 +5769,11 @@
"dev": true
},
"html-encoding-sniffer": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz",
"integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==",
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz",
"integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==",
"requires": {
"whatwg-encoding": "^1.0.1"
"whatwg-encoding": "^1.0.5"
}
},
"htmlparser2": {
@ -6273,6 +6281,11 @@
"isobject": "^3.0.1"
}
},
"is-potential-custom-element-name": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.0.tgz",
"integrity": "sha1-DFLlS8yjkbssSUsh6GJtczbG45c="
},
"is-promise": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz",
@ -6408,42 +6421,47 @@
"integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM="
},
"jsdom": {
"version": "15.2.1",
"resolved": "https://registry.npmjs.org/jsdom/-/jsdom-15.2.1.tgz",
"integrity": "sha512-fAl1W0/7T2G5vURSyxBzrJ1LSdQn6Tr5UX/xD4PXDx/PDgwygedfW6El/KIj3xJ7FU61TTYnc/l/B7P49Eqt6g==",
"version": "16.3.0",
"resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.3.0.tgz",
"integrity": "sha512-zggeX5UuEknpdZzv15+MS1dPYG0J/TftiiNunOeNxSl3qr8Z6cIlQpN0IdJa44z9aFxZRIVqRncvEhQ7X5DtZg==",
"requires": {
"abab": "^2.0.0",
"acorn": "^7.1.0",
"acorn-globals": "^4.3.2",
"array-equal": "^1.0.0",
"cssom": "^0.4.1",
"cssstyle": "^2.0.0",
"data-urls": "^1.1.0",
"domexception": "^1.0.1",
"escodegen": "^1.11.1",
"html-encoding-sniffer": "^1.0.2",
"abab": "^2.0.3",
"acorn": "^7.1.1",
"acorn-globals": "^6.0.0",
"cssom": "^0.4.4",
"cssstyle": "^2.2.0",
"data-urls": "^2.0.0",
"decimal.js": "^10.2.0",
"domexception": "^2.0.1",
"escodegen": "^1.14.1",
"html-encoding-sniffer": "^2.0.1",
"is-potential-custom-element-name": "^1.0.0",
"nwsapi": "^2.2.0",
"parse5": "5.1.0",
"pn": "^1.1.0",
"request": "^2.88.0",
"request-promise-native": "^1.0.7",
"saxes": "^3.1.9",
"symbol-tree": "^3.2.2",
"parse5": "5.1.1",
"request": "^2.88.2",
"request-promise-native": "^1.0.8",
"saxes": "^5.0.0",
"symbol-tree": "^3.2.4",
"tough-cookie": "^3.0.1",
"w3c-hr-time": "^1.0.1",
"w3c-xmlserializer": "^1.1.2",
"webidl-conversions": "^4.0.2",
"w3c-hr-time": "^1.0.2",
"w3c-xmlserializer": "^2.0.0",
"webidl-conversions": "^6.1.0",
"whatwg-encoding": "^1.0.5",
"whatwg-mimetype": "^2.3.0",
"whatwg-url": "^7.0.0",
"ws": "^7.0.0",
"whatwg-url": "^8.0.0",
"ws": "^7.2.3",
"xml-name-validator": "^3.0.0"
},
"dependencies": {
"acorn": {
"version": "7.3.1",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-7.3.1.tgz",
"integrity": "sha512-tLc0wSnatxAQHVHUapaHdz72pi9KUyHjq5KyHjGg9Y8Ifdc79pTh2XvI6I1/chZbnM7QtNKzh66ooDogPZSleA=="
},
"parse5": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz",
"integrity": "sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ=="
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz",
"integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug=="
}
}
},
@ -8331,11 +8349,6 @@
"resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz",
"integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow=="
},
"pn": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz",
"integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA=="
},
"popper.js": {
"version": "1.16.1",
"resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz",
@ -9561,11 +9574,11 @@
"integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw=="
},
"saxes": {
"version": "3.1.11",
"resolved": "https://registry.npmjs.org/saxes/-/saxes-3.1.11.tgz",
"integrity": "sha512-Ydydq3zC+WYDJK1+gRxRapLIED9PWeSuuS41wqyoRmzvhhh9nc+QQrVMKJYzJFULazeGhzSV0QleN2wD3boh2g==",
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz",
"integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==",
"requires": {
"xmlchars": "^2.1.1"
"xmlchars": "^2.2.0"
}
},
"scheduler": {
@ -10946,11 +10959,11 @@
}
},
"tr46": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz",
"integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=",
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/tr46/-/tr46-2.0.2.tgz",
"integrity": "sha512-3n1qG+/5kg+jrbTzwAykB5yRYtQCTqOGKq5U5PE3b0a1/mzo6snDhjGS0zJVJunO0NrT3Dg1MLy5TjWP/UJppg==",
"requires": {
"punycode": "^2.1.0"
"punycode": "^2.1.1"
}
},
"traverse": {
@ -11560,20 +11573,18 @@
"integrity": "sha512-ha3jNLJqNhhrAemDXcmMJMKf1Zu4sybMPr9KxJIuOpVcsDQlTBYLLladav2U+g1AvdYDG5Gs0xBTb0M5pXXYFQ=="
},
"w3c-hr-time": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz",
"integrity": "sha1-gqwr/2PZUOqeMYmlimViX+3xkEU=",
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz",
"integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==",
"requires": {
"browser-process-hrtime": "^0.1.2"
"browser-process-hrtime": "^1.0.0"
}
},
"w3c-xmlserializer": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-1.1.2.tgz",
"integrity": "sha512-p10l/ayESzrBMYWRID6xbuCKh2Fp77+sA0doRuGn4tTIMrrZVeqfpKjXHY+oDh3K4nLdPgNwMTVP6Vp4pvqbNg==",
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz",
"integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==",
"requires": {
"domexception": "^1.0.1",
"webidl-conversions": "^4.0.2",
"xml-name-validator": "^3.0.0"
}
},
@ -11597,9 +11608,9 @@
}
},
"webidl-conversions": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz",
"integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg=="
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz",
"integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w=="
},
"webpack": {
"version": "4.41.6",
@ -11847,13 +11858,20 @@
"integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g=="
},
"whatwg-url": {
"version": "7.1.0",
"resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz",
"integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==",
"version": "8.1.0",
"resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.1.0.tgz",
"integrity": "sha512-vEIkwNi9Hqt4TV9RdnaBPNt+E2Sgmo3gePebCRgZ1R7g6d23+53zCTnuB0amKI4AXq6VM8jj2DUAa0S1vjJxkw==",
"requires": {
"lodash.sortby": "^4.7.0",
"tr46": "^1.0.1",
"webidl-conversions": "^4.0.2"
"tr46": "^2.0.2",
"webidl-conversions": "^5.0.0"
},
"dependencies": {
"webidl-conversions": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz",
"integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA=="
}
}
},
"which": {
@ -11999,9 +12017,9 @@
}
},
"ws": {
"version": "7.2.1",
"resolved": "https://registry.npmjs.org/ws/-/ws-7.2.1.tgz",
"integrity": "sha512-sucePNSafamSKoOqoNfBd8V0StlkzJKL2ZAhGQinCfNQ+oacw+Pk7lcdAElecBF2VkLNZRiIb5Oi1Q5lVUVt2A=="
"version": "7.3.1",
"resolved": "https://registry.npmjs.org/ws/-/ws-7.3.1.tgz",
"integrity": "sha512-D3RuNkynyHmEJIpD2qrgVkc9DQ23OrN/moAwZX4L8DfvszsJxpjQuUq3LMx6HoYji9fbIOBY18XWBsAux1ZZUA=="
},
"xml-name-validator": {
"version": "3.0.0",

View File

@ -94,7 +94,7 @@
"fs-extra": "^7.0.1",
"graphile-utils": "^4.5.6",
"iconv-lite": "^0.5.1",
"jsdom": "^15.2.1",
"jsdom": "^16.3.0",
"knex": "^0.20.10",
"knex-migrate": "^1.7.4",
"longjohn": "^0.2.12",

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 918 B

View File

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<browserconfig>
<msapplication>
<tile>
<square150x150logo src="/img/favicon/mstile-150x150.png"/>
<TileColor>#ff6c88</TileColor>
</tile>
</msapplication>
</browserconfig>

Binary file not shown.

After

Width:  |  Height:  |  Size: 617 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 640 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@ -0,0 +1,48 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
width="1760.000000pt" height="1760.000000pt" viewBox="0 0 1760.000000 1760.000000"
preserveAspectRatio="xMidYMid meet">
<metadata>
Created by potrace 1.11, written by Peter Selinger 2001-2013
</metadata>
<g transform="translate(0.000000,1760.000000) scale(0.100000,-0.100000)"
fill="#000000" stroke="none">
<path d="M4663 10258 c2 -4039 7 -7363 10 -7388 4 -25 8 -58 10 -75 3 -16 8
-52 11 -80 4 -27 9 -63 12 -80 2 -16 6 -41 9 -55 3 -14 8 -36 10 -50 2 -14 11
-51 18 -82 8 -32 12 -58 9 -58 -2 0 1 -7 8 -15 7 -8 10 -15 7 -15 -5 0 42
-161 63 -215 6 -16 11 -30 10 -30 -1 0 4 -13 10 -30 7 -16 13 -34 14 -40 3
-11 8 -22 51 -125 37 -89 144 -298 156 -305 5 -4 7 -11 4 -16 -4 -5 -1 -9 4
-9 6 0 11 -7 11 -15 0 -8 5 -15 10 -15 6 0 10 -5 10 -11 0 -15 164 -260 205
-306 11 -12 29 -34 40 -48 130 -168 342 -381 506 -507 17 -12 52 -39 77 -59
39 -30 129 -91 262 -178 14 -9 39 -23 55 -31 17 -8 32 -18 35 -21 7 -9 264
-135 286 -141 11 -3 23 -5 28 -6 5 0 12 -4 15 -9 15 -21 330 -125 481 -159 11
-2 30 -6 43 -9 12 -3 39 -7 61 -10 21 -3 43 -8 48 -11 5 -4 24 -8 41 -10 18
-1 46 -5 62 -8 17 -2 57 -7 90 -11 33 -3 74 -9 90 -12 17 -4 1242 -8 2723 -10
l2692 -4 0 1521 c0 1209 -3 1520 -12 1521 -7 1 -26 1 -43 0 -41 -2 -43 -2
-105 1 -30 1 -61 -1 -68 -6 -6 -4 -12 -4 -12 1 0 4 -22 8 -50 8 -27 0 -50 -4
-50 -9 0 -5 -6 -4 -12 1 -15 10 -179 10 -196 -1 -7 -4 -12 -4 -12 1 0 4 -22 8
-50 8 -27 0 -50 -4 -50 -9 0 -5 -6 -4 -12 1 -15 10 -159 10 -176 -1 -7 -4 -12
-4 -12 1 0 4 -29 8 -65 8 -36 0 -65 -4 -65 -8 0 -4 -8 -4 -17 1 -10 4 -52 7
-93 5 -91 -4 -83 -4 -148 -1 -28 2 -52 -1 -52 -5 0 -5 -5 -5 -11 -1 -17 10
-89 11 -89 1 0 -6 -5 -6 -12 0 -7 5 -24 8 -38 6 -14 -2 -29 -3 -35 -3 -28 1
-153 2 -170 1 -11 -1 -33 -1 -50 0 -16 1 -43 1 -60 0 -16 -1 -47 -1 -67 -1
-21 0 -44 0 -50 -1 -7 0 -25 2 -40 4 -16 2 -28 0 -28 -5 0 -5 -8 -5 -17 -1
-22 10 -164 9 -181 -1 -7 -4 -12 -4 -12 1 0 4 -22 8 -50 8 -27 0 -50 -4 -50
-9 0 -5 -6 -4 -12 1 -15 10 -179 10 -196 -1 -7 -4 -12 -4 -12 1 0 4 -22 8 -50
8 -27 0 -50 -4 -50 -9 0 -5 -6 -4 -12 1 -15 10 -179 10 -196 -1 -7 -4 -12 -4
-12 1 0 4 -22 8 -50 8 -27 0 -50 -4 -50 -9 0 -5 -6 -4 -12 1 -15 10 -179 10
-196 -1 -7 -4 -12 -4 -12 1 0 4 -22 8 -50 8 -27 0 -50 -4 -50 -9 0 -5 -6 -4
-12 1 -15 10 -159 10 -176 -1 -7 -4 -12 -4 -12 1 0 4 -29 8 -65 8 -36 0 -65
-4 -65 -8 0 -4 -8 -4 -17 1 -10 4 -52 7 -93 5 -91 -4 -83 -4 -148 -1 -28 2
-52 -1 -52 -5 0 -5 -5 -5 -11 -1 -17 10 -89 11 -89 1 0 -6 -5 -6 -12 0 -7 5
-24 8 -38 6 -14 -2 -29 -3 -35 -3 -28 1 -153 2 -170 1 -11 -1 -33 -1 -50 0
-16 1 -43 1 -60 0 -16 -1 -47 -1 -67 -1 -21 0 -45 0 -53 0 -8 0 -22 0 -30 0
-8 0 -21 0 -27 0 -46 -1 -325 10 -378 14 -161 15 -179 18 -272 42 -18 5 -48
46 -53 72 -10 57 -19 110 -21 127 -16 148 -19 728 -19 3680 l0 3450 2610 1
c1436 1 2616 2 2623 3 9 1 12 312 12 1519 l0 1519 -2607 1 c-1435 0 -2615 1
-2624 1 -15 1 -16 177 -17 2054 0 1128 -1 2058 -1 2065 -1 9 -312 12 -1521 12
l-1520 0 3 -7342z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.0 KiB

View File

@ -0,0 +1,19 @@
{
"name": "traxxx",
"short_name": "traxxx",
"icons": [
{
"src": "/img/favicon/android-chrome-192x192.png",
"sizes": "192x192",
"type": "image/png"
},
{
"src": "/img/favicon/android-chrome-512x512.png",
"sizes": "512x512",
"type": "image/png"
}
],
"theme_color": "#ffffff",
"background_color": "#ffffff",
"display": "standalone"
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 188 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 188 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 KiB

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 KiB

After

Width:  |  Height:  |  Size: 3.6 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: 3.7 KiB

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.5 KiB

After

Width:  |  Height:  |  Size: 8.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 KiB

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.1 KiB

After

Width:  |  Height:  |  Size: 42 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: 40 KiB

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

After

Width:  |  Height:  |  Size: 23 KiB

View File

@ -305,8 +305,7 @@ const networks = [
{
slug: 'mikeadriano',
name: 'Mike Adriano',
url: null,
description: null,
url: 'https://www.mikeadriano.com',
},
{
slug: 'milehighmedia',

View File

@ -1821,6 +1821,12 @@ const sites = [
description: '',
parent: 'dogfartnetwork',
},
// ELEGANT ANGEL
{
slug: 'elegantangel',
name: 'Elegant Angel',
url: 'https://www.elegantangel.com',
},
// EVIL ANGEL
{
slug: 'evilangel',

View File

@ -68,7 +68,7 @@ async function fetchActorReleases({ query }, url, remainingPages, actorName, acc
return accReleases.concat(releases);
}
async function scrapeProfile({ query, window }, actorName, url, include) {
async function scrapeProfile({ query }, actorName, url, include) {
const profile = {};
profile.avatar = {
@ -85,7 +85,7 @@ async function scrapeProfile({ query, window }, actorName, url, include) {
if (include.releases) {
const availablePages = query.all('.pageboxdropdown option', 'value');
profile.releases = await fetchActorReleases(qu.init(query.q('#episodes > table'), window), url, availablePages.slice(1), actorName);
profile.releases = await fetchActorReleases(qu.init(query.q('#episodes > table')), url, availablePages.slice(1), actorName);
}
return profile;
@ -105,7 +105,9 @@ async function fetchScene(url, channel) {
async function fetchProfile(actorName, entity, include) {
const url = `http://killergram.com/episodes.asp?page=episodes&model=${encodeURI(actorName)}&ct=model`;
const res = await qu.get(url, '#content');
const res = await qu.get(url, '#content', null, {
followRedirects: false,
});
return res.ok ? scrapeProfile(res.item, actorName, url, include) : res.status;
}

View File

@ -1,237 +1,88 @@
'use strict';
/* eslint-disable newline-per-chained-call */
const { JSDOM } = require('jsdom');
const cheerio = require('cheerio');
const moment = require('moment');
// const bhttp = require('bhttp');
const qu = require('../utils/qu');
const { get } = require('../utils/http');
const descriptionTags = {
'anal cream pie': 'anal creampie',
'ass to mouth': 'ass to mouth',
'cream pie in her ass': 'anal creampie',
'eats ass': 'ass eating',
facial: 'facial',
gaped: 'gaping',
gapes: 'gaping',
gape: 'gaping',
'rectal cream pie': 'anal creampie',
rimming: 'ass eating',
};
function deriveTagsFromDescription(description) {
const matches = (description || '').toLowerCase().match(new RegExp(Object.keys(descriptionTags).join('|'), 'g'));
return matches
? matches.map(match => descriptionTags[match])
: [];
}
async function scrapeLatestA(html, site) {
const { document } = new JSDOM(html).window;
const sceneElements = document.querySelectorAll('.content-item-large, .content-item');
return Promise.all(Array.from(sceneElements, async (element) => {
const $ = cheerio.load(element.innerHTML, { normalizeWhitespace: true });
const titleElement = element.querySelector('h3.title a');
const title = titleElement.textContent;
const url = titleElement.href;
const entryId = url.split('/').slice(-2)[0];
const descriptionElement = element.querySelector('.desc');
const description = descriptionElement && descriptionElement.textContent.trim();
const date = moment(element.querySelector('.date, time').textContent, 'Do MMM YYYY').toDate();
const actors = Array.from(element.querySelectorAll('h4.models a'), actorElement => actorElement.textContent);
const durationString = element.querySelector('.total-time').textContent.trim();
// timestamp is sometimes 00:00, sometimes 0:00:00
const duration = durationString.split(':').length === 3
? moment.duration(durationString).asSeconds()
: moment.duration(`00:${durationString}`).asSeconds();
const ratingElement = element.querySelector('.rating');
const stars = ratingElement && ratingElement.dataset.rating;
const [poster, ...primaryPhotos] = Array.from(element.querySelectorAll('img'), imageElement => imageElement.src);
const secondaryPhotos = $('.thumb-top, .thumb-bottom')
.map((photoIndex, photoElement) => $(photoElement).css()['background-image'])
.toArray()
.map(photoUrl => photoUrl.slice(photoUrl.indexOf('http'), photoUrl.indexOf('.jpg') + 4));
const photos = [...primaryPhotos, ...secondaryPhotos];
const tags = deriveTagsFromDescription(description);
const scene = {
url,
entryId,
title,
description,
actors,
director: 'Mike Adriano',
date,
duration,
tags,
poster,
photos,
rating: {
stars,
},
site,
};
return scene;
}));
}
async function scrapeLatestB(html) {
const { document } = new JSDOM(html).window;
const sceneElements = document.querySelectorAll('.content-border');
return Promise.all(Array.from(sceneElements, async (element) => {
const $ = cheerio.load(element.innerHTML, { normalizeWhitespace: true });
async function scrapeAll(scenes) {
return scenes.map(({ query }) => {
const release = {
director: 'Mike Adriano',
};
const titleElement = element.querySelector('.content-title-wrap a');
release.title = titleElement.title || titleElement.textContent.trim();
release.url = titleElement.href;
release.entryId = release.url.split('/').slice(-2)[0];
release.title = query.cnt('h3.title a, .content-title-wrap a');
release.url = query.url('h3.title a, .content-title-wrap a');
release.entryId = new URL(release.url).pathname.match(/\/view\/(\d+)/)[1];
release.description = element.querySelector('.content-description').textContent.trim();
release.date = (moment(element.querySelector('.mobile-date').textContent, 'MM/DD/YYYY')
|| moment(element.querySelector('.date').textContent, 'Do MMM YYYY')).toDate();
release.actors = Array.from(element.querySelectorAll('.content-models a'), actorElement => actorElement.textContent);
release.description = query.cnt('.desc, .content-description');
release.date = query.date('.date, time, .hide', 'Do MMM YYYY');
const durationString = element.querySelector('.total-time').textContent.trim();
// timestamp is somethines 00:00, sometimes 0:00:00
release.duration = durationString.split(':').length === 3
? moment.duration(durationString).asSeconds()
: moment.duration(`00:${durationString}`).asSeconds();
release.actors = query.cnts('h4.models a, .content-models a');
release.duration = query.dur('.total-time');
const [poster, ...primaryPhotos] = Array.from(element.querySelectorAll('a img'), imageElement => imageElement.src);
const secondaryPhotos = $('.thumb-mouseover')
.map((photoIndex, photoElement) => $(photoElement).css()['background-image'])
.toArray()
.map(photoUrl => photoUrl.slice(photoUrl.indexOf('http'), photoUrl.indexOf('.jpg') + 4));
const [poster, ...primaryPhotos] = query.imgs('a img');
const secondaryPhotos = query.styles('.thumb-top, .thumb-bottom, .thumb-mouseover', 'background-image').map(style => style.match(/url\((.*)\)/)[1]);
release.poster = poster;
release.photos = [...primaryPhotos, ...secondaryPhotos];
release.photos = primaryPhotos.concat(secondaryPhotos);
release.tags = deriveTagsFromDescription(release.description);
return release;
}));
});
}
async function scrapeSceneA(html, url) {
const { document } = new JSDOM(html).window;
const element = document.querySelector('.content-page-info');
const release = {
url,
director: 'Mike Adriano',
function scrapeScene({ query }, url) {
const release = { director: 'Mike Adriano' };
if (query.exists('a[href*="stackpath.com"]')) {
throw new Error('URL blocked by StackPath');
}
release.entryId = new URL(url).pathname.match(/\/view\/(\d+)/)[1];
release.title = query.cnt('.content-page-info .title');
release.description = query.cnt('.content-page-info .desc');
release.date = query.date('.content-page-info .date, .content-page-info .hide', 'Do MMM YYYY');
release.actors = query.cnts('.content-page-info .models a');
release.duration = query.dur('.content-page-info .total-time:last-child');
release.poster = query.poster('.content-page-header video, .content-page-header-inner video');
const trailerEl = query.q('.content-page-header source, .content-page-header-inner source');
if (trailerEl) {
release.trailer = {
src: trailerEl.src,
type: trailerEl.type,
};
release.entryId = url.split('/').slice(-2)[0];
release.title = element.querySelector('.title').textContent.trim();
release.description = element.querySelector('.desc').textContent.trim();
release.date = moment(element.querySelector('.post-date').textContent.trim(), 'Do MMM YYYY').toDate();
release.actors = Array.from(element.querySelectorAll('.models a'), actorElement => actorElement.textContent);
const durationString = element.querySelector('.total-time').textContent.trim();
// timestamp is sometimes 00:00, sometimes 0:00:00
release.duration = durationString.split(':').length === 3
? moment.duration(durationString).asSeconds()
: moment.duration(`00:${durationString}`).asSeconds();
const { poster } = document.querySelector('.content-page-header video');
const { src, type } = document.querySelector('.content-page-header source');
release.poster = poster;
release.trailer = { src, type };
release.tags = deriveTagsFromDescription(release.description);
}
return release;
}
async function scrapeSceneB(html, url, site) {
const { document } = new JSDOM(html).window;
const element = document.querySelector('.content-page-info');
const entryId = url.split('/').slice(-2)[0];
const title = element.querySelector('.title').textContent.trim();
const description = element.querySelector('.desc').textContent.trim();
const date = moment(element.querySelector('.date').textContent.trim(), 'Do MMM YYYY').toDate();
const actors = Array.from(element.querySelectorAll('.models a'), actorElement => actorElement.textContent);
const durationString = element.querySelector('.total-time').textContent.trim();
// timestamp is somethines 00:00, sometimes 0:00:00
const duration = durationString.split(':').length === 3
? moment.duration(durationString).asSeconds()
: moment.duration(`00:${durationString}`).asSeconds();
const { poster } = document.querySelector('.content-page-header-inner video');
const { src, type } = document.querySelector('.content-page-header-inner source');
const tags = deriveTagsFromDescription(description);
const scene = {
url,
entryId,
title,
description,
actors,
director: 'Mike Adriano',
date,
duration,
tags,
poster,
trailer: {
src,
type,
},
site,
};
return scene;
}
async function fetchLatest(site, page = 1) {
const { host } = new URL(site.url);
async function fetchLatest(channel, page = 1) {
const { host } = new URL(channel.url);
const url = `https://tour.${host}/videos?page=${page}`;
const res = await get(url);
const res = await qu.get(url);
if (res.code === 200) {
if (host === 'trueanal.com' || host === 'swallowed.com') {
return scrapeLatestA(res.html, site);
if (res.ok) {
if (res.item.query.exists('a[href*="stackpath.com"]')) {
throw new Error('URL blocked by StackPath');
}
return scrapeLatestB(res.html, site);
return scrapeAll(qu.initAll(res.item.el, '.content-item-large, .content-item, .content-border'), channel);
}
return res.code;
return res.status;
}
async function fetchScene(url, site) {
const { host } = new URL(site.url);
const res = await get(url);
async function fetchScene(url, channel) {
const res = await qu.get(url);
if (res.code === 200) {
if (host === 'trueanal.com' || host === 'swallowed.com') {
return scrapeSceneA(res.body.toString(), url, site);
if (res.ok) {
return scrapeScene(res.item, url, channel);
}
return scrapeSceneB(res.body.toString(), url, site);
}
return res.code;
return res.status;
}
/* API protected

View File

@ -78,7 +78,7 @@ function scrapeAll(scenes, site, origin) {
release.url = `${site?.url || origin}${scene.targetUrl}`;
release.date = moment.utc(scene.releaseDate).toDate();
release.shootDate = moment.utc(scene.shootDate).toDate();
release.datePrecision = 'minute';
release.actors = scene.models;
release.stars = Number(scene.textRating) / 2;
@ -104,7 +104,7 @@ function scrapeUpcoming(scene, site) {
release.url = `${site.url}${scene.targetUrl}`;
release.date = moment.utc(scene.releaseDate).toDate();
release.shootDate = moment.utc(scene.shootDate).toDate();
release.datePrecision = 'minute';
release.actors = scene.models;
@ -133,7 +133,8 @@ async function scrapeScene(data, url, site, baseRelease) {
release.entryId = scene.newId;
release.date = moment.utc(scene.releaseDate).toDate();
release.shootDate = moment.utc(scene.shootDate).toDate();
release.productionDate = moment.utc(scene.shootDate).toDate();
release.datePrecision = 'minute';
release.actors = baseRelease?.actors || scene.models;

View File

@ -31,6 +31,7 @@ function curateReleaseEntry(release, batchId, existingRelease) {
shoot_id: release.shootId || null,
url: release.url,
date: Number(release.date) ? release.date : null,
production_date: Number(release.productionDate) ? release.productionDate : null,
date_precision: release.datePrecision,
slug,
description: release.description,

17
src/utils/jsdom-url.js Normal file
View File

@ -0,0 +1,17 @@
'use strict';
const { JSDOM } = require('jsdom');
const el = new JSDOM(`
<span id="url" style="background-image: url(https://w.wallhaven.cc/full/dg/wallhaven-dg7y23.jpg);">
<span id="urlQuotes" style="background-image: url('https://w.wallhaven.cc/full/dg/wallhaven-dg7y23.jpg');">
<span id="color" style="color: rgb(255, 0, 0);">
<span id="urlSpaces" style="background-image: url( https://w.wallhaven.cc/full/md/wallhaven-mdvmrm.jpg );">
<span id="colorSpaces" style="color: rgb( 255, 0, 0 );">
`).window.document;
console.log(el.querySelector('#url').style.backgroundImage);
console.log(el.querySelector('#urlQuotes').style.backgroundImage);
console.log(el.querySelector('#color').style.color);
console.log(el.querySelector('#urlSpaces').style.backgroundImage);
console.log(el.querySelector('#colorSpaces').style.color);

View File

@ -4,9 +4,11 @@ const { JSDOM } = require('jsdom');
const moment = require('moment');
const http = require('./http');
const { window: globalWindow } = new JSDOM('');
function trim(str) {
if (typeof str !== 'string') {
return null;
return str;
}
return str.trim().replace(/\s+/g, ' ');
@ -55,9 +57,9 @@ function q(context, selector, attrArg, applyTrim = true) {
if (attr) {
const value = selector
? context.querySelector(selector)?.[attr] || context.querySelector(selector)?.attributes[attr]?.value
: context[attr] || context.attributes[attr]?.value;
: context[attr] || context.getAttribute(attr);
return applyTrim && value ? trim(value) : value;
return applyTrim && typeof value === 'string' ? trim(value) : value;
}
return selector ? context.querySelector(selector) : context;
@ -77,6 +79,14 @@ function exists(context, selector) {
return !!q(context, selector);
}
function content(context, selector, applyTrim = true) {
return q(context, selector, 'textContent', applyTrim);
}
function contents(context, selector, applyTrim) {
return all(context, selector, 'textContent', applyTrim);
}
function html(context, selector) {
const el = q(context, selector, null, true);
@ -103,6 +113,33 @@ function text(context, selector, applyTrim = true) {
return applyTrim ? trim(textValue) : textValue;
}
function removeStyleFunctionSpaces(el) {
// jsdom appears to have a bug where it ignores inline CSS attributes set to a function() containing spaces, e.g. url( image.png )
el.setAttribute('style', el.getAttribute('style').replace(/\(\s+(.*)\s+\)/g, (match, cssArgs) => `(${cssArgs})`));
}
function style(context, selector, styleAttr) {
const el = q(context, selector);
if (el) {
removeStyleFunctionSpaces(el);
return styleAttr ? el.style[styleAttr] : el.style;
}
return null;
}
function styles(context, selector, styleAttr) {
const elStyles = Array.from(context.querySelectorAll(selector), (el) => {
removeStyleFunctionSpaces(el);
return styleAttr ? el.style[styleAttr] : el.style;
});
return elStyles;
}
function number(context, selector, attr = true) {
const value = q(context, selector, attr);
@ -236,6 +273,10 @@ const legacyFuncs = {
const quFuncs = {
all,
html,
content,
contents,
cnt: content,
cnts: contents,
date,
dur: duration,
duration,
@ -250,6 +291,8 @@ const quFuncs = {
num: number,
poster,
q,
style,
styles,
text,
texts,
trailer: video,
@ -265,7 +308,7 @@ function init(element, window) {
const legacyContextFuncs = Object.entries(legacyFuncs) // dynamically attach methods with context
.reduce((acc, [key, func]) => ({
...acc,
[key]: (...args) => (window && args[0] instanceof window.HTMLElement // allow for different context
[key]: (...args) => (args[0] instanceof globalWindow.HTMLElement // allow for different context
? func(...args)
: func(element, ...args)),
}), {});
@ -273,7 +316,7 @@ function init(element, window) {
const quContextFuncs = Object.entries(quFuncs) // dynamically attach methods with context
.reduce((acc, [key, func]) => ({
...acc,
[key]: (...args) => (window && args[0] instanceof window.HTMLElement // allow for different context
[key]: (...args) => (args[0] instanceof globalWindow.HTMLElement // allow for different context
? func(...args)
: func(element, ...args)),
}), {});
@ -319,7 +362,7 @@ function extractAll(htmlValue, selector) {
}
async function get(urlValue, selector, headers, options, queryAll = false) {
const res = await http.get(urlValue, headers);
const res = await http.get(urlValue, headers, options);
if (res.statusCode === 200) {
const item = queryAll