This repository has been archived on 2023-11-29. You can view files and clone it, but cannot push or open issues or pull requests.
Uloz.to-rychle/urlpool.ts

120 lines
2.6 KiB
TypeScript
Raw Normal View History

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;
is_direct = false;
urls: string[] = [];
2022-02-23 19:50:47 +01:00
used: boolean[] = [];
2022-03-14 20:18:08 +01:00
generating = false;
downloader?: Downloader;
2022-04-23 01:37:41 +02:00
valid = 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() {
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);
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;
while(this.urls.length < 10) {
2022-04-23 01:37:41 +02:00
this.generate();
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);
console.log(link);
return link;
} catch {
return undefined;
}
}
2022-03-14 20:18:08 +01:00
get_downloader() {
if(this.downloader) return this.downloader;
this.downloader = new Downloader(this)
return this.downloader;
}
}
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
}