summaryrefslogtreecommitdiff
path: root/internal/audio
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2026-04-02 21:47:12 +0300
committerPaul Buetow <paul@buetow.org>2026-04-02 21:47:12 +0300
commit993b2efe63e221cee550756770894c9c58474d25 (patch)
tree126b0dad9e1225c575f2521f29c6ad68556f4056 /internal/audio
parentdac35c77721c97f093a44d98164b38534452de9f (diff)
task 00g/00k/00h/008: gofmt, remove ProviderWithFallback, stdlib helpers, shared prompt
- task 00g: fix gofmt violations (trailing whitespace, missing newlines, indentation) in 8 files; all pass gofmt -l now - task 00k: remove unused ProviderWithFallback and its tests (YAGNI — no production caller existed; voice-level fallback via RunWithVoiceFallbacks already covers the real use case) - task 00h: replace private splitLines/trimSpace/isSpace helpers in internal/batch/processor.go with strings.Split+ReplaceAll and strings.TrimSpace from the stdlib; remove the now-redundant tests - task 008: extract buildEducationalPrompt into internal/image/prompt.go so the prompt-assembly policy (scene truncation cascade, char limit) lives in one place; both OpenAIClient and NanoBananaClient delegate to it Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Diffstat (limited to 'internal/audio')
-rw-r--r--internal/audio/provider.go51
-rw-r--r--internal/audio/provider_test.go92
-rw-r--r--internal/audio/validate.go8
3 files changed, 4 insertions, 147 deletions
diff --git a/internal/audio/provider.go b/internal/audio/provider.go
index 31b1180..0e863bf 100644
--- a/internal/audio/provider.go
+++ b/internal/audio/provider.go
@@ -75,54 +75,3 @@ func NewProvider(config *Config) (Provider, error) {
}
}
-// Compile-time check that ProviderWithFallback implements the Provider interface.
-var _ Provider = (*ProviderWithFallback)(nil)
-
-// ProviderWithFallback wraps a primary provider with a fallback option
-type ProviderWithFallback struct {
- primary Provider
- fallback Provider
-}
-
-// NewProviderWithFallback creates a provider that falls back to secondary if primary fails
-func NewProviderWithFallback(primary, fallback Provider) Provider {
- return &ProviderWithFallback{
- primary: primary,
- fallback: fallback,
- }
-}
-
-// GenerateAudio tries primary provider first, falls back to secondary on error
-func (p *ProviderWithFallback) GenerateAudio(ctx context.Context, text string, outputFile string) error {
- err := p.primary.GenerateAudio(ctx, text, outputFile)
- if err != nil {
- // Log the primary error
- fmt.Printf("Primary provider (%s) failed: %v. Falling back to %s\n",
- p.primary.Name(), err, p.fallback.Name())
-
- // Try fallback
- return p.fallback.GenerateAudio(ctx, text, outputFile)
- }
- return nil
-}
-
-// Name returns the provider name
-func (p *ProviderWithFallback) Name() string {
- return fmt.Sprintf("%s (fallback: %s)", p.primary.Name(), p.fallback.Name())
-}
-
-// IsAvailable checks if at least one provider is available
-func (p *ProviderWithFallback) IsAvailable() error {
- primaryErr := p.primary.IsAvailable()
- if primaryErr == nil {
- return nil
- }
-
- fallbackErr := p.fallback.IsAvailable()
- if fallbackErr == nil {
- return nil
- }
-
- return fmt.Errorf("both providers unavailable: primary=%v, fallback=%v",
- primaryErr, fallbackErr)
-}
diff --git a/internal/audio/provider_test.go b/internal/audio/provider_test.go
index a08b7a6..5702016 100644
--- a/internal/audio/provider_test.go
+++ b/internal/audio/provider_test.go
@@ -2,7 +2,6 @@ package audio
import (
"context"
- "errors"
"path/filepath"
"strings"
"testing"
@@ -153,94 +152,3 @@ func TestNewProvider(t *testing.T) {
}
}
-func TestProviderWithFallback(t *testing.T) {
- primary := &mockProvider{name: "primary"}
- fallback := &mockProvider{name: "fallback"}
-
- provider := NewProviderWithFallback(primary, fallback)
-
- // Test successful primary
- ctx := context.Background()
- err := provider.GenerateAudio(ctx, "test", "output.mp3")
- if err != nil {
- t.Errorf("GenerateAudio() unexpected error: %v", err)
- }
- if primary.generateCalls != 1 {
- t.Errorf("Expected 1 primary call, got %d", primary.generateCalls)
- }
- if fallback.generateCalls != 0 {
- t.Errorf("Expected 0 fallback calls, got %d", fallback.generateCalls)
- }
-
- // Test primary failure, fallback success
- primary.generateErr = errors.New("primary failed")
- primary.generateCalls = 0
-
- err = provider.GenerateAudio(ctx, "test", "output.mp3")
- if err != nil {
- t.Errorf("GenerateAudio() unexpected error: %v", err)
- }
- if primary.generateCalls != 1 {
- t.Errorf("Expected 1 primary call, got %d", primary.generateCalls)
- }
- if fallback.generateCalls != 1 {
- t.Errorf("Expected 1 fallback call, got %d", fallback.generateCalls)
- }
-
- // Test both fail
- fallback.generateErr = errors.New("fallback failed")
- primary.generateCalls = 0
- fallback.generateCalls = 0
-
- err = provider.GenerateAudio(ctx, "test", "output.mp3")
- if err == nil {
- t.Error("GenerateAudio() expected error when both providers fail")
- }
-}
-
-func TestProviderWithFallbackName(t *testing.T) {
- primary := &mockProvider{name: "primary"}
- fallback := &mockProvider{name: "fallback"}
-
- provider := NewProviderWithFallback(primary, fallback)
-
- expected := "primary (fallback: fallback)"
- if provider.Name() != expected {
- t.Errorf("Name() = %v, want %v", provider.Name(), expected)
- }
-}
-
-func TestProviderWithFallbackIsAvailable(t *testing.T) {
- primary := &mockProvider{name: "primary"}
- fallback := &mockProvider{name: "fallback"}
-
- provider := NewProviderWithFallback(primary, fallback)
-
- // Both available
- err := provider.IsAvailable()
- if err != nil {
- t.Errorf("IsAvailable() unexpected error: %v", err)
- }
-
- // Primary unavailable, fallback available
- primary.availableErr = errors.New("primary unavailable")
- err = provider.IsAvailable()
- if err != nil {
- t.Errorf("IsAvailable() unexpected error when fallback available: %v", err)
- }
-
- // Primary available, fallback unavailable
- primary.availableErr = nil
- fallback.availableErr = errors.New("fallback unavailable")
- err = provider.IsAvailable()
- if err != nil {
- t.Errorf("IsAvailable() unexpected error when primary available: %v", err)
- }
-
- // Both unavailable
- primary.availableErr = errors.New("primary unavailable")
- err = provider.IsAvailable()
- if err == nil {
- t.Error("IsAvailable() expected error when both providers unavailable")
- }
-}
diff --git a/internal/audio/validate.go b/internal/audio/validate.go
index db042bd..e200cfa 100644
--- a/internal/audio/validate.go
+++ b/internal/audio/validate.go
@@ -11,7 +11,7 @@ func ValidateBulgarianText(text string) error {
if strings.TrimSpace(text) == "" {
return fmt.Errorf("text cannot be empty")
}
-
+
hasCyrillic := false
for _, r := range text {
if unicode.In(r, unicode.Cyrillic) {
@@ -19,10 +19,10 @@ func ValidateBulgarianText(text string) error {
break
}
}
-
+
if !hasCyrillic {
return fmt.Errorf("text must contain Cyrillic characters")
}
-
+
return nil
-} \ No newline at end of file
+}