mirror of
https://github.com/xtrll/MusicMetaFinder.git
synced 2026-04-18 00:03:28 +02:00
70 lines
2.6 KiB
JavaScript
70 lines
2.6 KiB
JavaScript
import fs from 'fs';
|
|
import path from 'path';
|
|
|
|
/**
|
|
* Recursively fetches all files within a directory tree, or if the path is a file, returns it in an array.
|
|
*
|
|
* @param {string} inputPath - Path to the directory or file.
|
|
* @returns {Promise<string[]>} A promise that resolves with an array of file paths.
|
|
* @throws {Error} Throws an error if the path does not exist or is not accessible.
|
|
*/
|
|
export default async function fetchFiles(inputPath) {
|
|
try {
|
|
// Stat the path to determine if it's a file or directory
|
|
const stats = await fs.promises.stat(inputPath);
|
|
|
|
if (stats.isDirectory()) {
|
|
// Initiate recursive file fetching for directories
|
|
// eslint-disable-next-line no-use-before-define
|
|
return fetchFilesFromDirectory(inputPath);
|
|
} if (stats.isFile()) {
|
|
// Return the file path in an array for individual files
|
|
return [inputPath];
|
|
}
|
|
// The path is neither a file nor a directory
|
|
throw new Error(`Input path is neither a file nor a directory: ${inputPath}`);
|
|
} catch (error) {
|
|
// Throw an error with a clear message for the caller to handle
|
|
throw new Error(`Failed to fetch files: ${error.message}`);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Helper function that recursively traverses through a directory and accumulates file paths.
|
|
*
|
|
* @param {string} dirPath The starting directory path.
|
|
* @returns {Promise<string[]>} A promise that resolves with an array of file paths found recursively within the directory path.
|
|
* @private
|
|
*/
|
|
async function fetchFilesFromDirectory(dirPath) {
|
|
// Define the recursive function for enumerating files
|
|
async function enumerateFilesInDirectory(currentPath) {
|
|
let fileList = [];
|
|
const entries = await fs.promises.readdir(currentPath, { withFileTypes: true });
|
|
|
|
// Loop over directory entries and handle directories and files
|
|
for (const entry of entries) {
|
|
const fullPath = path.join(currentPath, entry.name);
|
|
|
|
if (entry.isDirectory()) {
|
|
// Recursively enumerate files in subdirectories
|
|
// eslint-disable-next-line no-await-in-loop
|
|
fileList = [...fileList, ...await enumerateFilesInDirectory(fullPath)];
|
|
} else {
|
|
// Add file to the list
|
|
fileList.push(fullPath);
|
|
}
|
|
}
|
|
return fileList;
|
|
}
|
|
|
|
// Use the recursive function starting from the provided directory path
|
|
try {
|
|
return await enumerateFilesInDirectory(dirPath);
|
|
} catch (error) {
|
|
// Log the error with context and rethrow it
|
|
console.error(`Error while enumerating files in directory ${dirPath}:`, error);
|
|
throw new Error(`Unable to enumerate files in directory: ${dirPath}`);
|
|
}
|
|
}
|