from flask import Flask, render_template_string, request, redirect, url_for, flash from werkzeug.utils import secure_filename import os import time from . import git_ops from .marvin_ops import MarvinClient # Für Uberspace 8 Marvin API # --- Konfiguration aus Umgebungsvariablen --- # Diese Variablen werden auf dem Uberspace (z.B. via .bash_profile oder Service-Config) gesetzt. UBERSPACE_ASTEROID = os.getenv('UBERSPACE_ASTEROID') UBERSPACE_DOMAIN = os.getenv('UBERSPACE_DOMAIN') MARVIN_API_KEY = os.getenv('MARVIN_API_KEY') FLASK_SECRET_KEY = os.getenv('FLASK_SECRET_KEY', 'fallback-fuer-lokale-entwicklung') app = Flask(__name__) # Konfiguration: Nutzt das 'downloads' Verzeichnis im aktuellen Arbeitsverzeichnis app.config['UPLOAD_FOLDER'] = os.path.join(os.getcwd(), 'downloads') app.secret_key = FLASK_SECRET_KEY # Sicherstellen, dass der Upload-Ordner existiert os.makedirs(app.config['UPLOAD_FOLDER'], exist_ok=True) # --- Hilfsfunktionen für die Content-Erzeugung --- def generate_markdown_content(data, article_slug): """Erzeugt den Markdown-Inhalt inklusive YAML Frontmatter für Pelican.""" # Pfade für die Links im statischen Blog (relativ zur Domain) pdf_path = f"/downloads/{article_slug}.pdf" audio_path = f"/downloads/{article_slug}.mp3" markdown_template = f"""--- Title: {data['title']} Date: {time.strftime("%Y-%m-%d %H:%M")} Slug: {article_slug} Description: {data['description']} Abstract: {data['abstract']} PDF_Download: {pdf_path} Audio_Download: {audio_path} --- {data['article_body']} """ return markdown_template.strip() # --- Flask Routen --- @app.route('/', methods=['GET']) def new_article_form(): """Zeigt das Eingabeformular für die Autorin.""" form_html = """
Angemeldet auf Asteroid: {{ asteroid }}
""" return render_template_string(form_html, asteroid=UBERSPACE_ASTEROID) @app.route('/preview', methods=['POST']) def preview_article(): """Erzeugt eine Vorschau des Artikels.""" data = request.form # Slug für Dateinamen generieren slug = secure_filename(data['title']).lower().replace('-', '_') markdown_content = generate_markdown_content(data, slug) # In der Praxis müssten die Dateien hier temporär zwischengespeichert werden, # um sie im /publish Schritt final zu übernehmen. preview_html = f"""{data['abstract']}
[Hier würde der gerenderte Artikeltext stehen]