1
0
mirror of https://github.com/upscayl/upscayl.git synced 2025-02-07 15:01:24 +01:00

Fix macos builds

This commit is contained in:
Nayam Amarshe 2023-11-10 17:11:35 +05:30
parent 076a7191d4
commit e610e7b8a9
13 changed files with 288 additions and 205 deletions

View File

@ -8,7 +8,7 @@ import slash from "../utils/slash";
import COMMAND from "../constants/commands"; import COMMAND from "../constants/commands";
import getModels from "../utils/get-models"; import getModels from "../utils/get-models";
import { getMainWindow } from "../main-window"; import { getMainWindow } from "../main-window";
import { settings } from "../utils/settings"; import settings from "electron-settings";
const customModelsSelect = async (event, message) => { const customModelsSelect = async (event, message) => {
const mainWindow = getMainWindow(); const mainWindow = getMainWindow();
@ -23,11 +23,12 @@ const customModelsSelect = async (event, message) => {
title: "Select Custom Models Folder", title: "Select Custom Models Folder",
defaultPath: customModelsFolderPath, defaultPath: customModelsFolderPath,
securityScopedBookmarks: true, securityScopedBookmarks: true,
message: "Select Custom Models Folder that is named 'models'",
}); });
if (bookmarks && bookmarks.length > 0) { if (bookmarks && bookmarks.length > 0) {
logit("📁 Bookmarks: ", bookmarks); console.log("🚨 Setting Bookmark: ", bookmarks);
settings.set("custom-models-bookmarks", bookmarks[0]); await settings.set("custom-models-bookmarks", bookmarks[0]);
} }
if (canceled) { if (canceled) {
@ -52,10 +53,8 @@ const customModelsSelect = async (event, message) => {
return null; return null;
} }
mainWindow.webContents.send( const models = await getModels(customModelsFolderPath);
COMMAND.CUSTOM_MODEL_FILES_LIST, mainWindow.webContents.send(COMMAND.CUSTOM_MODEL_FILES_LIST, models);
getModels(customModelsFolderPath)
);
logit("📁 Custom Folder Path: ", customModelsFolderPath); logit("📁 Custom Folder Path: ", customModelsFolderPath);
return customModelsFolderPath; return customModelsFolderPath;

View File

@ -15,11 +15,9 @@ const getModelsList = async (event, payload) => {
setCustomModelsFolderPath(payload); setCustomModelsFolderPath(payload);
logit("📁 Custom Models Folder Path: ", customModelsFolderPath); logit("📁 Custom Models Folder Path: ", customModelsFolderPath);
const models = await getModels(payload);
mainWindow.webContents.send( mainWindow.webContents.send(COMMAND.CUSTOM_MODEL_FILES_LIST, models);
COMMAND.CUSTOM_MODEL_FILES_LIST,
getModels(payload)
);
} }
}; };

View File

@ -1,21 +1,37 @@
import { MessageBoxOptions, dialog } from "electron"; import { MessageBoxOptions, app, dialog } from "electron";
import { getMainWindow } from "../main-window"; import { getMainWindow } from "../main-window";
import { imagePath, setImagePath } from "../utils/config-variables"; import { imagePath, setImagePath } from "../utils/config-variables";
import logit from "../utils/logit"; import logit from "../utils/logit";
import { settings } from "../utils/settings"; import settings from "electron-settings";
const selectFile = async () => { const selectFile = async () => {
const mainWindow = getMainWindow(); const mainWindow = getMainWindow();
const { canceled, filePaths, bookmarks } = await dialog.showOpenDialog({ const { canceled, filePaths, bookmarks } = await dialog.showOpenDialog({
properties: ["openFile", "multiSelections"], properties: ["openFile"],
title: "Select Image", title: "Select Image",
defaultPath: imagePath, defaultPath: imagePath,
securityScopedBookmarks: true, securityScopedBookmarks: true,
message: "Select Image to Upscale",
filters: [
{
name: "Images",
extensions: [
"png",
"jpg",
"jpeg",
"webp",
"PNG",
"JPG",
"JPEG",
"WEBP",
],
},
],
}); });
if (bookmarks && bookmarks.length > 0) { if (bookmarks && bookmarks.length > 0) {
logit("📁 Bookmarks: ", bookmarks); console.log("🚨 Setting Bookmark: ", bookmarks);
settings.set("file-bookmarks", bookmarks[0]); settings.set("file-bookmarks", bookmarks[0]);
} }

View File

@ -1,9 +1,22 @@
import { dialog } from "electron"; import { app, dialog } from "electron";
import { folderPath, setFolderPath } from "../utils/config-variables"; import { folderPath, setFolderPath } from "../utils/config-variables";
import logit from "../utils/logit"; import logit from "../utils/logit";
import { settings } from "../utils/settings"; import settings from "electron-settings";
const selectFolder = async (event, message) => { const selectFolder = async (event, message) => {
let closeAccess;
const folderBookmarks = await settings.get("folder-bookmarks");
if (folderBookmarks) {
logit("🚨 Folder Bookmarks: ", folderBookmarks);
try {
closeAccess = app.startAccessingSecurityScopedResource(
folderBookmarks as string
);
} catch (error) {
logit("📁 Folder Bookmarks Error: ", error);
}
}
const { const {
canceled, canceled,
filePaths: folderPaths, filePaths: folderPaths,
@ -15,8 +28,8 @@ const selectFolder = async (event, message) => {
}); });
if (bookmarks && bookmarks.length > 0) { if (bookmarks && bookmarks.length > 0) {
logit("📁 Bookmarks: ", bookmarks); console.log("🚨 Setting folder Bookmark: ", bookmarks);
settings.set("folder-bookmarks", bookmarks[0]); await settings.set("folder-bookmarks", bookmarks[0]);
} }
if (canceled) { if (canceled) {

View File

@ -19,7 +19,7 @@ import doubleUpscayl from "./commands/double-upscayl";
import autoUpdate from "./commands/auto-update"; import autoUpdate from "./commands/auto-update";
import sharp from "sharp"; import sharp from "sharp";
import { featureFlags } from "../common/feature-flags"; import { featureFlags } from "../common/feature-flags";
import { settings } from "./utils/settings"; import settings from "electron-settings";
// INITIALIZATION // INITIALIZATION
log.initialize({ preload: true }); log.initialize({ preload: true });
@ -45,21 +45,17 @@ app.on("ready", async () => {
log.info("🚀 UPSCAYL EXEC PATH: ", execPath("bin")); log.info("🚀 UPSCAYL EXEC PATH: ", execPath("bin"));
log.info("🚀 MODELS PATH: ", modelsPath); log.info("🚀 MODELS PATH: ", modelsPath);
// SECURITY SCOPED BOOKMARKS let closeAccess;
const fileBookmarks = settings.get("file-bookmarks", true); const folderBookmarks = await settings.get("folder-bookmarks");
const folderBookmarks = settings.get("folder-bookmarks", true);
const customModelsBookmarks = settings.get("custom-models-bookmarks", true);
if (fileBookmarks) {
log.info("📁 File Bookmarks: ", fileBookmarks);
app.startAccessingSecurityScopedResource(fileBookmarks);
}
if (folderBookmarks) { if (folderBookmarks) {
log.info("📁 Folder Bookmarks: ", folderBookmarks); logit("🚨 Folder Bookmarks: ", folderBookmarks);
app.startAccessingSecurityScopedResource(folderBookmarks); try {
closeAccess = app.startAccessingSecurityScopedResource(
folderBookmarks as string
);
} catch (error) {
logit("📁 Folder Bookmarks Error: ", error);
} }
if (customModelsBookmarks) {
log.info("📁 Custom Models Bookmarks: ", customModelsBookmarks);
app.startAccessingSecurityScopedResource(customModelsBookmarks);
} }
}); });

View File

@ -1,11 +1,29 @@
import fs from "fs"; import fs from "fs";
import logit from "./logit"; import logit from "./logit";
import { MessageBoxOptions, dialog } from "electron"; import { MessageBoxOptions, app, dialog } from "electron";
import settings from "electron-settings";
const getModels = (folderPath: string | undefined) => { const getModels = async (folderPath: string | undefined) => {
let models: string[] = []; let models: string[] = [];
let isValid = false; let isValid = false;
// SECURITY SCOPED BOOKMARKS
let closeAccess;
const customModelsBookmarks = await settings.get("custom-models-bookmarks");
if (customModelsBookmarks) {
console.log(
"🚀 => file: get-models.ts:18 => customModelsBookmarks:",
customModelsBookmarks
);
try {
closeAccess = app.startAccessingSecurityScopedResource(
customModelsBookmarks as string
);
} catch (error) {
logit("📁 Custom Models Bookmarks Error: ", error);
}
}
if (!folderPath) { if (!folderPath) {
logit("❌ Invalid Custom Model Folder Detected"); logit("❌ Invalid Custom Model Folder Detected");
const options: MessageBoxOptions = { const options: MessageBoxOptions = {

View File

@ -11,8 +11,8 @@ import { getMainWindow } from "../main-window";
* // Set a value * // Set a value
* settings.set("key", value); * settings.set("key", value);
*/ */
export const settings = { export const localStorage = {
get: (key: string, parse: boolean = false): any => { get: <T>(key: string, parse: boolean = false): T | null => {
const mainWindow = getMainWindow(); const mainWindow = getMainWindow();
if (!mainWindow) return null; if (!mainWindow) return null;
let result = null; let result = null;

303
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -225,6 +225,7 @@
"electron-is-dev": "^2.0.0", "electron-is-dev": "^2.0.0",
"electron-log": "^5.0.0-beta.16", "electron-log": "^5.0.0-beta.16",
"electron-next": "^3.1.5", "electron-next": "^3.1.5",
"electron-settings": "^4.0.2",
"electron-updater": "^6.1.4", "electron-updater": "^6.1.4",
"firebase": "^10.3.0", "firebase": "^10.3.0",
"jotai": "^2.2.2", "jotai": "^2.2.2",

View File

@ -5,10 +5,10 @@ export const customModelsPathAtom = atomWithStorage<string | null>(
"customModelsPath", "customModelsPath",
null null
); );
export const scaleAtom = atomWithStorage<"2" | "3" | "4">("scale", "4"); export const scaleAtom = atomWithStorage<"2" | "3" | "4">("scale", "4");
export const batchModeAtom = atom<boolean>(false); export const batchModeAtom = atom<boolean>(false);
export const outputPathAtom = atom<string | null>("");
export const progressAtom = atom<string>("");
export const rememberOutputFolderAtom = atomWithStorage<boolean>( export const rememberOutputFolderAtom = atomWithStorage<boolean>(
"rememberOutputFolder", "rememberOutputFolder",

View File

@ -17,7 +17,7 @@ export function SaveOutputFolderToggle({
</p> </p>
<input <input
type="checkbox" type="checkbox"
className="toggle-primary toggle" className="toggle"
checked={rememberOutputFolder} checked={rememberOutputFolder}
onClick={() => { onClick={() => {
setRememberOutputFolder((oldValue) => { setRememberOutputFolder((oldValue) => {

View File

@ -1,4 +1,4 @@
import { useAtomValue } from "jotai"; import { useAtom, useAtomValue } from "jotai";
import React, { useCallback, useEffect, useMemo, useState } from "react"; import React, { useCallback, useEffect, useMemo, useState } from "react";
import Select from "react-select"; import Select from "react-select";
import { Tooltip } from "react-tooltip"; import { Tooltip } from "react-tooltip";
@ -7,12 +7,13 @@ import { modelsListAtom } from "../../../atoms/modelsListAtom";
import useLog from "../../hooks/useLog"; import useLog from "../../hooks/useLog";
import { import {
noImageProcessingAtom, noImageProcessingAtom,
outputPathAtom,
progressAtom,
scaleAtom, scaleAtom,
} from "../../../atoms/userSettingsAtom"; } from "../../../atoms/userSettingsAtom";
import { featureFlags } from "@common/feature-flags"; import { featureFlags } from "@common/feature-flags";
interface IProps { interface IProps {
progress: string;
selectImageHandler: () => Promise<void>; selectImageHandler: () => Promise<void>;
selectFolderHandler: () => Promise<void>; selectFolderHandler: () => Promise<void>;
handleModelChange: (e: any) => void; handleModelChange: (e: any) => void;
@ -21,7 +22,6 @@ interface IProps {
batchMode: boolean; batchMode: boolean;
setBatchMode: React.Dispatch<React.SetStateAction<boolean>>; setBatchMode: React.Dispatch<React.SetStateAction<boolean>>;
imagePath: string; imagePath: string;
outputPath: string;
doubleUpscayl: boolean; doubleUpscayl: boolean;
setDoubleUpscayl: React.Dispatch<React.SetStateAction<boolean>>; setDoubleUpscayl: React.Dispatch<React.SetStateAction<boolean>>;
dimensions: { dimensions: {
@ -35,7 +35,6 @@ interface IProps {
} }
function LeftPaneImageSteps({ function LeftPaneImageSteps({
progress,
selectImageHandler, selectImageHandler,
selectFolderHandler, selectFolderHandler,
handleModelChange, handleModelChange,
@ -44,7 +43,6 @@ function LeftPaneImageSteps({
batchMode, batchMode,
setBatchMode, setBatchMode,
imagePath, imagePath,
outputPath,
doubleUpscayl, doubleUpscayl,
setDoubleUpscayl, setDoubleUpscayl,
dimensions, dimensions,
@ -64,6 +62,8 @@ function LeftPaneImageSteps({
const modelOptions = useAtomValue(modelsListAtom); const modelOptions = useAtomValue(modelsListAtom);
const scale = useAtomValue(scaleAtom); const scale = useAtomValue(scaleAtom);
const noImageProcessing = useAtomValue(noImageProcessingAtom); const noImageProcessing = useAtomValue(noImageProcessingAtom);
const [outputPath, setOutputPath] = useAtom(outputPathAtom);
const [progress, setProgress] = useAtom(progressAtom);
const { logit } = useLog(); const { logit } = useLog();
@ -162,7 +162,11 @@ function LeftPaneImageSteps({
type="checkbox" type="checkbox"
className="toggle" className="toggle"
defaultChecked={batchMode} defaultChecked={batchMode}
onClick={() => setBatchMode((oldValue) => !oldValue)}></input> onClick={() => {
setOutputPath("");
setProgress("");
setBatchMode((oldValue) => !oldValue);
}}></input>
<p <p
className="mr-1 inline-block cursor-help text-sm" className="mr-1 inline-block cursor-help text-sm"
data-tooltip-id="tooltip" data-tooltip-id="tooltip"
@ -182,7 +186,7 @@ function LeftPaneImageSteps({
</div> </div>
{/* STEP 2 */} {/* STEP 2 */}
<div className="animate-step-in"> <div className="animate-step-in group">
<p className="step-heading">Step 2</p> <p className="step-heading">Step 2</p>
<p className="mb-2 text-sm">Select Model</p> <p className="mb-2 text-sm">Select Model</p>
@ -196,7 +200,7 @@ function LeftPaneImageSteps({
handleModelChange(e); handleModelChange(e);
setCurrentModel({ label: e.label, value: e.value }); setCurrentModel({ label: e.label, value: e.value });
}} }}
className="react-select-container active:w-full focus:w-full hover:w-full transition-all" className="react-select-container group-active:w-full focus:w-full group-hover:w-full transition-all"
classNamePrefix="react-select" classNamePrefix="react-select"
value={currentModel} value={currentModel}
/> />
@ -239,9 +243,9 @@ function LeftPaneImageSteps({
data-tooltip-id="tooltip"> data-tooltip-id="tooltip">
<div className="step-heading flex items-center gap-2"> <div className="step-heading flex items-center gap-2">
<span>Step 3</span> <span>Step 3</span>
{!outputPath && ( {!outputPath && featureFlags.APP_STORE_BUILD && (
<div className="text-xs"> <div className="text-xs">
<span className="bg-error font-medium uppercase text-error-content rounded-btn px-2"> <span className="bg-base-200 font-medium uppercase text-base-content/50 rounded-btn px-2">
Not selected Not selected
</span> </span>
</div> </div>
@ -274,8 +278,11 @@ function LeftPaneImageSteps({
)} )}
<button <button
className="btn-accent btn" className="btn-accent btn"
onClick={upscaylHandler} onClick={
disabled={progress.length > 0 || !outputPath}> progress.length > 0 || !outputPath
? () => alert("Please select an output folder first")
: upscaylHandler
}>
{progress.length > 0 ? "Upscayling⏳" : "Upscayl"} {progress.length > 0 ? "Upscayling⏳" : "Upscayl"}
</button> </button>
</div> </div>

View File

@ -16,6 +16,8 @@ import { modelsListAtom } from "../atoms/modelsListAtom";
import { import {
batchModeAtom, batchModeAtom,
dontShowCloudModalAtom, dontShowCloudModalAtom,
outputPathAtom,
progressAtom,
scaleAtom, scaleAtom,
} from "../atoms/userSettingsAtom"; } from "../atoms/userSettingsAtom";
import useLog from "../components/hooks/useLog"; import useLog from "../components/hooks/useLog";
@ -27,9 +29,9 @@ const Home = () => {
const [os, setOs] = useState<"linux" | "mac" | "win" | undefined>(undefined); const [os, setOs] = useState<"linux" | "mac" | "win" | undefined>(undefined);
const [imagePath, SetImagePath] = useState(""); const [imagePath, SetImagePath] = useState("");
const [upscaledImagePath, setUpscaledImagePath] = useState(""); const [upscaledImagePath, setUpscaledImagePath] = useState("");
const [outputPath, setOutputPath] = useState(""); const [outputPath, setOutputPath] = useAtom(outputPathAtom);
const [scaleFactor] = useState(4); const [scaleFactor] = useState(4);
const [progress, setProgress] = useState(""); const [progress, setProgress] = useAtom(progressAtom);
const [model, setModel] = useState("realesrgan-x4plus"); const [model, setModel] = useState("realesrgan-x4plus");
const [loaded, setLoaded] = useState(false); const [loaded, setLoaded] = useState(false);
const [version, setVersion] = useState(""); const [version, setVersion] = useState("");
@ -77,7 +79,7 @@ const Home = () => {
if (batchMode) return; if (batchMode) return;
alert( alert(
data.includes("encode") data.includes("encode")
? "ENCODING ERROR => " ? `ENCODING ERROR: ${data}`
: "DECODING ERROR => " + : "DECODING ERROR => " +
"This image is possibly corrupt or not supported by Upscayl, or your GPU drivers are acting funny (Did you check if your GPU is compatible and drivers are alright?). You could try converting the image into another format and upscaling again. Also make sure that the output path is correct and you have the proper write permissions for the directory. If not, then unfortuantely there's not much we can do to help, sorry." "This image is possibly corrupt or not supported by Upscayl, or your GPU drivers are acting funny (Did you check if your GPU is compatible and drivers are alright?). You could try converting the image into another format and upscaling again. Also make sure that the output path is correct and you have the proper write permissions for the directory. If not, then unfortuantely there's not much we can do to help, sorry."
); );
@ -175,6 +177,8 @@ const Home = () => {
// CUSTOM FOLDER LISTENER // CUSTOM FOLDER LISTENER
window.electron.on(COMMAND.CUSTOM_MODEL_FILES_LIST, (_, data: string[]) => { window.electron.on(COMMAND.CUSTOM_MODEL_FILES_LIST, (_, data: string[]) => {
console.log("🚀 => file: index.tsx:178 => data:", data);
logit(`📜 CUSTOM_MODEL_FILES_LIST: `, data); logit(`📜 CUSTOM_MODEL_FILES_LIST: `, data);
const newModelOptions = data.map((model) => { const newModelOptions = data.map((model) => {
return { return {
@ -182,7 +186,10 @@ const Home = () => {
label: model, label: model,
}; };
}); });
console.log(
"🚀 => file: index.tsx:185 => newModelOptions:",
newModelOptions
);
// Add newModelsList to modelOptions and remove duplicates // Add newModelsList to modelOptions and remove duplicates
const combinedModelOptions = [...modelOptions, ...newModelOptions]; const combinedModelOptions = [...modelOptions, ...newModelOptions];
const uniqueModelOptions = combinedModelOptions.filter( const uniqueModelOptions = combinedModelOptions.filter(
@ -190,8 +197,13 @@ const Home = () => {
(model, index, array) => (model, index, array) =>
array.findIndex((t) => t.value === model.value) === index array.findIndex((t) => t.value === model.value) === index
); );
console.log(
"🚀 => file: index.tsx:197 => uniqueModelOptions:",
uniqueModelOptions
);
setModelOptions(uniqueModelOptions); setModelOptions(uniqueModelOptions);
}); });
if (!localStorage.getItem("upscaylCloudModalShown")) { if (!localStorage.getItem("upscaylCloudModalShown")) {
logit("⚙️ upscayl cloud show to true"); logit("⚙️ upscayl cloud show to true");
localStorage.setItem("upscaylCloudModalShown", "true"); localStorage.setItem("upscaylCloudModalShown", "true");
@ -210,10 +222,15 @@ const Home = () => {
} }
}, []); }, []);
// CHECK IF OUTPUT FOLDER IS REMEMBERED
useEffect(() => { useEffect(() => {
const rememberOutputFolder = localStorage.getItem("rememberOutputFolder"); const rememberOutputFolder = localStorage.getItem("rememberOutputFolder");
const lastOutputFolderPath = localStorage.getItem("lastOutputFolderPath"); console.log(
"🚀 => file: index.tsx:226 => rememberOutputFolder:",
rememberOutputFolder
);
const lastOutputFolderPath = localStorage.getItem("lastOutputFolderPath");
// GET OVERWRITE // GET OVERWRITE
if (!localStorage.getItem("overwrite")) { if (!localStorage.getItem("overwrite")) {
localStorage.setItem("overwrite", JSON.stringify(overwrite)); localStorage.setItem("overwrite", JSON.stringify(overwrite));
@ -223,8 +240,8 @@ const Home = () => {
setOverwrite(currentlySavedOverwrite === "true"); setOverwrite(currentlySavedOverwrite === "true");
} }
} }
if (rememberOutputFolder === "true") { if (rememberOutputFolder === "true") {
logit("🧠 Recalling Output Folder: ", lastOutputFolderPath);
setOutputPath(lastOutputFolderPath); setOutputPath(lastOutputFolderPath);
} else { } else {
setOutputPath(""); setOutputPath("");
@ -232,11 +249,6 @@ const Home = () => {
} }
}, []); }, []);
useEffect(() => {
setProgress("");
setOutputPath("");
}, [batchMode]);
useEffect(() => { useEffect(() => {
if (imagePath.length > 0) { if (imagePath.length > 0) {
logit("🖼 imagePath: ", imagePath); logit("🖼 imagePath: ", imagePath);
@ -523,7 +535,6 @@ const Home = () => {
{selectedTab === 0 && ( {selectedTab === 0 && (
<LeftPaneImageSteps <LeftPaneImageSteps
progress={progress}
selectImageHandler={selectImageHandler} selectImageHandler={selectImageHandler}
selectFolderHandler={selectFolderHandler} selectFolderHandler={selectFolderHandler}
handleModelChange={handleModelChange} handleModelChange={handleModelChange}
@ -532,7 +543,6 @@ const Home = () => {
batchMode={batchMode} batchMode={batchMode}
setBatchMode={setBatchMode} setBatchMode={setBatchMode}
imagePath={imagePath} imagePath={imagePath}
outputPath={outputPath}
doubleUpscayl={doubleUpscayl} doubleUpscayl={doubleUpscayl}
setDoubleUpscayl={setDoubleUpscayl} setDoubleUpscayl={setDoubleUpscayl}
dimensions={dimensions} dimensions={dimensions}