From 1c30b73253116764940efcf234d2cef30b81165d Mon Sep 17 00:00:00 2001 From: Tom Boullay Date: Sun, 10 May 2026 00:02:48 +0100 Subject: [PATCH] add: load dialohue manifest --- src/utils/dialogues/loadDialogueManifest.ts | 49 +++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 src/utils/dialogues/loadDialogueManifest.ts diff --git a/src/utils/dialogues/loadDialogueManifest.ts b/src/utils/dialogues/loadDialogueManifest.ts new file mode 100644 index 0000000..cdfe23d --- /dev/null +++ b/src/utils/dialogues/loadDialogueManifest.ts @@ -0,0 +1,49 @@ +import type { + DialogueDefinition, + DialogueManifest, + DialogueVoice, +} from "@/types/dialogues/dialogues"; +import type { SubtitleLanguage } from "@/managers/stores/useSettingsStore"; +import { parseDialogueManifest } from "@/utils/dialogues/dialogueManifestValidation"; + +const DIALOGUE_MANIFEST_PATH = "/sounds/dialogue/dialogues.json"; +const DEFAULT_SUBTITLE_LANGUAGE: SubtitleLanguage = "fr"; + +export async function loadDialogueManifest(): Promise { + const response = await fetch(DIALOGUE_MANIFEST_PATH); + + if (!response.ok) { + return null; + } + + return parseDialogueManifest(await response.json()); +} + +export function resolveDialogueSubtitlePath( + manifest: DialogueManifest, + dialogue: DialogueDefinition, + language: SubtitleLanguage, +): string | null { + const voice = getDialogueVoice(manifest, dialogue.voice); + if (!voice) return null; + + return getVoiceSubtitlePath(voice, language); +} + +export function getDialogueVoice( + manifest: DialogueManifest, + voiceId: DialogueDefinition["voice"], +): DialogueVoice | null { + return manifest.voices.find((voice) => voice.id === voiceId) ?? null; +} + +function getVoiceSubtitlePath( + voice: DialogueVoice, + language: SubtitleLanguage, +): string | null { + return ( + voice.subtitles[language] ?? + voice.subtitles[DEFAULT_SUBTITLE_LANGUAGE] ?? + null + ); +}