From a04efa504211cdfd1daf7702ff54e421c90e2847 Mon Sep 17 00:00:00 2001 From: Filip Znachor Date: Sun, 13 Nov 2022 11:37:30 +0100 Subject: [PATCH] Added GUI & fixed bugs --- downloader.ts | 5 +++-- index.html | 30 ------------------------------ pnpm-lock.yaml | 28 +++++++++++++++++++++++++++- public/favicon.ico | Bin 0 -> 15086 bytes public/index.html | 38 ++++++++++++++++++++++++++++++++++++++ urlpool.ts | 30 ++++++++++++++++++++++++++++-- webserver.ts | 4 +++- 7 files changed, 99 insertions(+), 36 deletions(-) delete mode 100644 index.html create mode 100644 public/favicon.ico create mode 100644 public/index.html diff --git a/downloader.ts b/downloader.ts index 642f676..811bfd3 100644 --- a/downloader.ts +++ b/downloader.ts @@ -6,7 +6,8 @@ export class Downloader { pool: UrlPool; chunks: {[U: string]: (Buffer | null)} = {}; - chunk_size = Math.round(0.3*1024*1024); + chunk_size = Math.round(1*1024*1024); + cache_size = 15; loading: boolean = false; destroyed: boolean = false; @@ -44,7 +45,7 @@ export class Downloader { cache() { let chunks: string[] = []; let existing_chunks = Object.keys(this.chunks); - for(let i=0; i<15; i++) { + for(let i=0; i { diff --git a/index.html b/index.html deleted file mode 100644 index 662692d..0000000 --- a/index.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e8328f5..d048769 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,4 +1,4 @@ -lockfileVersion: 5.3 +lockfileVersion: 5.4 specifiers: '@types/express': ^4.17.13 @@ -130,6 +130,8 @@ packages: dependencies: follow-redirects: 1.5.10 is-buffer: 2.0.5 + transitivePeerDependencies: + - supports-color dev: false /axios/0.26.0: @@ -160,6 +162,8 @@ packages: qs: 6.9.7 raw-body: 2.4.3 type-is: 1.6.18 + transitivePeerDependencies: + - supports-color dev: false /bytes/3.1.2: @@ -212,12 +216,22 @@ packages: /debug/2.6.9: resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true dependencies: ms: 2.0.0 dev: false /debug/3.1.0: resolution: {integrity: sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true dependencies: ms: 2.0.0 dev: false @@ -305,6 +319,8 @@ packages: type-is: 1.6.18 utils-merge: 1.0.1 vary: 1.1.2 + transitivePeerDependencies: + - supports-color dev: false /extend/3.0.2: @@ -335,6 +351,8 @@ packages: parseurl: 1.3.3 statuses: 1.5.0 unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color dev: false /follow-redirects/1.14.9: @@ -352,6 +370,8 @@ packages: engines: {node: '>=4.0'} dependencies: debug: 3.1.0 + transitivePeerDependencies: + - supports-color dev: false /forever-agent/0.6.1: @@ -639,6 +659,8 @@ packages: on-finished: 2.3.0 range-parser: 1.2.1 statuses: 1.5.0 + transitivePeerDependencies: + - supports-color dev: false /serve-static/1.14.2: @@ -649,6 +671,8 @@ packages: escape-html: 1.0.3 parseurl: 1.3.3 send: 0.17.2 + transitivePeerDependencies: + - supports-color dev: false /setprototypeof/1.2.0: @@ -707,6 +731,8 @@ packages: dependencies: axios: 0.18.1 socks-proxy-agent: 4.0.2 + transitivePeerDependencies: + - supports-color dev: false /tor-request/3.1.0: diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..5a6e1b62a0be066d27a5bb16d4904751a1272501 GIT binary patch literal 15086 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 literal 0 HcmV?d00001 diff --git a/public/index.html b/public/index.html new file mode 100644 index 0000000..09822fd --- /dev/null +++ b/public/index.html @@ -0,0 +1,38 @@ + + + + Ulož.to Rychle + + + +
+

Ulož.to Rychle

+

Stahujte z Ulož.to vysokou rychlostí

+
+ +
+
+
+ + + \ No newline at end of file diff --git a/urlpool.ts b/urlpool.ts index 464a92a..5cf170f 100644 --- a/urlpool.ts +++ b/urlpool.ts @@ -12,10 +12,13 @@ function sleep(ms: number) { export class UrlPool { id: string; + storage: UrlPoolStorage; urls: string[] = []; used: boolean[] = []; + valid_to: Date; + generating = false; downloaders: Downloader[] = []; @@ -23,8 +26,11 @@ export class UrlPool { is_direct = false; ready = false; - constructor(id: string) { + constructor(storage: UrlPoolStorage, id: string) { + this.valid_to = new Date(); + this.valid_to.setDate(this.valid_to.getDate() + 1); this.id = id; + this.storage = storage; } async init() { @@ -49,6 +55,7 @@ export class UrlPool { this.ready = true; return true; + } get_raw(): [number, string] | undefined { @@ -119,18 +126,37 @@ export class UrlPool { return d; } + destroy() { + this.downloaders.forEach(d => d.destroy()); + delete this.storage.pools[this.id]; + } + } export class UrlPoolStorage { + validity_interval: NodeJS.Timer; + pools: {[U: string]: UrlPool} = {}; + constructor() { + this.validity_interval = setInterval(this.validity_check, 1000*60*60); + } + + validity_check() { + for(let i in this.pools) { + if(this.pools[i].valid_to.getTime() < new Date().getTime()) { + this.pools[i].destroy(); + } + } + } + async get(id: string): Promise { return this.pools[id] ? this.pools[id] : await this.new(id); } async new(id: string): Promise { - let pool = new UrlPool(id); + let pool = new UrlPool(this, id); let check = await pool.init(); if(!check) return undefined; pool.start_generation(); diff --git a/webserver.ts b/webserver.ts index 08750da..ed2b198 100644 --- a/webserver.ts +++ b/webserver.ts @@ -11,6 +11,8 @@ export class Webserver { const app = express(); + app.use(express.static('public')); + app.get("/status/:id", async (req, res) => { let p = await storage.get(req.params.id); @@ -37,7 +39,7 @@ export class Webserver { }); - app.get("/stream/:id", async (req, res) => { + app.get("/u/:id", async (req, res) => { let p = await storage.get(req.params.id); if(!p) {