1
0
mirror of https://github.com/upscayl/upscayl.git synced 2024-12-18 10:26:04 +01:00
upscayl/electron/commands/double-upscayl.ts

210 lines
6.1 KiB
TypeScript
Raw Normal View History

import path, { parse } from "path";
import { getMainWindow } from "../main-window";
import {
childProcesses,
2024-04-09 20:11:24 +02:00
savedCustomModelsPath,
savedOutputPath,
rememberOutputFolder,
2023-11-23 06:39:46 +01:00
setCompression,
2023-11-22 16:54:02 +01:00
setNoImageProcessing,
setStopped,
stopped,
} from "../utils/config-variables";
import slash from "../utils/slash";
import { spawnUpscayl } from "../utils/spawn-upscayl";
import {
getDoubleUpscaleArguments,
getDoubleUpscaleSecondPassArguments,
} from "../utils/get-arguments";
import { modelsPath } from "../utils/get-resource-paths";
import logit from "../utils/logit";
import COMMAND from "../../common/commands";
2023-11-22 16:54:02 +01:00
import { DoubleUpscaylPayload } from "../../common/types/types";
2024-04-24 12:34:32 +02:00
import { ImageFormat } from "../types/types";
import showNotification from "../utils/show-notification";
import { DEFAULT_MODELS } from "../../common/models-list";
2023-11-22 16:54:02 +01:00
const doubleUpscayl = async (event, payload: DoubleUpscaylPayload) => {
const mainWindow = getMainWindow();
if (!mainWindow) return;
const model = payload.model as string;
const imagePath = payload.imagePath;
let inputDir = (imagePath.match(/(.*)[\/\\]/) || [""])[1];
let outputDir = path.normalize(payload.outputPath);
2024-04-09 20:11:24 +02:00
if (rememberOutputFolder === true && savedOutputPath) {
outputDir = savedOutputPath;
}
const gpuId = payload.gpuId as string;
const saveImageAs = payload.saveImageAs as ImageFormat;
2023-11-22 16:54:02 +01:00
setNoImageProcessing(payload.noImageProcessing);
2023-11-23 06:39:46 +01:00
setCompression(parseInt(payload.compression));
2023-11-22 16:54:02 +01:00
const isDefaultModel = DEFAULT_MODELS.includes(model);
// COPY IMAGE TO TMP FOLDER
const fullfileName = imagePath.split(slash).slice(-1)[0] as string;
const fileName = parse(fullfileName).name;
2024-04-09 20:11:24 +02:00
const scale = parseInt(payload.scale) * parseInt(payload.scale);
2024-04-20 17:44:42 +02:00
const useCustomWidth = payload.useCustomWidth;
const customWidth = useCustomWidth ? payload.customWidth : "";
2023-09-11 05:57:16 +02:00
const outFile =
2024-04-21 19:40:54 +02:00
outputDir +
slash +
fileName +
"_upscayl_" +
(useCustomWidth ? `${customWidth}px_` : `${scale}x_`) +
model +
"." +
saveImageAs;
2023-09-11 05:57:16 +02:00
// UPSCALE
let upscayl = spawnUpscayl(
2024-04-09 20:11:24 +02:00
getDoubleUpscaleArguments({
inputDir,
fullfileName,
outFile,
2024-04-09 20:11:24 +02:00
modelsPath: isDefaultModel
? modelsPath
: savedCustomModelsPath ?? modelsPath,
model,
gpuId,
saveImageAs,
2024-04-09 20:11:24 +02:00
}),
2024-02-08 15:57:35 +01:00
logit,
);
childProcesses.push(upscayl);
setStopped(false);
let failed = false;
let failed2 = false;
const onData = (data) => {
if (!mainWindow) return;
// CONVERT DATA TO STRING
data = data.toString();
// SEND UPSCAYL PROGRESS TO RENDERER
mainWindow.webContents.send(COMMAND.DOUBLE_UPSCAYL_PROGRESS, data);
// IF PROGRESS HAS ERROR, UPSCAYL FAILED
2024-04-08 20:47:08 +02:00
if (data.includes("Error") || data.includes("failed")) {
upscayl.kill();
failed = true;
} else if (data.includes("Resizing")) {
mainWindow.webContents.send(COMMAND.SCALING_AND_CONVERTING);
}
// if (data.includes("alpha channel")) {
// isAlpha = true;
// }
};
const onError = (data) => {
if (!mainWindow) return;
mainWindow.setProgressBar(-1);
data.toString();
// SEND UPSCAYL PROGRESS TO RENDERER
mainWindow.webContents.send(COMMAND.DOUBLE_UPSCAYL_PROGRESS, data);
// SET FAILED TO TRUE
failed = true;
mainWindow &&
mainWindow.webContents.send(
COMMAND.UPSCAYL_ERROR,
2024-02-08 15:57:35 +01:00
"Error upscaling image. Error: " + data,
);
showNotification("Upscayl Failure", "Failed to upscale image!");
upscayl.kill();
return;
};
const onClose2 = async (code) => {
if (!mainWindow) return;
if (!failed2 && !stopped) {
logit("💯 Done upscaling");
2023-09-19 17:04:31 +02:00
try {
mainWindow.setProgressBar(-1);
mainWindow.webContents.send(
COMMAND.DOUBLE_UPSCAYL_DONE,
outFile.replace(
/([^/\\]+)$/i,
2024-02-08 15:57:35 +01:00
encodeURIComponent(outFile.match(/[^/\\]+$/i)![0]),
),
);
showNotification("Upscayled", "Image upscayled successfully!");
} catch (error) {
logit("❌ Error reading original image metadata", error);
mainWindow &&
mainWindow.webContents.send(
COMMAND.UPSCAYL_ERROR,
2023-10-14 10:41:57 +02:00
"Error processing (scaling and converting) the image. Please report this error on Upscayl GitHub Issues page.\n" +
2024-02-08 15:57:35 +01:00
error,
);
showNotification("Upscayl Failure", "Failed to upscale image!");
upscayl.kill();
}
}
};
upscayl.process.stderr.on("data", onData);
upscayl.process.on("error", onError);
upscayl.process.on("close", (code) => {
// IF NOT FAILED
if (!failed && !stopped) {
// UPSCALE
let upscayl2 = spawnUpscayl(
2024-04-09 20:11:24 +02:00
getDoubleUpscaleSecondPassArguments({
outFile,
2024-04-09 20:11:24 +02:00
modelsPath: isDefaultModel
? modelsPath
: savedCustomModelsPath ?? modelsPath,
model,
gpuId,
saveImageAs,
2024-04-09 20:11:24 +02:00
scale: scale.toString(),
2024-04-20 17:44:42 +02:00
customWidth,
2024-04-09 20:11:24 +02:00
}),
2024-02-08 15:57:35 +01:00
logit,
);
childProcesses.push(upscayl2);
upscayl2.process.stderr.on("data", (data) => {
if (!mainWindow) return;
// CONVERT DATA TO STRING
data = data.toString();
// SEND UPSCAYL PROGRESS TO RENDERER
mainWindow.webContents.send(COMMAND.DOUBLE_UPSCAYL_PROGRESS, data);
// IF PROGRESS HAS ERROR, UPSCAYL FAILED
if (data.includes("invalid gpu") || data.includes("failed")) {
upscayl2.kill();
failed2 = true;
}
});
upscayl2.process.on("error", (data) => {
if (!mainWindow) return;
data.toString();
// SEND UPSCAYL PROGRESS TO RENDERER
mainWindow.webContents.send(COMMAND.DOUBLE_UPSCAYL_PROGRESS, data);
// SET FAILED TO TRUE
failed2 = true;
mainWindow &&
mainWindow.webContents.send(
COMMAND.UPSCAYL_ERROR,
2024-02-08 15:57:35 +01:00
"Error upscaling image. Error: " + data,
);
showNotification("Upscayl Failure", "Failed to upscale image!");
upscayl2.kill();
return;
});
upscayl2.process.on("close", onClose2);
}
});
};
export default doubleUpscayl;