Ban Yaro Blues — Hymne in der WELT-Welt

Eigener Song (KI-Demo via Suno) als Marken-Hymne. Dezente Player-Karte unter
dem Tageszitat; preload=none → 6 MB MP3 lädt erst bei Play, der SW cacht sie
danach für offline. Der Banner ist einmalige Einladung und verschwindet nach
erstem Hören (durchgehört oder >30s + Pause); danach dezenter runder Play-Button
unten links als Gegenspieler zum FAB, nur in WELT. Audio-Element zentral in
index.html → übersteht Welt-Wechsel & Re-Renders.

„Gehört" wird hybrid gemerkt: localStorage (sofort/offline) + DB-Flag
anthem_heard am User (neue Spalte, über /auth/me, gesetzt via
POST /api/profile/anthem-heard) — geräte- und deploy-übergreifend, damit der
Banner nicht erneut nervt.
This commit is contained in:
rene 2026-06-14 21:33:23 +02:00
parent f7370028da
commit d0a76e1b54
11 changed files with 149 additions and 18 deletions

View file

@ -398,7 +398,7 @@ async def me(user=Depends(get_current_user)):
bio, wohnort, erfahrung, social_link,
profil_sichtbarkeit, avatar_url, created_at,
is_founder, is_partner, founder_number, is_founder_pending,
notes_ki_enabled, gassi_stunde_push,
notes_ki_enabled, gassi_stunde_push, anthem_heard,
preferred_theme, subscription_tier,
subscription_expires_at, subscription_cancelled_at, needs_dog_selection,
billing_address, geburtstag

View file

@ -50,6 +50,16 @@ def _load_user(user_id: int) -> dict:
return data
@router.post("/anthem-heard", status_code=204)
async def mark_anthem_heard(user=Depends(get_current_user)):
"""Merkt server-seitig, dass die Hymne gehört wurde — geräteübergreifend und
übersteht Cache-Clear bzw. die iOS-Trennung von PWA- und Safari-localStorage,
damit der Banner nach einem Deploy nicht erneut auftaucht."""
with db() as conn:
conn.execute("UPDATE users SET anthem_heard=1 WHERE id=?", (user["id"],))
return None
@router.patch("")
async def update_profile(data: ProfileUpdate, user=Depends(get_current_user)):
fields = data.model_dump(exclude_none=True)