Positions-Timer ueberlebt stop(); K4 im Review-Bericht richtiggestellt

stop() brach _positionRecordTimer ab. Der Timer entsteht nur einmal im
Konstruktor, war also fuer den Rest der Sitzung weg. Da auch das System
stop() aufruft (Benachrichtigung wegwischen), merkte sich die App danach
keine Hoerposition mehr und scrobbelte nicht — bis zum Neustart und ohne
Hinweis. Der Timer steigt ohnehin selbst aus, solange nichts laeuft;
abgebrochen wird er jetzt nur noch in dispose().

Dazu eine Korrektur am eigenen Review: K4 behauptete, die Alben-Achse sei
verlorengegangen. Sie wurde bewusst durch "Kategorie" ersetzt — der
Album-Name ist in Melo die erste Kategorie eines Titels
(category_list.dart:12, kategorienAusTags). Was wirklich fehlt, ist die
Album-Detailansicht und die Tracknummer, die gar nicht eingelesen wird.

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 18:51:18 +02:00
co-authored by Claude Opus 5
parent e6d5f1c9ee
commit d15867d962
3 changed files with 64 additions and 16 deletions
@@ -18,8 +18,8 @@ Erklär-Kommentare an genau den Stellen, wo früher Bugs saßen. Das ist deutlic
der Durchschnitt eines Hobby-Projekts. der Durchschnitt eines Hobby-Projekts.
Als **vollwertige Musik-App im Sinne von Apple Music ist sie es aber noch nicht.** Es fehlen Als **vollwertige Musik-App im Sinne von Apple Music ist sie es aber noch nicht.** Es fehlen
nicht Details, sondern drei tragende Säulen: **Alben als Browse-Achse**, **echtes Offline- nicht Details, sondern drei tragende Säulen: **die Album-Detailansicht** (siehe die Korrektur
Management** und **Cover-Art für Server-Titel**. Dazu kommen zwei stille Fehler, die man unter K4), **echtes Offline-Management** und **Cover-Art für Server-Titel**. Dazu kommen zwei stille Fehler, die man
der App nicht ansieht: der Offline-Schalter tut nichts, und ohne `POST_NOTIFICATIONS` der App nicht ansieht: der Offline-Schalter tut nichts, und ohne `POST_NOTIFICATIONS`
erscheint auf Android 13+ keine Wiedergabe-Benachrichtigung. erscheint auf Android 13+ keine Wiedergabe-Benachrichtigung.
@@ -89,23 +89,41 @@ bleibt.
--- ---
### K4 — Alben fehlen als Browse-Achse ### K4 — ~~Alben fehlen als Browse-Achse~~ → **korrigiert: Album-Detailansicht fehlt**
**Ort:** `lib/library/song_grouping.dart` · `lib/library/my_music_screen.dart:88` **Ort:** `lib/library/category_list.dart:12` · `lib/library/categories.dart:26`
**Kategorie:** Funktionsumfang **Kategorie:** Funktionsumfang
`Songs.album` ist eine Textspalte, aber es gibt weder eine Alben-Liste noch einen > **Korrektur vom 2026-08-23 (nach der P0-Runde).** Die ursprüngliche Fassung
Album-Detail-Screen. `song_grouping.dart` kann nur `groupByArtist`. Die Unterreiter > dieses Punktes war falsch. Sie behauptete, die Alben-Achse sei
heißen **Lieder / Kategorie / Künstler** — im Referenz-Screenshot > „verlorengegangen". Sie wurde **bewusst ersetzt**: `category_list.dart`
(`ui-referenz/bugs/img_2d5761551808.jpg`, das ist Melo selbst) stand dort noch > dokumentiert das im Klassenkommentar, und `kategorienAusTags` setzt den
**Songs / Künstler / Alben**. Die Achse ist also verlorengegangen. > Album-Namen beim Scan als **erste Kategorie** jedes Titels. Der Reiter
> „Kategorie" *ist* der Alben-Reiter — nur allgemeiner, weil ein Titel
> mehreren Kategorien angehören darf. Der Fehler entstand, weil nur
> `song_grouping.dart` und `my_music_screen.dart` gelesen wurden.
**Wirkung:** Album ist neben Playlist die wichtigste Einheit, in der Menschen Musik **Was wirklich fehlt**, ist nicht die Achse, sondern die **Ansicht eines
denken. Ohne sie ist "Bibliothek" eine flache Titelliste — brauchbar bei 200 Titeln, Albums als Album**:
unbrauchbar bei 5.000.
1. **Kein Album-Kopf.** `_KategorieLiederScreen` ist eine `AppBar` über einer
Titelliste. Es fehlen großes Cover, Künstler, Jahr, Titelzahl,
Gesamtdauer und ein „Abspielen / Zufällig"-Paar. Bei Apple Music trägt
genau dieser Kopf die Identität eines Albums.
2. **Falsche Reihenfolge.** Innerhalb einer Kategorie wird nach Titel
sortiert. Ein Album gehört in **Tracknummer-Reihenfolge** — sonst beginnt
jedes Konzeptalbum mit dem Lied, das alphabetisch vorn steht.
3. **Die Tracknummer wird gar nicht gelesen.** Verifiziert: weder `Songs` noch
der Scan kennen `trackNumber`. Punkt 2 braucht also zuerst eine
Schema-Erweiterung plus Auslesen des Tags.
4. **Kein Weg vom Künstler zu seinen Alben.** `_ArtistSongsScreen` zeigt alle
Titel flach.
**Empfehlung (ersetzt die alte):** Keinen vierten Reiter bauen — der würde
denselben Bestand doppelt zeigen. Stattdessen `_KategorieLiederScreen` zu
einem richtigen Detail-Screen ausbauen und die Tracknummer nachrüsten. Der
Aufwand liegt damit **nicht** bei „ein Reiter wie der Künstler-Reiter",
sondern bei Schema-Migration + Scan + Screen.
**Empfehlung:** `groupByAlbum` (analog zu `groupByArtist`, existierende `_groupBy`-
Hilfsfunktion nutzt man mit), vierter Unterreiter, Album-Screen mit großem Cover,
Künstler, Jahr, Titelzahl, Gesamtdauer und "Abspielen / Zufällig".
--- ---
+22
View File
@@ -92,6 +92,28 @@ die die App gab und der Code nicht hielt**.
mehr — vorbestehend), und die Server-Cover haben nur einen Zwischenspeicher mehr — vorbestehend), und die Server-Cover haben nur einen Zwischenspeicher
im Arbeitsspeicher, keinen auf der Platte. 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) ### 🏷️ Der zweite Tab heißt wieder „Download" (2026-08-21)
- 📥 **Aus „Online" wird „Download".** Der Bereich behält seinen Inhalt - 📥 **Aus „Online" wird „Download".** Der Bereich behält seinen Inhalt
+9 -1
View File
@@ -405,10 +405,18 @@ class MeloAudioHandler extends BaseAudioHandler with QueueHandler, SeekHandler {
@override @override
Future<void> pause() => _player.pause(); Future<void> pause() => _player.pause();
/// Der Positions-Timer wird hier bewusst **nicht** abgebrochen.
///
/// Er ist ein `Timer.periodic` und entsteht nur einmal im Konstruktor —
/// einmal abgebrochen, käme er für den Rest der App-Sitzung nicht zurück.
/// [stop] löst aber nicht nur der Nutzer aus: das System ruft es beim
/// Wegwischen der Benachrichtigung auf. Danach merkte sich die App keine
/// Hörposition mehr und scrobbelte nicht mehr — bis zum Neustart und ohne
/// jeden Hinweis. Er kostet nichts: seine erste Zeile steigt aus, solange
/// nichts läuft. Abgebrochen wird er allein in [dispose].
@override @override
Future<void> stop() async { Future<void> stop() async {
sleepTimer.cancel(); sleepTimer.cancel();
_positionRecordTimer.cancel();
await _player.stop(); await _player.stop();
await super.stop(); await super.stop();
} }