summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--internal/audio/openai_provider.go3
-rw-r--r--internal/audio/provider.go3
-rw-r--r--internal/image/nanobanana.go2
-rw-r--r--internal/image/openai.go10
-rw-r--r--internal/image/search.go6
5 files changed, 16 insertions, 8 deletions
diff --git a/internal/audio/openai_provider.go b/internal/audio/openai_provider.go
index 1700baf..bf5ac58 100644
--- a/internal/audio/openai_provider.go
+++ b/internal/audio/openai_provider.go
@@ -12,6 +12,9 @@ import (
"github.com/sashabaranov/go-openai"
)
+// Compile-time check that OpenAIProvider implements the Provider interface.
+var _ Provider = (*OpenAIProvider)(nil)
+
// OpenAIProvider implements Provider interface for OpenAI TTS
type OpenAIProvider struct {
client *openai.Client
diff --git a/internal/audio/provider.go b/internal/audio/provider.go
index 4fdccfb..31b1180 100644
--- a/internal/audio/provider.go
+++ b/internal/audio/provider.go
@@ -75,6 +75,9 @@ 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
diff --git a/internal/image/nanobanana.go b/internal/image/nanobanana.go
index 93afe06..a35e4cf 100644
--- a/internal/image/nanobanana.go
+++ b/internal/image/nanobanana.go
@@ -157,7 +157,7 @@ func (c *NanoBananaClient) Download(ctx context.Context, url string) (io.ReadClo
return nil, err
}
- resp, err := http.DefaultClient.Do(req)
+ resp, err := imageHTTPClient.Do(req)
if err != nil {
return nil, err
}
diff --git a/internal/image/openai.go b/internal/image/openai.go
index e322d32..8edb182 100644
--- a/internal/image/openai.go
+++ b/internal/image/openai.go
@@ -13,6 +13,14 @@ import (
"github.com/sashabaranov/go-openai"
)
+// Compile-time check that OpenAIClient implements the ImageSearcher interface.
+var _ ImageSearcher = (*OpenAIClient)(nil)
+
+// imageHTTPClient is a shared HTTP client with a generous timeout for image
+// downloads. http.DefaultClient has no timeout, which can block goroutines
+// indefinitely on slow or unresponsive servers.
+var imageHTTPClient = &http.Client{Timeout: 60 * time.Second}
+
// OpenAIClient implements ImageSearcher for OpenAI DALL-E image generation
type OpenAIClient struct {
client *openai.Client
@@ -190,7 +198,7 @@ func (c *OpenAIClient) Download(ctx context.Context, url string) (io.ReadCloser,
return nil, err
}
- resp, err := http.DefaultClient.Do(req)
+ resp, err := imageHTTPClient.Do(req)
if err != nil {
return nil, err
}
diff --git a/internal/image/search.go b/internal/image/search.go
index 53004c1..80274eb 100644
--- a/internal/image/search.go
+++ b/internal/image/search.go
@@ -81,9 +81,3 @@ func (e *RateLimitError) Error() string {
return e.Provider + ": rate limit exceeded"
}
-// DownloadImage is a utility function to download an image to a file
-func DownloadImage(ctx context.Context, searcher ImageSearcher, url string, outputPath string) error {
- // Implementation will be in a separate download.go file
- // This is just the interface definition
- return nil
-}