🔧 Refactoring still.

This commit is contained in:
2021-04-20 18:11:29 -07:00
parent 69ca5fdea0
commit 21c53fccb7
3 changed files with 68 additions and 70 deletions

View File

@@ -24,7 +24,7 @@ export interface IFolderData {
export interface IExplodedPathResponse { export interface IExplodedPathResponse {
exploded: Array<string>; exploded: Array<string>;
fileName: string | Array<string>; fileName: string;
} }
export interface IComicBookCoverMetadata { export interface IComicBookCoverMetadata {

View File

@@ -11,13 +11,14 @@ import {
import { Request, Response } from "express"; import { Request, Response } from "express";
router.route("/getComicCovers").get(async (req: Request, res: Response) => { router.route("/getComicCovers").get(async (req: Request, res: Response) => {
const foo = await extractArchive({ const options = {
name: "Ozymandias 001.cbr", name: "Gyo v01 (2003) (Digital) (LostNerevarine-Empire)",
extension: ".cbr", extension: ".cbz",
containedIn: "comics/(2012) Before Watchmen - Ozymandias", containedIn: "comics/ITOU Junji - Gyo",
isFile: true, isFile: true,
isLink: false, isLink: false,
}); };
const foo = await extractArchive(options);
// const foo = await extractMetadataFromImage( // const foo = await extractMetadataFromImage(
// "./comics/covers/Ghosts and Ruins-001.jpg", // "./comics/covers/Ghosts and Ruins-001.jpg",
// ); // );

View File

@@ -34,6 +34,16 @@ export const unrar = async (
extractionOptions.folderDetails.name, extractionOptions.folderDetails.name,
).catch((err) => console.error("Failed to read file", err)); ).catch((err) => console.error("Failed to read file", err));
const targetPath =
extractionTargetPath + "/" + extractionOptions.folderDetails.name;
try {
await fse.ensureDir(targetPath, directoryOptions);
logger.info(`${targetPath} was created or already exists.`);
} catch (error) {
logger.error(`${error}: Couldn't create directory.`);
}
const extractor = await unrarer.createExtractorFromData({ data: fileBuffer }); const extractor = await unrarer.createExtractorFromData({ data: fileBuffer });
switch (extractionOptions.extractTarget) { switch (extractionOptions.extractTarget) {
case "cover": case "cover":
@@ -43,32 +53,22 @@ export const unrar = async (
const extractedFile = [...file.files][0]; const extractedFile = [...file.files][0];
const fileArrayBuffer = extractedFile.extraction; const fileArrayBuffer = extractedFile.extraction;
const pathFragments = explodePath(extractedFile.fileHeader.name);
const targetPath =
extractionTargetPath + "/" + pathFragments.exploded.join("/");
logger.info(`Attempting to write ${extractedFile.fileHeader.name}`); logger.info(`Attempting to write ${extractedFile.fileHeader.name}`);
return new Promise(async (resolve, reject) => { return new Promise(async (resolve, reject) => {
try { try {
await fse.ensureDir(targetPath, directoryOptions); const fileName = explodePath(extractedFile.fileHeader.name).fileName;
logger.info(`${targetPath} was created or already exists.`); if (fileName !== "") {
try { await writeFile(targetPath + "/" + fileName, fileArrayBuffer);
await writeFile(
targetPath + "/" + pathFragments.fileName,
fileArrayBuffer,
);
resolve({
name: `${extractedFile.fileHeader.name}`,
path: targetPath,
fileSize: extractedFile.fileHeader.packSize,
});
} catch (error) {
logger.error(`${error}: Couldn't write file.`);
reject(error);
} }
resolve({
name: `${extractedFile.fileHeader.name}`,
path: targetPath,
fileSize: extractedFile.fileHeader.packSize,
});
} catch (error) { } catch (error) {
logger.error(`${error}: Coudln't create directory.`); logger.error(`${error}: Couldn't write file.`);
reject(error); reject(error);
} }
}); });
@@ -81,29 +81,19 @@ export const unrar = async (
for (const file of extractedFiles) { for (const file of extractedFiles) {
logger.info(`Attempting to write ${file.fileHeader.name}`); logger.info(`Attempting to write ${file.fileHeader.name}`);
const fileBuffer = file.extraction; const fileBuffer = file.extraction;
const pathFragments = explodePath(file.fileHeader.name); const fileName = explodePath(file.fileHeader.name).fileName;
const fragment = determineFolderNameForExtraction(pathFragments);
const targetPath = extractionTargetPath + "/" + fragment;
try { try {
await fse.ensureDir(targetPath, directoryOptions); if (fileName !== "") {
logger.info(`${targetPath} was created or already exists.`); await writeFile(targetPath + "/" + fileName, fileBuffer);
try {
await writeFile(
targetPath + "/" + pathFragments.fileName,
fileBuffer,
);
comicBookCoverFiles.push({
name: `${file.fileHeader.name}`,
path: targetPath,
fileSize: file.fileHeader.packSize,
});
} catch (error) {
logger.error(error);
reject(error);
} }
} catch (err) { comicBookCoverFiles.push({
logger.error(err); name: `${file.fileHeader.name}`,
reject(err); path: targetPath,
fileSize: file.fileHeader.packSize,
});
} catch (error) {
logger.error(error);
reject(error);
} }
} }
resolve(comicBookCoverFiles); resolve(comicBookCoverFiles);
@@ -140,34 +130,47 @@ export const unzip = async (
const targetPath = const targetPath =
extractionOptions.sourceFolder + extractionOptions.sourceFolder +
"/" + "/" +
extractionOptions.targetExtractionFolder; extractionOptions.targetExtractionFolder +
"/" +
extractionOptions.folderDetails.name;
const zip = createReadStream( const zip = createReadStream(
extractionOptions.sourceFolder + "/" + extractionOptions.folderDetails.name, extractionOptions.folderDetails.containedIn +
"/" +
extractionOptions.folderDetails.name +
extractionOptions.folderDetails.extension,
).pipe(unzipper.Parse({ forceStream: true })); ).pipe(unzipper.Parse({ forceStream: true }));
for await (const entry of zip) {
try { try {
await fse.ensureDir(targetPath, directoryOptions); await fse.ensureDir(targetPath, directoryOptions);
logger.info(`${targetPath} was created or already exists.`); logger.info(`${targetPath} was created or already exists.`);
const fileName = entry.path; for await (const entry of zip) {
const fileName = explodePath(entry.path).fileName;
const size = entry.vars.uncompressedSize; // There is also compressedSize; const size = entry.vars.uncompressedSize; // There is also compressedSize;
if (fileName !== "") {
entry.pipe(createWriteStream(targetPath + "/" + fileName));
}
extractedFiles.push({ extractedFiles.push({
name: fileName, name: fileName,
fileSize: size, fileSize: size,
path: targetPath, path: targetPath,
}); });
entry.pipe(createWriteStream(targetPath + fileName));
entry.autodrain(); entry.autodrain();
} catch (error) {
logger.error(`${error} Couldn't create directory.`);
} }
} catch (error) {
logger.error(`${error} Couldn't create directory.`);
} }
return new Promise((resolve, reject) => {
return new Promise(async (resolve, reject) => {
logger.info(""); logger.info("");
resolve(extractedFiles); resolve(extractedFiles);
}); });
}; };
export const unzipOne = async (): Promise<IExtractedComicBookCoverFile> => { export const unzipOne = async (
extractionOptions: IExtractionOptions,
): Promise<IExtractedComicBookCoverFile> => {
const directory = await unzipper.Open.file( const directory = await unzipper.Open.file(
"./comics/Lovecraft - The Myth of Cthulhu (2018) (Maroto) (fylgja).cbz", "./comics/Lovecraft - The Myth of Cthulhu (2018) (Maroto) (fylgja).cbz",
); );
@@ -193,11 +196,11 @@ export const extractArchive = async (
| IExtractedComicBookCoverFile[] | IExtractedComicBookCoverFile[]
| IExtractComicBookCoverErrorResponse | IExtractComicBookCoverErrorResponse
> => { > => {
const sourceFolder = "./comics/"; const sourceFolder = "./comics";
const targetExtractionFolder = "expanded"; const targetExtractionFolder = "expanded";
const extractionOptions: IExtractionOptions = { const extractionOptions: IExtractionOptions = {
folderDetails: fileObject, folderDetails: fileObject,
extractTarget: "all", extractTarget: "cover",
sourceFolder, sourceFolder,
targetExtractionFolder, targetExtractionFolder,
}; };
@@ -241,19 +244,13 @@ export const explodePath = (filePath: string): IExplodedPathResponse => {
const exploded = filePath.split("/"); const exploded = filePath.split("/");
const fileName = _.remove(exploded, (item) => { const fileName = _.remove(exploded, (item) => {
return _.indexOf(exploded, item) === exploded.length - 1; return _.indexOf(exploded, item) === exploded.length - 1;
}).join("");
console.log({
exploded,
fileName,
}); });
return { return {
exploded, exploded,
fileName, fileName,
}; };
}; };
export const determineFolderNameForExtraction = (
pathFragments: IExplodedPathResponse,
): string | string[] => {
if (pathFragments.exploded.length === 0) {
return pathFragments.fileName;
} else {
return pathFragments.exploded.join("/");
}
};