summaryrefslogtreecommitdiff
path: root/internal/comic/runner.go
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2026-04-22 08:29:14 +0300
committerPaul Buetow <paul@buetow.org>2026-04-22 08:29:14 +0300
commit15639ba3508ab92599bd1884ba07139c73b2dac0 (patch)
tree7b6bfaaf8b76827307c62ae5fa461f7920d08140 /internal/comic/runner.go
parentaf21fec32c7cf3c15879dba6646a0b5cf19ac583 (diff)
Add manual prompt image mode
Diffstat (limited to 'internal/comic/runner.go')
-rw-r--r--internal/comic/runner.go39
1 files changed, 39 insertions, 0 deletions
diff --git a/internal/comic/runner.go b/internal/comic/runner.go
index 8be8e2c..a9411ef 100644
--- a/internal/comic/runner.go
+++ b/internal/comic/runner.go
@@ -192,6 +192,45 @@ func (r *Runner) Run(ctx context.Context, batchFile string) error {
return r.handleNarration(ctx, result.StoryText, slug, assetsDir)
}
+// RunPrompt renders a single image from a direct user prompt.
+func (r *Runner) RunPrompt(ctx context.Context, prompt string) error {
+ if r == nil || r.config == nil {
+ return fmt.Errorf("runner config is required")
+ }
+ if r.artist == nil {
+ return fmt.Errorf("runner providers are not configured")
+ }
+ if ctx == nil {
+ ctx = context.Background()
+ }
+ prompt = strings.TrimSpace(prompt)
+ if prompt == "" {
+ return fmt.Errorf("prompt is required")
+ }
+
+ dir := orDefault(r.config.OutputDir, ".")
+ slug := strings.TrimSpace(r.config.Slug)
+ if slug == "" {
+ slug = slugify(prompt)
+ if slug == "" || slug == "comic" {
+ slug = "manual-prompt"
+ }
+ }
+
+ assetsDir := comicAssetsDir(dir, slug)
+ if err := os.MkdirAll(assetsDir, 0o755); err != nil {
+ return fmt.Errorf("create comics assets dir %s: %w", assetsDir, err)
+ }
+
+ r.artist.outputDir = assetsDir
+ outputFile := filepath.Join(assetsDir, "prompt.png")
+ if err := r.artist.generatePromptImage(ctx, prompt, outputFile); err != nil {
+ return fmt.Errorf("prompt image generation failed: %w", err)
+ }
+ fmt.Printf("Prompt image saved: %s\n", outputFile)
+ return nil
+}
+
func comicsRootDir(outputRoot string) string {
root := orDefault(outputRoot, ".")
if filepath.Base(filepath.Clean(root)) == "comics" {