summaryrefslogtreecommitdiff
path: root/internal/cli
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2026-04-20 19:07:56 +0300
committerPaul Buetow <paul@buetow.org>2026-04-20 19:07:56 +0300
commitd773e26b19dcea2f4a1917ebb6edaa4f5721693f (patch)
treecc38b381c0d367a84ad802c16bf7fcb0c67bc8ad /internal/cli
parent7bb500b8cd567e45634fc01c97e8dcd5a1a9db22 (diff)
Remove story feature for task 05
Diffstat (limited to 'internal/cli')
-rw-r--r--internal/cli/flags.go54
-rw-r--r--internal/cli/flags_test.go4
-rw-r--r--internal/cli/video_runner.go3
3 files changed, 17 insertions, 44 deletions
diff --git a/internal/cli/flags.go b/internal/cli/flags.go
index bdcc88b..0df3ffd 100644
--- a/internal/cli/flags.go
+++ b/internal/cli/flags.go
@@ -23,29 +23,20 @@ type Flags struct {
// AudioFormatSpecified records whether the audio format was explicitly set on the CLI.
AudioFormatSpecified bool
// AudioProvider selects the text-to-speech backend ("gemini" or "openai").
- AudioProvider string
- ImageAPI string
- ImageAPISpecified bool
- BatchFile string
- StoryFile string // --story <file>: generate vocabulary story + comic image
- StoryStyle string // --story-style: override the random art style (empty = random)
- StoryTheme string // --story-theme: override the random genre pick (empty = random)
- StoryNoUltraRealistic bool // --no-ultra-realistic: disable photorealistic rendering requirement
- StoryUltraRealistic bool // --ultra-realistic: force photorealistic rendering (overrides random 50/50)
- StorySlug string // --story-slug: force a specific output slug/directory (empty = auto from title)
- NarratorVoice string // --narrator-voice: Gemini voice for cinematic narration (empty = random)
- NarrateEnabled bool // --narrate: generate cinematic MP3 narration after --story (default false)
- VideoEnabled bool // --video: whether to prompt for Veo video generation after --story completes
- SkipAudio bool
- SkipImages bool
- RetryFailedAssets bool
- GenerateAnki bool
- AnkiCSV bool
- DeckName string
- ListModels bool
- AllVoices bool
- NoAutoPlay bool
- Archive bool
+ AudioProvider string
+ ImageAPI string
+ ImageAPISpecified bool
+ BatchFile string
+ SkipAudio bool
+ SkipImages bool
+ RetryFailedAssets bool
+ GenerateAnki bool
+ AnkiCSV bool
+ DeckName string
+ ListModels bool
+ AllVoices bool
+ NoAutoPlay bool
+ Archive bool
// OpenAI flags
OpenAIModel string
@@ -83,7 +74,6 @@ func NewFlags() *Flags {
AudioFormat: defaults.OutputFormat,
AudioProvider: defaults.Provider,
ImageAPI: "nanobanana",
- VideoEnabled: true,
DeckName: "Bulgarian Vocabulary",
OpenAIModel: "gpt-4o-mini-tts",
OpenAISpeed: 0.9,
@@ -114,22 +104,6 @@ func setupFlags(cmd *cobra.Command, flags *Flags) {
cmd.Flags().StringVarP(&flags.AudioFormat, "format", "f", flags.AudioFormat, "Audio format (wav or mp3; Gemini TTS writes wav natively and auto-converts to mp3 with ffmpeg, which is now the default)")
cmd.Flags().StringVar(&flags.ImageAPI, "image-api", flags.ImageAPI, "Image source for explicit CLI runs (default: Nano Banana; use openai to switch, config file image.provider also applies when unset)")
cmd.Flags().StringVar(&flags.BatchFile, "batch", "", "Process words from file (one per line)")
- cmd.Flags().StringVar(&flags.StoryFile, "story", "", "Generate a vocabulary story + comic image from a batch-format file (outputs to current directory)")
- cmd.Flags().StringVar(&flags.StoryStyle, "story-style", "", "Art style for comic pages (default: random). E.g. \"ultra realistic comic strip with photographic detail and dramatic lighting\"")
- cmd.Flags().StringVar(&flags.StoryTheme, "story-theme", "", "Genre/theme for the story (default: random). E.g. \"a thrilling space adventure with aliens and spaceships\"")
- cmd.Flags().BoolVar(&flags.StoryNoUltraRealistic, "no-ultra-realistic", false, "Disable photorealistic rendering requirement; produces standard comic-book style output")
- cmd.Flags().BoolVar(&flags.StoryUltraRealistic, "ultra-realistic", false, "Force photorealistic rendering for all pages (overrides the default random 50/50 pick)")
- cmd.Flags().StringVar(&flags.StorySlug, "story-slug", "",
- "Force the output directory slug for --story (e.g. \"ai-jungle-quest\"). "+
- "Use this to repair a partial run: existing pages are skipped, missing ones are generated.")
- cmd.Flags().StringVar(&flags.NarratorVoice, "narrator-voice", "",
- "Gemini voice for cinematic story narration (default: random from cinematic pool). "+
- "Valid values: Charon, Fenrir, Enceladus, Algieba, Aoede, Schedar")
- cmd.Flags().BoolVar(&flags.NarrateEnabled, "narrate", false,
- "Generate a cinematic MP3 narration of the story after --story completes (default false). "+
- "Requires GOOGLE_API_KEY. Use --narrator-voice to pick a specific voice.")
- cmd.Flags().BoolVar(&flags.VideoEnabled, "video", flags.VideoEnabled,
- "Prompt to generate Veo videos after comic generation (default true; use --video=false to skip)")
cmd.Flags().BoolVar(&flags.SkipAudio, "skip-audio", false, "Skip audio generation")
cmd.Flags().BoolVar(&flags.SkipImages, "skip-images", false, "Skip image download")
cmd.Flags().BoolVar(&flags.RetryFailedAssets, "retry-failed-assets", false, "Scan existing cards and regenerate missing or failed audio/image assets, stopping on the first error")
diff --git a/internal/cli/flags_test.go b/internal/cli/flags_test.go
index 5c56770..4c20543 100644
--- a/internal/cli/flags_test.go
+++ b/internal/cli/flags_test.go
@@ -21,8 +21,6 @@ func TestNewFlags(t *testing.T) {
{"AudioProvider", flags.AudioProvider, audio.DefaultProviderConfig().Provider},
{"ImageAPI", flags.ImageAPI, "nanobanana"},
{"ImageAPISpecified", flags.ImageAPISpecified, false},
- {"NanoBananaModelSpecified", flags.NanoBananaModelSpecified, false},
- {"NanoBananaTextModelSpecified", flags.NanoBananaTextModelSpecified, false},
{"DeckName", flags.DeckName, "Bulgarian Vocabulary"},
{"OpenAIModel", flags.OpenAIModel, "gpt-4o-mini-tts"},
{"OpenAISpeed", flags.OpenAISpeed, 0.9},
@@ -33,7 +31,9 @@ func TestNewFlags(t *testing.T) {
{"GeminiTTSModel", flags.GeminiTTSModel, audio.DefaultProviderConfig().GeminiTTSModel},
{"GeminiVoice", flags.GeminiVoice, ""},
{"NanoBananaModel", flags.NanoBananaModel, "gemini-3.1-flash-image-preview"},
+ {"NanoBananaModelSpecified", flags.NanoBananaModelSpecified, false},
{"NanoBananaTextModel", flags.NanoBananaTextModel, "gemini-2.5-flash"},
+ {"NanoBananaTextModelSpecified", flags.NanoBananaTextModelSpecified, false},
}
for _, tt := range tests {
diff --git a/internal/cli/video_runner.go b/internal/cli/video_runner.go
index 021a6bf..9e888fb 100644
--- a/internal/cli/video_runner.go
+++ b/internal/cli/video_runner.go
@@ -10,8 +10,7 @@ import (
// directly.
//
// apiKey is the Google/Gemini API key passed by the caller.
-// selectedPaths contains the absolute (or relative) paths of the gallery PNGs
-// to animate — typically returned by video.PromptForGalleryVideos.
+// selectedPaths contains the absolute (or relative) paths of the PNGs to animate.
//
// Each page prints a "Generating…" line before the API call and a "Video saved:"
// line with the output path on success. The MP4 is written next to its source