const Walk = require("@root/walk"); import path from "path"; import { IExplodedPathResponse, IExtractComicBookCoverErrorResponse, IExtractedComicBookCoverFile, IExtractionOptions, IFolderData, } from "../interfaces/folder.interface"; import { logger } from "./logger.utils"; import { each, isEmpty, map, remove, indexOf } from "lodash"; export const walkFolder = async (folder: string): Promise => { const result: IFolderData[] = []; let walkResult: IFolderData = { name: "", extension: "", containedIn: "", isFile: false, isLink: true, }; const walk = Walk.create({ sort: filterOutDotFiles }); await walk(folder, async (err, pathname, dirent) => { if (err) { logger.error("Failed to lstat directory", { error: err }); return false; } if ([".cbz", ".cbr"].includes(path.extname(dirent.name))) { walkResult = { name: path.basename(dirent.name, path.extname(dirent.name)), extension: path.extname(dirent.name), containedIn: path.dirname(pathname), isFile: dirent.isFile(), isLink: dirent.isSymbolicLink(), }; logger.info( `Scanned ${dirent.name} contained in ${path.dirname(pathname)}` ); result.push(walkResult); } }); return result; }; export const explodePath = (filePath: string): IExplodedPathResponse => { const exploded = filePath.split("/"); const fileName = remove( exploded, (item) => indexOf(exploded, item) === exploded.length - 1 ).join(""); return { exploded, fileName, }; }; export const constructPaths = ( extractionOptions: IExtractionOptions, walkedFolder: IFolderData ) => ({ targetPath: extractionOptions.targetExtractionFolder + "/" + walkedFolder.name, inputFilePath: walkedFolder.containedIn + "/" + walkedFolder.name + walkedFolder.extension, }); const filterOutDotFiles = (entities) => entities.filter((ent) => !ent.name.startsWith("."));