diff options
| author | Paul Buetow <paul@buetow.org> | 2026-04-01 19:40:17 +0300 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2026-04-01 19:40:17 +0300 |
| commit | e264a38e0a92ba451c21e64af2abf2d7fb88f919 (patch) | |
| tree | 4714fc9c824637b365379103fe491455bf921748 | |
| parent | 008d6308ecb767df7194aa944328c6ead6473ca5 (diff) | |
z9: fix GUI launch provider propagation
| -rw-r--r-- | cmd/totalrecall/main.go | 2 | ||||
| -rw-r--r-- | internal/cli/flags.go | 29 | ||||
| -rw-r--r-- | internal/cli/flags_test.go | 3 | ||||
| -rw-r--r-- | internal/processor/processor.go | 28 | ||||
| -rw-r--r-- | internal/processor/processor_test.go | 49 |
5 files changed, 86 insertions, 25 deletions
diff --git a/cmd/totalrecall/main.go b/cmd/totalrecall/main.go index c58565f..c0bd142 100644 --- a/cmd/totalrecall/main.go +++ b/cmd/totalrecall/main.go @@ -60,6 +60,8 @@ func runCommand(cmd *cobra.Command, args []string, flags *cli.Flags) error { fmt.Printf("Note: Using image size 1024x1024 for DALL-E 3 (use --openai-image-size to override)\n") } + flags.ImageAPISpecified = cmd.Flags().Changed("image-api") + // Create processor proc := processor.NewProcessor(flags) diff --git a/internal/cli/flags.go b/internal/cli/flags.go index 9c00051..1e18766 100644 --- a/internal/cli/flags.go +++ b/internal/cli/flags.go @@ -8,20 +8,21 @@ const ( // Flags holds all command-line flag values type Flags struct { // General flags - CfgFile string - OutputDir string - AudioFormat string - ImageAPI string - BatchFile string - SkipAudio bool - SkipImages bool - GenerateAnki bool - AnkiCSV bool - DeckName string - ListModels bool - AllVoices bool - NoAutoPlay bool - Archive bool + CfgFile string + OutputDir string + AudioFormat string + ImageAPI string + ImageAPISpecified bool + BatchFile string + SkipAudio bool + SkipImages bool + GenerateAnki bool + AnkiCSV bool + DeckName string + ListModels bool + AllVoices bool + NoAutoPlay bool + Archive bool // OpenAI flags OpenAIModel string diff --git a/internal/cli/flags_test.go b/internal/cli/flags_test.go index d40d8a2..2a63d8d 100644 --- a/internal/cli/flags_test.go +++ b/internal/cli/flags_test.go @@ -16,6 +16,7 @@ func TestNewFlags(t *testing.T) { }{ {"AudioFormat", flags.AudioFormat, "mp3"}, {"ImageAPI", flags.ImageAPI, "openai"}, + {"ImageAPISpecified", flags.ImageAPISpecified, false}, {"DeckName", flags.DeckName, "Bulgarian Vocabulary"}, {"OpenAIModel", flags.OpenAIModel, "gpt-4o-mini-tts"}, {"OpenAISpeed", flags.OpenAISpeed, 0.9}, @@ -84,7 +85,7 @@ func TestFlagsStructure(t *testing.T) { flagsType := reflect.TypeOf(*flags) expectedFields := []string{ - "CfgFile", "OutputDir", "AudioFormat", "ImageAPI", "BatchFile", + "CfgFile", "OutputDir", "AudioFormat", "ImageAPI", "ImageAPISpecified", "BatchFile", "SkipAudio", "SkipImages", "GenerateAnki", "AnkiCSV", "DeckName", "ListModels", "AllVoices", "NoAutoPlay", "OpenAIModel", "OpenAIVoice", "OpenAISpeed", "OpenAIInstruction", diff --git a/internal/processor/processor.go b/internal/processor/processor.go index dd49c2b..935ce60 100644 --- a/internal/processor/processor.go +++ b/internal/processor/processor.go @@ -541,16 +541,7 @@ func (p *Processor) GenerateAnkiFile() (string, error) { // RunGUIMode launches the GUI application func (p *Processor) RunGUIMode() error { - // Create GUI configuration from command line flags and viper config - guiConfig := &gui.Config{ - AudioFormat: p.flags.AudioFormat, - ImageProvider: p.flags.ImageAPI, - OpenAIKey: cli.GetOpenAIKey(), - GoogleAPIKey: cli.GetGoogleAPIKey(), - TranslationProvider: translation.Provider(viper.GetString("translation.provider")), - PhoneticProvider: phonetic.Provider(viper.GetString("phonetic.provider")), - AutoPlay: !p.flags.NoAutoPlay, // Invert the flag (--no-auto-play disables auto-play) - } + guiConfig := p.guiConfigForRunMode() // Only set OutputDir if it was explicitly provided via flag // Check if the outputDir is different from the default @@ -569,6 +560,23 @@ func (p *Processor) RunGUIMode() error { return nil } +func (p *Processor) guiConfigForRunMode() *gui.Config { + imageProvider := p.flags.ImageAPI + if !p.flags.ImageAPISpecified { + imageProvider = gui.DefaultConfig().ImageProvider + } + + return &gui.Config{ + AudioFormat: p.flags.AudioFormat, + ImageProvider: imageProvider, + OpenAIKey: cli.GetOpenAIKey(), + GoogleAPIKey: cli.GetGoogleAPIKey(), + TranslationProvider: translation.Provider(viper.GetString("translation.provider")), + PhoneticProvider: phonetic.Provider(viper.GetString("phonetic.provider")), + AutoPlay: !p.flags.NoAutoPlay, // Invert the flag (--no-auto-play disables auto-play) + } +} + // Helper methods func (p *Processor) findOrCreateWordDirectory(word string) string { diff --git a/internal/processor/processor_test.go b/internal/processor/processor_test.go index ad71263..7ae475a 100644 --- a/internal/processor/processor_test.go +++ b/internal/processor/processor_test.go @@ -6,6 +6,7 @@ import ( "testing" "codeberg.org/snonux/totalrecall/internal/cli" + "codeberg.org/snonux/totalrecall/internal/gui" "codeberg.org/snonux/totalrecall/internal/phonetic" "github.com/spf13/viper" ) @@ -131,6 +132,54 @@ func TestNewProcessor_ExplicitGeminiTranslationProvider(t *testing.T) { } } +func TestGUIConfigForRunModeUsesNanoBananaDefaultWhenImageAPIIsNotSpecified(t *testing.T) { + t.Setenv("OPENAI_API_KEY", "test-openai-key") + t.Setenv("GOOGLE_API_KEY", "test-google-key") + + originalConfig := viper.New() + *originalConfig = *viper.GetViper() + defer func() { + *viper.GetViper() = *originalConfig + }() + viper.Reset() + + flags := cli.NewFlags() + flags.AudioFormat = "wav" + flags.ImageAPI = "openai" + flags.ImageAPISpecified = false + p := NewProcessor(flags) + + guiConfig := p.guiConfigForRunMode() + if guiConfig.ImageProvider != gui.DefaultConfig().ImageProvider { + t.Fatalf("guiConfig.ImageProvider = %q, want GUI default %q", guiConfig.ImageProvider, gui.DefaultConfig().ImageProvider) + } + if guiConfig.AudioFormat != "wav" { + t.Fatalf("guiConfig.AudioFormat = %q, want %q", guiConfig.AudioFormat, "wav") + } +} + +func TestGUIConfigForRunModeHonorsExplicitImageAPI(t *testing.T) { + t.Setenv("OPENAI_API_KEY", "test-openai-key") + t.Setenv("GOOGLE_API_KEY", "test-google-key") + + originalConfig := viper.New() + *originalConfig = *viper.GetViper() + defer func() { + *viper.GetViper() = *originalConfig + }() + viper.Reset() + + flags := cli.NewFlags() + flags.ImageAPI = "openai" + flags.ImageAPISpecified = true + p := NewProcessor(flags) + + guiConfig := p.guiConfigForRunMode() + if guiConfig.ImageProvider != "openai" { + t.Fatalf("guiConfig.ImageProvider = %q, want %q", guiConfig.ImageProvider, "openai") + } +} + func TestProcessSingleWord_InvalidWord(t *testing.T) { flags := cli.NewFlags() flags.OutputDir = t.TempDir() |
