mirror of
https://github.com/snobu/destreamer.git
synced 2026-02-18 12:39:42 +00:00
- fixed progress bar not updating
- fixed comments
This commit is contained in:
@@ -4,10 +4,14 @@ import cliProgress from 'cli-progress';
|
|||||||
import WebSocket from 'ws';
|
import WebSocket from 'ws';
|
||||||
|
|
||||||
// TODO: ADD ERROR HANDLING!!!
|
// TODO: ADD ERROR HANDLING!!!
|
||||||
|
// FIXME: progress bar does not update after the first time, it just fills up immediatly
|
||||||
|
|
||||||
export class DownloadManager {
|
export class DownloadManager {
|
||||||
private webSocket: WebSocket;
|
private webSocket: WebSocket;
|
||||||
private progresBar: cliProgress.Bar;
|
// TODO: there's a "not a tty" mode for progresBar
|
||||||
|
// FIXME: is there a way to fix the ETA? Can't get size nor ETA from aria that I can see
|
||||||
|
// we initialize this for each download
|
||||||
|
private progresBar!: cliProgress.Bar;
|
||||||
private completed: number;
|
private completed: number;
|
||||||
private queue: Set<string>;
|
private queue: Set<string>;
|
||||||
private index: number;
|
private index: number;
|
||||||
@@ -18,19 +22,6 @@ export class DownloadManager {
|
|||||||
this.queue = new Set<string>();
|
this.queue = new Set<string>();
|
||||||
this.index = 1;
|
this.index = 1;
|
||||||
|
|
||||||
// TODO: there's a not a tty mode for progresBar
|
|
||||||
// FIXME: is there a way to fix the ETA?
|
|
||||||
// Can't get not the size nor the ETA from aria2c that I can see
|
|
||||||
this.progresBar = new cliProgress.SingleBar({
|
|
||||||
barCompleteChar: '\u2588',
|
|
||||||
barIncompleteChar: '\u2591',
|
|
||||||
format: 'progress [{bar}] {percentage}% {speed} MB/s {eta_formatted}',
|
|
||||||
// process.stdout.columns may return undefined in some terminals (Cygwin/MSYS)
|
|
||||||
barsize: Math.floor((process.stdout.columns || 30) / 3),
|
|
||||||
stopOnComplete: true,
|
|
||||||
hideCursor: true,
|
|
||||||
});
|
|
||||||
|
|
||||||
// Is this really needed having the 30 columns default if
|
// Is this really needed having the 30 columns default if
|
||||||
// process.stdout.columns undefined/0?
|
// process.stdout.columns undefined/0?
|
||||||
if (!process.stdout.columns) {
|
if (!process.stdout.columns) {
|
||||||
@@ -103,6 +94,18 @@ export class DownloadManager {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private initProgresBar(): void {
|
||||||
|
this.progresBar = new cliProgress.SingleBar({
|
||||||
|
barCompleteChar: '\u2588',
|
||||||
|
barIncompleteChar: '\u2591',
|
||||||
|
format: 'progress [{bar}] {percentage}% {speed} MB/s {eta_formatted}',
|
||||||
|
// process.stdout.columns may return undefined in some terminals (Cygwin/MSYS)
|
||||||
|
barsize: Math.floor((process.stdout.columns || 30) / 3),
|
||||||
|
stopOnComplete: true,
|
||||||
|
hideCursor: true,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
private createMessage(method: 'aria2.addUri', params: [[string]] | [[string], object], id?: string): string;
|
private createMessage(method: 'aria2.addUri', params: [[string]] | [[string], object], id?: string): string;
|
||||||
private createMessage(method: 'aria2.changeOption', params: [string, object], id?: string): string;
|
private createMessage(method: 'aria2.changeOption', params: [string, object], id?: string): string;
|
||||||
private createMessage(method: 'aria2.changeGlobalOption', params: [{[option: string]: string}], id?: string): string;
|
private createMessage(method: 'aria2.changeGlobalOption', params: [{[option: string]: string}], id?: string): string;
|
||||||
@@ -146,6 +149,12 @@ export class DownloadManager {
|
|||||||
public downloadUrls(urls: Array<string>, directory: string): Promise<void> {
|
public downloadUrls(urls: Array<string>, directory: string): Promise<void> {
|
||||||
return new Promise (resolve => {
|
return new Promise (resolve => {
|
||||||
|
|
||||||
|
this.index = 1;
|
||||||
|
this.completed = 0;
|
||||||
|
// initialize the bar as a new one
|
||||||
|
this.initProgresBar();
|
||||||
|
let barStarted = false;
|
||||||
|
|
||||||
const handleResponse = (data: WebSocket.Data): void => {
|
const handleResponse = (data: WebSocket.Data): void => {
|
||||||
const parsed = JSON.parse(data.toString());
|
const parsed = JSON.parse(data.toString());
|
||||||
|
|
||||||
@@ -165,7 +174,6 @@ export class DownloadManager {
|
|||||||
this.webSocket.send(this.createMessage('aria2.getGlobalStat', null, 'getSpeed'));
|
this.webSocket.send(this.createMessage('aria2.getGlobalStat', null, 'getSpeed'));
|
||||||
|
|
||||||
if (this.queue.size === 0) {
|
if (this.queue.size === 0) {
|
||||||
this.index = 1;
|
|
||||||
this.webSocket.removeListener('message', handleResponse);
|
this.webSocket.removeListener('message', handleResponse);
|
||||||
resolve();
|
resolve();
|
||||||
}
|
}
|
||||||
@@ -177,10 +185,9 @@ export class DownloadManager {
|
|||||||
{ speed: ((parsed.result.downloadSpeed as number) / 1000000).toFixed(2) });
|
{ speed: ((parsed.result.downloadSpeed as number) / 1000000).toFixed(2) });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// handle download errors
|
// handle download errors
|
||||||
else if (parsed.method === 'aria2.onDownloadError') {
|
else if (parsed.method === 'aria2.onDownloadError') {
|
||||||
// TODO: test download error parsing
|
// TODO: test download error parsing, not had a chance to yet
|
||||||
logger.error(JSON.stringify(parsed));
|
logger.error(JSON.stringify(parsed));
|
||||||
|
|
||||||
let errorGid: string = parsed.params.pop().gid.toString();
|
let errorGid: string = parsed.params.pop().gid.toString();
|
||||||
@@ -212,14 +219,18 @@ export class DownloadManager {
|
|||||||
this.queue.add(gid.toString())
|
this.queue.add(gid.toString())
|
||||||
);
|
);
|
||||||
|
|
||||||
this.progresBar.start(this.queue.size, 0, { speed: 0});
|
if (!barStarted) {
|
||||||
|
barStarted = true;
|
||||||
|
logger.debug(`[DownloadMangaer] Starting queue size: ${this.queue.size}`);
|
||||||
|
this.progresBar.start(this.queue.size, 0, { speed: 0});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
this.webSocket.on('message', data => handleResponse(data));
|
this.webSocket.on('message', data => handleResponse(data));
|
||||||
|
|
||||||
const params: Array<any> = urls.map(url => {
|
const paramsForDownload: Array<any> = urls.map(url => {
|
||||||
const title: string = (this.index++).toString().padStart(16, '0') + '.encr';
|
const title: string = (this.index++).toString().padStart(16, '0') + '.encr';
|
||||||
|
|
||||||
return this.createMulticallElement(
|
return this.createMulticallElement(
|
||||||
@@ -227,7 +238,7 @@ export class DownloadManager {
|
|||||||
});
|
});
|
||||||
|
|
||||||
this.webSocket.send(
|
this.webSocket.send(
|
||||||
this.createMessage('system.multicall', [params], 'addUrl')
|
this.createMessage('system.multicall', [paramsForDownload], 'addUrl')
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user