Added auto captcha and link generating
This commit is contained in:
parent
1b12af714f
commit
0eda7a506d
35
README.md
Normal file
35
README.md
Normal file
|
@ -0,0 +1,35 @@
|
||||||
|
# Ulož.to streamer
|
||||||
|
|
||||||
|
Stream ulož.to video content without downloading
|
||||||
|
|
||||||
|
## Instalation
|
||||||
|
|
||||||
|
### Python libraries
|
||||||
|
|
||||||
|
Install all python libraries for `captcha.py`:
|
||||||
|
|
||||||
|
```
|
||||||
|
numpy, requests, tensorflow, PIL
|
||||||
|
```
|
||||||
|
|
||||||
|
### Install node modules
|
||||||
|
|
||||||
|
```
|
||||||
|
npm i --save
|
||||||
|
```
|
||||||
|
|
||||||
|
### Setup Tor proxy
|
||||||
|
|
||||||
|
Set `ControlPort`, `SocksPort` and `HashedControlPassword` in /etc/tor/torrc:
|
||||||
|
|
||||||
|
```
|
||||||
|
SocksPort 9050
|
||||||
|
ControlPort 9051
|
||||||
|
HashedControlPassword 16:872230D6EA809D4760AD5894ADB7A5A07191882EBCD188378544794F8F
|
||||||
|
```
|
||||||
|
|
||||||
|
Password can be generated with:
|
||||||
|
|
||||||
|
```
|
||||||
|
tor --hash-password giraffe
|
||||||
|
```
|
53
captcha.py
Normal file
53
captcha.py
Normal file
|
@ -0,0 +1,53 @@
|
||||||
|
import numpy
|
||||||
|
import requests
|
||||||
|
import string
|
||||||
|
import sys
|
||||||
|
import tensorflow
|
||||||
|
from io import BytesIO
|
||||||
|
from PIL import Image
|
||||||
|
|
||||||
|
|
||||||
|
def decode(li) -> string:
|
||||||
|
available_chars = "abcdefghijklmnopqrstuvwxyz"
|
||||||
|
result = []
|
||||||
|
for char in li:
|
||||||
|
result.append(available_chars[char])
|
||||||
|
return "".join(result)
|
||||||
|
|
||||||
|
|
||||||
|
def solve(url: string) -> string:
|
||||||
|
interpreter = tensorflow.lite.Interpreter(
|
||||||
|
model_content=open("./model.tflite", "rb").read())
|
||||||
|
u = requests.get(url)
|
||||||
|
raw_data = u.content
|
||||||
|
img = Image.open(BytesIO(raw_data))
|
||||||
|
img = numpy.asarray(img)
|
||||||
|
# normalize to [0...1]
|
||||||
|
img = (img / 255).astype(numpy.float32)
|
||||||
|
# convert to grayscale
|
||||||
|
r, g, b = img[:, :, 0], img[:, :, 1], img[:, :, 2]
|
||||||
|
gray = 0.299 * r + 0.587 * g + 0.114 * b
|
||||||
|
# input has nowof shape (70, 175)
|
||||||
|
# we modify dimensions to match model's input
|
||||||
|
gray = numpy.expand_dims(gray, 0)
|
||||||
|
gray = numpy.expand_dims(gray, -1)
|
||||||
|
# input is now of shape (batch_size, 70, 175, 1)
|
||||||
|
# output will have shape (batch_size, 4, 26)
|
||||||
|
interpreter.allocate_tensors()
|
||||||
|
input_details = interpreter.get_input_details()
|
||||||
|
output_details = interpreter.get_output_details()
|
||||||
|
interpreter.set_tensor(input_details[0]['index'], gray)
|
||||||
|
interpreter.invoke()
|
||||||
|
# predict and get the output
|
||||||
|
output = interpreter.get_tensor(output_details[0]['index'])
|
||||||
|
# now get labels
|
||||||
|
labels_indices = numpy.argmax(output, axis=2)
|
||||||
|
decoded_label = [decode(x) for x in labels_indices][0]
|
||||||
|
return decoded_label
|
||||||
|
|
||||||
|
|
||||||
|
try:
|
||||||
|
result = solve(sys.argv[1])
|
||||||
|
print(result, end = "")
|
||||||
|
except:
|
||||||
|
pass
|
31
index.html
31
index.html
|
@ -1 +1,30 @@
|
||||||
<video src="http://localhost:8000" controls>
|
<head>
|
||||||
|
<link href="https://vjs.zencdn.net/7.17.0/video-js.css" rel="stylesheet" />
|
||||||
|
|
||||||
|
<!-- If you'd like to support IE8 (for Video.js versions prior to v7) -->
|
||||||
|
<!-- <script src="https://vjs.zencdn.net/ie8/1.1.2/videojs-ie8.min.js"></script> -->
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<video
|
||||||
|
id="my-video"
|
||||||
|
class="video-js"
|
||||||
|
controls
|
||||||
|
preload="auto"
|
||||||
|
width="640"
|
||||||
|
height="264"
|
||||||
|
poster="MY_VIDEO_POSTER.jpg"
|
||||||
|
data-setup="{}"
|
||||||
|
>
|
||||||
|
<source src="/api/stream/ulozto_id" type="video/mp4" />
|
||||||
|
<p class="vjs-no-js">
|
||||||
|
To view this video please enable JavaScript, and consider upgrading to a
|
||||||
|
web browser that
|
||||||
|
<a href="https://videojs.com/html5-video-support/" target="_blank"
|
||||||
|
>supports HTML5 video</a
|
||||||
|
>
|
||||||
|
</p>
|
||||||
|
</video>
|
||||||
|
|
||||||
|
<script src="https://vjs.zencdn.net/7.17.0/video.min.js"></script>
|
||||||
|
</body>
|
31
index.ts
31
index.ts
|
@ -4,33 +4,4 @@ let webserver = new Webserver;
|
||||||
|
|
||||||
process.on('uncaughtException', err => {
|
process.on('uncaughtException', err => {
|
||||||
console.error('There was an uncaught error', err)
|
console.error('There was an uncaught error', err)
|
||||||
});
|
});
|
||||||
|
|
||||||
// (async () => {
|
|
||||||
|
|
||||||
// let downloader = new Downloader(pool);
|
|
||||||
|
|
||||||
// await downloader.init();
|
|
||||||
// console.log(downloader.total_size);
|
|
||||||
|
|
||||||
// let limit = Math.ceil(downloader.total_size/downloader.chunk_size);
|
|
||||||
// let chunk = -1;
|
|
||||||
|
|
||||||
// let interval = setInterval(() => {
|
|
||||||
// let available = pool.available(limit-chunk);
|
|
||||||
// if(available.length) {
|
|
||||||
// console.log("downloading new chunks", available.length);
|
|
||||||
// available.forEach(async (i: number) => {
|
|
||||||
// chunk++;
|
|
||||||
// if(!await downloader.download_chunk(chunk)) console.warn("Error!");
|
|
||||||
// });
|
|
||||||
// }
|
|
||||||
// console.log(downloader.downloaded_chunks + " / " + downloader.total_chunks);
|
|
||||||
// if(downloader.total_chunks == downloader.downloaded_chunks) {
|
|
||||||
// clearInterval(interval);
|
|
||||||
// console.log(downloader.chunks.length);
|
|
||||||
// fs.writeFileSync("vid.mkv", Buffer.concat(downloader.chunks));
|
|
||||||
// }
|
|
||||||
// }, 1000);
|
|
||||||
|
|
||||||
// });
|
|
84
links.ts
Normal file
84
links.ts
Normal file
|
@ -0,0 +1,84 @@
|
||||||
|
import { exec } from "child_process";
|
||||||
|
import axios from "axios";
|
||||||
|
let tor_axios = require('tor-axios');
|
||||||
|
|
||||||
|
export class Links {
|
||||||
|
|
||||||
|
tor = tor_axios.torSetup({
|
||||||
|
ip: 'localhost',
|
||||||
|
port: 9050,
|
||||||
|
controlPort: '9051',
|
||||||
|
controlPassword: 'giraffe'
|
||||||
|
})
|
||||||
|
|
||||||
|
inst = axios.create({
|
||||||
|
httpAgent: this.tor.httpAgent(),
|
||||||
|
httpsAgent: this.tor.httpsAgent(),
|
||||||
|
});
|
||||||
|
|
||||||
|
parse_cookie(cookies: string[] | undefined) {
|
||||||
|
if(!cookies) return "";
|
||||||
|
let cookie_list: string[] = [];
|
||||||
|
cookies.forEach(c => {
|
||||||
|
cookie_list.push(c.split(";")[0]);
|
||||||
|
});
|
||||||
|
return cookie_list.join("; ");
|
||||||
|
}
|
||||||
|
|
||||||
|
regex_escape(string: string) {
|
||||||
|
return string.replace(/[-[\]{}()*+!<=:?.\/\\^$|#\s,]/g, '\\$&');
|
||||||
|
}
|
||||||
|
|
||||||
|
regex_parse(regex: RegExp, text: string, group: number): string | undefined {
|
||||||
|
let match = regex.exec(text);
|
||||||
|
if(!match) return;
|
||||||
|
return match![group] ? match![group] : undefined;
|
||||||
|
}
|
||||||
|
|
||||||
|
async link(id: string) {
|
||||||
|
|
||||||
|
let download_link = "https://uloz.to/download-dialog/free/download?fileSlug="+id;
|
||||||
|
let captcha_page = await this.inst.get(download_link);
|
||||||
|
let cookies = this.parse_cookie(captcha_page.headers["set-cookie"]);
|
||||||
|
|
||||||
|
let url = this.regex_parse(/<img class="xapca-image" src="([^"]*)" alt="">/gm, captcha_page.data, 1);
|
||||||
|
if(!url) return undefined;
|
||||||
|
let captcha_image = new URL(url, "https://localhost").href;
|
||||||
|
|
||||||
|
let captcha = await this.captcha(captcha_image);
|
||||||
|
|
||||||
|
let form = new URLSearchParams();
|
||||||
|
|
||||||
|
["_token_", "timestamp", "salt", "hash", "captcha_type", "_do"].forEach(name => {
|
||||||
|
let regex = "name=\""+this.regex_escape(name)+"\" value=\"([^\"]*)\"";
|
||||||
|
let resp = this.regex_parse(new RegExp(regex), captcha_page.data, 1);
|
||||||
|
if(resp) form.append(name, resp);
|
||||||
|
});
|
||||||
|
|
||||||
|
form.append("captcha_value", captcha);
|
||||||
|
|
||||||
|
let result = await this.inst({
|
||||||
|
method: "POST",
|
||||||
|
url: download_link,
|
||||||
|
data: form,
|
||||||
|
headers: {
|
||||||
|
"Accept-Encoding": "gzip",
|
||||||
|
"X-Requested-With": "XMLHttpRequest",
|
||||||
|
"User-Agent": "Go-http-client/1.1",
|
||||||
|
"Cookie": cookies
|
||||||
|
}
|
||||||
|
});
|
||||||
|
this.tor.torNewSession();
|
||||||
|
return result.data.slowDownloadLink;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
async captcha(url: string): Promise<string> {
|
||||||
|
return new Promise((resolve) => {
|
||||||
|
exec("python3 captcha.py "+url, (e, o) => {
|
||||||
|
resolve(o);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
BIN
model.tflite
Normal file
BIN
model.tflite
Normal file
Binary file not shown.
|
@ -4,7 +4,9 @@
|
||||||
"main": "index.ts",
|
"main": "index.ts",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"axios": "^0.26.0",
|
"axios": "^0.26.0",
|
||||||
"express": "^4.17.3"
|
"express": "^4.17.3",
|
||||||
|
"tor-axios": "^1.0.9",
|
||||||
|
"tor-request": "^3.1.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/express": "^4.17.13",
|
"@types/express": "^4.17.13",
|
||||||
|
|
355
pnpm-lock.yaml
355
pnpm-lock.yaml
|
@ -5,10 +5,14 @@ specifiers:
|
||||||
'@types/node': ^17.0.20
|
'@types/node': ^17.0.20
|
||||||
axios: ^0.26.0
|
axios: ^0.26.0
|
||||||
express: ^4.17.3
|
express: ^4.17.3
|
||||||
|
tor-axios: ^1.0.9
|
||||||
|
tor-request: ^3.1.0
|
||||||
|
|
||||||
dependencies:
|
dependencies:
|
||||||
axios: 0.26.0
|
axios: 0.26.0
|
||||||
express: 4.17.3
|
express: 4.17.3
|
||||||
|
tor-axios: 1.0.9
|
||||||
|
tor-request: 3.1.0
|
||||||
|
|
||||||
devDependencies:
|
devDependencies:
|
||||||
'@types/express': 4.17.13
|
'@types/express': 4.17.13
|
||||||
|
@ -77,10 +81,57 @@ packages:
|
||||||
negotiator: 0.6.3
|
negotiator: 0.6.3
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
/agent-base/4.2.1:
|
||||||
|
resolution: {integrity: sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==}
|
||||||
|
engines: {node: '>= 4.0.0'}
|
||||||
|
dependencies:
|
||||||
|
es6-promisify: 5.0.0
|
||||||
|
dev: false
|
||||||
|
|
||||||
|
/ajv/6.12.6:
|
||||||
|
resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==}
|
||||||
|
dependencies:
|
||||||
|
fast-deep-equal: 3.1.3
|
||||||
|
fast-json-stable-stringify: 2.1.0
|
||||||
|
json-schema-traverse: 0.4.1
|
||||||
|
uri-js: 4.4.1
|
||||||
|
dev: false
|
||||||
|
|
||||||
/array-flatten/1.1.1:
|
/array-flatten/1.1.1:
|
||||||
resolution: {integrity: sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=}
|
resolution: {integrity: sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=}
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
/asn1/0.2.6:
|
||||||
|
resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==}
|
||||||
|
dependencies:
|
||||||
|
safer-buffer: 2.1.2
|
||||||
|
dev: false
|
||||||
|
|
||||||
|
/assert-plus/1.0.0:
|
||||||
|
resolution: {integrity: sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=}
|
||||||
|
engines: {node: '>=0.8'}
|
||||||
|
dev: false
|
||||||
|
|
||||||
|
/asynckit/0.4.0:
|
||||||
|
resolution: {integrity: sha1-x57Zf380y48robyXkLzDZkdLS3k=}
|
||||||
|
dev: false
|
||||||
|
|
||||||
|
/aws-sign2/0.7.0:
|
||||||
|
resolution: {integrity: sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=}
|
||||||
|
dev: false
|
||||||
|
|
||||||
|
/aws4/1.11.0:
|
||||||
|
resolution: {integrity: sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==}
|
||||||
|
dev: false
|
||||||
|
|
||||||
|
/axios/0.18.1:
|
||||||
|
resolution: {integrity: sha512-0BfJq4NSfQXd+SkFdrvFbG7addhYSBA2mQwISr46pD6E5iqkWg02RAs8vyTT/j0RTnoYmeXauBuSv1qKwR179g==}
|
||||||
|
deprecated: Critical security vulnerability fixed in v0.21.1. For more information, see https://github.com/axios/axios/pull/3410
|
||||||
|
dependencies:
|
||||||
|
follow-redirects: 1.5.10
|
||||||
|
is-buffer: 2.0.5
|
||||||
|
dev: false
|
||||||
|
|
||||||
/axios/0.26.0:
|
/axios/0.26.0:
|
||||||
resolution: {integrity: sha512-lKoGLMYtHvFrPVt3r+RBMp9nh34N0M8zEfCWqdWZx6phynIEhQqAdydpyBAAG211zlhX9Rgu08cOamy6XjE5Og==}
|
resolution: {integrity: sha512-lKoGLMYtHvFrPVt3r+RBMp9nh34N0M8zEfCWqdWZx6phynIEhQqAdydpyBAAG211zlhX9Rgu08cOamy6XjE5Og==}
|
||||||
dependencies:
|
dependencies:
|
||||||
|
@ -89,6 +140,12 @@ packages:
|
||||||
- debug
|
- debug
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
/bcrypt-pbkdf/1.0.2:
|
||||||
|
resolution: {integrity: sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=}
|
||||||
|
dependencies:
|
||||||
|
tweetnacl: 0.14.5
|
||||||
|
dev: false
|
||||||
|
|
||||||
/body-parser/1.19.2:
|
/body-parser/1.19.2:
|
||||||
resolution: {integrity: sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw==}
|
resolution: {integrity: sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw==}
|
||||||
engines: {node: '>= 0.8'}
|
engines: {node: '>= 0.8'}
|
||||||
|
@ -110,6 +167,17 @@ packages:
|
||||||
engines: {node: '>= 0.8'}
|
engines: {node: '>= 0.8'}
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
/caseless/0.12.0:
|
||||||
|
resolution: {integrity: sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=}
|
||||||
|
dev: false
|
||||||
|
|
||||||
|
/combined-stream/1.0.8:
|
||||||
|
resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==}
|
||||||
|
engines: {node: '>= 0.8'}
|
||||||
|
dependencies:
|
||||||
|
delayed-stream: 1.0.0
|
||||||
|
dev: false
|
||||||
|
|
||||||
/content-disposition/0.5.4:
|
/content-disposition/0.5.4:
|
||||||
resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==}
|
resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==}
|
||||||
engines: {node: '>= 0.6'}
|
engines: {node: '>= 0.6'}
|
||||||
|
@ -131,12 +199,34 @@ packages:
|
||||||
engines: {node: '>= 0.6'}
|
engines: {node: '>= 0.6'}
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
/core-util-is/1.0.2:
|
||||||
|
resolution: {integrity: sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=}
|
||||||
|
dev: false
|
||||||
|
|
||||||
|
/dashdash/1.14.1:
|
||||||
|
resolution: {integrity: sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=}
|
||||||
|
engines: {node: '>=0.10'}
|
||||||
|
dependencies:
|
||||||
|
assert-plus: 1.0.0
|
||||||
|
dev: false
|
||||||
|
|
||||||
/debug/2.6.9:
|
/debug/2.6.9:
|
||||||
resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==}
|
resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==}
|
||||||
dependencies:
|
dependencies:
|
||||||
ms: 2.0.0
|
ms: 2.0.0
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
/debug/3.1.0:
|
||||||
|
resolution: {integrity: sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==}
|
||||||
|
dependencies:
|
||||||
|
ms: 2.0.0
|
||||||
|
dev: false
|
||||||
|
|
||||||
|
/delayed-stream/1.0.0:
|
||||||
|
resolution: {integrity: sha1-3zrhmayt+31ECqrgsp4icrJOxhk=}
|
||||||
|
engines: {node: '>=0.4.0'}
|
||||||
|
dev: false
|
||||||
|
|
||||||
/depd/1.1.2:
|
/depd/1.1.2:
|
||||||
resolution: {integrity: sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=}
|
resolution: {integrity: sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=}
|
||||||
engines: {node: '>= 0.6'}
|
engines: {node: '>= 0.6'}
|
||||||
|
@ -146,6 +236,13 @@ packages:
|
||||||
resolution: {integrity: sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=}
|
resolution: {integrity: sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=}
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
/ecc-jsbn/0.1.2:
|
||||||
|
resolution: {integrity: sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=}
|
||||||
|
dependencies:
|
||||||
|
jsbn: 0.1.1
|
||||||
|
safer-buffer: 2.1.2
|
||||||
|
dev: false
|
||||||
|
|
||||||
/ee-first/1.1.1:
|
/ee-first/1.1.1:
|
||||||
resolution: {integrity: sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=}
|
resolution: {integrity: sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=}
|
||||||
dev: false
|
dev: false
|
||||||
|
@ -155,6 +252,16 @@ packages:
|
||||||
engines: {node: '>= 0.8'}
|
engines: {node: '>= 0.8'}
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
/es6-promise/4.2.8:
|
||||||
|
resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==}
|
||||||
|
dev: false
|
||||||
|
|
||||||
|
/es6-promisify/5.0.0:
|
||||||
|
resolution: {integrity: sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=}
|
||||||
|
dependencies:
|
||||||
|
es6-promise: 4.2.8
|
||||||
|
dev: false
|
||||||
|
|
||||||
/escape-html/1.0.3:
|
/escape-html/1.0.3:
|
||||||
resolution: {integrity: sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=}
|
resolution: {integrity: sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=}
|
||||||
dev: false
|
dev: false
|
||||||
|
@ -200,6 +307,23 @@ packages:
|
||||||
vary: 1.1.2
|
vary: 1.1.2
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
/extend/3.0.2:
|
||||||
|
resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==}
|
||||||
|
dev: false
|
||||||
|
|
||||||
|
/extsprintf/1.3.0:
|
||||||
|
resolution: {integrity: sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=}
|
||||||
|
engines: {'0': node >=0.6.0}
|
||||||
|
dev: false
|
||||||
|
|
||||||
|
/fast-deep-equal/3.1.3:
|
||||||
|
resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
|
||||||
|
dev: false
|
||||||
|
|
||||||
|
/fast-json-stable-stringify/2.1.0:
|
||||||
|
resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==}
|
||||||
|
dev: false
|
||||||
|
|
||||||
/finalhandler/1.1.2:
|
/finalhandler/1.1.2:
|
||||||
resolution: {integrity: sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==}
|
resolution: {integrity: sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==}
|
||||||
engines: {node: '>= 0.8'}
|
engines: {node: '>= 0.8'}
|
||||||
|
@ -223,6 +347,26 @@ packages:
|
||||||
optional: true
|
optional: true
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
/follow-redirects/1.5.10:
|
||||||
|
resolution: {integrity: sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==}
|
||||||
|
engines: {node: '>=4.0'}
|
||||||
|
dependencies:
|
||||||
|
debug: 3.1.0
|
||||||
|
dev: false
|
||||||
|
|
||||||
|
/forever-agent/0.6.1:
|
||||||
|
resolution: {integrity: sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=}
|
||||||
|
dev: false
|
||||||
|
|
||||||
|
/form-data/2.3.3:
|
||||||
|
resolution: {integrity: sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==}
|
||||||
|
engines: {node: '>= 0.12'}
|
||||||
|
dependencies:
|
||||||
|
asynckit: 0.4.0
|
||||||
|
combined-stream: 1.0.8
|
||||||
|
mime-types: 2.1.34
|
||||||
|
dev: false
|
||||||
|
|
||||||
/forwarded/0.2.0:
|
/forwarded/0.2.0:
|
||||||
resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==}
|
resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==}
|
||||||
engines: {node: '>= 0.6'}
|
engines: {node: '>= 0.6'}
|
||||||
|
@ -233,6 +377,26 @@ packages:
|
||||||
engines: {node: '>= 0.6'}
|
engines: {node: '>= 0.6'}
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
/getpass/0.1.7:
|
||||||
|
resolution: {integrity: sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=}
|
||||||
|
dependencies:
|
||||||
|
assert-plus: 1.0.0
|
||||||
|
dev: false
|
||||||
|
|
||||||
|
/har-schema/2.0.0:
|
||||||
|
resolution: {integrity: sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=}
|
||||||
|
engines: {node: '>=4'}
|
||||||
|
dev: false
|
||||||
|
|
||||||
|
/har-validator/5.1.5:
|
||||||
|
resolution: {integrity: sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==}
|
||||||
|
engines: {node: '>=6'}
|
||||||
|
deprecated: this library is no longer supported
|
||||||
|
dependencies:
|
||||||
|
ajv: 6.12.6
|
||||||
|
har-schema: 2.0.0
|
||||||
|
dev: false
|
||||||
|
|
||||||
/http-errors/1.8.1:
|
/http-errors/1.8.1:
|
||||||
resolution: {integrity: sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==}
|
resolution: {integrity: sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==}
|
||||||
engines: {node: '>= 0.6'}
|
engines: {node: '>= 0.6'}
|
||||||
|
@ -244,6 +408,15 @@ packages:
|
||||||
toidentifier: 1.0.1
|
toidentifier: 1.0.1
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
/http-signature/1.2.0:
|
||||||
|
resolution: {integrity: sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=}
|
||||||
|
engines: {node: '>=0.8', npm: '>=1.3.7'}
|
||||||
|
dependencies:
|
||||||
|
assert-plus: 1.0.0
|
||||||
|
jsprim: 1.4.2
|
||||||
|
sshpk: 1.17.0
|
||||||
|
dev: false
|
||||||
|
|
||||||
/iconv-lite/0.4.24:
|
/iconv-lite/0.4.24:
|
||||||
resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==}
|
resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==}
|
||||||
engines: {node: '>=0.10.0'}
|
engines: {node: '>=0.10.0'}
|
||||||
|
@ -255,11 +428,54 @@ packages:
|
||||||
resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
|
resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
/ip/1.1.5:
|
||||||
|
resolution: {integrity: sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=}
|
||||||
|
dev: false
|
||||||
|
|
||||||
/ipaddr.js/1.9.1:
|
/ipaddr.js/1.9.1:
|
||||||
resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==}
|
resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==}
|
||||||
engines: {node: '>= 0.10'}
|
engines: {node: '>= 0.10'}
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
/is-buffer/2.0.5:
|
||||||
|
resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==}
|
||||||
|
engines: {node: '>=4'}
|
||||||
|
dev: false
|
||||||
|
|
||||||
|
/is-typedarray/1.0.0:
|
||||||
|
resolution: {integrity: sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=}
|
||||||
|
dev: false
|
||||||
|
|
||||||
|
/isstream/0.1.2:
|
||||||
|
resolution: {integrity: sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=}
|
||||||
|
dev: false
|
||||||
|
|
||||||
|
/jsbn/0.1.1:
|
||||||
|
resolution: {integrity: sha1-peZUwuWi3rXyAdls77yoDA7y9RM=}
|
||||||
|
dev: false
|
||||||
|
|
||||||
|
/json-schema-traverse/0.4.1:
|
||||||
|
resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==}
|
||||||
|
dev: false
|
||||||
|
|
||||||
|
/json-schema/0.4.0:
|
||||||
|
resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==}
|
||||||
|
dev: false
|
||||||
|
|
||||||
|
/json-stringify-safe/5.0.1:
|
||||||
|
resolution: {integrity: sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=}
|
||||||
|
dev: false
|
||||||
|
|
||||||
|
/jsprim/1.4.2:
|
||||||
|
resolution: {integrity: sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==}
|
||||||
|
engines: {node: '>=0.6.0'}
|
||||||
|
dependencies:
|
||||||
|
assert-plus: 1.0.0
|
||||||
|
extsprintf: 1.3.0
|
||||||
|
json-schema: 0.4.0
|
||||||
|
verror: 1.10.0
|
||||||
|
dev: false
|
||||||
|
|
||||||
/media-typer/0.3.0:
|
/media-typer/0.3.0:
|
||||||
resolution: {integrity: sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=}
|
resolution: {integrity: sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=}
|
||||||
engines: {node: '>= 0.6'}
|
engines: {node: '>= 0.6'}
|
||||||
|
@ -305,6 +521,10 @@ packages:
|
||||||
engines: {node: '>= 0.6'}
|
engines: {node: '>= 0.6'}
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
/oauth-sign/0.9.0:
|
||||||
|
resolution: {integrity: sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==}
|
||||||
|
dev: false
|
||||||
|
|
||||||
/on-finished/2.3.0:
|
/on-finished/2.3.0:
|
||||||
resolution: {integrity: sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=}
|
resolution: {integrity: sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=}
|
||||||
engines: {node: '>= 0.8'}
|
engines: {node: '>= 0.8'}
|
||||||
|
@ -321,6 +541,10 @@ packages:
|
||||||
resolution: {integrity: sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=}
|
resolution: {integrity: sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=}
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
/performance-now/2.1.0:
|
||||||
|
resolution: {integrity: sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=}
|
||||||
|
dev: false
|
||||||
|
|
||||||
/proxy-addr/2.0.7:
|
/proxy-addr/2.0.7:
|
||||||
resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==}
|
resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==}
|
||||||
engines: {node: '>= 0.10'}
|
engines: {node: '>= 0.10'}
|
||||||
|
@ -329,6 +553,20 @@ packages:
|
||||||
ipaddr.js: 1.9.1
|
ipaddr.js: 1.9.1
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
/psl/1.8.0:
|
||||||
|
resolution: {integrity: sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==}
|
||||||
|
dev: false
|
||||||
|
|
||||||
|
/punycode/2.1.1:
|
||||||
|
resolution: {integrity: sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==}
|
||||||
|
engines: {node: '>=6'}
|
||||||
|
dev: false
|
||||||
|
|
||||||
|
/qs/6.5.3:
|
||||||
|
resolution: {integrity: sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==}
|
||||||
|
engines: {node: '>=0.6'}
|
||||||
|
dev: false
|
||||||
|
|
||||||
/qs/6.9.7:
|
/qs/6.9.7:
|
||||||
resolution: {integrity: sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==}
|
resolution: {integrity: sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==}
|
||||||
engines: {node: '>=0.6'}
|
engines: {node: '>=0.6'}
|
||||||
|
@ -349,6 +587,33 @@ packages:
|
||||||
unpipe: 1.0.0
|
unpipe: 1.0.0
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
/request/2.88.2:
|
||||||
|
resolution: {integrity: sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==}
|
||||||
|
engines: {node: '>= 6'}
|
||||||
|
deprecated: request has been deprecated, see https://github.com/request/request/issues/3142
|
||||||
|
dependencies:
|
||||||
|
aws-sign2: 0.7.0
|
||||||
|
aws4: 1.11.0
|
||||||
|
caseless: 0.12.0
|
||||||
|
combined-stream: 1.0.8
|
||||||
|
extend: 3.0.2
|
||||||
|
forever-agent: 0.6.1
|
||||||
|
form-data: 2.3.3
|
||||||
|
har-validator: 5.1.5
|
||||||
|
http-signature: 1.2.0
|
||||||
|
is-typedarray: 1.0.0
|
||||||
|
isstream: 0.1.2
|
||||||
|
json-stringify-safe: 5.0.1
|
||||||
|
mime-types: 2.1.34
|
||||||
|
oauth-sign: 0.9.0
|
||||||
|
performance-now: 2.1.0
|
||||||
|
qs: 6.5.3
|
||||||
|
safe-buffer: 5.2.1
|
||||||
|
tough-cookie: 2.5.0
|
||||||
|
tunnel-agent: 0.6.0
|
||||||
|
uuid: 3.4.0
|
||||||
|
dev: false
|
||||||
|
|
||||||
/safe-buffer/5.2.1:
|
/safe-buffer/5.2.1:
|
||||||
resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
|
resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
|
||||||
dev: false
|
dev: false
|
||||||
|
@ -390,6 +655,43 @@ packages:
|
||||||
resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==}
|
resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==}
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
/smart-buffer/4.2.0:
|
||||||
|
resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==}
|
||||||
|
engines: {node: '>= 6.0.0', npm: '>= 3.0.0'}
|
||||||
|
dev: false
|
||||||
|
|
||||||
|
/socks-proxy-agent/4.0.2:
|
||||||
|
resolution: {integrity: sha512-NT6syHhI9LmuEMSK6Kd2V7gNv5KFZoLE7V5udWmn0de+3Mkj3UMA/AJPLyeNUVmElCurSHtUdM3ETpR3z770Wg==}
|
||||||
|
engines: {node: '>= 6'}
|
||||||
|
dependencies:
|
||||||
|
agent-base: 4.2.1
|
||||||
|
socks: 2.3.3
|
||||||
|
dev: false
|
||||||
|
|
||||||
|
/socks/2.3.3:
|
||||||
|
resolution: {integrity: sha512-o5t52PCNtVdiOvzMry7wU4aOqYWL0PeCXRWBEiJow4/i/wr+wpsJQ9awEu1EonLIqsfGd5qSgDdxEOvCdmBEpA==}
|
||||||
|
engines: {node: '>= 6.0.0', npm: '>= 3.0.0'}
|
||||||
|
dependencies:
|
||||||
|
ip: 1.1.5
|
||||||
|
smart-buffer: 4.2.0
|
||||||
|
dev: false
|
||||||
|
|
||||||
|
/sshpk/1.17.0:
|
||||||
|
resolution: {integrity: sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==}
|
||||||
|
engines: {node: '>=0.10.0'}
|
||||||
|
hasBin: true
|
||||||
|
dependencies:
|
||||||
|
asn1: 0.2.6
|
||||||
|
assert-plus: 1.0.0
|
||||||
|
bcrypt-pbkdf: 1.0.2
|
||||||
|
dashdash: 1.14.1
|
||||||
|
ecc-jsbn: 0.1.2
|
||||||
|
getpass: 0.1.7
|
||||||
|
jsbn: 0.1.1
|
||||||
|
safer-buffer: 2.1.2
|
||||||
|
tweetnacl: 0.14.5
|
||||||
|
dev: false
|
||||||
|
|
||||||
/statuses/1.5.0:
|
/statuses/1.5.0:
|
||||||
resolution: {integrity: sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=}
|
resolution: {integrity: sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=}
|
||||||
engines: {node: '>= 0.6'}
|
engines: {node: '>= 0.6'}
|
||||||
|
@ -400,6 +702,38 @@ packages:
|
||||||
engines: {node: '>=0.6'}
|
engines: {node: '>=0.6'}
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
/tor-axios/1.0.9:
|
||||||
|
resolution: {integrity: sha512-JFBkpV7essVA7sB2Xwm5MhfJ5CwA4dLZSyOaQTl14hl9K+Q0wHWEOqtFoME2qPRmYIbIHJIIxZTPVQjB3aV8gw==}
|
||||||
|
dependencies:
|
||||||
|
axios: 0.18.1
|
||||||
|
socks-proxy-agent: 4.0.2
|
||||||
|
dev: false
|
||||||
|
|
||||||
|
/tor-request/3.1.0:
|
||||||
|
resolution: {integrity: sha512-153kvMc+f3U0TOncrxpQlbYRnRdfVHVOtlkVwSsgsUzU4RiuvIW8UyyIOMSMfVlu1u887d/FgHZF9K2YmOK3Mw==}
|
||||||
|
dependencies:
|
||||||
|
request: 2.88.2
|
||||||
|
socks-proxy-agent: 4.0.2
|
||||||
|
dev: false
|
||||||
|
|
||||||
|
/tough-cookie/2.5.0:
|
||||||
|
resolution: {integrity: sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==}
|
||||||
|
engines: {node: '>=0.8'}
|
||||||
|
dependencies:
|
||||||
|
psl: 1.8.0
|
||||||
|
punycode: 2.1.1
|
||||||
|
dev: false
|
||||||
|
|
||||||
|
/tunnel-agent/0.6.0:
|
||||||
|
resolution: {integrity: sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=}
|
||||||
|
dependencies:
|
||||||
|
safe-buffer: 5.2.1
|
||||||
|
dev: false
|
||||||
|
|
||||||
|
/tweetnacl/0.14.5:
|
||||||
|
resolution: {integrity: sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=}
|
||||||
|
dev: false
|
||||||
|
|
||||||
/type-is/1.6.18:
|
/type-is/1.6.18:
|
||||||
resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==}
|
resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==}
|
||||||
engines: {node: '>= 0.6'}
|
engines: {node: '>= 0.6'}
|
||||||
|
@ -413,12 +747,33 @@ packages:
|
||||||
engines: {node: '>= 0.8'}
|
engines: {node: '>= 0.8'}
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
/uri-js/4.4.1:
|
||||||
|
resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
|
||||||
|
dependencies:
|
||||||
|
punycode: 2.1.1
|
||||||
|
dev: false
|
||||||
|
|
||||||
/utils-merge/1.0.1:
|
/utils-merge/1.0.1:
|
||||||
resolution: {integrity: sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=}
|
resolution: {integrity: sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=}
|
||||||
engines: {node: '>= 0.4.0'}
|
engines: {node: '>= 0.4.0'}
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
/uuid/3.4.0:
|
||||||
|
resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==}
|
||||||
|
deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.
|
||||||
|
hasBin: true
|
||||||
|
dev: false
|
||||||
|
|
||||||
/vary/1.1.2:
|
/vary/1.1.2:
|
||||||
resolution: {integrity: sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=}
|
resolution: {integrity: sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=}
|
||||||
engines: {node: '>= 0.8'}
|
engines: {node: '>= 0.8'}
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
/verror/1.10.0:
|
||||||
|
resolution: {integrity: sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=}
|
||||||
|
engines: {'0': node >=0.6.0}
|
||||||
|
dependencies:
|
||||||
|
assert-plus: 1.0.0
|
||||||
|
core-util-is: 1.0.2
|
||||||
|
extsprintf: 1.3.0
|
||||||
|
dev: false
|
||||||
|
|
100
tsconfig.json
Normal file
100
tsconfig.json
Normal file
|
@ -0,0 +1,100 @@
|
||||||
|
{
|
||||||
|
"compilerOptions": {
|
||||||
|
/* Visit https://aka.ms/tsconfig.json to read more about this file */
|
||||||
|
|
||||||
|
/* Projects */
|
||||||
|
// "incremental": true, /* Enable incremental compilation */
|
||||||
|
// "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */
|
||||||
|
// "tsBuildInfoFile": "./", /* Specify the folder for .tsbuildinfo incremental compilation files. */
|
||||||
|
// "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects */
|
||||||
|
// "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */
|
||||||
|
// "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */
|
||||||
|
|
||||||
|
/* Language and Environment */
|
||||||
|
"target": "es5", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */
|
||||||
|
// "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */
|
||||||
|
// "jsx": "preserve", /* Specify what JSX code is generated. */
|
||||||
|
// "experimentalDecorators": true, /* Enable experimental support for TC39 stage 2 draft decorators. */
|
||||||
|
// "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */
|
||||||
|
// "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h' */
|
||||||
|
// "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */
|
||||||
|
// "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using `jsx: react-jsx*`.` */
|
||||||
|
// "reactNamespace": "", /* Specify the object invoked for `createElement`. This only applies when targeting `react` JSX emit. */
|
||||||
|
// "noLib": true, /* Disable including any library files, including the default lib.d.ts. */
|
||||||
|
// "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */
|
||||||
|
|
||||||
|
/* Modules */
|
||||||
|
"module": "commonjs", /* Specify what module code is generated. */
|
||||||
|
// "rootDir": "./", /* Specify the root folder within your source files. */
|
||||||
|
// "moduleResolution": "node", /* Specify how TypeScript looks up a file from a given module specifier. */
|
||||||
|
// "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */
|
||||||
|
// "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */
|
||||||
|
// "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */
|
||||||
|
// "typeRoots": [], /* Specify multiple folders that act like `./node_modules/@types`. */
|
||||||
|
// "types": [], /* Specify type package names to be included without being referenced in a source file. */
|
||||||
|
// "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */
|
||||||
|
// "resolveJsonModule": true, /* Enable importing .json files */
|
||||||
|
// "noResolve": true, /* Disallow `import`s, `require`s or `<reference>`s from expanding the number of files TypeScript should add to a project. */
|
||||||
|
|
||||||
|
/* JavaScript Support */
|
||||||
|
// "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the `checkJS` option to get errors from these files. */
|
||||||
|
// "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */
|
||||||
|
// "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from `node_modules`. Only applicable with `allowJs`. */
|
||||||
|
|
||||||
|
/* Emit */
|
||||||
|
// "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */
|
||||||
|
// "declarationMap": true, /* Create sourcemaps for d.ts files. */
|
||||||
|
// "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */
|
||||||
|
// "sourceMap": true, /* Create source map files for emitted JavaScript files. */
|
||||||
|
// "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If `declaration` is true, also designates a file that bundles all .d.ts output. */
|
||||||
|
// "outDir": "./", /* Specify an output folder for all emitted files. */
|
||||||
|
// "removeComments": true, /* Disable emitting comments. */
|
||||||
|
// "noEmit": true, /* Disable emitting files from a compilation. */
|
||||||
|
// "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */
|
||||||
|
// "importsNotUsedAsValues": "remove", /* Specify emit/checking behavior for imports that are only used for types */
|
||||||
|
// "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */
|
||||||
|
// "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */
|
||||||
|
// "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */
|
||||||
|
// "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */
|
||||||
|
// "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */
|
||||||
|
// "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */
|
||||||
|
// "newLine": "crlf", /* Set the newline character for emitting files. */
|
||||||
|
// "stripInternal": true, /* Disable emitting declarations that have `@internal` in their JSDoc comments. */
|
||||||
|
// "noEmitHelpers": true, /* Disable generating custom helper functions like `__extends` in compiled output. */
|
||||||
|
// "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */
|
||||||
|
// "preserveConstEnums": true, /* Disable erasing `const enum` declarations in generated code. */
|
||||||
|
// "declarationDir": "./", /* Specify the output directory for generated declaration files. */
|
||||||
|
|
||||||
|
/* Interop Constraints */
|
||||||
|
// "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */
|
||||||
|
// "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */
|
||||||
|
"esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables `allowSyntheticDefaultImports` for type compatibility. */
|
||||||
|
// "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */
|
||||||
|
"forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */
|
||||||
|
|
||||||
|
/* Type Checking */
|
||||||
|
"strict": true, /* Enable all strict type-checking options. */
|
||||||
|
// "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied `any` type.. */
|
||||||
|
// "strictNullChecks": true, /* When type checking, take into account `null` and `undefined`. */
|
||||||
|
// "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */
|
||||||
|
// "strictBindCallApply": true, /* Check that the arguments for `bind`, `call`, and `apply` methods match the original function. */
|
||||||
|
// "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */
|
||||||
|
// "noImplicitThis": true, /* Enable error reporting when `this` is given the type `any`. */
|
||||||
|
// "useUnknownInCatchVariables": true, /* Type catch clause variables as 'unknown' instead of 'any'. */
|
||||||
|
// "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */
|
||||||
|
// "noUnusedLocals": true, /* Enable error reporting when a local variables aren't read. */
|
||||||
|
// "noUnusedParameters": true, /* Raise an error when a function parameter isn't read */
|
||||||
|
// "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */
|
||||||
|
// "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */
|
||||||
|
// "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */
|
||||||
|
// "noUncheckedIndexedAccess": true, /* Include 'undefined' in index signature results */
|
||||||
|
// "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */
|
||||||
|
// "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type */
|
||||||
|
// "allowUnusedLabels": true, /* Disable error reporting for unused labels. */
|
||||||
|
// "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */
|
||||||
|
|
||||||
|
/* Completeness */
|
||||||
|
// "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */
|
||||||
|
"skipLibCheck": true /* Skip type checking all .d.ts files. */
|
||||||
|
}
|
||||||
|
}
|
60
urlpool.ts
60
urlpool.ts
|
@ -1,11 +1,22 @@
|
||||||
|
import { Downloader } from "./downloader";
|
||||||
|
import { Links } from "./links";
|
||||||
|
|
||||||
|
let links = new Links;
|
||||||
|
|
||||||
|
function sleep(ms: number) {
|
||||||
|
return new Promise(resolve => setTimeout(resolve, ms));
|
||||||
|
}
|
||||||
|
|
||||||
export class UrlPool {
|
export class UrlPool {
|
||||||
|
|
||||||
urls: string[];
|
urls: string[];
|
||||||
used: boolean[] = [];
|
used: boolean[] = [];
|
||||||
|
generating = false;
|
||||||
|
downloader?: Downloader;
|
||||||
|
|
||||||
constructor(urls: string[]) {
|
constructor(urls?: string[]) {
|
||||||
this.urls = urls;
|
this.urls = urls ? urls : [];
|
||||||
for(let i=0; i<urls.length; i++) {
|
for(let i=0; i<this.urls.length; i++) {
|
||||||
this.used[i] = false;
|
this.used[i] = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -28,7 +39,7 @@ export class UrlPool {
|
||||||
clearInterval(check);
|
clearInterval(check);
|
||||||
complete(url);
|
complete(url);
|
||||||
}
|
}
|
||||||
}, 500);
|
}, 100);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -36,6 +47,11 @@ export class UrlPool {
|
||||||
this.used[i] = false;
|
this.used[i] = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
add(url: string) {
|
||||||
|
this.urls.push(url);
|
||||||
|
this.used.push(false);
|
||||||
|
}
|
||||||
|
|
||||||
available(count?: number) {
|
available(count?: number) {
|
||||||
let available: number[] = [];
|
let available: number[] = [];
|
||||||
for(let i=0; i<this.used.length; i++) {
|
for(let i=0; i<this.used.length; i++) {
|
||||||
|
@ -46,4 +62,40 @@ export class UrlPool {
|
||||||
return count ? available.slice(0, count) : available;
|
return count ? available.slice(0, count) : available;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async generate(id: string) {
|
||||||
|
this.generating = true;
|
||||||
|
while(this.urls.length < 10) {
|
||||||
|
|
||||||
|
let link = await links.link(id);
|
||||||
|
if(link) this.add(link);
|
||||||
|
console.log(link);
|
||||||
|
await sleep(2000);
|
||||||
|
|
||||||
|
}
|
||||||
|
this.generating = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
get_downloader() {
|
||||||
|
if(this.downloader) return this.downloader;
|
||||||
|
this.downloader = new Downloader(this)
|
||||||
|
return this.downloader;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
export class UrlPoolStorage {
|
||||||
|
|
||||||
|
pools: {[U: string]: UrlPool} = {};
|
||||||
|
|
||||||
|
get(id: string) {
|
||||||
|
return this.pools[id] ? this.pools[id] : this.new(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
new(id: string) {
|
||||||
|
let pool = new UrlPool;
|
||||||
|
pool.generate(id);
|
||||||
|
this.pools[id] = pool;
|
||||||
|
return pool;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
43
webserver.ts
43
webserver.ts
|
@ -1,22 +1,10 @@
|
||||||
import express from "express";
|
import express from "express";
|
||||||
import { Downloader } from "./downloader";
|
import { Downloader } from "./downloader";
|
||||||
import { UrlPool } from "./urlpool";
|
import { UrlPoolStorage } from "./urlpool";
|
||||||
import { Readable } from 'stream';
|
import { Readable } from 'stream';
|
||||||
|
|
||||||
let pool = new UrlPool(`https://download.uloz.to/Ps;Hs;up=0;cid=1412447369;uip=89.163.243.88;aff=uloz.to;did=uloz-to;fide=az2Gxzu;fs=pLlZx78VhpLo;hid=JPWTfrY;rid=53936164;tm=1645827197;ut=f;rs=0;He;ch=3676c0f11954b17f3b47a432f1ae1ee8;Pe/file/pLlZx78VhpLo/matrix-1999-cz-mp4?bD&c=1412447369&De
|
|
||||||
https://download.uloz.to/Ps;Hs;up=0;cid=1129985479;uip=185.220.102.249;aff=uloz.to;did=uloz-to;fide=az2Gxzu;fs=pLlZx78VhpLo;hid=JPWTfrY;rid=561098867;tm=1645827209;ut=f;rs=0;He;ch=519cfbfcb4efe4af4a94b34ec9644609;Pe/file/pLlZx78VhpLo/matrix-1999-cz-mp4?bD&c=1129985479&De
|
|
||||||
https://download.uloz.to/Ps;Hs;up=0;cid=114914590;uip=185.220.101.86;aff=uloz.to;did=uloz-to;fide=az2Gxzu;fs=pLlZx78VhpLo;hid=JPWTfrY;rid=1829476423;tm=1645827209;ut=f;rs=0;He;ch=4cf0db28c8c81955bdc81ccd3b7f92f6;Pe/file/pLlZx78VhpLo/matrix-1999-cz-mp4?bD&c=114914590&De
|
|
||||||
https://download.uloz.to/Ps;Hs;up=0;cid=1617820972;uip=107.189.4.253;aff=uloz.to;did=uloz-to;fide=az2Gxzu;fs=pLlZx78VhpLo;hid=JPWTfrY;rid=141776455;tm=1645827211;ut=f;rs=0;He;ch=7c1fb7f1a836590c274039c66dfcda99;Pe/file/pLlZx78VhpLo/matrix-1999-cz-mp4?bD&c=1617820972&De
|
|
||||||
https://download.uloz.to/Ps;Hs;up=0;cid=1469359686;uip=5.2.72.226;aff=uloz.to;did=uloz-to;fide=az2Gxzu;fs=pLlZx78VhpLo;hid=JPWTfrY;rid=1774386903;tm=1645827212;ut=f;rs=0;He;ch=6b1485bc3e20cc06d0a712ebe4036905;Pe/file/pLlZx78VhpLo/matrix-1999-cz-mp4?bD&c=1469359686&De
|
|
||||||
https://download.uloz.to/Ps;Hs;up=0;cid=1910168684;uip=107.189.10.63;aff=uloz.to;did=uloz-to;fide=az2Gxzu;fs=pLlZx78VhpLo;hid=JPWTfrY;rid=1577890352;tm=1645827223;ut=f;rs=0;He;ch=3be975ccb9361af36b61255001a5427b;Pe/file/pLlZx78VhpLo/matrix-1999-cz-mp4?bD&c=1910168684&De
|
|
||||||
https://download.uloz.to/Ps;Hs;up=0;cid=381158312;uip=89.248.168.41;aff=uloz.to;did=uloz-to;fide=az2Gxzu;fs=pLlZx78VhpLo;hid=JPWTfrY;rid=666945992;tm=1645827223;ut=f;rs=0;He;ch=ef7f799ef9521ff132ef82f8c21cd831;Pe/file/pLlZx78VhpLo/matrix-1999-cz-mp4?bD&c=381158312&De
|
|
||||||
https://download.uloz.to/Ps;Hs;up=0;cid=335896018;uip=185.195.71.2;aff=uloz.to;did=uloz-to;fide=az2Gxzu;fs=pLlZx78VhpLo;hid=JPWTfrY;rid=1195420583;tm=1645827224;ut=f;rs=0;He;ch=b77f94898e04485661c3120f1f23e95d;Pe/file/pLlZx78VhpLo/matrix-1999-cz-mp4?bD&c=335896018&De
|
|
||||||
https://download.uloz.to/Ps;Hs;up=0;cid=1364037004;uip=185.195.71.244;aff=uloz.to;did=uloz-to;fide=az2Gxzu;fs=pLlZx78VhpLo;hid=JPWTfrY;rid=1209800903;tm=1645827245;ut=f;rs=0;He;ch=d3a38438c7c8786cb869458f391d6ca3;Pe/file/pLlZx78VhpLo/matrix-1999-cz-mp4?bD&c=1364037004&De
|
|
||||||
https://download.uloz.to/Ps;Hs;up=0;cid=947300788;uip=185.220.100.243;aff=uloz.to;did=uloz-to;fide=az2Gxzu;fs=pLlZx78VhpLo;hid=JPWTfrY;rid=1975067348;tm=1645827245;ut=f;rs=0;He;ch=39019f9e27d7a216eb2d2cecffda619c;Pe/file/pLlZx78VhpLo/matrix-1999-cz-mp4?bD&c=947300788&De
|
|
||||||
https://download.uloz.to/Ps;Hs;up=0;cid=1608448688;uip=185.220.101.42;aff=uloz.to;did=uloz-to;fide=az2Gxzu;fs=pLlZx78VhpLo;hid=JPWTfrY;rid=1643356760;tm=1645827246;ut=f;rs=0;He;ch=1347a9cf2cabad923867347b897924a3;Pe/file/pLlZx78VhpLo/matrix-1999-cz-mp4?bD&c=1608448688&De
|
|
||||||
https://download.uloz.to/Ps;Hs;up=0;cid=709281061;uip=185.220.101.20;aff=uloz.to;did=uloz-to;fide=az2Gxzu;fs=pLlZx78VhpLo;hid=JPWTfrY;rid=2092835317;tm=1645827247;ut=f;rs=0;He;ch=254d43fbd221b68723edcb0c6f0d9181;Pe/file/pLlZx78VhpLo/matrix-1999-cz-mp4?bD&c=709281061&De`.split("\n"));
|
|
||||||
|
|
||||||
let d = new Downloader(pool);
|
let storage = new UrlPoolStorage;
|
||||||
|
|
||||||
export class Webserver {
|
export class Webserver {
|
||||||
|
|
||||||
|
@ -27,7 +15,25 @@ export class Webserver {
|
||||||
|
|
||||||
const app = express();
|
const app = express();
|
||||||
|
|
||||||
app.get("/", async (req, res) => {
|
app.get("/status/:id", async (req, res) => {
|
||||||
|
|
||||||
|
let p = storage.get(req.params.id);
|
||||||
|
|
||||||
|
res.write(JSON.stringify({
|
||||||
|
streams: {
|
||||||
|
total: p.urls.length,
|
||||||
|
available: p.available().length,
|
||||||
|
generating: p.generating
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
res.end();
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
app.get("/stream/:id", async (req, res) => {
|
||||||
|
|
||||||
|
let p = storage.get(req.params.id);
|
||||||
|
let d = p.get_downloader();
|
||||||
|
|
||||||
let range: Range = {from: 0, to: null};
|
let range: Range = {from: 0, to: null};
|
||||||
if(req.headers.range) range = this.parse_range(req.headers.range);
|
if(req.headers.range) range = this.parse_range(req.headers.range);
|
||||||
|
@ -48,7 +54,6 @@ export class Webserver {
|
||||||
|
|
||||||
res.writeHead(206, headers);
|
res.writeHead(206, headers);
|
||||||
|
|
||||||
|
|
||||||
const readable = new Readable()
|
const readable = new Readable()
|
||||||
readable._read = async () => {
|
readable._read = async () => {
|
||||||
[from, to] = this.from_to([to+1, to+1+this.chunk_size], d.total_size);
|
[from, to] = this.from_to([to+1, to+1+this.chunk_size], d.total_size);
|
||||||
|
@ -57,11 +62,11 @@ export class Webserver {
|
||||||
//res.end();
|
//res.end();
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
let stream = await this.download_chunk(from, to);
|
let stream = await this.download_chunk(d, from, to);
|
||||||
readable.push(stream);
|
readable.push(stream);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
let stream = await this.download_chunk(from, to);
|
let stream = await this.download_chunk(d, from, to);
|
||||||
readable.push(stream);
|
readable.push(stream);
|
||||||
readable.pipe(res);
|
readable.pipe(res);
|
||||||
|
|
||||||
|
@ -73,7 +78,7 @@ export class Webserver {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
async download_chunk(from: number, to: number) {
|
async download_chunk(d: Downloader, from: number, to: number) {
|
||||||
console.log("downloading...", from, to);
|
console.log("downloading...", from, to);
|
||||||
let stream = await d.download_range(from, to);
|
let stream = await d.download_range(from, to);
|
||||||
console.log("downloaded ", from, to);
|
console.log("downloaded ", from, to);
|
||||||
|
|
Reference in a new issue