docs(changelog): Android-Versionen je Release in einer Zeile bündeln

Die APK-Versionen standen als eigene Einträge zwischen den Features und
wiederholten deren Inhalt: "Android 1.6: Warteschlange ist sofort da"
neben "Zuletzt Gehörtes überlebt den Neustart" — die beiden
widersprachen sich sogar (nur Song-Ids vs. volles JSON), weil 1.6 den
Ansatz aus 1.4 abgelöst hatte.

Jede Release-Überschrift trägt jetzt eine "Android:"-Zeile mit Spanne und
je einem Halbsatz; die Einträge darunter beschreiben nur noch die
Änderung. Die Warteschlangen-Einträge sind zu einem zusammengezogen, mit
dem Weg 1.4 -> 1.6 als Unterpunkt.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
marcandClaude Opus 5 committed 2026-09-11 23:58:46 +02:00
1 parent 4ee20de359
commit ea448e109f
1 file changed
+36 -32
+36 -32
View File
@@ -3,6 +3,9 @@
All notable changes to NovaSonic are documented here.
Format follows [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
Versioning: two-part `MAJOR.MINOR` — each release bumps the minor (features and fixes together).
Die Android-App zählt eigenständig weiter (mehrere APKs pro Release). Welche das waren, steht in einer
**Android:**-Zeile direkt unter der Release-Überschrift — die Einträge darunter beschreiben nur noch,
*was* sich geändert hat, nicht in welchem APK.
---
@@ -72,8 +75,9 @@ Versioning: two-part `MAJOR.MINOR` — each release bumps the minor (features an
## [2.5] — 2026-09-10
**Android:** 1.8 (versionCode 11) — Sprung vom Album zum Künstler.
### Added
- **Android 1.8 (versionCode 11)** — enthält den Sprung vom Album zum Künstler (siehe unten).
- **Vom Album zum Künstler springen (Web + Android)** — in der globalen Suche führte ein Album
bisher in eine Sackgasse: der Künstlername darunter war reiner Text. Wer von dort zum Künstler
wollte, musste zurück und neu suchen. Der Name ist jetzt anklickbar und öffnet dieselbe
@@ -105,39 +109,40 @@ Versioning: two-part `MAJOR.MINOR` — each release bumps the minor (features an
## [2.4] — 2026-09-06
**Android:** 1.4 (versionCode 7) → 1.7 (versionCode 10). 1.4 brachte Warteschlangen-Wiederherstellung
und die Streitpunkte im Duell, 1.6 machte das Wiederherstellen rein lokal und damit sofort, 1.7 leert
den Cache nach einem Update selbst.
### Added
- **Android 1.7 (versionCode 10): Cache räumt sich nach einem Update selbst auf** — im `cacheDir`
- **Cache räumt sich nach einem Update selbst auf (Android)** — im `cacheDir`
liegen Coils Bildspeicher (Cover) und heruntergeladene APK-Updates. Blieb dort nach einer neuen
Version etwas Altes liegen, half nur „Cache leeren" von Hand in den Systemeinstellungen — nichts,
das man einem normalen Nutzer erklären möchte. Beim ersten Start nach einem Versionswechsel wird
der Cache jetzt einmalig geleert; im laufenden Betrieb passiert nichts, sonst wären die Cover bei
jedem Start neu zu laden. **Offline-Downloads sind nicht betroffen**, die liegen unter
`filesDir/offline` und damit außerhalb des Caches.
- **Android 1.6 (versionCode 9): Warteschlange ist sofort da** — bisher wurden nur die Song-Ids
gesichert und beim Start **einzeln nacheinander über das Netz** nachgeladen. Das dauerte Sekunden,
klappte mal und mal nicht und ohne Verbindung gar nicht. Jetzt liegen die vollständigen Songs als
JSON im Gerätespeicher — das Wiederherstellen ist ein rein lokaler Lesevorgang, wie im Web. Preis:
zwischenzeitlich geänderte Titel oder Cover zeigen bis zum nächsten Abspielen den alten Stand.
Zusätzlich sichert `MusicService.onTaskRemoved` die Warteschlange, wenn die App aus den letzten
Apps gewischt wird — dabei feuert `onIsPlayingChanged` nicht zuverlässig, genau dieser Fall ging
vorher verloren. Protokoll unter dem Tag `NsQueue` (`adb logcat -s NsQueue`).
- **Service-Worker-Cache versioniert sich beim Bauen selbst** — die Cache-Version stand handgepflegt
als `ns-v78` in `sw.js` und wurde beim Ausliefern zuverlässig vergessen. Da die Aktivierung nur
Caches mit *abweichendem* Namen löscht, blieb der alte bestehen und Nutzer mussten den Browsercache
von Hand leeren. Ein Vite-Plugin setzt die Version jetzt aus der Bauzeit (`ns-JJJJMMTThhmmss`), der
alte Cache räumt sich beim ersten Start selbst ab. Die Quelldatei bleibt unverändert.
- **Android 1.4 (versionCode 7)** — erste Version mit Warteschlangen-Wiederherstellung und den
Streitpunkten im Duell. Hinweis fürs Testen: der gespeicherte Zustand entsteht erst mit dieser
Version, direkt nach der Installation ist die Leiste also noch leer — einmal abspielen, App
schließen, wieder öffnen.
- **Zuletzt Gehörtes überlebt den Neustart (Web + Android)** — Android sicherte bisher nur den
letzten Song, ohne Warteschlange: die Now-Playing-Leiste blieb nach dem Öffnen **leer, bis man
einmal auf Play drückte**. Jetzt merken sich beide Plattformen Warteschlange und aktuellen Titel
und stellen sie beim Start wieder her — Android **vorbereitet, aber nicht abgespielt**, damit
einen die App beim Öffnen nicht überfällt; läuft schon etwas, passiert nichts. Der Titel beginnt
von vorn: die Sekunde im Titel wird bewusst **nicht** gespeichert, das spart dauerndes Schreiben
während der Wiedergabe. Gesichert werden nur Song-Ids, weil Titel und Cover sich durch
Metadaten-Bearbeitung ändern können; verschwundene Titel werden übersprungen.
- **Zuletzt Gehörtes und Warteschlange überleben den Neustart (Web + Android)** — Android sicherte
bisher nur den letzten Song, ohne Warteschlange: die Now-Playing-Leiste blieb nach dem Öffnen
**leer, bis man einmal auf Play drückte**. Jetzt merken sich beide Plattformen Warteschlange und
aktuellen Titel und stellen sie beim Start wieder her — Android **vorbereitet, aber nicht
abgespielt**, damit einen die App beim Öffnen nicht überfällt; läuft schon etwas, passiert nichts.
Der Titel beginnt von vorn: die Sekunde im Titel wird bewusst **nicht** gespeichert, das spart
dauerndes Schreiben während der Wiedergabe.
- Der erste Anlauf (1.4) sicherte nur Song-Ids und lud sie beim Start **einzeln nacheinander über
das Netz** nach: das dauerte Sekunden, klappte mal und mal nicht und ohne Verbindung gar nicht.
Seit 1.6 liegen die vollständigen Songs als JSON im Gerätespeicher, das Wiederherstellen ist ein
rein lokaler Lesevorgang wie im Web. Preis: zwischenzeitlich geänderte Titel oder Cover zeigen
bis zum nächsten Abspielen den alten Stand.
- `MusicService.onTaskRemoved` sichert die Warteschlange auch, wenn die App aus den letzten Apps
gewischt wird — dabei feuert `onIsPlayingChanged` nicht zuverlässig, genau dieser Fall ging
vorher verloren. Protokoll unter dem Tag `NsQueue` (`adb logcat -s NsQueue`).
- Hinweis fürs Testen: der gespeicherte Zustand entsteht erst ab dieser Version, direkt nach der
Installation ist die Leiste also noch leer — einmal abspielen, App schließen, wieder öffnen.
- **Streitpunkte im Musik-Duell (Web + Android)** — gemeinsame Künstler, sortiert nach dem größten
**Ungleichgewicht** statt nach der Summe: wo einer 120 Plays hat und der andere 3. Ein Balken
@@ -148,6 +153,12 @@ Versioning: two-part `MAJOR.MINOR` — each release bumps the minor (features an
## [2.3] — 2026-09-04
**Android:** versionCode 3 → 1.3 (versionCode 6). versionCode 3 lieferte den Alben-Tab-Fix aus und
erstmals das Scroll- und Suchgedächtnis der Künstlerseite (2.2 enthielt den Code, das damalige APK
war älter); 1.1 brachte Teilen-Link, Songlöschen, Playlist aus dem Import und die Duell-Anzeigetafel;
1.2 und 1.3 nahmen die Adressen aus den Einstellungen in den Build. Alle mit demselben Debug-Schlüssel
signiert, Updates laufen also in-place und App-Daten bleiben.
### Fixed
- **YT-Music-Suche war praktisch tot** — `getYtmVideoUrls` verwarf die komplette Trefferliste, sobald
irgendwo ein Kanal-Eintrag (`browse/UC…`) auftauchte, samt der bereits gesammelten Song-URLs. An
@@ -228,18 +239,17 @@ Versioning: two-part `MAJOR.MINOR` — each release bumps the minor (features an
mutiert, um unter Windows das Neuaufbauen der Medienkachel zu vermeiden. Über MPRIS kam davon
nichts an: Plasma-Widgets zeigten dauerhaft den zuerst gespielten Titel. Bei echtem Titelwechsel
wird jetzt ein neues `MediaMetadata` zugewiesen, sonst weiter in-place (Cover-Nachladen).
- **Android 1.3 (versionCode 6): keine Adressen mehr eintippen** — Navidrome-, Backend- und
- **Keine Adressen mehr eintippen (Android)** — Navidrome-, Backend- und
Scrobble-Adresse kommen als Vorgabe aus dem Build (`-PnovasonicNavidrome=` / `-PnovasonicBackend=`
/ `-PnovasonicScrobble=`, gepflegt in `scripts/.env.release`). Sie greifen, wenn im Gerätespeicher
nichts steht; die Felder in den Einstellungen bleiben sichtbar und überschreibbar, damit ein Umzug
am Gerät korrigierbar ist statt per neuem APK. Beim ersten Start ist nur noch **Benutzer und
Passwort** einzugeben — Zugangsdaten werden bewusst *nicht* eingebacken, die gehören pro Person.
- **Android 1.2 (versionCode 5)** — die Web-Adresse ist keine Einstellung mehr, sondern kommt aus
- **Die Web-Adresse ist keine Einstellung mehr (Android)** — sie kommt aus
`BuildConfig.SHARE_HOST`, also aus **derselben** Angabe (`-PnovasonicHost=…`), die ohnehin für die
App-Links ins Manifest wandert. Damit gibt es keine vierte Adresse zu pflegen, „Teilen" ist immer
sichtbar, und ein- und ausgehende Links können nicht mehr auseinanderlaufen.
- **Android 1.1 (versionCode 4)** — erste Version mit Teilen-Link, Songlöschen, Playlist aus dem
Import und Duell-Anzeigetafel. Wichtig für den In-App-Updater: er vergleicht den `versionCode` aus
- **Falle beim Veröffentlichen** — der In-App-Updater vergleicht den `versionCode` aus
der Gitea-Release-Beschreibung mit dem der installierten App. Wird die Version nicht angehoben
**oder** die Beschreibung nicht mitgepflegt (etwa beim Hochladen von Hand statt über
`npm run publish-apk`), meldet die App korrekt „kein Update" — obwohl ein neues APK bereitliegt.
@@ -286,12 +296,6 @@ host), and the scroll memory from 2.2 finally behaves on the Alben tab.
an album discarded the position the ViewModel had correctly kept. Scrolling to the top now happens
in `LibraryViewModel.setAlbumSort()`, on a real sort change only.
### Changed
- **APK release at versionCode 3** — carries the Alben-tab fix above and, for the first time in a
published build, the artist-page and "Alle anzeigen" overlay scroll/search memory (2.2 shipped the
code, but the release APK predated it). Signed with the established debug key, so it installs
in place over versionCode 2 and app data survives.
---
## [2.2] — 2026-08-22