img-dl
Downloade image(s), by command or programmatically. The alternative for image-downloader
package (see the features).
Features
Features | img-dl | image-downloader |
---|
Single download | ✅ | ✅ |
Bulk download | ✅ | ❌ |
CLI | ✅ | ❌ |
Custom filename | ✅ | ✅ |
Custom extension | ✅ | ❌ |
Request timeout | ✅ | ✅ |
Retry failed request | ✅ | ❌ |
Abort request | ✅ | ❌ |
Increment mode (in CLI) | ✅ | ❌ |
Overwrite prevention | ✅ | ❌ |
Increment mode
Download images with an url that contains {i}
placeholder for the index, and specify the start and end index.
Overwrite prevention
To prevent overwriting, (n)
will be appended to the name of the new file if the file with the same name already exists.
The number will be incremented until the file name is unique in the directory, starting from 1 (e.g. image (1).jpg
, image (2).jpg
, etc.).
Image with different extension will be considered as different file, so it will not be appended with (n)
. For example, image.jpg
and image.png
will not be considered as the same file.
This feature will work for both single and bulk download.
Prerequisites
- Node.js 20.9 or later
- npm 10 or later
Installation
img-dl can be installed in the global scope (if you'd like to have it available and use it on the whole system) or locally for a specific package (especially if you'd like to use it programmatically):
Install globally:
npm install -g img-dl
Install locally:
npm install img-dl
Usage
Command line
Access the help page with imgdl --help
Download image(s), by command or programmatically
USAGE
$ imgdl <url> ... [OPTIONS]
PARAMETERS
url The URL of the image to download. Provide multiple URLs to download multiple images.
In increment mode, the URL must contain {i} placeholder for the index,
only one URL is allowed, and the '--end' is required.
OPTIONS
-d, --dir=<path> The output directory. Default: current working directory
--end=<number> The end index. Required in increment mode
-e, --ext=<ext> The file extension. Default: original extension or jpg
-h, --help Show this help message
-H, --header=<header> The header to send with the request. Can be used multiple times
-i, --increment Enable increment mode. Default: false
--interval=<number> The interval between each batch of requests in milliseconds
-n, --name=<filename> The filename. If not specified, the original filename will be used. Default: 'image'
--max-retry=<number> Set the maximum number of times to retry the request if it fails
--silent Disable logging
--start=<number> The start index for increment mode. Default: 0
--step=<number> The number of requests to make at the same time. Default: 5
-t, --timeout=<number> Set timeout for each request in milliseconds
-v, --version Show the version number
EXAMPLES
$ imgdl https://example.com/image.jpg
$ imgdl https://example.com/image.jpg --dir=images --name=example --ext=png
$ imgdl https://example.com/image.jpg --silent
$ imgdl https://example.com/image.jpg https://example.com/image2.webp
$ imgdl https://example.com/image-{i}.jpg --increment --start=1 --end=10
$ imgdl https://example.com/image.jpg --header="User-Agent: Mozilla/5.0" --header="Cookie: foo=bar"
Simple download
imgdl https://example.com/image.jpg
Bulk download
imgdl https://example.com/image.jpg https://example.com/image2.jpg
Bulk download with increment mode
imgdl https://example.com/image-{i}.jpg --increment --start=1 --end=10
Programmatically
Simple download
import imgdl from 'img-dl';
const image = await new Promise((resolve, reject) => {
imgdl('https://example.com/image.jpg', {
onSuccess: resolve,
onError: reject,
});
});
console.log(image);
Bulk download
import imgdl from 'img-dl';
const urls = [
'https://example.com/image.jpg',
'https://example.com/image2.jpg',
];
await imgdl(urls, {
onSuccess: (image) => {
console.log(image);
},
onError: (error, url) => {
console.error(`Failed to download ${url}: ${error.message}`);
},
});
console.log('Download completed');
Bulk download with specific options
import imgdl from 'img-dl';
const options = {
name: 'avatar',
extension: 'png',
onSuccess: (image) => {
console.log(`Downloaded ${image.name}.${image.extension}`);
},
onError: (error, url) => {
console.error(`Failed to download ${url}: ${error.message}`);
},
timeout: 5000,
};
await imgdl(
[
{ url: 'http://example.com/image.jpg', name: 'myavatar' },
{ url: 'http://example.com/image.jpg', extension: 'webp' },
{ url: 'http://example.com/image2.jpg', directory: 'avatars' },
],
options,
);
API
imgdl(url, ?options)
Returns: Promise<void>
Download image(s) from the given URL(s).
url
Type: string | (string | ({ url: string } & ImageOptions))[]
Required: true
The URL(s) of the image(s) to download. Required.
If the url
is a string, it will download a single image.
If the url
is an array, it will download multiple images.
- Each item in the array can be a URL in string or an object containing the URL and the image options.
- This URL-level options will override the function-level options, the image options provided in the second argument (see
options
).
options
Type: Options
Required: false
directory
Type: string
Default: process.cwd()
The output directory.
extension
Type: string
Default: 'jpg'
The file extension. If not specified, the original extension will be used. If the original extension is not available, 'jpg' will be used.
Type: Record<string, string | string[] | undefined>
Default: undefined
The headers to send with the request.
interval
Type: number
Default: 100
The interval between each batch of requests in milliseconds when downloading multiple images.
name
Type: string
Default: 'image'
The filename. If not specified, the original filename will be used. If the original filename is not available, 'image' will be used.
maxRetry
Type: number
Default: 2
Set the maximum number of times to retry the request if it fails.
onSuccess
Type: (image: Image) => void
Default: undefined
The callback function to be called when the image is successfully downloaded.
Image
is an object containing the information of the downloaded image. Image
has the following properties:
url
: The instance of URL
class of the image. See URL
Class.originalName
: The original name of the image if available. Default: undefined
.originalExtension
: The original extension of the image if available. Default: undefined
.name
: The user-defined name of the image. If not specified and the original name is available, the original name will be used. If the original name is not available, 'image'
will be used.extension
: The user-defined extension of the image. If not specified and the original extension is available, the original extension will be used. If the original extension is not available, 'jpg'
will be used.directory
: The output directory of the image.path
: The path of the downloaded image.
onError
Type: (error: Error, url: string) => void
Default: undefined
The callback function to be called when the image fails to download.
signal
Type: AbortSignal
Default: undefined
The signal to abort the request.
step
Type: number
Default: 5
The number of requests to make at the same time when downloading multiple images.
timeout
Type: number
Default: undefined
Set timeout for each request in milliseconds.
Support This Project
Give a ⭐️ if this project helped you!
Also please consider supporting this project with a donation. Your donation will help us maintain and develop this project and provide you with better support.