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 %}
📦 Alle Bilder als ZIP herunterladen
← 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
Kommentar veröffentlichen