Akhmad123 commited on
Commit
d4bdd2d
Β·
verified Β·
1 Parent(s): f5bd360

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +121 -6
app.py CHANGED
@@ -2,6 +2,9 @@
2
  import gradio as gr
3
  import json
4
  from datetime import datetime
 
 
 
5
 
6
  # ============================
7
  # USER DATABASE (SIMPLE)
@@ -153,6 +156,88 @@ def generate_video_json(username, tier,
153
 
154
  return json.dumps(data, ensure_ascii=False, indent=2)
155
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
156
  # ============================
157
  # LOGIN HANDLER
158
  # ============================
@@ -182,14 +267,14 @@ with gr.Blocks() as demo:
182
  # MAIN UI (hidden first)
183
  with gr.Group(visible=False) as main_ui:
184
 
185
- gr.Markdown("# 🌟 AIPromptLab β€” Multi Output JSON Prompt Generator")
186
 
187
  with gr.Tabs():
188
 
189
  # ============================
190
  # TAB 1: E-BOOK
191
  # ============================
192
- with gr.Tab("E-Book Prompt"):
193
 
194
  ebook_goal = gr.Textbox(label="Goal / Ide E-book")
195
  ebook_genre = gr.Dropdown(
@@ -249,10 +334,19 @@ with gr.Blocks() as demo:
249
  value="Medium (30–50 pages)"
250
  )
251
 
 
 
 
 
 
252
  ebook_generate_btn = gr.Button("πŸš€ Generate E-book JSON")
253
- ebook_output = gr.Textbox(label="E-book JSON Output", lines=20, elem_id="ebook-json-output")
254
  ebook_copy_btn = gr.Button("Copy E-book JSON")
255
 
 
 
 
 
256
  # ============================
257
  # TAB 2: IMAGE DESIGN
258
  # ============================
@@ -305,7 +399,7 @@ with gr.Blocks() as demo:
305
  )
306
 
307
  img_generate_btn = gr.Button("πŸš€ Generate Image Design JSON")
308
- img_output = gr.Textbox(label="Image Design JSON Output", lines=20, elem_id="image-json-output")
309
  img_copy_btn = gr.Button("Copy Image JSON")
310
 
311
  # ============================
@@ -359,7 +453,7 @@ with gr.Blocks() as demo:
359
  )
360
 
361
  vid_generate_btn = gr.Button("πŸš€ Generate Video AI JSON")
362
- vid_output = gr.Textbox(label="Video AI JSON Output", lines=20, elem_id="video-json-output")
363
  vid_copy_btn = gr.Button("Copy Video JSON")
364
 
365
  # LOGIN LOGIC
@@ -380,7 +474,7 @@ with gr.Blocks() as demo:
380
  [login_msg, login_ui, main_ui, login_status, login_user, login_tier]
381
  )
382
 
383
- # E-BOOK GENERATE
384
  def handle_ebook_generate(login_status, login_user, login_tier,
385
  goal, genre, tone, style, platform, length):
386
  if not login_status:
@@ -394,6 +488,27 @@ with gr.Blocks() as demo:
394
  ebook_output
395
  )
396
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
397
  # IMAGE GENERATE
398
  def handle_image_generate(login_status, login_user, login_tier,
399
  goal, design_style, color_palette, platform, aspect_ratio):
 
2
  import gradio as gr
3
  import json
4
  from datetime import datetime
5
+ from fpdf import FPDF
6
+ import os
7
+ import uuid
8
 
9
  # ============================
10
  # USER DATABASE (SIMPLE)
 
156
 
157
  return json.dumps(data, ensure_ascii=False, indent=2)
158
 
159
+ # ============================
160
+ # PDF E-BOOK GENERATOR (A4)
161
+ # ============================
162
+ class EbookPDF(FPDF):
163
+ def header(self):
164
+ if self.page_no() == 1:
165
+ return
166
+ self.set_font("Helvetica", "I", 9)
167
+ self.cell(0, 8, "AIPromptLab E-Book", 0, 1, "R")
168
+ self.ln(2)
169
+
170
+ def footer(self):
171
+ self.set_y(-15)
172
+ self.set_font("Helvetica", "I", 9)
173
+ self.cell(0, 10, f"Page {self.page_no()}", 0, 0, "C")
174
+
175
+ def build_ebook_pdf(username, goal, genre, tone, style, length, cover_brief):
176
+ pdf = EbookPDF(format="A4")
177
+ pdf.set_auto_page_break(auto=True, margin=15)
178
+
179
+ # COVER
180
+ pdf.add_page()
181
+ pdf.set_fill_color(230, 240, 255)
182
+ pdf.rect(0, 0, 210, 297, "F")
183
+
184
+ pdf.set_font("Helvetica", "B", 28)
185
+ pdf.set_text_color(40, 40, 70)
186
+ pdf.ln(60)
187
+ pdf.multi_cell(0, 15, "E-Book", 0, "C")
188
+ pdf.ln(5)
189
+ pdf.set_font("Helvetica", "B", 20)
190
+ pdf.multi_cell(0, 12, goal, 0, "C")
191
+ pdf.ln(10)
192
+ pdf.set_font("Helvetica", "", 12)
193
+ pdf.multi_cell(0, 8, f"Genre: {genre}", 0, "C")
194
+ pdf.multi_cell(0, 8, f"Tone: {tone} | Style: {style}", 0, "C")
195
+ pdf.ln(15)
196
+ pdf.set_font("Helvetica", "I", 11)
197
+ pdf.multi_cell(0, 7, "Cover illustration idea:", 0, "C")
198
+ pdf.ln(3)
199
+ pdf.set_font("Helvetica", "", 11)
200
+ pdf.multi_cell(0, 7, cover_brief, 0, "C")
201
+
202
+ # TABLE OF CONTENTS
203
+ pdf.add_page()
204
+ pdf.set_font("Helvetica", "B", 18)
205
+ pdf.cell(0, 10, "Daftar Isi", 0, 1)
206
+ pdf.ln(5)
207
+ pdf.set_font("Helvetica", "", 12)
208
+ chapters = [
209
+ "Bab 1: Pembukaan",
210
+ "Bab 2: Konflik Utama",
211
+ "Bab 3: Perjalanan Tokoh",
212
+ "Bab 4: Puncak Cerita",
213
+ "Bab 5: Penutup & Hikmah"
214
+ ]
215
+ for i, ch in enumerate(chapters, start=1):
216
+ pdf.cell(0, 8, f"{i}. {ch}", 0, 1)
217
+
218
+ # CHAPTERS (SIMPLE GENERATED TEXT)
219
+ body_paragraph = (
220
+ f"Cerita ini mengisahkan tentang {goal.lower()}, disampaikan dengan gaya {style.lower()} "
221
+ f"dan nuansa {tone.lower()}. Setiap bagian dirancang agar mudah dipahami anak-anak, "
222
+ "mengandung nilai-nilai kebaikan, dan mengajak pembaca untuk merenungkan makna di balik setiap peristiwa."
223
+ )
224
+
225
+ for ch in chapters:
226
+ pdf.add_page()
227
+ pdf.set_font("Helvetica", "B", 16)
228
+ pdf.cell(0, 10, ch, 0, 1)
229
+ pdf.ln(4)
230
+ pdf.set_font("Helvetica", "", 12)
231
+ for _ in range(6):
232
+ pdf.multi_cell(0, 7, body_paragraph, 0, "J")
233
+ pdf.ln(2)
234
+
235
+ # SAVE TEMP FILE
236
+ os.makedirs("outputs", exist_ok=True)
237
+ filename = f"outputs/ebook_{uuid.uuid4().hex}.pdf"
238
+ pdf.output(filename)
239
+ return filename
240
+
241
  # ============================
242
  # LOGIN HANDLER
243
  # ============================
 
267
  # MAIN UI (hidden first)
268
  with gr.Group(visible=False) as main_ui:
269
 
270
+ gr.Markdown("# 🌟 AIPromptLab β€” Multi Output JSON & PDF E-Book Generator")
271
 
272
  with gr.Tabs():
273
 
274
  # ============================
275
  # TAB 1: E-BOOK
276
  # ============================
277
+ with gr.Tab("E-Book Prompt & PDF"):
278
 
279
  ebook_goal = gr.Textbox(label="Goal / Ide E-book")
280
  ebook_genre = gr.Dropdown(
 
334
  value="Medium (30–50 pages)"
335
  )
336
 
337
+ ebook_cover_brief = gr.Textbox(
338
+ label="Cover Illustration Brief (diambil dari konsep image design)",
339
+ value="Cute pastel Islamic illustration of children reading together under warm light, soft colors, friendly style."
340
+ )
341
+
342
  ebook_generate_btn = gr.Button("πŸš€ Generate E-book JSON")
343
+ ebook_output = gr.Textbox(label="E-book JSON Output", lines=18, elem_id="ebook-json-output")
344
  ebook_copy_btn = gr.Button("Copy E-book JSON")
345
 
346
+ gr.Markdown("### πŸ“„ Generate PDF E-book (A4)")
347
+ ebook_pdf_btn = gr.Button("Generate PDF E-book")
348
+ ebook_pdf_file = gr.File(label="Download E-book PDF")
349
+
350
  # ============================
351
  # TAB 2: IMAGE DESIGN
352
  # ============================
 
399
  )
400
 
401
  img_generate_btn = gr.Button("πŸš€ Generate Image Design JSON")
402
+ img_output = gr.Textbox(label="Image Design JSON Output", lines=18, elem_id="image-json-output")
403
  img_copy_btn = gr.Button("Copy Image JSON")
404
 
405
  # ============================
 
453
  )
454
 
455
  vid_generate_btn = gr.Button("πŸš€ Generate Video AI JSON")
456
+ vid_output = gr.Textbox(label="Video AI JSON Output", lines=18, elem_id="video-json-output")
457
  vid_copy_btn = gr.Button("Copy Video JSON")
458
 
459
  # LOGIN LOGIC
 
474
  [login_msg, login_ui, main_ui, login_status, login_user, login_tier]
475
  )
476
 
477
+ # E-BOOK GENERATE JSON
478
  def handle_ebook_generate(login_status, login_user, login_tier,
479
  goal, genre, tone, style, platform, length):
480
  if not login_status:
 
488
  ebook_output
489
  )
490
 
491
+ # E-BOOK GENERATE PDF
492
+ def handle_ebook_pdf(login_status, login_user,
493
+ goal, genre, tone, style, length, cover_brief):
494
+ if not login_status:
495
+ return None
496
+ goal_ = normalize(goal, "Islamic children's story about good manners.")
497
+ genre_ = normalize(genre, "Islamic Children Story")
498
+ tone_ = normalize(tone, "Friendly")
499
+ style_ = normalize(style, "Storybook style")
500
+ length_ = normalize(length, "Medium (30–50 pages)")
501
+ cover_ = normalize(cover_brief, "Pastel Islamic illustration of children reading together.")
502
+ pdf_path = build_ebook_pdf(login_user, goal_, genre_, tone_, style_, length_, cover_)
503
+ return pdf_path
504
+
505
+ ebook_pdf_btn.click(
506
+ handle_ebook_pdf,
507
+ [login_status, login_user,
508
+ ebook_goal, ebook_genre, ebook_tone, ebook_style, ebook_length, ebook_cover_brief],
509
+ ebook_pdf_file
510
+ )
511
+
512
  # IMAGE GENERATE
513
  def handle_image_generate(login_status, login_user, login_tier,
514
  goal, design_style, color_palette, platform, aspect_ratio):