2022-04-23 01:37:41 +02:00
|
|
|
import axios from "axios";
|
2022-03-14 20:18:08 +01:00
|
|
|
import { Downloader } from "./downloader";
|
|
|
|
import { Links } from "./links";
|
|
|
|
|
|
|
|
let links = new Links;
|
|
|
|
|
|
|
|
function sleep(ms: number) {
|
|
|
|
return new Promise(resolve => setTimeout(resolve, ms));
|
|
|
|
}
|
|
|
|
|
2022-02-23 19:50:47 +01:00
|
|
|
export class UrlPool {
|
|
|
|
|
2022-04-23 01:37:41 +02:00
|
|
|
id: string;
|
2022-04-23 14:49:12 +02:00
|
|
|
|
2022-04-23 01:37:41 +02:00
|
|
|
urls: string[] = [];
|
2022-02-23 19:50:47 +01:00
|
|
|
used: boolean[] = [];
|
2022-04-23 14:49:12 +02:00
|
|
|
|
2022-03-14 20:18:08 +01:00
|
|
|
generating = false;
|
2022-04-23 14:49:12 +02:00
|
|
|
downloaders: Downloader[] = [];
|
|
|
|
|
|
|
|
total_size: number = 0;
|
|
|
|
is_direct = false;
|
|
|
|
ready = false;
|
2022-02-23 19:50:47 +01:00
|
|
|
|
2022-04-23 01:37:41 +02:00
|
|
|
constructor(id: string) {
|
|
|
|
this.id = id;
|
|
|
|
}
|
|
|
|
|
|
|
|
async init() {
|
2022-04-23 14:49:12 +02:00
|
|
|
|
2022-04-23 01:37:41 +02:00
|
|
|
let page = await axios.get("https://uloz.to/file/"+this.id, {validateStatus: null});
|
|
|
|
if(page.status == 404) return false;
|
|
|
|
// TODO: Add quick download support
|
|
|
|
// let quick_dl_url = links.regex_parse(new RegExp('href="(/quickDownload/[^"]*)"'), page.data, 1);
|
|
|
|
this.is_direct = 'js-free-download-button-direct' == links.regex_parse(new RegExp('data-href="/download-dialog/free/[^"]+" +class=".+(js-free-download-button-direct).+"'), page.data, 1);
|
2022-04-23 14:49:12 +02:00
|
|
|
|
|
|
|
await this.generate();
|
|
|
|
let url = await this.get();
|
|
|
|
if(!url) throw "No available URL in pool!";
|
|
|
|
let r = await axios.get(url[1], {
|
|
|
|
responseType: 'arraybuffer',
|
|
|
|
headers: {
|
|
|
|
Range: `bytes=0-0`
|
|
|
|
}
|
|
|
|
});
|
|
|
|
this.total_size = parseInt(r.headers["content-range"].split("/")[1]);
|
|
|
|
this.return(url[0]);
|
|
|
|
|
|
|
|
this.ready = true;
|
2022-04-23 01:37:41 +02:00
|
|
|
return true;
|
2022-02-23 19:50:47 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
get_raw(): [number, string] | undefined {
|
|
|
|
for(let i=0; i<this.urls.length; i++) {
|
|
|
|
if(this.used[i]) continue;
|
|
|
|
this.used[i] = true;
|
|
|
|
return [i, this.urls[i]];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
async get(): Promise<[number, string] | undefined> {
|
|
|
|
let url = this.get_raw();
|
|
|
|
if(url) return url;
|
|
|
|
return new Promise((complete) => {
|
|
|
|
let check = setInterval(() => {
|
|
|
|
let url = this.get_raw();
|
|
|
|
if(url) {
|
|
|
|
clearInterval(check);
|
|
|
|
complete(url);
|
|
|
|
}
|
2022-03-14 20:18:08 +01:00
|
|
|
}, 100);
|
2022-02-23 19:50:47 +01:00
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
return(i: number) {
|
|
|
|
this.used[i] = false;
|
|
|
|
}
|
|
|
|
|
2022-03-14 20:18:08 +01:00
|
|
|
add(url: string) {
|
|
|
|
this.urls.push(url);
|
|
|
|
this.used.push(false);
|
|
|
|
}
|
|
|
|
|
2022-02-23 19:50:47 +01:00
|
|
|
available(count?: number) {
|
|
|
|
let available: number[] = [];
|
|
|
|
for(let i=0; i<this.used.length; i++) {
|
|
|
|
if(!this.used[i]) {
|
|
|
|
available.push(i);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return count ? available.slice(0, count) : available;
|
|
|
|
}
|
|
|
|
|
2022-04-23 01:37:41 +02:00
|
|
|
async start_generation() {
|
2022-03-14 20:18:08 +01:00
|
|
|
this.generating = true;
|
2022-04-23 14:49:12 +02:00
|
|
|
while(this.urls.length < 15 && this.generating) {
|
|
|
|
console.log(this.id, "| new link:", (await this.generate()) ? true : false);
|
2022-03-14 20:18:08 +01:00
|
|
|
await sleep(2000);
|
|
|
|
}
|
|
|
|
this.generating = false;
|
|
|
|
}
|
|
|
|
|
2022-04-23 01:37:41 +02:00
|
|
|
async generate(): Promise<string | undefined> {
|
|
|
|
try {
|
|
|
|
let link = await (this.is_direct ? links.direct_link(this.id) : links.captcha_link(this.id));
|
|
|
|
if(link) this.add(link);
|
|
|
|
return link;
|
2022-04-23 14:49:12 +02:00
|
|
|
} catch(e) {
|
|
|
|
console.log(e);
|
|
|
|
this.generating = false;
|
2022-04-23 01:37:41 +02:00
|
|
|
return undefined;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-04-23 14:49:12 +02:00
|
|
|
get_downloader(from: number) {
|
|
|
|
let d = new Downloader(this, from);
|
|
|
|
this.downloaders.push(d);
|
|
|
|
return d;
|
2022-03-14 20:18:08 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
export class UrlPoolStorage {
|
|
|
|
|
|
|
|
pools: {[U: string]: UrlPool} = {};
|
|
|
|
|
2022-04-23 01:37:41 +02:00
|
|
|
async get(id: string): Promise<UrlPool | undefined> {
|
|
|
|
return this.pools[id] ? this.pools[id] : await this.new(id);
|
2022-03-14 20:18:08 +01:00
|
|
|
}
|
|
|
|
|
2022-04-23 01:37:41 +02:00
|
|
|
async new(id: string): Promise<UrlPool | undefined> {
|
|
|
|
let pool = new UrlPool(id);
|
|
|
|
let check = await pool.init();
|
|
|
|
if(!check) return undefined;
|
|
|
|
pool.start_generation();
|
2022-03-14 20:18:08 +01:00
|
|
|
this.pools[id] = pool;
|
|
|
|
return pool;
|
|
|
|
}
|
|
|
|
|
2022-02-23 19:50:47 +01:00
|
|
|
}
|