* add transcribe from web * transcribe from web * add azure speech ai * fix azure speech output * may select stt service * fix UI * remove debug code * lint * fix default stt service * tweak * fix secondsToTimestamp
181 lines
4.4 KiB
TypeScript
181 lines
4.4 KiB
TypeScript
import settings from "electron-settings";
|
|
import { LIBRARY_PATH_SUFFIX, DATABASE_NAME } from "@/constants";
|
|
import { ipcMain, app } from "electron";
|
|
import path from "path";
|
|
import fs from "fs-extra";
|
|
import os from "os";
|
|
import commandExists from "command-exists";
|
|
import log from "electron-log";
|
|
import * as i18n from "i18next";
|
|
|
|
const logger = log.scope("settings");
|
|
|
|
const language = () => {
|
|
const _language = settings.getSync("language");
|
|
|
|
if (!_language || typeof _language !== "string") {
|
|
settings.setSync("language", "en");
|
|
}
|
|
|
|
return settings.getSync("language") as string;
|
|
};
|
|
|
|
const switchLanguage = (language: string) => {
|
|
settings.setSync("language", language);
|
|
i18n.changeLanguage(language);
|
|
};
|
|
|
|
const libraryPath = () => {
|
|
const _library = settings.getSync("library");
|
|
|
|
if (!_library || typeof _library !== "string") {
|
|
settings.setSync(
|
|
"library",
|
|
path.join(app.getPath("documents"), LIBRARY_PATH_SUFFIX)
|
|
);
|
|
} else if (path.parse(_library).base !== LIBRARY_PATH_SUFFIX) {
|
|
settings.setSync("library", path.join(_library, LIBRARY_PATH_SUFFIX));
|
|
}
|
|
|
|
const library = settings.getSync("library") as string;
|
|
fs.ensureDirSync(library);
|
|
|
|
return library;
|
|
};
|
|
|
|
const cachePath = () => {
|
|
const tmpDir = path.join(libraryPath(), "cache");
|
|
fs.ensureDirSync(tmpDir);
|
|
|
|
return tmpDir;
|
|
};
|
|
|
|
const dbPath = () => {
|
|
const dbName = app.isPackaged
|
|
? `${DATABASE_NAME}.sqlite`
|
|
: `${DATABASE_NAME}_dev.sqlite`;
|
|
return path.join(userDataPath(), dbName);
|
|
};
|
|
|
|
const whisperConfig = (): WhisperConfigType => {
|
|
const model = settings.getSync("whisper.model") as string;
|
|
|
|
let service = settings.getSync(
|
|
"whisper.service"
|
|
) as WhisperConfigType["service"];
|
|
|
|
if (!service) {
|
|
if (model) {
|
|
settings.setSync("whisper.service", "local");
|
|
service = "local";
|
|
} else {
|
|
settings.setSync("whisper.service", "azure");
|
|
service = "azure";
|
|
}
|
|
}
|
|
|
|
return {
|
|
service,
|
|
availableModels: settings.getSync(
|
|
"whisper.availableModels"
|
|
) as WhisperConfigType["availableModels"],
|
|
modelsPath: settings.getSync("whisper.modelsPath") as string,
|
|
model,
|
|
};
|
|
};
|
|
|
|
const userDataPath = () => {
|
|
const userData = path.join(
|
|
libraryPath(),
|
|
settings.getSync("user.id").toString()
|
|
);
|
|
fs.ensureDirSync(userData);
|
|
|
|
return userData;
|
|
};
|
|
|
|
const ffmpegConfig = () => {
|
|
const ffmpegPath = settings.getSync("ffmpeg.ffmpegPath");
|
|
const ffprobePath = settings.getSync("ffmpeg.ffprobePath");
|
|
|
|
const _commandExists =
|
|
commandExists.sync("ffmpeg") && commandExists.sync("ffprobe");
|
|
|
|
const config = {
|
|
os: os.platform(),
|
|
arch: os.arch(),
|
|
commandExists: _commandExists,
|
|
ffmpegPath,
|
|
ffprobePath,
|
|
ready: Boolean(_commandExists || (ffmpegPath && ffprobePath)),
|
|
};
|
|
|
|
logger.info("ffmpeg config", config);
|
|
|
|
return config;
|
|
};
|
|
|
|
export default {
|
|
registerIpcHandlers: () => {
|
|
ipcMain.handle("settings-get-library", (_event) => {
|
|
libraryPath();
|
|
return settings.getSync("library");
|
|
});
|
|
|
|
ipcMain.handle("settings-set-library", (_event, library) => {
|
|
if (path.parse(library).base === LIBRARY_PATH_SUFFIX) {
|
|
settings.setSync("library", library);
|
|
} else {
|
|
const dir = path.join(library, LIBRARY_PATH_SUFFIX);
|
|
fs.ensureDirSync(dir);
|
|
settings.setSync("library", dir);
|
|
}
|
|
});
|
|
|
|
ipcMain.handle("settings-get-user", (_event) => {
|
|
return settings.getSync("user");
|
|
});
|
|
|
|
ipcMain.handle("settings-set-user", (_event, user) => {
|
|
settings.setSync("user", user);
|
|
});
|
|
|
|
ipcMain.handle("settings-get-whisper-model", (_event) => {
|
|
return settings.getSync("whisper.model");
|
|
});
|
|
|
|
ipcMain.handle("settings-set-whisper-model", (_event, model) => {
|
|
settings.setSync("whisper.model", model);
|
|
});
|
|
|
|
ipcMain.handle("settings-get-user-data-path", (_event) => {
|
|
return userDataPath();
|
|
});
|
|
|
|
ipcMain.handle("settings-get-llm", (_event, provider) => {
|
|
return settings.getSync(provider);
|
|
});
|
|
|
|
ipcMain.handle("settings-set-llm", (_event, provider, config) => {
|
|
return settings.setSync(provider, config);
|
|
});
|
|
|
|
ipcMain.handle("settings-get-language", (_event) => {
|
|
return language();
|
|
});
|
|
|
|
ipcMain.handle("settings-switch-language", (_event, language) => {
|
|
switchLanguage(language);
|
|
});
|
|
},
|
|
cachePath,
|
|
libraryPath,
|
|
userDataPath,
|
|
dbPath,
|
|
whisperConfig,
|
|
ffmpegConfig,
|
|
language,
|
|
switchLanguage,
|
|
...settings,
|
|
};
|