feat: add local backend server script and frontend application infrastructure

This commit is contained in:
techjarves committed 2026-06-21 20:33:59 +05:30
1 parent b71b4ecafa
commit d5d0c0ac19
7 files changed
+516 -224

No files matched your search

+40 -1
View File
@@ -1821,6 +1821,9 @@ function transcribeWavBuffer(buffer, options = {}) {
} else {
args.push("-l", "auto");
}
if (options.translate) {
args.push("-tr");
}
const startedAt = Date.now();
console.log(" [speech] Starting:", backend.cli, args.join(" "));
@@ -4664,7 +4667,7 @@ const server = http.createServer(async (req, res) => {
}
if (req.url === "/api/speech/stop" && req.method === "POST") {
await runExclusiveSpeechOperation(() => stopSpeech());
await stopSpeech();
return json(res, 200, { ok: true });
}
@@ -4677,6 +4680,7 @@ const server = http.createServer(async (req, res) => {
language: parsed.searchParams.get("language") || "auto",
filename: parsed.searchParams.get("filename") || req.headers["x-filename"] || "recording.wav",
threads: parsed.searchParams.get("threads") || speechSettings.threads,
translate: parsed.searchParams.get("translate") === "true",
}));
return json(res, 200, { ok: true, transcription: result });
} catch (err) {
@@ -4732,6 +4736,41 @@ const server = http.createServer(async (req, res) => {
return json(res, 200, { ok: true, transcriptions: listTranscriptions() });
}
if (req.url === "/api/speech/delete-transcription" && req.method === "POST") {
const body = await readJsonBody(req, res);
if (!body) return;
const filename = path.basename(String(body.filename || ""));
if (!filename || !filename.endsWith(".json")) {
return json(res, 400, { ok: false, error: "Invalid filename" });
}
const jsonPath = path.join(TRANSCRIPTIONS, filename);
if (!pathInside(jsonPath, TRANSCRIPTIONS)) {
return json(res, 400, { ok: false, error: "Invalid path" });
}
try {
if (!fs.existsSync(jsonPath)) {
return json(res, 404, { ok: false, error: "Transcription metadata not found" });
}
const metadata = JSON.parse(fs.readFileSync(jsonPath, "utf8"));
const textFile = metadata.textFile ? path.basename(String(metadata.textFile)) : "";
fs.unlinkSync(jsonPath);
if (textFile) {
const textPath = path.join(TRANSCRIPTIONS, textFile);
if (pathInside(textPath, TRANSCRIPTIONS) && fs.existsSync(textPath)) {
fs.unlinkSync(textPath);
}
}
return json(res, 200, { ok: true });
} catch (err) {
console.error(" [api] Failed to delete transcription:", err);
return json(res, 500, { ok: false, error: err.message });
}
}
function isOomError(msg) {
if (!msg) return false;
const lower = String(msg).toLowerCase();