🔧 Refactoring unrar for single and multiple file extraction

This commit is contained in:
2021-04-19 12:38:55 -07:00
parent e612eea7fd
commit 33741417c1
2 changed files with 82 additions and 32 deletions

View File

@@ -10,12 +10,18 @@ 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 unrar("./comics/covers/"); const foo = await extractArchive({
name: "Dante's Inferno 02 (2010) (noads) (Legion-CPS).cbr",
extension: ".cbr",
containedIn: "comics/Dante's Inferno",
isFile: true,
isLink: false,
});
// const foo = await extractMetadataFromImage( // const foo = await extractMetadataFromImage(
// "./comics/covers/Ghosts and Ruins-001.jpg", // "./comics/covers/Ghosts and Ruins-001.jpg",
// ); // );
// const foo = await unzipOne(); // const foo = await unzipOne();
const foo = await unzip("asd"); // const foo = await unzip("asd");
res.json({ res.json({
jagan: "trupti", jagan: "trupti",
foo, foo,

View File

@@ -14,46 +14,90 @@ import {
export const unrar = async ( export const unrar = async (
extractionOptions: IExtractionOptions, extractionOptions: IExtractionOptions,
): Promise<IExtractedComicBookCoverFile> => { ): Promise<
IExtractedComicBookCoverFile | IExtractComicBookCoverErrorResponse
> => {
const comicCoversTargetPath = const comicCoversTargetPath =
extractionOptions.sourceFolder + extractionOptions.extractTarget; extractionOptions.sourceFolder +
extractionOptions.targetComicCoversFolder +
"/";
const buf = Uint8Array.from( const buf = Uint8Array.from(
fs.readFileSync( fs.readFileSync(
extractionOptions.sourceFolder + extractionOptions.folderDetails.name, extractionOptions.folderDetails.containedIn +
"/" +
extractionOptions.folderDetails.name,
), ),
).buffer; ).buffer;
const extractor = await unrarer.createExtractorFromData({ data: buf }); const extractor = await unrarer.createExtractorFromData({ data: buf });
const list = extractor.getFileList(); const list = extractor.getFileList();
const fileHeaders = [...list.fileHeaders]; const fileHeaders = [...list.fileHeaders];
// extract the first file only switch (extractionOptions.extractTarget) {
const extracted = extractor.extract({ files: [fileHeaders[0].name] }); // extract the first file only
const files = [...extracted.files]; case "cover":
const extractedFile = files[0]; const arcHeader = extractor.extract({ files: [fileHeaders[0].name] });
const myBuffer = extractedFile.extraction; const file = [...arcHeader.files];
const extractedFile = file[0];
const fileArrayBuffer = extractedFile.extraction;
logger.info(`Attempting to write ${extractedFile.fileHeader.name}`); logger.info(`Attempting to write ${extractedFile.fileHeader.name}`);
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
fs.writeFile( fs.writeFile(
comicCoversTargetPath + extractedFile.fileHeader.name, comicCoversTargetPath + extractedFile.fileHeader.name,
myBuffer, fileArrayBuffer,
(err) => { (err) => {
if (err) { if (err) {
logger.error("Failed to write file", err); logger.error("Failed to write file", err);
reject(err); reject(err);
} else { } else {
logger.info( logger.info(
`The file ${extractedFile.fileHeader.name} was saved to disk.`, `The file ${extractedFile.fileHeader.name} was saved to disk.`,
); );
resolve({ resolve({
name: `${extractedFile.fileHeader.name}`, name: `${extractedFile.fileHeader.name}`,
path: comicCoversTargetPath, path: comicCoversTargetPath,
fileSize: extractedFile.fileHeader.packSize, fileSize: extractedFile.fileHeader.packSize,
}); });
} }
}, },
); );
}); });
case "all":
const extractedFileHeaders = extractor.extract({});
const files = [...extractedFileHeaders.files];
const extractedFiles = files[0];
const filesBuffer = extractedFile.extraction;
logger.info(`Attempting to write ${extractedFiles.fileHeader.name}`);
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.",
errorCode: "90",
data: "asda",
};
}
}; };
export const extractMetadataFromImage = async ( export const extractMetadataFromImage = async (