From 916b5d304f58dc4006414b1e7e56cae6c8d539d5 Mon Sep 17 00:00:00 2001 From: Tom Boullay Date: Sun, 10 May 2026 00:23:37 +0100 Subject: [PATCH] update: save srt files --- src/components/editor/EditorSrtPanel.tsx | 46 +++++++++++++- src/index.css | 8 ++- vite.config.ts | 81 +++++++++++++++++++++++- 3 files changed, 132 insertions(+), 3 deletions(-) diff --git a/src/components/editor/EditorSrtPanel.tsx b/src/components/editor/EditorSrtPanel.tsx index 123694b..b031a20 100644 --- a/src/components/editor/EditorSrtPanel.tsx +++ b/src/components/editor/EditorSrtPanel.tsx @@ -1,5 +1,5 @@ import { useEffect, useState } from "react"; -import { Download, RefreshCw } from "lucide-react"; +import { Download, RefreshCw, Save } from "lucide-react"; import type { SubtitleLanguage } from "@/managers/stores/useSettingsStore"; import type { DialogueSpeaker, @@ -48,14 +48,49 @@ function downloadSrtFile( window.setTimeout(() => URL.revokeObjectURL(url), 0); } +async function saveSrtFile( + voice: DialogueVoiceId, + language: SubtitleLanguage, + content: string, +): Promise { + const response = await fetch("/api/save-srt", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ voice, language, content }), + }); + + if (!response.ok) { + const body = (await response.json().catch(() => null)) as { + error?: string; + } | null; + throw new Error(body?.error ?? "Sauvegarde SRT impossible"); + } +} + export function EditorSrtPanel(): React.JSX.Element { const [voice, setVoice] = useState("narrateur"); const [language, setLanguage] = useState("fr"); const [content, setContent] = useState(""); const [status, setStatus] = useState("Chargement du SRT..."); + const [isSaving, setIsSaving] = useState(false); const selectedVoice = SRT_VOICES.find((item) => item.id === voice) ?? DEFAULT_SRT_VOICE; + async function handleSave(): Promise { + setIsSaving(true); + setStatus("Sauvegarde du SRT..."); + + try { + await saveSrtFile(voice, language, content); + setStatus(`Sauvegarde dans ${getSrtPath(voice, language)}`); + } catch (err) { + const message = err instanceof Error ? err.message : "Erreur inconnue"; + setStatus(`${message}. Utilise Export SRT si le serveur dev est absent.`); + } finally { + setIsSaving(false); + } + } + useEffect(() => { let mounted = true; const srtPath = getSrtPath(voice, language); @@ -148,6 +183,15 @@ export function EditorSrtPanel(): React.JSX.Element { +