Suche trennt nach Titel, Kuenstler, Kategorien und Wiedergabelisten

Der Suchen-Tab war 59 Zeilen: ein Textfeld ueber einer flachen
Liederliste, nur ueber Titel/Kuenstler/Album. Wer "Nightcore" eingab,
fand alle Titel dieses Kuenstlers untereinander, aber weder den
Kuenstler selbst noch eine gleichnamige Kategorie oder Liste.

- Vier Abschnitte mit Ueberschrift und Trefferzahl. Alben stecken in
  "Kategorien" — der Album-Name ist in Melo die erste Kategorie eines
  Titels, ein eigener Abschnitt waere dieselbe Liste zweimal.
- Treffer am Wortanfang zuerst, dann alphabetisch.
- Entprellt (250 ms); vorher baute jeder Tastendruck alles neu auf.
- Letzte acht Suchen, gemerkt beim Abschicken, mit Loeschen-Knopf.
- Der Tab folgt jetzt dem Aufbau der uebrigen Tabs (war ein Scaffold
  mit eigener AppBar innerhalb eines Tabs).
- Bewusst rein lokal, ohne Server-Abfrage.

Herausgeloest, weil es sonst eine dritte Kopie gegeben haette:
TitelListenScreen ("Ueberschrift + Liederliste", stand zweimal wortgleich
im Baum) und SongZeile (die Suche setzt einzelne Zeilen in ihre
Abschnitte; eine ganze SongList waere dort verschachteltes Scrollen).

Aus dem Code-Review nachgebessert: Suche und Zuordnung benutzen dieselbe
Normalform, sonst zeigte ein Treffer "0 Titel" und oeffnete eine leere
Liste; Kategorien ohne lebende Titel fallen weg; alle Abschnitte sind
gedeckelt; die Drift-Stroeme werden nicht mehr je Rebuild neu abonniert;
das Loeschkreuz erscheint sofort statt nach 250 ms.

Tot geworden und entfernt: MeloDb.searchSongs samt Test.

396 Tests gruen (vorher 360), flutter analyze ohne Befund, Release-APK
gebaut.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013xAHJTJM6UUqmjUgk1PUEd
This commit is contained in:
Hermes (Server)
2026-08-23 20:08:40 +02:00
co-authored by Claude Opus 5
parent d15867d962
commit ca28264c0e
14 changed files with 1247 additions and 182 deletions
+85 -22
View File
@@ -5,6 +5,91 @@ Format angelehnt an [Keep a Changelog](https://keepachangelog.com/de/1.0.0/).
## [Unreleased]
### 🔎 Die Suche trennt jetzt nach Titel, Künstler, Kategorien und Listen (2026-08-23)
Der Suchen-Tab war bisher **59 Zeilen**: ein Textfeld über einer flachen
Liederliste. Wer „Nightcore“ eingab, bekam alle Titel dieses Künstlers
untereinander — den Künstler selbst, seine Kategorie oder eine gleichnamige
Wiedergabeliste fand er nicht.
- 🗂️ **Vier Abschnitte statt einer Liste.** Titel · Künstler · Kategorien ·
Wiedergabelisten, jeder mit Überschrift und Trefferzahl. Alben stecken in
„Kategorien“ — der Album-Name *ist* in Melo die erste Kategorie eines
Titels, ein eigener Alben-Abschnitt wäre dieselbe Liste zweimal.
- ⬆️ **Treffer am Wortanfang stehen oben.** Wer „roses“ tippt, meint eher
„Roses“ als „Wild Roses“. Innerhalb dieser beiden Ränge alphabetisch.
- ⏱️ **Entprellt (250 ms).** Vorher baute jeder einzelne Tastendruck die
komplette Trefferliste neu auf.
- 🕘 **Letzte acht Suchen.** Sie stehen da, solange das Feld leer ist; Antippen
übernimmt den Begriff. Gemerkt wird ein Begriff erst beim Abschicken —
halbe Wörter aus dem Tippen sind keine Suche, die man wiederholen möchte.
- 🧹 **Der Tab sieht aus wie die anderen.** Er war ein `Scaffold` mit eigener
`AppBar` *innerhalb* eines Tabs, während „Meine Musik“ und „Favoriten“ eine
Kopfzeile im Inhalt haben. Jetzt einheitlich, mit demselben runden Suchfeld
wie auf der Startseite.
- ♻️ **Aufgeräumt, weil es sonst eine dritte Kopie gegeben hätte:** Die
Ansicht „Überschrift + Liederliste“ stand zweimal wortgleich im Baum
(hinter einem Künstler und hinter einer Kategorie). Sie ist jetzt eine
Klasse, die auch die Suche benutzt. Ebenso ist die einzelne Songzeile aus
der Liederliste herausgelöst — die Suche setzt einzelne Zeilen in ihre
Abschnitte, eine ganze Liste wäre dort eine verschachtelte Scrollfläche.
- 🐛 **Beim Bauen selbst gefunden und behoben:** Der Verlauf wurde zuerst
beim Aufbau der Trefferliste geschrieben. Das hätte eine Endlosschleife
ergeben — schreiben löst ein Neuzeichnen aus, das wieder schreibt.
- 📴 **Kein Server-Teil.** Bewusst so entschieden: die Suche läuft rein
lokal, damit sie sofort antwortet und ohne Netz funktioniert.
- 🔍 **Aus dem Code-Review nachgebessert (die wichtigsten drei):**
**(1)** Die Suche fasste „Neoni", „NEONI" und „Neoni " zu einem Treffer
zusammen — die Titel dazu wurden aber unter der rohen Schreibweise gesucht.
Ergebnis: „0 Titel" und ein leerer Bildschirm beim Antippen. Beide Seiten
benutzen jetzt dieselbe Normalform, und verschiedene Schreibweisen
desselben Künstlers fallen dabei zusammen statt sich gegenseitig zu
verstecken. Dasselbe galt für Kategorien.
**(2)** Eine Kategorie, an der nur noch gelöschte Titel hängen, erschien
als Treffer und führte ins Leere. Solche Treffer fallen jetzt weg.
**(3)** Alle Abschnitte sind auf fünf Einträge gedeckelt, nicht nur die
Titel. Eine Eingabe wie „a" hätte sonst hunderte Künstlerzeilen bei jedem
Neuzeichnen gebaut. Die Gesamtzahl steht ohnehin in der Überschrift.
Dazu kleinere Sachen: die beiden Datenbank-Ströme werden nicht mehr bei
jedem Neuzeichnen neu abonniert, der Fehlerfall der Wiedergabelisten wird
behandelt, und das Löschkreuz im Suchfeld erscheint sofort statt nach
250 ms — vorher sprang das Textfeld dabei um eine Knopfbreite enger.
- 🗑️ **Verlauf lässt sich löschen.** Ein „Löschen" neben der Überschrift.
(Ohne das hätte es keine Möglichkeit gegeben, gespeicherte Suchbegriffe
wieder loszuwerden.)
- ♻️ **Tot geworden und entfernt:** `MeloDb.searchSongs` samt Test — die
alte LIKE-Abfrage hat nach dem Umbau keinen Aufrufer mehr.
-**Getestet:** 396 Tests grün (vorher 360), `flutter analyze` ohne Befund,
Release-APK gebaut. Neu: 25 Tests für die Suchregeln und die Bündelung
nach Schreibweise, 7 für den Verlauf, 7 Widget-Tests für die Abschnitte
(inklusive einem, der prüft, dass wirklich entprellt wird).
### 🔁 Positions-Timer überlebt jetzt das Wegwischen (2026-08-23)
- ⏱️ **Behoben: nach dem Wegwischen der Benachrichtigung merkte sich die App
keine Hörposition mehr.** `stop()` brach dabei den Timer ab, der alle fünf
Sekunden die Wiedergabeposition sichert — und der entsteht nur **einmal**
beim App-Start. Einmal abgebrochen, kam er nie zurück: „Fortsetzen an alter
Stelle" hörte still auf zu funktionieren, und zum Server wurde nicht mehr
gemeldet, was gehört wurde. Erst ein Neustart half. Der Timer läuft jetzt
durch; er kostet nichts, weil er von selbst aussteigt, solange nichts
spielt. Abgebrochen wird er nur noch beim endgültigen Aufräumen.
- 📄 **Korrektur am eigenen Review-Bericht (K4).** Dort stand, die
Alben-Ansicht sei „verlorengegangen". Das war falsch: der Alben-Reiter wurde
**bewusst** durch „Kategorie" ersetzt — der Album-Name eines Liedes *ist* in
Melo seine erste Kategorie (`category_list.dart:12`, `kategorienAusTags`).
Was wirklich fehlt, ist die Album-**Detailansicht** (großes Cover,
Künstler, Gesamtdauer) und die Sortierung nach Tracknummer — letztere
braucht zuerst eine Schema-Erweiterung, weil die Tracknummer bisher
überhaupt nicht eingelesen wird. Im Bericht ist der Punkt richtiggestellt.
-**Getestet:** 360 Tests grün, `flutter analyze` ohne Befund.
### 🚑 Fünf P0-Fehler behoben: Benachrichtigung, Offline, Cover, Warteschlange (2026-08-23)
Ergebnis einer vollständigen Durchsicht der App gegen den Maßstab „Apple
@@ -92,28 +177,6 @@ die die App gab und der Code nicht hielt**.
mehr — vorbestehend), und die Server-Cover haben nur einen Zwischenspeicher
im Arbeitsspeicher, keinen auf der Platte.
### 🔁 Positions-Timer überlebt jetzt das Wegwischen (2026-08-23)
- ⏱️ **Behoben: nach dem Wegwischen der Benachrichtigung merkte sich die App
keine Hörposition mehr.** `stop()` brach dabei den Timer ab, der alle fünf
Sekunden die Wiedergabeposition sichert — und der entsteht nur **einmal**
beim App-Start. Einmal abgebrochen, kam er nie zurück: „Fortsetzen an alter
Stelle" hörte still auf zu funktionieren, und zum Server wurde nicht mehr
gemeldet, was gehört wurde. Erst ein Neustart half. Der Timer läuft jetzt
durch; er kostet nichts, weil er von selbst aussteigt, solange nichts
spielt. Abgebrochen wird er nur noch beim endgültigen Aufräumen.
- 📄 **Korrektur am eigenen Review-Bericht (K4).** Dort stand, die
Alben-Ansicht sei „verlorengegangen". Das war falsch: der Alben-Reiter wurde
**bewusst** durch „Kategorie" ersetzt — der Album-Name eines Liedes *ist* in
Melo seine erste Kategorie (`category_list.dart:12`, `kategorienAusTags`).
Was wirklich fehlt, ist die Album-**Detailansicht** (großes Cover,
Künstler, Gesamtdauer) und die Sortierung nach Tracknummer — letztere
braucht zuerst eine Schema-Erweiterung, weil die Tracknummer bisher
überhaupt nicht eingelesen wird. Im Bericht ist der Punkt richtiggestellt.
-**Getestet:** 360 Tests grün, `flutter analyze` ohne Befund.
### 🏷️ Der zweite Tab heißt wieder „Download" (2026-08-21)
- 📥 **Aus „Online" wird „Download".** Der Bereich behält seinen Inhalt