From 5f3c93da736d2056a0106e211729ffad36a9bbb0 Mon Sep 17 00:00:00 2001 From: Rishi Ghan Date: Fri, 2 Dec 2022 10:30:34 -0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=94=A7=20Refactoring=20uncompression=20me?= =?UTF-8?q?thods.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- constants/directories.ts | 4 +- services/api.service.ts | 4 +- services/library.service.ts | 15 +++-- utils/uncompression.utils.ts | 113 ++++++++++++++++++++++------------- 4 files changed, 83 insertions(+), 53 deletions(-) diff --git a/constants/directories.ts b/constants/directories.ts index c514ca0..c912665 100644 --- a/constants/directories.ts +++ b/constants/directories.ts @@ -1,2 +1,2 @@ -export const COMICS_DIRECTORY = "/comics"; -export const USERDATA_DIRECTORY = "/userdata"; \ No newline at end of file +export const COMICS_DIRECTORY = "./comics"; +export const USERDATA_DIRECTORY = "./userdata"; \ No newline at end of file diff --git a/services/api.service.ts b/services/api.service.ts index f9d7021..c59c829 100644 --- a/services/api.service.ts +++ b/services/api.service.ts @@ -56,12 +56,12 @@ export default class ApiService extends Service { { path: "/userdata", use: [ - ApiGateway.serveStatic(path.resolve("/userdata")), + ApiGateway.serveStatic(path.resolve("./userdata")), ], }, { path: "/comics", - use: [ApiGateway.serveStatic(path.resolve("/comics"))], + use: [ApiGateway.serveStatic(path.resolve("./comics"))], }, { path: "/logs", diff --git a/services/library.service.ts b/services/library.service.ts index 74ba857..f6c726d 100644 --- a/services/library.service.ts +++ b/services/library.service.ts @@ -95,9 +95,12 @@ export default class ImportService extends Service { uncompressFullArchive: { rest: "POST /uncompressFullArchive", params: {}, - handler: async (ctx: Context<{ filePath: string }>) => { + handler: async ( + ctx: Context<{ filePath: string; options: any }> + ) => { return await uncompressEntireArchive( - ctx.params.filePath + ctx.params.filePath, + ctx.params.options ); }, }, @@ -302,17 +305,17 @@ export default class ImportService extends Service { async handler( ctx: Context<{ bundleId: String; - comicObjectId: String, + comicObjectId: String; name: String; size: Number; type: String; }> ) { - console.log(JSON.stringify(ctx.params, null, 2)) + console.log(JSON.stringify(ctx.params, null, 2)); const comicObjectId = new ObjectId( ctx.params.comicObjectId ); - + return new Promise((resolve, reject) => { Comic.findByIdAndUpdate( comicObjectId, @@ -322,7 +325,7 @@ export default class ImportService extends Service { bundleId: ctx.params.bundleId, name: ctx.params.name, size: ctx.params.size, - type: ctx.params.type, + type: ctx.params.type, }, }, }, diff --git a/utils/uncompression.utils.ts b/utils/uncompression.utils.ts index de74bc7..7687e1f 100644 --- a/utils/uncompression.utils.ts +++ b/utils/uncompression.utils.ts @@ -63,6 +63,12 @@ interface RarFile { const UNRAR_BIN_PATH = process.env.UNRAR_BIN_PATH || "/usr/local/bin/unrar"; +/** + * Method that extracts comicInfo.xml file from a .rar archive, if one exists. + * Also extracts the first image in the listing, which is assumed to be the cover. + * @param {string} filePath + * @returns {any} + */ export const extractComicInfoXMLFromRar = async ( filePath: string ): Promise => { @@ -77,7 +83,9 @@ export const extractComicInfoXMLFromRar = async ( }; const { fileNameWithoutExtension, extension } = getFileConstituents(filePath); - const targetDirectory = `${USERDATA_DIRECTORY}/covers/${sanitize(fileNameWithoutExtension)}`; + const targetDirectory = `${USERDATA_DIRECTORY}/covers/${sanitize( + fileNameWithoutExtension + )}`; await createDirectory(directoryOptions, targetDirectory); const archive = new Unrar({ @@ -207,7 +215,9 @@ export const extractComicInfoXMLFromZip = async ( }; const { fileNameWithoutExtension, extension } = getFileConstituents(filePath); - const targetDirectory = `${USERDATA_DIRECTORY}/covers/${sanitize(fileNameWithoutExtension)}`; + const targetDirectory = `${USERDATA_DIRECTORY}/covers/${sanitize( + fileNameWithoutExtension + )}`; await createDirectory(directoryOptions, targetDirectory); let filesToWriteToDisk = { coverFile: null, comicInfoXML: null }; @@ -357,33 +367,46 @@ export const extractFromArchive = async (filePath: string) => { } }; -export const uncompressEntireArchive = async (filePath: string) => { +/** + * Proxy method that calls uncompression on a .zip or a .rar archive and optionally resizes the images contained therein + * @param {string} filePath + * @param {any} options + * @returns {Promise} A promise containing the contents of the uncompressed archive. + */ +export const uncompressEntireArchive = async ( + filePath: string, + options: any +) => { const { extension } = getFileConstituents(filePath); - console.log(extension); switch (extension) { case ".cbz": case ".cb7": - return await uncompressZipArchive(filePath); + return await uncompressZipArchive(filePath, options); case ".cbr": - return await uncompressRarArchive(filePath); + return await uncompressRarArchive(filePath, options); } }; -export const uncompressZipArchive = async (filePath: string) => { +/** + * Method that uncompresses a .zip file + * @param {string} filePath + * @param {any} options + * @returns {any} + */ +export const uncompressZipArchive = async (filePath: string, options: any) => { // Create the target directory const directoryOptions = { mode: 0o2775, }; - const { fileNameWithoutExtension, extension } = - getFileConstituents(filePath); + const { fileNameWithoutExtension } = getFileConstituents(filePath); const targetDirectory = `${USERDATA_DIRECTORY}/expanded/${fileNameWithoutExtension}`; await createDirectory(directoryOptions, targetDirectory); await p7zip.extract(filePath, targetDirectory, [], "", false); - return await resizeImageDirectory(targetDirectory); + return await resizeImageDirectory(targetDirectory, options); }; -export const uncompressRarArchive = async (filePath: string) => { +export const uncompressRarArchive = async (filePath: string, options: any) => { // Create the target directory const directoryOptions = { mode: 0o2775, @@ -421,10 +444,15 @@ export const uncompressRarArchive = async (filePath: string) => { }) ); }); - return Promise.all(extractionPromises); + + await Promise.all(extractionPromises); + return await resizeImageDirectory(targetDirectory, options); }; -export const resizeImageDirectory = async (directoryPath: string) => { +export const resizeImageDirectory = async ( + directoryPath: string, + options: any +) => { const files = await walkFolder(directoryPath, [ ".jpg", ".jpeg", @@ -435,37 +463,36 @@ export const resizeImageDirectory = async (directoryPath: string) => { ]); const resizePromises = []; map(files, (file) => { - resizePromises.push( - new Promise((resolve, reject) => { - const sharpResizeInstance = sharp().resize(275).toFormat("png"); - const resizedStream = createReadStream( - `${directoryPath}/${file.name}${file.extension}` - ); - if ( - fse.existsSync( - `${directoryPath}/${file.name}${file.extension}` - ) - ) { - resizedStream - .pipe(sharpResizeInstance) - .toFile( - `${directoryPath}/${file.name}_275px${file.extension}` - ) - .then((data) => { - console.log( - `Resized image ${JSON.stringify(data, null, 4)}` - ); - fse.unlink( - `${directoryPath}/${file.name}${file.extension}` - ); - resolve( - `${directoryPath}/${file.name}_275px${file.extension}` - ); - }); - } - }) - ); + resizePromises.push(resizeImage(directoryPath, file, options)); }); return await Promise.all(resizePromises); }; + +export const resizeImage = (directoryPath: string, file: any, options: any) => { + const { baseWidth } = options.imageResizeOptions; + const sharpResizeInstance = sharp().resize(baseWidth).toFormat("png"); + return new Promise((resolve, reject) => { + const resizedStream = createReadStream( + `${directoryPath}/${file.name}${file.extension}` + ); + if (fse.existsSync(`${directoryPath}/${file.name}${file.extension}`)) { + resizedStream + .pipe(sharpResizeInstance) + .toFile( + `${directoryPath}/${file.name}_${baseWidth}px${file.extension}` + ) + .then((data) => { + console.log( + `Resized image ${JSON.stringify(data, null, 4)}` + ); + fse.unlink( + `${directoryPath}/${file.name}${file.extension}` + ); + resolve( + `${directoryPath}/${file.name}_${baseWidth}px${file.extension}` + ); + }); + } + }); +};