🧠 Fixing bulk unrar

This commit is contained in:
2021-04-20 01:06:51 -07:00
parent 112e28360d
commit 035a7f0799
5 changed files with 98 additions and 31 deletions

View File

@@ -22,6 +22,11 @@ export interface IFolderData {
isLink: boolean;
}
export interface IExplodedPathResponse {
exploded: Array<string>;
fileName: string | Array<string>;
}
export interface IComicBookCoverMetadata {
name: string;
path: string;

View File

@@ -6,14 +6,15 @@ import {
unzip,
extractMetadataFromImage,
unzipOne,
explodePath,
} from "../../utils/fs.utils";
import { Request, Response } from "express";
router.route("/getComicCovers").get(async (req: Request, res: Response) => {
const foo = await extractArchive({
name: "Dante's Inferno 02 (2010) (noads) (Legion-CPS).cbr",
name: "Hellboy - The Chained Coffin and Others Ch3.cbr",
extension: ".cbr",
containedIn: "comics/Dante's Inferno",
containedIn: "comics/Hellboy. The Chained Coffin and Others (1998) (of 1)",
isFile: true,
isLink: false,
});
@@ -22,6 +23,7 @@ router.route("/getComicCovers").get(async (req: Request, res: Response) => {
// );
// const foo = await unzipOne();
// const foo = await unzip("asd");
// const foo = explodePath("Chapter Three/HELLBOY - The Chained Coffin - 069.jpg");
res.json({
jagan: "trupti",
foo,

View File

@@ -2,10 +2,14 @@ import { default as unzipper } from "unzipper";
const sharp = require("sharp");
const unrarer = require("node-unrar-js");
const Walk = require("@root/walk");
const mkdirp = require("mkdirp");
const fse = require("fs-extra");
import fs from "fs";
import path from "path";
import _ from "lodash";
import { logger } from "./logger.utils";
import {
IExplodedPathResponse,
IExtractComicBookCoverErrorResponse,
IExtractedComicBookCoverFile,
IExtractionOptions,
@@ -15,12 +19,13 @@ import {
export const unrar = async (
extractionOptions: IExtractionOptions,
): Promise<
IExtractedComicBookCoverFile | IExtractComicBookCoverErrorResponse
| IExtractedComicBookCoverFile
| IExtractedComicBookCoverFile[]
| IExtractComicBookCoverErrorResponse
> => {
const comicCoversTargetPath =
extractionOptions.sourceFolder +
extractionOptions.targetComicCoversFolder +
"/";
extractionOptions.sourceFolder + extractionOptions.targetComicCoversFolder;
const buf = Uint8Array.from(
fs.readFileSync(
extractionOptions.folderDetails.containedIn +
@@ -63,34 +68,48 @@ export const unrar = async (
);
});
case "all":
const comicBookCoverFiles: IExtractedComicBookCoverFile[] = [];
const files = extractor.extract({});
const extractedFiles = [...files.files];
console.log(extractedFiles);
// logger.info(`Attempting to write ${extractedFiles.fileHeader.name}`);
return new Promise(async (resolve, reject) => {
for (const file of extractedFiles) {
logger.info(`Attempting to write ${file.fileHeader.name}`);
const fileBuffer = file.extraction;
const pathFragments = explodePath(file.fileHeader.name);
const targetPath =
comicCoversTargetPath + "/" + pathFragments.exploded.join("/");
fse.ensureDir(targetPath, (err) => {
if (err) {
console.log(err);
} else {
fs.writeFile(
targetPath + "/" + pathFragments.fileName,
fileBuffer,
(err) => {
if (err) {
logger.error(err);
reject(err);
} else {
logger.info(
`The file ${file.fileHeader.name} was saved to disk.`,
);
}
},
);
comicBookCoverFiles.push({
name: `${file.fileHeader.name}`,
path: targetPath,
fileSize: file.fileHeader.packSize,
});
}
});
}
console.log(comicBookCoverFiles);
resolve(comicBookCoverFiles);
});
// return new Promise((resolve, reject) => {
// fs.writeFile(
// comicCoversTargetPath + extractedFiles.fileHeader.name,
// filesBuffer,
// (err) => {
// if (err) {
// logger.error("Failed to write file", err);
// reject(err);
// } else {
// logger.info(
// `The file ${extractedFile.fileHeader.name} was saved to disk.`,
// );
// resolve({
// name: `${extractedFile.fileHeader.name}`,
// path: comicCoversTargetPath,
// fileSize: extractedFile.fileHeader.packSize,
// });
// }
// },
// );
// });
// });
default:
return {
message: "File format not supported, yet.",
@@ -206,3 +225,14 @@ export const walkFolder = async (folder: string): Promise<IFolderData[]> => {
});
return result;
};
export const explodePath = (filePath: string): IExplodedPathResponse => {
const exploded = filePath.split("/");
const fileName = _.remove(exploded, (item) => {
return _.indexOf(exploded, item) === exploded.length - 1;
});
return {
exploded,
fileName,
};
};