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
npm i open-directory-downloader
Upon 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.
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
// }
// }
}
Compatible Versions of OpenDirectoryDownloader
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.
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)
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 scan
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'
}
})
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 thestats
event might get emitted more often.
- Returns: An instance of
OpenDirectoryDownloader
Initiates the scan of the provided URL
url
(String
orURL
Object) (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.userAgent
andauth
will 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 alive
property (see below).
If the promise rejects, it will return an array where the first element is always anError
object and there might also be a second element, which is aScanResult
but without theScanResult.scan
property.
The promise returned when starting a scan, resolves to ScanResult
live
AnEventEmitter
providing 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 thelogs
event 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 thestats
event above.
The object returned when the promise resolves
scannedUrl
The URL that was scanned- [
scan
] The parsed JSON-Object created by the OpenDirectoryDownloader binary. Can be very large depending on the size of the Open Directory.
Only included ifoptions.parseScan
was set totrue
jsonFile
The full path to the created JSON-file.
Only included ifkeepJsonFile
was set totrue
.urlFile
The full path to the created text-file.
Only included ifkeepUrlFile
was set totrue
.reddit
The markdown-formatted table containing the stats for the Open Directory.
Does not include the credits.credits
The markdown signature containing a link to KoalaBear84/OpenDirectoryDownloadermissingFileSizes
If thefastScan
option 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
.
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.
An error indicating that the OpenDirectoryDownloader binary encountered an error.
Often indicates that the URL couldn't be scanned, because it isn't supported.
An error indicating that the OpenDirectoryDownloader process used more memory than allowed by options.maximumMemory
.
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.).