c

from flask import Flask, request, send_file, render_template_string from PIL import Image, ImageDraw, ImageFont import io import zipfile import textwrap import base64 from datetime import datetime app = Flask(__name__) # --------------------------- # FRONTEND - Startseite # --------------------------- HOME_HTML = """ Instagram Generator

Instagram Text → Bilder Generator



""" # --------------------------- # FONT & HELPER FUNCTIONS (gleich wie vorher) # --------------------------- def load_font(size=62): font_options = ["arial.ttf", "/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf", "/System/Library/Fonts/Helvetica.ttc", "Helvetica", "Arial"] for font_name in font_options: try: return ImageFont.truetype(font_name, size) except: continue return ImageFont.load_default() def split_text(text, max_chars_per_chunk=380): if not text.strip(): return [] paragraphs = text.split('\n\n') chunks = [] for para in paragraphs: words = para.split() current = [] for word in words: current.append(word) if len(" ".join(current)) >= max_chars_per_chunk: chunks.append(" ".join(current)) current = [] if current: chunks.append(" ".join(current)) return chunks or [text.strip()] def create_image(text_chunk): img = Image.new("RGB", (1080, 1080), (18, 18, 18)) draw = ImageDraw.Draw(img) font = load_font(62) wrapped = textwrap.fill(text_chunk, width=28) bbox = draw.multiline_textbbox((0, 0), wrapped, font=font) text_w = bbox[2] - bbox[0] text_h = bbox[3] - bbox[1] x = (1080 - text_w) // 2 y = (1080 - text_h) // 2 draw.multiline_text((x, y), wrapped, font=font, fill=(255, 255, 255), align="center", spacing=12) buffer = io.BytesIO() img.save(buffer, format="PNG", optimize=True) buffer.seek(0) return buffer # --------------------------- # ERGEBNISSEITE # --------------------------- RESULTS_HTML = """ Generierte Instagram Bilder

Deine Instagram Bilder

{% for img in images %} {% endfor %}

← Neue Bilder generieren

""" # --------------------------- # ROUTES # --------------------------- @app.route("/") def home(): return render_template_string(HOME_HTML) @app.route("/generate", methods=["POST"]) def generate(): text = request.form.get("text", "").strip() if not text: return "Bitte gib einen Text ein.", 400 chunks = split_text(text) if not chunks: return "Kein Text verarbeitet.", 400 images = [] for i, chunk in enumerate(chunks, 1): buffer = create_image(chunk) base64_img = base64.b64encode(buffer.getvalue()).decode('utf-8') images.append({ 'base64': base64_img, 'num': i, 'filename': f"instagram_{i:02d}.png" }) return render_template_string(RESULTS_HTML, images=images, text=text) @app.route("/download_zip") def download_zip(): text = request.args.get("text", "").strip() if not text: return "Kein Text gefunden", 400 chunks = split_text(text) if not chunks: return "Fehler", 400 zip_buffer = io.BytesIO() with zipfile.ZipFile(zip_buffer, "w", zipfile.ZIP_DEFLATED) as zipf: for i, chunk in enumerate(chunks, 1): img_buffer = create_image(chunk) zipf.writestr(f"instagram_{i:02d}.png", img_buffer.getvalue()) zip_buffer.seek(0) timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") return send_file( zip_buffer, as_attachment=True, download_name=f"instagram_export_{timestamp}.zip", mimetype="application/zip" ) # --------------------------- # START # --------------------------- if __name__ == "__main__": print("🚀 Instagram Generator läuft auf http://127.0.0.1:5000") app.run(debug=True, host="0.0.0.0", port=5000)

Kommentare

Beliebte Posts aus diesem Blog

gg

c