Commit graph

405 commits

Author SHA1 Message Date
aa49ff1f85 Knigge: Padding auf Voting/KI-Rat/Haftpflicht-Cards — SW by-v419 2026-04-26 09:50:44 +02:00
c272812661 Knigge: page-container (kein Doppel-Padding), Radfahrer-Icon, SW by-v418 2026-04-26 09:43:31 +02:00
aeed35078f Knigge: page-container + Padding — kein Rand-zu-Rand-Layout, SW by-v417 2026-04-26 09:39:32 +02:00
231f7976c5 Icons Runde 2: poison/wiki/movies/social + 16 Sprite-Icons — SW by-v416
Sprite: thermometer-hot, heartbeat, bone, lightning, plant, pill,
        circle-dashed, stethoscope, backpack (erste-hilfe),
        music-notes, lightbulb, sparkle, link-simple, globe,
        heart-straight, check-circle (social/movies)

poison.js:   → check-circle (Bestätigt-Badge, Button, Popup, Toast)
wiki.js:    📸 → camera (Community-Fotos Heading)
movies.js:  ⚠️🐾🎬 → check-circle/warning/star/paw-print/film-slate
social.js:  🎵📸🌐 Plattformen, ✓👁📌🏷🔗🤍💬↗️ → Phosphor
2026-04-26 09:36:31 +02:00
fd76eddfb9 Icons: Emoji/Unicode → Phosphor in 8 Dateien + 16 neue Sprite-Icons — SW by-v415
Sprite: arrow-up/down, bug, check-circle, ear, fish, flask, flower,
        medal, question, scissors, tent, ticket, tooth, trend-up/down

poison.js:     TYPEN (🎣☠️⚗️⚠️) → question/fish/skull/flask/warning
events.js:     TYPEN (🎪🏆🎓🐕🛍️🥇📌) → ticket/trophy/graduation-cap/dog/shopping-bag/medal/push-pin
dog-profile.js: Pflege-Emojis (✂️💅🦷👂👁🐾🦟🌸❤️🐶) → Phosphor
trainingsplaene.js: (🐶🐕🦮) → dog mit SVG-Icon
health.js:     ▲▼→ → trend-up/trend-down/arrow-right
uebungen.js:   ↑↓→★ → trend-up/trend-down/arrow-right/star
admin.js:      ✓✗ → check/x in HTML-Templates
moderation.js: ✓✗ → check/x Buttons
2026-04-26 09:26:13 +02:00
f6586c88ee Giftköder: Tiergift-Nummern raus, Erste-Hilfe-Button direkt zu Vergiftung
poison.js: nur noch Polizei 110 + Button → Erste Hilfe (Tab lebensgefahr)
erste-hilfe.js: init() akzeptiert params.tab zum direkten Tab-Sprung
SW by-v414, APP_VER 393
2026-04-26 09:04:10 +02:00
5ca522780b SW: app.js/ui.js/api.js auf Network-First — iOS cached nie alte Versionen
Cache-First für app.js führte dazu dass iOS im normalen Safari-Tab
den alten APP_VER servierte → alte Seiten-Skripte wurden geladen.
Alle Kern-JS-Dateien sind jetzt Network-First wie CSS und Seiten-Module.
SW by-v413, APP_VER 392
2026-04-26 08:56:10 +02:00
4353994c68 iOS PWA: reg.update() beim Start + visibilitychange — SW by-v412
iOS prüft im Standalone-Modus nicht automatisch ob ein neuer SW vorliegt.
reg.update() erzwingt die Prüfung beim App-Öffnen und beim Zurückkehren
aus dem Hintergrund — der bestehende controllerchange→reload greift dann.
2026-04-26 08:38:50 +02:00
1400033862 Welcome: Redesign — Hero-Gradient, Icon-Grid, luftiger — SW by-v411
- Hero: warmer Gradient-Hintergrund, großes Icon, CTA direkt darin
- Features: 4×4 Icon-Grid (Desktop 8-spaltig) statt dense Kachel-Karten
- Eingeloggte User: persönliche Begrüßung im Hero
- Install: kompakte Karte am Ende
- Burger-Hinweis entfernt (unnötig)
2026-04-26 08:35:31 +02:00
a698bec817 Desktop: Settings max-width 640→860px via page-container — SW by-v410 2026-04-26 08:30:06 +02:00
e2af505eac Desktop: Forum, Chat, Walks auf 860px — einheitliche Breite, SW by-v409 2026-04-26 08:26:35 +02:00
770d75100e Desktop: Nachrichten + Gassi-Treffen auf max-width 1100px — SW by-v408
Chat: position:absolute→width:100%, page-body als zentrierter flex-Container
Walks: max-width none→1100px (konsistent mit Forum)
2026-04-26 08:20:13 +02:00
6930e6f848 OSM: Auto-Retry max 3x (30/60/90s), doppelte Tile-Fetches verhindert
Retry-Limit verhindert Endlos-Loop. Delay wächst (30s→60s→90s) damit
mehr Tiles gecacht sein können. Kartenbewegung setzt Counter zurück.
_fetching-Set im Backend verhindert parallele Doppel-Requests pro Tile.
SW by-v407, APP_VER 387
2026-04-25 22:54:12 +02:00
66af669653 Karte: Auto-Retry nach 20s wenn 0 Marker — SW by-v407
Wenn der erste Scan 0 OSM-Marker liefert (Cache leer, Hintergrund-Fetch
läuft), automatisch nach 20 Sekunden nochmal scannen. User muss die
Karte nicht manuell verschieben um Marker zu sehen.
2026-04-25 22:47:25 +02:00
c96283fa87 OSM: lz4.overpass-api.de an erste Stelle — kumi gibt 404 2026-04-25 22:43:49 +02:00
6f320c1225 OSM: Referer-Header gegen 406 — overpass-api.de sofort wieder nutzbar
406 von overpass-api.de wird durch fehlenden Referer-Header ausgelöst,
nicht durch einen zeitbasierten IP-Ban. Mit Referer: https://banyaro.app/
antwortet der Server sofort mit 200. OVERPASS_HEADERS enthält jetzt
User-Agent + Referer.
2026-04-25 22:40:47 +02:00
190db6ac51 OSM: Debug-Logging entfernt 2026-04-25 22:35:29 +02:00
b47daf54a0 OSM: Debug-Logging für Hintergrund-Task 2026-04-25 22:30:31 +02:00
eaf7884a1f OSM: create_task GC-sicher — Task-Referenz in _bg_tasks speichern
asyncio.create_task ohne gespeicherte Referenz wird vom Garbage Collector
sofort gelöscht bevor der Task läuft (dokumentiertes Python-Verhalten).
Fix: _bg_tasks-Set hält Referenz bis done_callback sie wieder entfernt.
2026-04-25 22:24:38 +02:00
ddff1d3571 OSM: asyncio.create_task statt BackgroundTasks — Hintergrund-Fetch funktioniert jetzt
BackgroundTasks wurde nicht ausgeführt (Bug in der Starlette-Integration).
asyncio.create_task() plant den Overpass-Fetch direkt im Event-Loop ein,
Argumente explizit übergeben statt Closure um Capture-Probleme zu vermeiden.
2026-04-25 22:22:39 +02:00
8cc528350d OSM: Overpass-Fetch non-blocking — Antwort sofort, Kacheln im Hintergrund
Stale-Tile-Fetches blockierten den HTTP-Request minutenlang → _overpassActive
blieb auf true → Frontend-Scan konnte nicht neu starten.

Fix: BackgroundTasks statt await — /pois antwortet sofort mit DB-Daten,
Overpass-Fetch läuft im Hintergrund. Beim nächsten Kartenschwenk sind
die frisch gecachten Tiles dann verfügbar.
2026-04-25 22:16:18 +02:00
163b942ea4 OSM: Fair-Use-Rate-Limit + User-Agent für Overpass-Anfragen
Semaphore 2→1 (nur 1 gleichzeitige Anfrage), 2s Mindestabstand,
User-Agent mit App-Name und Kontakt — Standard-Höflichkeit für
Community-Dienste wie kumi.systems.
2026-04-25 22:09:50 +02:00
92d583e661 OSM: Prewarm deaktiviert, CACHE_DAYS 14→90 — kein Overpass-Spam mehr
23.500 Overpass-Anfragen täglich haben die Server-IP geblockt (406).
Fix: OSM-Cache füllt sich nur noch on-demand wenn Nutzer die Karte benutzen.
CACHE_DAYS auf 90 erhöht damit selten besuchte Bereiche länger frisch bleiben.
2026-04-25 22:05:12 +02:00
91389b9a3f Fix: Overpass-Fallback auf kumi.systems — overpass-api.de gibt 406 zurück
overpass-api.de und lz4.overpass-api.de blockieren die Server-IP mit 406.
OVERPASS_URLS-Liste mit Fallback: kumi → lz4 → overpass-api.de.
_fetch_overpass probiert jede Instanz, springt bei 4xx-Fehler zur nächsten.
2026-04-25 22:00:26 +02:00
8d3a620275 Fix: Karte-Scan wenn Diary-Karte vorher geöffnet — SW by-v406
diary.js lädt Leaflet ohne MarkerCluster. Wenn der User zuerst die
Diary-Karte öffnet, findet _loadLeaflet() in map.js ein gesetztes
window.L und überspringt das Laden komplett — inklusive MarkerCluster.
L.markerClusterGroup() schlägt dann still fehl (catch { return 0; }),
und alle OSM-Layer zeigen 0 Marker.

Fix: Leaflet-Basis und MarkerCluster separat prüfen:
- window.L fehlt → lade Leaflet-Basis
- window.L.markerClusterGroup fehlt → lade MarkerCluster
2026-04-25 21:46:36 +02:00
553e9e7854 Sprint 12+13: Tagebuch Day-One-Redesign, Notiz-Feature, Icon-Fixes, SW by-v405
Tagebuch:
- Day-One-Listenansicht: Wochentag + Tageszahl + Meta-Zeile (Zeit/Ort/Wetter)
- 4 Ansichten: Liste, Medien-Mosaik, Kalender (mit Sprungbuttons), Karte (GPS-Marker)
- Detail-Ansicht inline im Content-Bereich (kein Fullscreen-Overlay mehr)
- Hero-Bild vollständig sichtbar (object-fit:contain), Lightbox mit Safe-Area
- 2-Spalten-Layout Desktop: Text + Leaflet-Karte + POI-Liste
- EXIF-GPS-Extraktion bei Foto-Upload, historisches Wetter via Archive-API
- NoteStation-Import: Fotos in diary_media (80 Einträge migriert, 94 Medien)
- Stats-Endpoints: /diary/stats, /diary/calendar, /diary/locations

Notiz-Feature:
- Generische notes-Tabelle (parent_type + parent_id + meta_json)
- 📝-Button in 8 Bereichen, Notizblock-Seite mit KI-Analyse
- KI-Toggle in Einstellungen, notes_ki_enabled in User-Profil

Icons & Design:
- fill:currentColor Fix für welcome/onboarding/friends.js
- --c-icon Variable, --c-text-muted Dark Mode aufgehellt
- 15+ neue Phosphor-Icons aus lokaler Kopie
- CSS Network-First im SW, Cache-Control-Middleware

Infrastruktur:
- Wiki-Anreicherungs-Scheduler-Jobs entfernt (abgeschlossen)
- auth.py: notes_ki_enabled + is_social_media im User-Response
2026-04-25 20:44:46 +02:00
f168961c44 Landing-Page + llms.txt: Featurestand 2026-04-25
- Neue Feature-Karten: Pflege-System (43 Tipps), Wöchentlicher Lober, Wetter & Zecken-Alarm
- Symptom-Checker: Tag von Plus → Kostenlos korrigiert
- Hunde-Wiki: 1003 Rassen, Community-Fotos, Wikipedia-grounded
- Pricing: nicht implementierte Features entfernt (Barcode, EU-Reisepass, Smart Collar, Jahresrückblick, PDF-Export); Plus als "In Entwicklung" markiert
- Vergleichstabelle: neue Zeile "Pflege-Tipps rassenspezifisch"
- JSON-LD featureList + datePublished (2026-04-25) aktualisiert
- llms.txt vollständig überarbeitet: KI-Integration (LM Studio + claude-sonnet-4-6), Breed-Enricher 97,6%, Community-Features, korrekte Monetarisierung
2026-04-25 10:34:18 +02:00
4f58a784c7 Admin: Social-Media-Tab mit Manager-Übersicht, Plattform-Auswertung und Post-Nachweis, SW by-v370 2026-04-25 10:27:39 +02:00
e2bb1a4b2d Social: Vorschläge merken (📌), Post-Link nachträglich eintragen, Quick-Post ohne prompt(), SW by-v369 2026-04-25 10:23:17 +02:00
092230c4e1 Wiki: Placeholder-Icon auf Phosphor 'dog' umgestellt (statt unförmigem Custom-SVG), SW by-v368 2026-04-25 10:15:29 +02:00
af4b1a4a55 Registrierung: Hundepassphrase-Generator (3 Wörter + Zahl, 60+ Hundewörter), SW by-v367 2026-04-25 10:08:42 +02:00
6064a1d750 Wiki-Foto-System: Gallery-Flow, Community-Fotos, Wiki-Fotos-Badge
- review_submission: Fotos ins gallery/-Verzeichnis statt breeds/ kopieren;
  foto_url der Rasse nur überschreiben wenn noch keins vorhanden (Erstbild)
- Rassen-Detail-API: user_fotos (approved submissions) mitliefern
- Rassen-Listen-API: user_foto-Subquery als Fallback wenn foto_url leer
- achievements: neue Badge-Kategorie "Wiki-Fotos" (bronze 1, silber 3, gold 10)
  mit wiki_fotos-Metrik in check_and_award und my_achievements
- Badge-Check + Push nach Foto-Approval
- wiki.js: Karten-Bild nutzt r.foto_url || r.user_foto
- wiki.js: Detail-Ansicht zeigt Community-Foto-Galerie (scrollbar, clickable)
- Dockerfile: breeds/gallery + breeds/submissions im Image anlegen
- SW by-v366, APP_VER 351
2026-04-25 09:53:24 +02:00
b608d5635f Admin: Kachel 'Fotos freizugeben' + pending_fotos in Stats-API, SW by-v365 2026-04-25 09:44:17 +02:00
034f7ef21f Moderation: Foto-Freigabe repariert (rasse_id join, delegate an wiki-API), SW by-v364 2026-04-25 09:41:56 +02:00
d603b7bae1 Wiki: Bildrechte-Bestätigung bei Foto-Einreichung (Checkbox + DB + Mod-Badge), SW by-v363 2026-04-25 09:35:06 +02:00
de73c7901e Wiki: Hunde-Silhouette als Placeholder für fehlende Rassenfotos (SW by-v362)
- _DOG_SILHOUETTE Phosphor-SVG als Modul-Konstante in wiki.js
- Karten-Fallback zeigt SVG statt UI.icon('dog')
- Detail-Ansicht zeigt 56px SVG + „Kein Foto verfügbar" wenn kein Foto
- CSS: wiki-breed-photo-fallback mit Gradient, neue wiki-detail-photo-placeholder-Klasse
- SW by-v362, APP_VER 347
2026-04-25 09:27:19 +02:00
2fed44fbd4 fetch_wiki_images: Commons File-Namespace-Suche entfernt
_commons_search() und deren Aufruf (Stufe 4+5) entfernt.
Nur WP pageimages DE/EN + Commons pageimages (exakter Treffer) bleiben.
urllib.parse Import entfernt.
2026-04-25 09:25:48 +02:00
26074a42db Scraper: Commons-Suche nur bei vollständigem Namensmatch im Dateinamen 2026-04-25 09:22:14 +02:00
fc4cfcf19b Scraper: fetch_wiki_images striktere Bildfilterung (kein PDF/Stadtfoto/Dokument) 2026-04-25 09:19:15 +02:00
93ea8a69fd Scraper: fetch_wiki_images mit Commons-Dateisuche (File-Namespace) 2026-04-25 09:17:40 +02:00
c3d33547c7 Wiki: sehr_gross Pill-CSS + Moderation Icon auf eye geändert 2026-04-25 08:59:19 +02:00
d0921a28e9 Admin-Wartung: obsolete Buttons entfernt, Enrichment-Status + Foto-Laden hinzugefügt
- Temperament→Deutsch-Button entfernt (0 englische Temperamente in DB)
- Gemma-Einträge-zurücksetzen entfernt (0 Gemma-Einträge, alle Claude Haiku)
- Neuer Button: Enrichment-Status (GET /api/admin/wiki/enrichment-status)
  zeigt Gesamt/Angereichert/Kein-Wiki/Ausstehend/Fotos/Modelle-Verteilung
- Neuer Button: Fotos laden (POST /api/admin/wiki/fetch-photos)
  führt fetch_wiki_images.py --limit 50 aus und zählt gespeicherte Fotos
- SW by-v361, APP_VER 346
2026-04-25 08:53:28 +02:00
0af3078a2a Breed Enricher: sqlite3.Row zu dict konvertieren in _enrich_one 2026-04-25 08:40:30 +02:00
77f6af8817 Breed-Enricher: verbesserte Wikipedia-Suche + retry_missed für ki_enriched=2
- _NAME_ALIASES-Dict mit 20 Rassen-Mappings (z.B. Zwergpinscher → Miniature Pinscher)
- exsentences=5 statt exintro=1 + Threshold 80 statt 150 Zeichen (fixiert Zwergpinscher, Spinone, Thai Bangkaew)
- Neue Fallback-Kette: direkt DE/EN → name_de → Aliasse → normalisierte Namen → opensearch DE/EN
- Neue Funktion retry_missed(limit) für ki_enriched=2 ohne DB-Reset
- CLI-Flags --retry-missed und --dry-run
2026-04-25 08:36:27 +02:00
5aba366b21 Deploy: SW by-v360, APP_VER 345 2026-04-25 08:23:45 +02:00
22225d5717 Pflege: Fell schneiden vs. trimmen + Tagebuch Medien-Button nach oben
- dogs.py: Pflegeart-Filter (trimmen/schneiden) anhand Rassen-Beschreibung
- dog-profile.js: Badge '✂️ Schneiden' / ' Trimmen' bei Fell-Kategorie
- diary.js: Fotos/Videos-Button direkt nach Textfeld (vor Ort und Meilenstein)
- ki.py: Standardmodell auf claude-sonnet-4-6 umgestellt
2026-04-25 08:21:49 +02:00
69f78219ae Scraper: fetch_wiki_images.py — Rassen-Fotos via Wikipedia pageimages API
Neues standalone-Script holt fehlende Fotos für wiki_rassen direkt
von Wikipedia (de → en Fallback) und Wikimedia Commons, ohne lokalen
Download — URL wird direkt in foto_url gespeichert.

CLI: --limit N, --dry-run, --model claude-sonnet-4-6
2026-04-25 08:20:39 +02:00
8d5c7a19b1 Admin: KI-Anfragen nach Quelle aufschlüsseln (cloud/local/luna)
- ki_daily_calls: PK auf (user_id, date, source) erweitert + Index; Migration
  baut Tabelle mit neuer Struktur neu auf, behält Altdaten als 'cloud'
- ki.py: return_source=True-Parameter gibt (text, 'cloud'|'local') zurück
- training.py: ki_source aus ki.complete() auslesen, in DB speichern
- social.py: _ki_complete_tracked() zählt Luna-Anfragen mit source='luna';
  alle Content-Endpoints (generate, evaluate, training-tip, breed-of-day,
  pflege-tipp) nutzen tracking-Variante
- admin.py: Stats aufgeteilt in ki_cloud/ki_local/ki_luna je heute+Monat
- admin.js: KI-Karte zeigt 9 Zeilen mit ☁️ Claude / 🖥️ LM Studio / 🌙 Luna
- SW by-v359, APP_VER 344
2026-04-25 08:20:29 +02:00
74b6c03bb3 Social: Modernes Design — Cards, Pill-Buttons, Shadows, SW by-v359 2026-04-25 08:19:45 +02:00
8ba8f4dfa3 Moderations-Panel: neue Seite /moderation für Mods und Admins
- Backend: routes/moderation.py mit GET /stats, /reports, /users, /fotos
  und PATCH-Endpoints für Ban/Unban und Foto-Review
- Frontend: pages/moderation.js mit 4 Tabs (Übersicht, Fotos, User, Forum)
- Sidebar-Eintrag (nur für Moderatoren/Admins sichtbar, gelb)
- Page in index.html registriert, pages-Objekt in app.js ergänzt
- Router in main.py eingebunden (/api/moderation)
- SW-Cache by-v357, app.js/ui.js/api.js auf v=94
2026-04-25 08:19:19 +02:00