From bc3e47a535fd4761b5241e50106e381d73cb28f7 Mon Sep 17 00:00:00 2001 From: vboechat Date: Tue, 21 May 2024 19:16:28 -0300 Subject: [PATCH] feat: add code files --- src/conversors/conversor.ts | 13 +++++++++++++ src/conversors/convert-image.ts | 29 +++++++++++++++++++++++++++++ src/conversors/to-jpg.ts | 10 ++++++++++ src/conversors/to-png.ts | 10 ++++++++++ src/index.ts | 22 ++++++++++++++++++++++ 5 files changed, 84 insertions(+) create mode 100644 src/conversors/conversor.ts create mode 100644 src/conversors/convert-image.ts create mode 100644 src/conversors/to-jpg.ts create mode 100644 src/conversors/to-png.ts create mode 100644 src/index.ts diff --git a/src/conversors/conversor.ts b/src/conversors/conversor.ts new file mode 100644 index 0000000..432d100 --- /dev/null +++ b/src/conversors/conversor.ts @@ -0,0 +1,13 @@ +import { readdirSync } from "fs"; +import { extname } from "path"; +import { convertImage } from "./convert-image"; + +export const convertImagesInFolder = async (folderPath: string, outputFormat: string = 'png') => { + const files = readdirSync(folderPath); + const isHeicFile = (file: string) => extname(file).toLowerCase() === '.heic'; + const heicFiles = files.filter(isHeicFile); + + const conversionPromises = heicFiles.map(file => convertImage(file, folderPath, outputFormat)); + + await Promise.all(conversionPromises); +}; diff --git a/src/conversors/convert-image.ts b/src/conversors/convert-image.ts new file mode 100644 index 0000000..5f9b064 --- /dev/null +++ b/src/conversors/convert-image.ts @@ -0,0 +1,29 @@ +import { join, basename, extname } from 'path'; +import { convertHeicToPng } from './to-png'; +import { convertHeicToJpg } from './to-jpg'; +import { handleError } from '../lib/error-handler'; + +export const convertImage = (file: string, folderPath: string, outputFormat: string) => { + const extension = extname(file).toLowerCase(); + if (extension !== '.heic') return; + + const inputPath = join(folderPath, file); + const outputFilename = `${basename(file, extension)}.${outputFormat}`; + const outputPath = join(folderPath, outputFilename); + + const conversionFunction = { + 'png': convertHeicToPng, + 'jpg': convertHeicToJpg, + 'jpeg': convertHeicToJpg + }[outputFormat]; + + if (!conversionFunction) { + console.log(`Unsupported format: ${outputFormat}`); + return; + } + + return handleError(async () => { + await conversionFunction(inputPath, outputPath); + console.log(`Converted ${file} to ${outputFilename}`); + }); +}; diff --git a/src/conversors/to-jpg.ts b/src/conversors/to-jpg.ts new file mode 100644 index 0000000..00ee814 --- /dev/null +++ b/src/conversors/to-jpg.ts @@ -0,0 +1,10 @@ +import sharp from "sharp"; +import { handleError } from "../lib/error-handler"; + +export const convertHeicToJpg = (inputPath: string, outputPath: string) => { + return handleError(async () => { + return await sharp(inputPath) + .jpeg({ quality: 100 }) + .toFile(outputPath) +}); +}; diff --git a/src/conversors/to-png.ts b/src/conversors/to-png.ts new file mode 100644 index 0000000..0847baf --- /dev/null +++ b/src/conversors/to-png.ts @@ -0,0 +1,10 @@ +import sharp from "sharp"; +import { handleError } from "../lib/error-handler"; + +export const convertHeicToPng = (inputPath: string, outputPath: string) => { + return handleError(async () => { + await sharp(inputPath) + .png({ quality: 100, compressionLevel: 0 }) + .toFile(outputPath); + }); +}; diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 0000000..55ca557 --- /dev/null +++ b/src/index.ts @@ -0,0 +1,22 @@ +#!/usr/bin/env node + +import { Command } from 'commander'; +import { convertImagesInFolder } from './conversors/conversor'; +import { getPackageVersion } from './lib/versioning'; + +const program = new Command(); + +program + .version(getPackageVersion()) + .description('Convert HEIC images to PNG or JPG') + .requiredOption('-f, --format ', 'Output format (png or jpg)') + .requiredOption('-p, --path ', 'Path to the folder containing HEIC images') + .action((options) => { + const { format, path: folderPath } = options; + + convertImagesInFolder(folderPath, format) + .then(() => console.log('Conversion complete')) + .catch(error => console.error('Error during conversion:', error)); + }); + +program.parse(process.argv);