summaryrefslogtreecommitdiff
path: root/internal/comic/runner.go
diff options
context:
space:
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" {