import gradio as gr import random from PIL import Image, ImageDraw, ImageFont import io import base64 # Deine Assets (erweitert) images = ["file:12", "file:71"] # Cert-Vorlagen videos = ["file:97", "file:98", "file:99"] tasks = ["Cage anziehen", "Loser Pics", "Pegging", "Toilet-Asche", "Anschaffen", "Halsband", "Brandmark"] def generate_cert_and_blogimage(name, bewerbung, tribut, custom_image=None): """Erweiterte Funktion: Cert + Blog-Image mit Upload-Option""" # Tribut-Validierung try: tribut = float(tribut or 0) except (TypeError, ValueError): return "❌ Ungültiger Betrag.", None, None, None if tribut < 35: return "❌ Tribut unzureichend! Mind. 35€ für Sissy-Zertifikat.", None, None, None # 1. SISSY CERT generieren cert_img = Image.new("RGB", (800, 600), color="black") draw = ImageDraw.Draw(cert_img) font = ImageFont.load_default() cert_text = ( f"Sissy Zertifikat\n" f"Name: {name}\n" f"Bewerbung: {bewerbung[:50]}...\n" f"Goddess Annabelle\n" f"Task: {random.choice(tasks)}" ) draw.text((100, 100), cert_text, fill="red", font=font) task = random.choice(tasks) video = random.choice(videos) # 2. BLOG-IMAGE generieren (mit Custom Upload Overlay) if custom_image: # Custom Bild als Basis nehmen (Resize) blog_img = custom_image.resize((1200, 800)) draw_blog = ImageDraw.Draw(blog_img) # Overlay: Text + Cert-Snippet overlay_text = ( f"NEU! Sissy Cert #{name[:8]}\n" f"Task: {task}\n" f"Blog ready – 35€ Tribut\n" f"GoddessAnnabelle.com" ) draw_blog.text((50, 50), overlay_text, fill="white", font=font, stroke_width=2, stroke_fill="black") # Kleines Cert-Snippet unten rechts einfügen cert_thumb = cert_img.resize((200, 150)) blog_img.paste(cert_thumb, (900, 600)) else: # Default Blog-Image aus Assets blog_img = Image.new("RGB", (1200, 800), color="#1a0033") draw_blog = ImageDraw.Draw(blog_img) draw_blog.text((100, 100), f"Sissy {name} approved!\n{task} Task unlocked\n35€ BNWO Entry", fill="magenta", font=font) status = f"✅ Zertifikat + Blog-Image ready! Task: {task}" return status, cert_img, video, blog_img # Erweiterte Gradio Interface with gr.Blocks(title="🖤 Goddess Annabelle Sissy Suite 🖤") as iface: gr.Markdown("# Sissy Cert + Blog-Image Generator\n35€ → Zertifikat, Task-Reel **+ Social-Ready Blogbild**") with gr.Row(): with gr.Column(scale=1): name = gr.Textbox(label="Dein Sissy-Name", placeholder="sissy_loser_420") bewerbung = gr.Textbox(label="Aussagekräftige Bewerbung", lines=4) tribut = gr.Number(label="Tribut (€)", value=0, minimum=0) custom_img = gr.Image(type="pil", label="📸 Custom Blog-Bild hochladen (optional)") with gr.Column(scale=1): status = gr.Textbox(label="Status", interactive=False) cert_img = gr.Image(label="✅ Dein Sissy Cert") video_reel = gr.Video(label="🎥 Task Reel") blog_img = gr.Image(label="🖼️ Social/Blog-Image (1200x800 ready!)") submit_btn = gr.Button("Generate Cert + Blog-Image", variant="primary", size="lg") submit_btn.click( fn=generate_cert_and_blogimage, inputs=[name, bewerbung, tribut, custom_img], outputs=[status, cert_img, video_reel, blog_img] ) gr.Markdown(""" **Features:** - Personalisierte Certs mit Tasks - Social-ready Blog-Bilder (Instagram/Twitter/WordPress) - Custom Upload → Overlay mit Cert/Task - BNWO optimized! 🚀 """) # Launch (server=False für privates Testing) iface.launch(server_name="0.0.0.0", server_port=7860, share=False, debug=True)