Files
everyone-can-use-english/enjoy/src/main/settings.ts
an-lee cec9d73bc8 Feat: transcribe from web (#204)
* 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
2024-01-27 00:45:06 +08:00

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,
};