summaryrefslogtreecommitdiff
path: root/internal/processor
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2026-04-01 19:40:17 +0300
committerPaul Buetow <paul@buetow.org>2026-04-01 19:40:17 +0300
commite264a38e0a92ba451c21e64af2abf2d7fb88f919 (patch)
tree4714fc9c824637b365379103fe491455bf921748 /internal/processor
parent008d6308ecb767df7194aa944328c6ead6473ca5 (diff)
z9: fix GUI launch provider propagation
Diffstat (limited to 'internal/processor')
-rw-r--r--internal/processor/processor.go28
-rw-r--r--internal/processor/processor_test.go49
2 files changed, 67 insertions, 10 deletions
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()