Spaces:
Runtime error
Runtime error
Update app.py
Browse files
app.py
CHANGED
|
@@ -112,9 +112,48 @@ def convert_panel_to_visual_prompt(panel_text, character_mode, character_desc):
|
|
| 112 |
return f"{base_style} Scene: {panel_text}."
|
| 113 |
|
| 114 |
# ============================
|
| 115 |
-
# IMAGE
|
| 116 |
# ============================
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 117 |
def generate_image_flux(prompt):
|
|
|
|
|
|
|
|
|
|
| 118 |
try:
|
| 119 |
out = replicate.run(
|
| 120 |
"black-forest-labs/flux-schnell-free",
|
|
@@ -126,6 +165,20 @@ def generate_image_flux(prompt):
|
|
| 126 |
return ""
|
| 127 |
return ""
|
| 128 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 129 |
def download_image(url, filename):
|
| 130 |
if not url:
|
| 131 |
return ""
|
|
@@ -157,7 +210,8 @@ class ComicPDF(FPDF):
|
|
| 157 |
self.cell(0, 10, f"Page {self.page_no()}", 0, 0, "C")
|
| 158 |
|
| 159 |
def build_comic_pdf(username, goal, genre, tone, style, cover_brief,
|
| 160 |
-
chapters_count, character_mode, character_desc,
|
|
|
|
| 161 |
|
| 162 |
ensure_outputs_dir()
|
| 163 |
pdf = ComicPDF(format="A4")
|
|
@@ -168,7 +222,7 @@ def build_comic_pdf(username, goal, genre, tone, style, cover_brief,
|
|
| 168 |
f"Cute pastel cartoon cover, soft colors, kid-friendly, Islamic-friendly, "
|
| 169 |
f"{cover_brief}, theme: {goal}"
|
| 170 |
)
|
| 171 |
-
cover_url =
|
| 172 |
cover_path = download_image(cover_url, f"cover_{uuid.uuid4().hex}.png")
|
| 173 |
|
| 174 |
pdf.add_page()
|
|
@@ -224,8 +278,8 @@ def build_comic_pdf(username, goal, genre, tone, style, cover_brief,
|
|
| 224 |
character_desc
|
| 225 |
)
|
| 226 |
|
| 227 |
-
# Generate image
|
| 228 |
-
illus_url =
|
| 229 |
illus_path = download_image(
|
| 230 |
illus_url,
|
| 231 |
f"chapter_{idx}_panel_{p_idx}_{uuid.uuid4().hex}.png"
|
|
@@ -284,7 +338,7 @@ with gr.Blocks() as demo:
|
|
| 284 |
# MAIN UI
|
| 285 |
with gr.Group(visible=False) as main_ui:
|
| 286 |
|
| 287 |
-
gr.Markdown("# π AIPromptLab β Comic Generator 2.
|
| 288 |
|
| 289 |
with gr.Tabs():
|
| 290 |
|
|
@@ -362,6 +416,13 @@ with gr.Blocks() as demo:
|
|
| 362 |
[character_desc]
|
| 363 |
)
|
| 364 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 365 |
generate_pdf_btn = gr.Button("π Generate Comic PDF")
|
| 366 |
pdf_output = gr.File(label="Download Comic PDF")
|
| 367 |
|
|
@@ -386,7 +447,8 @@ with gr.Blocks() as demo:
|
|
| 386 |
# PDF GENERATOR HANDLER
|
| 387 |
def handle_generate_pdf(login_status, login_user,
|
| 388 |
comic_name, goal, genre, tone, style,
|
| 389 |
-
chapters, cover_brief, character_mode,
|
|
|
|
| 390 |
|
| 391 |
if not login_status:
|
| 392 |
return None
|
|
@@ -401,7 +463,8 @@ with gr.Blocks() as demo:
|
|
| 401 |
chapters,
|
| 402 |
character_mode,
|
| 403 |
character_desc,
|
| 404 |
-
comic_name
|
|
|
|
| 405 |
)
|
| 406 |
return pdf_path
|
| 407 |
|
|
@@ -411,7 +474,7 @@ with gr.Blocks() as demo:
|
|
| 411 |
login_status, login_user,
|
| 412 |
comic_name, comic_goal, comic_genre, comic_tone,
|
| 413 |
comic_style, chapters_slider, cover_brief,
|
| 414 |
-
character_mode, character_desc
|
| 415 |
],
|
| 416 |
pdf_output
|
| 417 |
)
|
|
|
|
| 112 |
return f"{base_style} Scene: {panel_text}."
|
| 113 |
|
| 114 |
# ============================
|
| 115 |
+
# IMAGE GENERATORS (3 MODEL)
|
| 116 |
# ============================
|
| 117 |
+
def generate_image_pastel_mix(prompt):
|
| 118 |
+
"""
|
| 119 |
+
fofr/pastel-mix β paling cocok untuk komik pastel
|
| 120 |
+
"""
|
| 121 |
+
try:
|
| 122 |
+
out = replicate.run(
|
| 123 |
+
"fofr/pastel-mix",
|
| 124 |
+
input={"prompt": prompt}
|
| 125 |
+
)
|
| 126 |
+
if isinstance(out, list) and out:
|
| 127 |
+
return out[0]
|
| 128 |
+
except:
|
| 129 |
+
return ""
|
| 130 |
+
return ""
|
| 131 |
+
|
| 132 |
+
def generate_image_sdxl(prompt):
|
| 133 |
+
"""
|
| 134 |
+
stability-ai/sdxl β detail tinggi
|
| 135 |
+
"""
|
| 136 |
+
try:
|
| 137 |
+
out = replicate.run(
|
| 138 |
+
"stability-ai/sdxl",
|
| 139 |
+
input={
|
| 140 |
+
"prompt": prompt,
|
| 141 |
+
"cfg_scale": 7,
|
| 142 |
+
"steps": 30
|
| 143 |
+
}
|
| 144 |
+
)
|
| 145 |
+
if isinstance(out, dict) and "output" in out and out["output"]:
|
| 146 |
+
return out["output"][0]
|
| 147 |
+
if isinstance(out, list) and out:
|
| 148 |
+
return out[0]
|
| 149 |
+
except:
|
| 150 |
+
return ""
|
| 151 |
+
return ""
|
| 152 |
+
|
| 153 |
def generate_image_flux(prompt):
|
| 154 |
+
"""
|
| 155 |
+
black-forest-labs/flux-schnell-free β cepat, tapi tidak selalu stabil
|
| 156 |
+
"""
|
| 157 |
try:
|
| 158 |
out = replicate.run(
|
| 159 |
"black-forest-labs/flux-schnell-free",
|
|
|
|
| 165 |
return ""
|
| 166 |
return ""
|
| 167 |
|
| 168 |
+
def generate_image_by_model(prompt, model_name):
|
| 169 |
+
"""
|
| 170 |
+
Pilih model berdasarkan dropdown user.
|
| 171 |
+
"""
|
| 172 |
+
if model_name == "Pastel-Mix":
|
| 173 |
+
return generate_image_pastel_mix(prompt)
|
| 174 |
+
elif model_name == "SDXL":
|
| 175 |
+
return generate_image_sdxl(prompt)
|
| 176 |
+
elif model_name == "Flux":
|
| 177 |
+
return generate_image_flux(prompt)
|
| 178 |
+
else:
|
| 179 |
+
# fallback ke Pastel-Mix
|
| 180 |
+
return generate_image_pastel_mix(prompt)
|
| 181 |
+
|
| 182 |
def download_image(url, filename):
|
| 183 |
if not url:
|
| 184 |
return ""
|
|
|
|
| 210 |
self.cell(0, 10, f"Page {self.page_no()}", 0, 0, "C")
|
| 211 |
|
| 212 |
def build_comic_pdf(username, goal, genre, tone, style, cover_brief,
|
| 213 |
+
chapters_count, character_mode, character_desc,
|
| 214 |
+
comic_name, image_model):
|
| 215 |
|
| 216 |
ensure_outputs_dir()
|
| 217 |
pdf = ComicPDF(format="A4")
|
|
|
|
| 222 |
f"Cute pastel cartoon cover, soft colors, kid-friendly, Islamic-friendly, "
|
| 223 |
f"{cover_brief}, theme: {goal}"
|
| 224 |
)
|
| 225 |
+
cover_url = generate_image_by_model(cover_prompt, image_model)
|
| 226 |
cover_path = download_image(cover_url, f"cover_{uuid.uuid4().hex}.png")
|
| 227 |
|
| 228 |
pdf.add_page()
|
|
|
|
| 278 |
character_desc
|
| 279 |
)
|
| 280 |
|
| 281 |
+
# Generate image by selected model
|
| 282 |
+
illus_url = generate_image_by_model(visual_prompt, image_model)
|
| 283 |
illus_path = download_image(
|
| 284 |
illus_url,
|
| 285 |
f"chapter_{idx}_panel_{p_idx}_{uuid.uuid4().hex}.png"
|
|
|
|
| 338 |
# MAIN UI
|
| 339 |
with gr.Group(visible=False) as main_ui:
|
| 340 |
|
| 341 |
+
gr.Markdown("# π AIPromptLab β Comic Generator 2.1 (Cartoon Pastel Edition)")
|
| 342 |
|
| 343 |
with gr.Tabs():
|
| 344 |
|
|
|
|
| 416 |
[character_desc]
|
| 417 |
)
|
| 418 |
|
| 419 |
+
# IMAGE MODEL DROPDOWN
|
| 420 |
+
image_model = gr.Dropdown(
|
| 421 |
+
label="Model Gambar",
|
| 422 |
+
choices=["Pastel-Mix", "SDXL", "Flux"],
|
| 423 |
+
value="Pastel-Mix" # default sesuai pilihanmu
|
| 424 |
+
)
|
| 425 |
+
|
| 426 |
generate_pdf_btn = gr.Button("π Generate Comic PDF")
|
| 427 |
pdf_output = gr.File(label="Download Comic PDF")
|
| 428 |
|
|
|
|
| 447 |
# PDF GENERATOR HANDLER
|
| 448 |
def handle_generate_pdf(login_status, login_user,
|
| 449 |
comic_name, goal, genre, tone, style,
|
| 450 |
+
chapters, cover_brief, character_mode,
|
| 451 |
+
character_desc, image_model):
|
| 452 |
|
| 453 |
if not login_status:
|
| 454 |
return None
|
|
|
|
| 463 |
chapters,
|
| 464 |
character_mode,
|
| 465 |
character_desc,
|
| 466 |
+
comic_name,
|
| 467 |
+
image_model
|
| 468 |
)
|
| 469 |
return pdf_path
|
| 470 |
|
|
|
|
| 474 |
login_status, login_user,
|
| 475 |
comic_name, comic_goal, comic_genre, comic_tone,
|
| 476 |
comic_style, chapters_slider, cover_brief,
|
| 477 |
+
character_mode, character_desc, image_model
|
| 478 |
],
|
| 479 |
pdf_output
|
| 480 |
)
|