🧑🏻🔧 Functioning unzip and unrar for .cbz and .cbr archives
This commit is contained in:
@@ -5,14 +5,13 @@ import {
|
|||||||
unrar,
|
unrar,
|
||||||
unzip,
|
unzip,
|
||||||
extractMetadataFromImage,
|
extractMetadataFromImage,
|
||||||
unzipOne,
|
|
||||||
explodePath,
|
explodePath,
|
||||||
} from "../../utils/fs.utils";
|
} from "../../utils/fs.utils";
|
||||||
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 options = {
|
const options = {
|
||||||
name: "Gyo v01 (2003) (Digital) (LostNerevarine-Empire)",
|
name: "Gyo v02 (2004) (Digital) (LostNerevarine-Empire)",
|
||||||
extension: ".cbz",
|
extension: ".cbz",
|
||||||
containedIn: "comics/ITOU Junji - Gyo",
|
containedIn: "comics/ITOU Junji - Gyo",
|
||||||
isFile: true,
|
isFile: true,
|
||||||
@@ -22,7 +21,7 @@ router.route("/getComicCovers").get(async (req: Request, res: Response) => {
|
|||||||
// 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(options);
|
||||||
// const foo = await unzip("asd");
|
// const foo = await unzip("asd");
|
||||||
// const foo = explodePath("Chapter Three/HELLBOY - The Chained Coffin - 069.jpg");
|
// const foo = explodePath("Chapter Three/HELLBOY - The Chained Coffin - 069.jpg");
|
||||||
res.json({
|
res.json({
|
||||||
|
|||||||
@@ -1,8 +1,9 @@
|
|||||||
import { default as unzipper } from "unzipper";
|
|
||||||
const sharp = require("sharp");
|
const sharp = require("sharp");
|
||||||
const unrarer = require("node-unrar-js");
|
const unrarer = require("node-unrar-js");
|
||||||
const Walk = require("@root/walk");
|
const Walk = require("@root/walk");
|
||||||
const fse = require("fs-extra");
|
const fse = require("fs-extra");
|
||||||
|
|
||||||
|
import { default as unzipper } from "unzipper";
|
||||||
import { createReadStream, createWriteStream } from "fs";
|
import { createReadStream, createWriteStream } from "fs";
|
||||||
const { writeFile, readFile } = require("fs").promises;
|
const { writeFile, readFile } = require("fs").promises;
|
||||||
import path from "path";
|
import path from "path";
|
||||||
@@ -99,7 +100,6 @@ export const unrar = async (
|
|||||||
resolve(comicBookCoverFiles);
|
resolve(comicBookCoverFiles);
|
||||||
});
|
});
|
||||||
|
|
||||||
// });
|
|
||||||
default:
|
default:
|
||||||
return {
|
return {
|
||||||
message: "File format not supported, yet.",
|
message: "File format not supported, yet.",
|
||||||
@@ -122,7 +122,9 @@ export const extractMetadataFromImage = async (
|
|||||||
|
|
||||||
export const unzip = async (
|
export const unzip = async (
|
||||||
extractionOptions: IExtractionOptions,
|
extractionOptions: IExtractionOptions,
|
||||||
): Promise<IExtractedComicBookCoverFile[]> => {
|
): Promise<
|
||||||
|
IExtractedComicBookCoverFile[] | IExtractComicBookCoverErrorResponse
|
||||||
|
> => {
|
||||||
const extractedFiles: IExtractedComicBookCoverFile[] = [];
|
const extractedFiles: IExtractedComicBookCoverFile[] = [];
|
||||||
const directoryOptions = {
|
const directoryOptions = {
|
||||||
mode: 0o2775,
|
mode: 0o2775,
|
||||||
@@ -144,49 +146,61 @@ export const unzip = async (
|
|||||||
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.`);
|
||||||
for await (const entry of zip) {
|
|
||||||
const fileName = explodePath(entry.path).fileName;
|
|
||||||
const size = entry.vars.uncompressedSize; // There is also compressedSize;
|
|
||||||
|
|
||||||
if (fileName !== "") {
|
|
||||||
entry.pipe(createWriteStream(targetPath + "/" + fileName));
|
|
||||||
}
|
|
||||||
extractedFiles.push({
|
|
||||||
name: fileName,
|
|
||||||
fileSize: size,
|
|
||||||
path: targetPath,
|
|
||||||
});
|
|
||||||
entry.autodrain();
|
|
||||||
}
|
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
logger.error(`${error} Couldn't create directory.`);
|
logger.error(`${error} Couldn't create directory.`);
|
||||||
}
|
}
|
||||||
|
|
||||||
return new Promise(async (resolve, reject) => {
|
switch (extractionOptions.extractTarget) {
|
||||||
logger.info("");
|
case "all":
|
||||||
resolve(extractedFiles);
|
for await (const entry of zip) {
|
||||||
});
|
const fileName = explodePath(entry.path).fileName;
|
||||||
};
|
const size = entry.vars.uncompressedSize;
|
||||||
|
|
||||||
export const unzipOne = async (
|
if (fileName !== "") {
|
||||||
extractionOptions: IExtractionOptions,
|
entry.pipe(createWriteStream(targetPath + "/" + fileName));
|
||||||
): Promise<IExtractedComicBookCoverFile> => {
|
}
|
||||||
const directory = await unzipper.Open.file(
|
extractedFiles.push({
|
||||||
"./comics/Lovecraft - The Myth of Cthulhu (2018) (Maroto) (fylgja).cbz",
|
name: fileName,
|
||||||
);
|
fileSize: size,
|
||||||
return new Promise((resolve, reject) => {
|
path: targetPath,
|
||||||
directory.files[0]
|
});
|
||||||
.stream()
|
entry.autodrain();
|
||||||
.pipe(createWriteStream("./comics/covers/yelaveda.jpg"))
|
}
|
||||||
.on("error", reject)
|
|
||||||
.on("finish", () =>
|
return new Promise(async (resolve, reject) => {
|
||||||
resolve({
|
logger.info("");
|
||||||
name: directory.files[0].path,
|
resolve(extractedFiles);
|
||||||
fileSize: directory.files[0].uncompressedSize,
|
});
|
||||||
path: "ll",
|
|
||||||
}),
|
case "cover":
|
||||||
);
|
for await (const entry of zip) {
|
||||||
});
|
const fileName = explodePath(entry.path).fileName;
|
||||||
|
|
||||||
|
if (fileName !== "" && entry.type !== "Directory") {
|
||||||
|
const size = entry.vars.uncompressedSize;
|
||||||
|
entry.pipe(createWriteStream(targetPath + "/" + fileName));
|
||||||
|
extractedFiles.push({
|
||||||
|
name: fileName,
|
||||||
|
fileSize: size,
|
||||||
|
path: targetPath,
|
||||||
|
});
|
||||||
|
entry.autodrain();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return new Promise(async (resolve, reject) => {
|
||||||
|
logger.info("");
|
||||||
|
resolve(extractedFiles);
|
||||||
|
});
|
||||||
|
|
||||||
|
default:
|
||||||
|
return {
|
||||||
|
message: "File format not supported, yet.",
|
||||||
|
errorCode: "90",
|
||||||
|
data: "asda",
|
||||||
|
};
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
export const extractArchive = async (
|
export const extractArchive = async (
|
||||||
@@ -197,7 +211,7 @@ export const extractArchive = async (
|
|||||||
| IExtractComicBookCoverErrorResponse
|
| IExtractComicBookCoverErrorResponse
|
||||||
> => {
|
> => {
|
||||||
const sourceFolder = "./comics";
|
const sourceFolder = "./comics";
|
||||||
const targetExtractionFolder = "expanded";
|
const targetExtractionFolder = "covers";
|
||||||
const extractionOptions: IExtractionOptions = {
|
const extractionOptions: IExtractionOptions = {
|
||||||
folderDetails: fileObject,
|
folderDetails: fileObject,
|
||||||
extractTarget: "cover",
|
extractTarget: "cover",
|
||||||
@@ -245,10 +259,7 @@ export const explodePath = (filePath: string): IExplodedPathResponse => {
|
|||||||
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("");
|
}).join("");
|
||||||
console.log({
|
|
||||||
exploded,
|
|
||||||
fileName,
|
|
||||||
});
|
|
||||||
return {
|
return {
|
||||||
exploded,
|
exploded,
|
||||||
fileName,
|
fileName,
|
||||||
|
|||||||
Reference in New Issue
Block a user