Skip to content

Last-Order/shua

Repository files navigation

Shua

Shua is a common file downloader implemented by Node.js. Inspired by Minyami download core.

The target of Shua is to provide a way to download thousands of small files in a short time.

Installation

npm install -g shua

Note: Shua needs Node.js 12.0.0+.

Expressions

Shua supports generating urls from a url expression.

Integer Expressions

Syntax: {{%d(start: integer, end: integer, step?: integer, leftPad?: integer)}}

For example, to download

https://example.com/segment1.ts
https://example.com/segment2.ts
https://example.com/segment3.ts
...
https://example.com/segment100.ts

Just use the following command

shua -e "https://example.com/segment{{%d(1, 100)}}.ts"

Multi expressions is also supported.

To download

https://example.com/segment1_1.ts
https://example.com/segment1_2.ts
...
https://example.com/segment1_10.ts
https://example.com/segment2_1.ts
https://example.com/segment2_2.ts
...
https://example.com/segment2_10.ts
...
https://example.com/segment5_10.ts

Use the following expression

shua -e "https://example.com/segment{{%d(1, 5)}}_{{%d(1, 10)}}.ts"

To download

https://example.com/segment001.ts
https://example.com/segment002.ts
https://example.com/segment003.ts
...
https://example.com/segment100.ts

Use

shua -e "https://example.com/segment{{%d(1, 100, 1, 3)}}.ts"

Example

Download all urls from a.txt with 16 threads

shua -f a.txt --threads 16

Options

--file, -f <path>

Download all URLs containing in a file. Both local path and remote URLs are supported as import. Lines couldn't be parsed as an valid URL will be ignored by default.

Examples

shua -f "files.txt"
shua -f "https://example.com/file_list.txt"

--expression, -e <expression>

Download all URLs generated from a expression. See Expressions section above.

--json, -j <path>

Download tasks defined in a json file. JSON files should contain a DownloadTask array.

interface DownloadTask {
    /** URL */
    url: string;
    /** retry count */
    retryCount: number;
    /** output filename */
    filename?: string;
    /** custom HTTP headers */
    headers?: Record<string, string>;
}
type Tasks = DownloadTask[];

--threads <limit>

Threads limit.

--retries, -r <limit>

Max attempts for download tasks.

--timeout <threshold>

Timeout threshold for download tasks in milliseconds.

--concat, -c (3.0.0+)

Concatenate all downloaded files into a single output file.

--output, -o <name>

Output folder name.

Nested paths are not supported now.

if --concat is provided, --output will be used for concentration.

--ascending, -a

Rename output files in numerical ascending order.

--debug, --verbose

Enable debug log output.

Use as a library

Getting Started

import { Downloader } from 'shua';
const downloader = new Downloader();
downloader.addUrlsFromFile('urls.txt');
downloader.on('finish', () => {
   console.log('All files downloaded!');
});
downloader.start();

Events

Event Name Parameters
progress finishedCount: number, totalCount: number
task-finish task: Task
task-error err: Error, task: Task
finish