diff --git a/app.py b/app.py index 1a78c28..d6a7a24 100644 --- a/app.py +++ b/app.py @@ -242,6 +242,15 @@ WICHTIG zu display_text: kopiere ihn 1:1 als display_text. - Wenn der Text kurz, unstrukturiert oder noisy ist: formuliere einen sauberen, lesbaren Display-Text (2-4 Sätze), der die Kernaussage wiedergibt. +- 🎤 SPRACHNACHRICHTEN (erkennbar an \"🎤\" am Anfang): + - Wenn der Inhalt REICHHALTIG ist (≥200 Zeichen, mehrere Fakten, klare News): + Transkription 1:1 als display_text übernehmen. + - Wenn der Inhalt DÜNN ist (nur \"Spiel X gibt's an Stand Y für €Z\"): + Kurze LLM-Zusammenfassung (1 Satz), nicht die ganze Transkription. + Grund: Die Sprachnachricht selbst wird NICHT veröffentlicht (nur der Text). +- 🖼️ FOTO + 🎤 SPRACHNACHRICHT kombiniert (erkennbar an \"[Bild ohne Text]\" + \"🎤\"): + display_text = Transkription der Sprachnachricht (mit Foto-Regeln wie oben). + Das Foto wird automatisch mitveröffentlicht, die Audio-Datei NICHT. - Entferne dabei: Füllwörter, Emoji-Overload, unhöfliche Formulierungen, irrelevante Anhängsel. - Der display_text MUSS auf Deutsch sein (englische Eigennamen/Fachbegriffe sind OK). - Maximal 500 Zeichen. @@ -436,11 +445,27 @@ def triage_submission(db, submission_id: int) -> dict: if len(display_text) > 1000: display_text = display_text[:997] + "..." + # ── Media-Publish-Flags: Audio nicht veröffentlichen ──────────── + # Regel: Sprachnachrichten (.ogg/.mp3/.wav) sollen NIE auf der + # Frontpage als Audio-Player erscheinen. Nur die Transkription + # (display_text) wird gezeigt. Bilder/Videos bleiben sichtbar. + media_flags = None + if row["media_path"]: + paths = row["media_path"].split("||") + flags = [] + for p in paths: + ext = os.path.splitext(p)[1].lower() + if ext in (".ogg", ".mp3", ".wav"): + flags.append("0") # Audio: nicht veröffentlichen + else: + flags.append("1") # Bild/Video: veröffentlichen + media_flags = ",".join(flags) + # ── DB-Update ─────────────────────────────────────────────────── db.execute( """UPDATE submissions SET triage_tier=?, triage_reasons=?, triage_at=CURRENT_TIMESTAMP, - public=?, status=?, display_text=?, + public=?, status=?, display_text=?, media_publish_flags=?, published_at=CASE WHEN ? = 1 THEN COALESCE(published_at, CURRENT_TIMESTAMP) ELSE published_at END WHERE id=?""", ( @@ -449,6 +474,7 @@ def triage_submission(db, submission_id: int) -> dict: 1 if tier == 1 else 0, "published" if tier == 1 else ("blocked" if tier == 3 else "pending"), display_text, + media_flags, tier, submission_id, ), @@ -979,6 +1005,7 @@ def whatsapp_webhook(): return "OK", 200 try: + import threading entries = body.get("entry", []) db = get_db() @@ -1159,7 +1186,6 @@ def whatsapp_webhook(): # Transcribe audio in background (non-blocking) if msg_type == "audio" and media_path: - import threading sub_id = recent["id"] if thread_found else db.execute( "SELECT last_insert_rowid()" ).fetchone()[0] @@ -1171,7 +1197,6 @@ def whatsapp_webhook(): # Transcribe video in background if msg_type == "video" and media_path: - import threading sub_id = recent["id"] if thread_found else db.execute( "SELECT last_insert_rowid()" ).fetchone()[0] @@ -1183,7 +1208,6 @@ def whatsapp_webhook(): # Auto-summarize text/image submissions (LLM hall + summary) if msg_type in ("text", "image") and not thread_found and content and len(content.strip()) > 20: - import threading sub_id = db.execute("SELECT last_insert_rowid()").fetchone()[0] # Only if regex didn't already find a halle if not halle: @@ -4600,6 +4624,7 @@ def telegram_webhook(): return "OK", 200 try: + import threading msg = body.get("message", {}) if not msg: return "OK", 200