Spaces:
Running
Running
| 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) | |