feat(web+android): Lyrics-Mitlaufen umschaltbar, echtes Mischen, Wiederholung am Queue-Ende
Lyrics: Schalter "Mitlaufen" im Lyrics-Reiter, Vorgabe AUS. Hervorgehoben wird die laufende Zeile immer, gescrollt nur bei eingeschaltetem Mitlaufen. Nur bei synchronen Texten sichtbar. Android speichert den Schluessel einzeln, damit das Speichern im Einstellungsbildschirm ihn nicht auf die Vorgabe zuruecksetzt. Mischen (Web): sort(() => Math.random() - 0.5) ist keine Mischung. Gemessen blieb der erste Titel drei- bis fuenfmal zu oft vorn (18,8 % statt 10 % bei n=10, 0,23 % statt 0,05 % bei n=2000). Ersetzt durch Fisher-Yates in queueMath.mischeListe. Queue-Ende (Web): ein beendetes <audio> meldet sich als pausiert, die Wiederaufnahme nach unfreiwilligem Hintergrund-Stop rief play() und spielte den letzten Titel erneut. Jetzt Abbruch bei audio.ended. Shuffle (Android): das Mischen macht jetzt der Player (playSongs(liste, -1)), damit die ungemischte Liste erhalten bleibt — vorher leuchtete das Symbol nicht und "Shuffle aus" konnte die Albumreihenfolge nicht wiederherstellen. Radio-Modus (beide): der laufende Titel ist aus der letzten Rueckfallebene ausgenommen. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
1 parent
ae357b0eb9
commit
b6e98463ee
21 files changed
+227
-29
No files matched your search
+44
-1
@@ -23,7 +23,7 @@ Die Android-App zählt eigenständig weiter (mehrere APKs pro Release). Welche d
|
||||
| Dominant color background | ✅ | ✅ |
|
||||
| Cover art scale animation | ❌ | ✅ |
|
||||
| Synced lyrics (LRCLIB) | ✅ | ✅ |
|
||||
| Lyrics autoscroll | ✅ | ✅ |
|
||||
| Lyrics-Mitlaufen (umschaltbar) | ✅ | ✅ |
|
||||
| Star / favorite song | ✅ | ✅ |
|
||||
| Multi-artist navigation | ✅ | ✅ |
|
||||
| Album detail page | ✅ | ✅ |
|
||||
@@ -79,6 +79,49 @@ Die Android-App zählt eigenständig weiter (mehrere APKs pro Release). Welche d
|
||||
|
||||
---
|
||||
|
||||
## [3.2] — 2026-10-01
|
||||
|
||||
**Android:** 1.25 (versionCode 28) → 1.26 (versionCode 29).
|
||||
|
||||
### Added
|
||||
- **Lyrics: Mitlaufen ein- und ausschalten (Web + Android)** — im Lyrics-Reiter sitzt jetzt ein
|
||||
kleiner Schalter *Mitlaufen / Folgt*. Aus heißt: der Text bleibt stehen, man scrollt selbst.
|
||||
An heißt: der Text springt mit und hält die laufende Zeile bei 40 % Höhe.
|
||||
- **Vorgabe ist AUS.** Wer mitliest, blättert auch mal zurück oder vor — und genau dann sprang
|
||||
der Text bisher bei jeder neuen Zeile unter dem Finger weg.
|
||||
- **Nur bei synchronen Texten sichtbar.** Ohne Zeitstempel gibt es nichts mitzuführen; bei
|
||||
reinem Text erscheint der Schalter nicht.
|
||||
- Hervorgehoben wird die laufende Zeile **immer**, auch bei ausgeschaltetem Mitlaufen — man will
|
||||
ja sehen, wo man ist. Einschalten richtet sofort aus, statt bis zur nächsten Zeile zu warten.
|
||||
- Gespeichert wird pro Gerät (`ns_lyrics_folgen` im Web, `lyrics_autoscroll` in den Android-
|
||||
Einstellungen). Der Android-Schlüssel wird **einzeln** geschrieben: würde ihn das Speichern im
|
||||
Einstellungsbildschirm mitschreiben, setzte es ihn jedes Mal auf die Vorgabe zurück, weil
|
||||
dieser Bildschirm das Feld gar nicht führt.
|
||||
|
||||
### Fixed
|
||||
- **Mischen war nicht zufällig (Web)** — `liste.sort(() => Math.random() - 0.5)` ist keine
|
||||
Mischung: ein Vergleicher, der bei derselben Paarung mal so und mal anders antwortet, ist für
|
||||
eine Sortierung ungültig, und das Ergebnis ist messbar verzerrt. Gemessen (V8, 3000 Durchläufe)
|
||||
blieb der erste Titel drei- bis fünfmal zu oft vorn — bei 10 Titeln in 18,8 % der Fälle statt
|
||||
10 %, bei 100 in 3,1 % statt 1 %, bei 2000 in 0,23 % statt 0,05 %. Die Grobordnung sah dabei
|
||||
gemischt aus, weshalb es lange nicht auffiel; bevorzugt wurden trotzdem immer dieselben Titel.
|
||||
Ersetzt durch Fisher-Yates in `src/player/queueMath.js` (`mischeListe`), verwendet an allen vier
|
||||
Stellen: Warteschlange starten, Mischen umschalten und die beiden Genre-Knöpfe.
|
||||
- **Der letzte Titel lief mehrfach wieder los (Web/PWA)** — am Ende der Warteschlange ohne Repeat
|
||||
steht nichts mehr an, trotzdem spielte der letzte Titel bei jedem Zurückholen der Seite erneut.
|
||||
Ursache: ein beendetes `<audio>` meldet sich als *pausiert*, und die Wiederaufnahme nach einem
|
||||
unfreiwilligen Hintergrund-Stop rief `play()` — das spult dann auf Anfang zurück. Mit Mischen
|
||||
fiel es besonders auf, weil der letzte Titel dort ein beliebiger ist. Jetzt bricht die
|
||||
Wiederaufnahme bei `audio.ended` ab.
|
||||
- **Shuffle-Knopf und tatsächliche Reihenfolge gingen auseinander (Android)** — jeder
|
||||
Shuffle-Knopf mischte selbst (`liste.shuffled()`) und übergab die fertige Reihenfolge. Damit war
|
||||
die „ursprüngliche" Liste schon die gemischte: das Shuffle-Symbol leuchtete nicht, obwohl
|
||||
gemischt gespielt wurde, und *Shuffle aus* konnte die Albumreihenfolge nie wiederherstellen.
|
||||
Das Mischen macht jetzt der Player (`playSongs(liste, -1)`), der die ungemischte Liste behält.
|
||||
- **Radio-Modus konnte den laufenden Titel direkt hinter sich selbst hängen (Web + Android)** — in
|
||||
der letzten Rückfallebene sind Wiederholungen erlaubt, damit Musik weiterläuft; der gerade
|
||||
laufende Titel war davon nicht ausgenommen und spielte dann zweimal in Folge. Jetzt ist er es.
|
||||
|
||||
## [3.1] — 2026-09-22
|
||||
|
||||
**Android:** 1.15 (versionCode 18) → 1.23 (versionCode 26). 1.16 brachte den Rollbalken, 1.17 bis 1.21 machten ihn bedienbar, 1.19 das Bearbeiten der Warteschlange, 1.22 die Wischgeste, den Mischen-Fehler und die zwei neuen Designs, 1.23 den Honigtopf und die Gesamtdauer, 1.24 die Konzerte, 1.25 sie ohne Zeitfenster.
|
||||
|
||||
Reference in new issue
Block a user