Introduce libSquoosh

This commit is contained in:
Surma
2021-05-19 12:15:00 +01:00
parent 25754b91b7
commit 392aced394
19 changed files with 86 additions and 100 deletions

12
cli/package-lock.json generated
View File

@@ -4,13 +4,6 @@
"lockfileVersion": 1,
"requires": true,
"dependencies": {
"@squoosh/api": {
"version": "file:../api/squoosh-api-0.1.0.tgz",
"integrity": "sha512-fraw9j1Qq4MKhiA3VF+8djKcvgV42qCWaMQvLjfkn3r7jpFjAlHhoyHNpkfLDunKY3M55BHpBdn2/ozXZWt8kw==",
"requires": {
"web-streams-polyfill": "^3.0.3"
}
},
"ansi-regex": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
@@ -247,11 +240,6 @@
"requires": {
"defaults": "^1.0.3"
}
},
"web-streams-polyfill": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.0.3.tgz",
"integrity": "sha512-d2H/t0eqRNM4w2WvmTdoeIvzAUSpK7JmATB8Nr2lb7nQ9BTIJVjbQ/TRFVEh2gUH1HwclPdoPtfMoFfetXaZnA=="
}
}
}

View File

@@ -15,7 +15,7 @@
"author": "Google Chrome Developers <chromium-dev@google.com>",
"license": "Apache-2.0",
"dependencies": {
"@squoosh/api": "0.1.0",
"@squoosh/lib": "0.1.0",
"commander": "^7.2.0",
"json5": "^2.2.0",
"kleur": "^4.1.4",

View File

@@ -7,8 +7,7 @@ import { promises as fsp } from 'fs';
import ora from 'ora';
import kleur from 'kleur';
//Replace package name with '../../api/build/index.js' to test unpublished changes in the API
import { ImagePool, preprocessors, encoders } from '@squoosh/api';
import { ImagePool, preprocessors, encoders } from '@squoosh/lib';
function clamp(v, min, max) {
if (v < min) return min;
@@ -55,9 +54,9 @@ function progressTracker(results) {
for (const result of results.values()) {
out += `\n ${kleur.cyan(result.file)}: ${prettyPrintSize(result.size)}`;
for (const { outputFile, size: outputSize, infoText } of result.outputs) {
out += `\n ${kleur.dim('└')} ${kleur.cyan(outputFile.padEnd(5))}${prettyPrintSize(
outputSize,
)}`;
out += `\n ${kleur.dim('└')} ${kleur.cyan(
outputFile.padEnd(5),
)}${prettyPrintSize(outputSize)}`;
const percent = ((outputSize / result.size) * 100).toPrecision(3);
out += ` (${kleur[outputSize > result.size ? 'red' : 'green'](
percent + '%',
@@ -76,7 +75,7 @@ async function getInputFiles(paths) {
for (const inputPath of paths) {
const files = (await fsp.lstat(inputPath)).isDirectory()
? (await fsp.readdir(inputPath)).map(file => path.join(inputPath, file))
? (await fsp.readdir(inputPath)).map((file) => path.join(inputPath, file))
: [inputPath];
for (const file of files) {
try {
@@ -135,17 +134,21 @@ async function processFiles(files) {
if (!program.opts()[preprocessorName]) {
continue;
}
preprocessOptions[preprocessorName] = JSON5.parse(program.opts()[preprocessorName]);
preprocessOptions[preprocessorName] = JSON5.parse(
program.opts()[preprocessorName],
);
}
for(const image of decodedFiles){
for (const image of decodedFiles) {
image.preprocess(preprocessOptions);
}
await Promise.all(decodedFiles.map( (image) => image.decoded ));
await Promise.all(decodedFiles.map((image) => image.decoded));
progress.progressOffset = decoded;
progress.setStatus('Encoding ' + kleur.dim(`(${imagePool.workerPool.numWorkers} threads)`));
progress.setStatus(
'Encoding ' + kleur.dim(`(${imagePool.workerPool.numWorkers} threads)`),
);
progress.setProgress(0, files.length);
const jobs = [];
@@ -155,34 +158,37 @@ async function processFiles(files) {
const originalFile = results.get(image).file;
const encodeOptions = {
optimizerButteraugliTarget: Number(program.opts().optimizerButteraugliTarget),
optimizerButteraugliTarget: Number(
program.opts().optimizerButteraugliTarget,
),
maxOptimizerRounds: Number(program.opts().maxOptimizerRounds),
}
};
for (const encName of Object.keys(encoders)) {
if (!program.opts()[encName]) {
continue;
}
const encParam = program.opts()[encName];
const encConfig = encParam.toLowerCase() === 'auto' ? 'auto' : JSON5.parse(encParam);
const encConfig =
encParam.toLowerCase() === 'auto' ? 'auto' : JSON5.parse(encParam);
encodeOptions[encName] = encConfig;
}
jobsStarted++;
const job = image.encode(encodeOptions)
.then(async () => {
jobsFinished++;
const outputPath = path.join(program.opts().outputDir, program.opts().suffix + path.basename(originalFile, path.extname(originalFile)));
for(const output of Object.values(image.encodedWith)){
const outputFile = `${outputPath}.${(await output).extension}`;
await fsp.writeFile(outputFile, (await output).binary);
results.get(image).outputs.push(
Object.assign(
await output,
{outputFile},
)
);
}
progress.setProgress(jobsFinished, jobsStarted);
});
const job = image.encode(encodeOptions).then(async () => {
jobsFinished++;
const outputPath = path.join(
program.opts().outputDir,
program.opts().suffix +
path.basename(originalFile, path.extname(originalFile)),
);
for (const output of Object.values(image.encodedWith)) {
const outputFile = `${outputPath}.${(await output).extension}`;
await fsp.writeFile(outputFile, (await output).binary);
results
.get(image)
.outputs.push(Object.assign(await output, { outputFile }));
}
progress.setProgress(jobsFinished, jobsStarted);
});
jobs.push(job);
}
@@ -194,8 +200,6 @@ async function processFiles(files) {
progress.finish('Squoosh results:');
}
program
.name('squoosh-cli')
.arguments('<files...>')
@@ -226,5 +230,3 @@ for (const [key, value] of Object.entries(encoders)) {
}
program.parse(process.argv);