open-directory-downloader v9.0.2
A NodeJS Wrapper around OpenDirectoryDownloader
This is a wrapper around KoalaBear84/OpenDirectoryDownloader, exposing functionality and output of the CLI in JavaScript.
Open Directory Downloader is a CLI tool for indexing so-called Open Directories (ODs), which are HTTP servers exposing files and folders for browsing and downloading. For more info about Open Directories visit the subreddit
Installation
npm i open-directory-downloaderUpon installation, the latest supported OpenDirectoryDownloader binary will automatically be downloaded from GitHub.
If this should fail, a local installation can be used instead (see below).
For changelogs, please look at the GitHub release page.
Usage
const odd = require(`open-directory-downloader`);
const indexer = new odd.OpenDirectoryDownloader();
indexer.scanUrl(url)
.then(scanResult => {
console.log(scanResult)
// {
// scannedUrl: 'https://example.com/files',
// scan: {...},
// jsonFile: '/full/path/to/scan/file',
// urlFile: '/full/path/to/url/file',
// reddit: '|**Url:** [https://example.com/files](https://example.com/files)||[Urls file](https://gofile.io/?c=XXXXX)|\r\n' +
// '|:-|-:|-:|\r\n' +
// '|**Extension (Top 5)**|**Files**|**Size**|\r\n' +
// '|.iso|70|2.2 TiB|\r\n' +
// '|.mkv|40|796.3 GiB|\r\n' +
// '|.zip|16|200.39 GiB|\r\n' +
// '|.rar|1|71 GiB|\r\n' +
// '|.mp4|1|32 GiB|\r\n' +
// '|**Dirs:** 188 **Ext:** 34|**Total:** 572|**Total:** 3.39 TiB|\r\n' +
// '|**Date (UTC):** 2021-10-17 12:13:31|**Time:** 00:00:20||\r\n',
// credits: "^(Created by [KoalaBear84's OpenDirectory Indexer v2.1.0.0](https://github.com/KoalaBear84/OpenDirectoryDownloader/))",
// missingFileSizes: false,
// stats: {
// version: '2.1.0.0',
// totalFiles: 572,
// totalSize: '3.39 TiB',
// totalDirectories: 188,
// statusCodes: { '200': 188 },
// totalHTTPRequests: 188,
// totalHTTPTraffic: '353.19 kiB',
// urlQueue: 0,
// urlThreads: 0,
// sizeQueue: 0,
// sizeThreads: 0
// }
// }
}| Wrapper Version | Supported ODD Versions (up to) | Included Version |
|---|---|---|
| 9.0.2 | v2.8.0.0+ | v2.8.0.0 |
| 9.0.1 | v2.5.0.1 | v2.4.4.3 |
| 9.0.0 | v2.4.4.3+ | v2.4.4.3 |
| 8.0.2 | v2.4.4.3+ | v2.4.4.1 |
| 8.0.0 | v2.4.4.3+ | v2.3.1.4 |
| 7.0.0 | 2.2.0.1-2.2.0.2 | 2.2.0.2 |
| 6.2.0 | 2.1.0.8 | 2.1.0.8 |
| 6.1.2 | 2.1.0.0 | 2.1.0.0 |
| 6.1.0 | 2.1.0.0 | 2.1.0.0 |
| 5.1.0 | 2.0.0.6 | 2.0.0.3 |
| 5.0.0 | 2.0.0.2 | 2.0.0.0 |
| 4.0.3 | 1.9.6.1 | 1.9.6.1 |
| 4.0.2 | 1.9.6.1 | 1.9.5.5 |
| 4.0.1 | 1.9.6.1 | 1.9.4.6 |
| 4.0.0 | 1.9.6.1 | 1.9.4.6 |
| 3.1.2 | 1.9.6.1 | 1.9.4.6 |
| 3.1.1 | 1.9.6.1 | 1.9.4.5 |
| 3.1.0 | 1.9.6.1 | 1.9.4.4 |
| 3.0.0 | 1.9.4.3 | 1.9.3.9 |
| 2.0.0 | 1.9.4.3 | 1.9.3.8 |
| 1.1.0 | 1.9.4.3 | 1.9.3.6 |
| 1.0.0 | 1.9.3.1-1.9.3.5 | 1.9.3.3 |
Some intermediary releases might not be fully supported. It is recommended to use the versions that are included by default.
Examples
Custom Scan Options
const odd = require(`open-directory-downloader`);
const indexer = new odd.OpenDirectoryDownloader();
indexer.scanUrl(url, {
outputFile: `/path/to/filename/without/extension`,
keepJsonFile: true,
keepUrlFile: true,
parseScan: true,
performSpeedtest: true,
uploadUrlFile: true,
})
.then(scanResult => {
console.log(scanResult)
})
.catch(console.error)Live Logs & Stats
const odd = require(`open-directory-downloader`);
const indexer = new odd.OpenDirectoryDownloader({
statsInterval: 5, // 5 seconds
});
let scan = indexer.scanUrl(url)
scan.live.on(`logs`, (newLogs) => {
console.logs(newLogs)
})
scan.live.on(`stats`, (newStats) => {
console.logs(newStats)
})
scan.then(scanResult => {
console.log(scan.live.output) // access all logs after the scan is done
console.log(scanResult)
})
.catch(console.error)
// or:
// let scanResult = await scanError Handling
const odd = require(`open-directory-downloader`);
const indexer = new odd.OpenDirectoryDownloader();
indexer.scanUrl(url)
.catch(err => {
if (err instanceof odd.ODDError) {
console.log(err.name) // 'ODDError'
} else if (err instanceof odd.ODDWrapperError) {
console.log(err.name) // 'WrapperError'
console.log(err[0]) // logs the actual error
if (err.length > 1) {
console.log(err[1]) // logs a "best-effort" `ScanResult`, possibly with some fields (like `ScanResult.scan`) missing
}
}
} else if (err instanceof odd.ODDOutOfMemoryError) {
console.log(err.name) // 'OutOfMemoryError'
}
})API
Class OpenDirectoryDownloader
OpenDirectoryDownloader(options)
Constructor
options(Object) (optional): Additional options for the scanoutputFile(String) (optional, defaults to the escaped URL): The name of the output file(s). Can also be a full path. Don't include an extension, as multiple files with different extensions will be generated.executablePath(String) (optional) The full path to the OpenDirectoryDownloader executable.
Allows you to use a custom OpenDirectoryDownloader binary.workingDirectory(String) (optional) The full path to the directory where OpenDirectoryDownloader saves its scan files.maximumMemory(Number) (optional, default isInfinity) The maximum allowed memory usage in bytes for each scan.statsInterval(Number) (optional, default is15) The minimum interval (in seconds) for refreshing the scan stats (applies toScanResultPromise.live). ODD might output additional stats periodically, so thestatsevent might get emitted more often.
- Returns: An instance of
OpenDirectoryDownloader
OpenDirectoryDownloader.scanUrl(url, options)
Initiates the scan of the provided URL
url(StringorURLObject) (required): The URL to scan/index.options(Object) (optional): Additional options for the scanoutputFile(String) (optional, defaults to the escaped URL): The name of the output file(s). Can also be a full path. Don't include an extension, as multiple files with different extensions will be generated.keepJsonFile(Boolean) (optional, default isfalse): Keep the JSON-file generated by the OpenDirectoryDownloader binary after the scan?keepUrlFile(Boolean) (optional, default isfalse): Keep the text-file generated by the OpenDirectoryDownloader binary after the scan?parseScan(Boolean) (optional, default isfalse): Parse the generated JSON file and include it in theScanResult?performSpeedtest(Boolean) (optional, default isfalse): Perform a speed test after the scan is done? (usually takes a few seconds)
Note: For some OD formats, speed test are disabled by OpenDirectoryDownloader. For these, no test results will be included inScanResult.scan.SpeedtestResult.uploadUrlFile(Boolean) (optional, default isfalse): Automatically upload the file containing all the found URLs to GoFile?fastScan(Boolean) (optional, default isfalse): Disable slow operations during the scan, like HEAD requests. This can result in file sizes being reported as "0" or "n/a", if the OD doesn't show file sizes next to the file names.exactSizes(Boolean) (optional, default isfalse) Use HEAD requests to retrieve exact file sizesuserAgent(String) (optional, default is"") Use a custom user agent for all HTTP requestsauth(Object) (optional) Used to configure (HTTP Basic) auth settingsusername(String) (optional, default is"") The user name to use for authenticationpassword(String) (optional, default is"") The password to use for authentication
headers(Object) (optional) Used to configure additional headers to be sent with each request (cookies, referrers, etc.). Headers are key-value pairs of strings.userAgentandauthwill overwrite any equivalent custom headers, if provided.threads(Number) (optional, default is5) Number of threads to use for scanningtimeout(Number) (optional, default is100) Number of seconds to wait before timing out
- Returns: Promise<Resolves to
ScanResult| Rejects toArray<Error[,ScanResult]>>
The promise also has aliveproperty (see below).
If the promise rejects, it will return an array where the first element is always anErrorobject and there might also be a second element, which is aScanResultbut without theScanResult.scanproperty.
ScanResultPromise
The promise returned when starting a scan, resolves to ScanResult
liveAnEventEmitterproviding the following events:- EVENT
logs(String) Emitted every time ODD outputs new logs, containing only the new logs (including errors) - EVENT
stats(Object) Emitted every time ODD outputs the current scan stats.version(String) the detected version of ODDtotalFiles(Number) the total amount of files found in the ODtotalSize(String) the (estimated) total size of all the files, in human-readable formtotalDirectories(Number) the total amount of subdirectories found in the ODstatusCodes(Object) an object containing status codes as keys and the number of times that status code was returned as valuestotalHTTPRequests(Number) the total amount of HTTP requests made while scanningtotalHTTPTraffic(String) the total HTTP traffic generated while scanning, in human-readable formurlQueue(Number) the amount of URLs that still need to be indexedurlThreads(Number) the amount of threads used for indexing the remaining URLssizeQueue(Number) the amount of URLs/files for which the size still needs to be determinedsizeThreads(Number) the amount of threads used for determining the file sizes
- EVENT
The live property also has some sub-properties:
output(String) All the logs generated by ODD during the current scan. Same properties as the object emitted by thelogsevent above.error(String) All the error logs generated by ODD during the current scanstats(Object) The current stats. Same properties as the object emitted by thestatsevent above.
ScanResult
The object returned when the promise resolves
scannedUrlThe URL that was scannedscanThe parsed JSON-Object created by the OpenDirectoryDownloader binary. Can be very large depending on the size of the Open Directory.
Only included ifoptions.parseScanwas set totruejsonFileThe full path to the created JSON-file.
Only included ifkeepJsonFilewas set totrue.urlFileThe full path to the created text-file.
Only included ifkeepUrlFilewas set totrue.redditThe markdown-formatted table containing the stats for the Open Directory.
Does not include the credits.creditsThe markdown signature containing a link to KoalaBear84/OpenDirectoryDownloadermissingFileSizesIf thefastScanoption is enabled and the OD doesn't list file sizes, OpenDirectoryDownloader has no way of getting the file sizes, and this boolean will be set totrue.
Custom Errors
open-directory-downloader implements various custom errors to better indicate what went wrong. These errors can be used for more precise error handling, but also handled like a regular error without special treatment.
ODDError
An error indicating that the OpenDirectoryDownloader binary encountered an error.
Often indicates that the URL couldn't be scanned, because it isn't supported.
ODDOutOfMemoryError
An error indicating that the OpenDirectoryDownloader process used more memory than allowed by options.maximumMemory.
ODDWrapperError
An error indicating that the wrapper itself encountered an error.
This could happen if parsing ODD's output fails or if there are file system issues (deleted files, permission issues, etc.).
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago